Одномерные-двумерные массивы в языке C
Есть лабораторная по программированию на C. Вопрос по 3 заданиям. Я покажу задание и то, что у меня есть, то, как я вижу, НО оно работает неправильно. Я очень прошу вас помочь мне разобраться, если не сложно - написать код.
1 задача: Заполнить массив array[N] случайными целыми числами из диапазона [A; B], сумма цифр которых не превышает MAX. Вывести массив на экран в строку.
Мои мысли:
#include <stdio.h>
#include <stdlib.h>
#define N 45
#define A 5
#define B 6510
#define MAX 10
int main(void) {
int i, n, s, array[N];
for (i = 0; i < N; i++) {
s = 0;
n = (A + rand() % (B - A + 1));
printf("%d ", n);
while (n > 0) {
s += n % 10;
n /= 10;
}
printf("%d\n", s);
if (s < MAX) {
array[i] = n;
printf("array[%d] = %d ", i, array[i]);
}
}
return 0;
}
Задача 2: Заполнить одномерный массив из 25 элементов случайными целыми числами от -99 до +99 и вывести его в файл. Найти и дописать в файл среднее значение элементов в первой половине массива и среднее значение элементов во второй половине массива.
Мои мысли:
#include <stdio.h>
#include <stdlib.h>
#define N 11
int main() {
FILE *file = fopen("input.txt", "w");
int srednee, sum, i, A = -99, B = 99;
int array[N];
for (int i = 0; i < N; i++) {
array[i] = A + rand() % (B - A + 1);
fprintf(file, "%d\n", array[i]);
}
fprintf(file, "\n");
for (i = 0; i < N; i++) {
sum += array[i];
srednee = sum / N;
}
fprintf(file, "%d\n", sum);
fclose(file);
return 0;
}
Самое грустное здесь - не работает даже простое нахождение среднего значения во всем массиве.
**Пожалуйста, не нужно писать заоблачные программы, это нужно сделать максимально просто для понимания, можно даже костыльно. **
Всем, кто откликнется, сразу говорю большое спасибо, вы мне очень поможете!
Ответы (2 шт):
задание 1:
ошибка 1 в том, что вы или заполняете элемент массива или не заполняете элемент массива, т.е. по сути делаете 1 попытку,
а попыток сгенерировать случайное число с нужными свойствами должно быть столько, сколько нужно
ошибка 2 в том, что вычисляя цифры вы уменьшаете n до нуля, а потом эту же n записываете в ячейку массива - т.е. вы всегда в массив записываете 0!
поэтому переменную надо дублировать
for (i = 0; i < N; i++) {
s = 0;
n = (A + rand() % (B - A + 1));
printf("%d ", n);
while (n > 0) {
s += n % 10;
n /= 10; // ОШИБКА - уменьшаем n, хотя потом будем им пользоваться
}
printf("%d\n", s);
// ОШИБКА - вот тут одна попытка всего
if (s < MAX) {
array[i] = n;
printf("array[%d] = %d ", i, array[i]);
}
}
надо так:
for (i = 0; i < N; i++) {
s = 0;
value = 0;
do {
n = (A + rand() % (B - A + 1));
value = n
while (n > 0) {
s += n % 10;
n /= 10;
}
} while (s >= MAX);
array[i] = value;
}
ВАЖНО
поскольку поиск подходящего числа может занять значительное время ~ диапазону чисел среди которых это число будет искаться, то можно сделать следующее:
// ищем все подходящие числа
int values[B];
int values_size = 0;
for (i = A; i <=B; i++) {
s = 0;
n = i;
while (n > 0) {
s += n % 10;
n /= 10;
}
if (s < MAX) {
values[values_size] = i;
values_size ++;
}
}
// ищем случайные числа из ранее найденных подходящих
for (i = 0; i < N; i++) {
n = rand() % values_size;
array[i] = values[n[;
}
задание 2:
вас же просили среднее подсчитать первой половины и второй половины массива, а вы среднее целого массива считаете
for (i = 0; i < N; i++) {
sum += array[i];
srednee = sum / N;
}
кроме того вы его считаете неправильно - вы вычисляете среднее как целое, а надо как число с плавающей точкой - вмеcто int надо float,
кроме того вы еще и делите на N накапливаемую сумму сразу для каждого нового элемента, а не в конце - в итоге у вас не среднее получается, а мусор, т.е. вместо ave = (a1 + a2 + a3) / N вы получаете trash = ((a1 / N + a2) / N + a3) / N = a1 / N^3 + a2 / N^2 + a3 / N
надо
sum = 0;
for (i = 0; i < N; i++) {
sum += array[i];
}
srednee = (float)sum / N; // если не конвертировать, то будет деление целого на целое
Ну и раз вам надо вычислить для двух половинок массива, то и будет:
for (i = 0; i < N / 2; i++) {...}
sum1 = sum1 / (N / 2)
for (i = N / 2; i < N; i++) {...}
sum2 = sum2 / (N - N / 2)
Задачи решены так:
1 задача:
int main(void) {
int i, n, s, array[N];
// ищем все подходящие числа
int chisla[B + A];
int chisla_col = 0;
for (i = A; i <= B; i++) {
s = 0;
n = i;
while (n > 0) {
s += n % 10;
n /= 10;
}
if (s < MAX) {
chisla[chisla_col] = i;
chisla_col++; //граница
}
}
// ищем случайные числа из ранее найденных подходящих
for (i = 0; i < N; i++) {
n = rand() % chisla_col;
array[i] = chisla[n];
printf("%d\n", array[i]);
}
return 0;
}
2 задача:
int main() {
FILE *file = fopen("input.txt", "w");
int sum, sum1, sum2, i, array[N];
double srednee1, srednee2;
for (int i = 0; i < N; i++) {
array[i] = A + rand() % (B - A + 1);
fprintf(file, "%d\n", array[i]);
}
fprintf(file, "***\n\n");
sum = 0;
for (i = 0; i < (N / 2); i++) {
sum += array[i];
}
sum1 = sum;
srednee1 = sum1 / (N / 2);
sum = 0;
for (i = N / 2; i < N; i++) {
sum += array[i];
}
sum2 = sum;
srednee2 = sum2 / (N / 2);
fclose(file);
file = fopen("input.txt", "a");
fprintf(file, "%d***%lf\n", sum1, srednee1);
fprintf(file, "%d***%lf\n", sum2, srednee2);
return 0;
}