В вашем коде есть несколько проблем:
- индексы массива начинаются с
0
в C, вы не должны увеличивать c
до тех пор, пока не сохраните значение. - вам на самом деле не нужно хранить значение, просто посчитав их достаточно
- вы должны инициализировать
large
и small
с первого считанного значения. - вы должны проверить возвращаемое значение
scanf()
для обнаружения неверного ввода и предотвращения неопределенного поведения
Вот исправленная версия:
#include <stdio.h>
int main() {
int c, n, large, small;
double sum = 0;
for (c = 0;; c++) {
printf("Enter number: ");
if (scanf("%d", &n) != 1 || n == 0)
break;
sum += n;
if (c == 0 || n > large) {
large = n;
}
if (c == 0 || n < small) {
small = n;
}
}
if (c == 0) {
printf("no numbers\n");
} else {
printf("Smallest: %d\n", small);
printf("Largest: %d\n", large);
printf("Sum = %f\n", sum);
printf("Average = %.2f\n", sum / c);
}
return 0;
}
Чтобы проиллюстрировать, как приведенный выше код работает без локального массива, вотпромежуточная версия с массивом и коментариями:
#include <stdio.h>
int main() {
int c, n, i, array[100], large, small;
double sum;
for (c = 0; c < 100; c++) { // loop reading into array, stop at array size
printf("Enter number: ");
if (scanf("%d", &n) != 1) // read a number, stop on failure
break;
if (n == 0) // stop when reading a 0
break;
array[c] = n;
}
if (c == 0) {
printf("no numbers\n");
return 0;
}
// initialize variables from first entry
sum = array[0];
large = small = array[0];
// loop over remaining entries and update variables
for (i = 1; i < c; i++) {
sum += array[i];
if (large < array[i]) {
large = array[i];
}
if (small > array[i]) {
small = array[i];
}
}
printf("Smallest: %d\n", small);
printf("Largest: %d\n", large);
printf("Sum = %f\n", sum);
printf("Average = %.2f\n", sum / c);
return 0;
}