Простой цикл да / нет в C - PullRequest
0 голосов
/ 25 октября 2018

Я новичок в программировании, и я пытаюсь сделать простую программу на C, с циклом y / n для заполнения массива и получения суммы / среднего / числа записей / мин и максимального значения, но все, что я получаю, это нулив конце.Любые советы будут полезны, ниже приведен код.Заранее спасибо!

#include <stdio.h>
int main() {
        int N, Number, i= 0,j=0, c;
        double sum, average, min, max;
        double array[N];
        double arr[100];
        char YesNo = 'y';
        int count = 0;
        printf("Please enter maximum size of the array: ");
        scanf("%d",&N);
        while(1){
                printf("Do you want to enter a number? ");
                scanf("%c",&YesNo);
                //if(YesNo != 'Y' || YesNo != 'y' || YesNo != 'n' || YesNo != 'N'){
                //printf("Please enter y or n ");
                //break;
                //return 0;}
                if(YesNo =='y' || YesNo == 'Y'){
                        printf("Enter number: ");
                        scanf("%f", &array[i]);
                        array[i]=arr[j];
                        i++;
                        count++;
                        j++;
                }
                if(YesNo =='n' || YesNo == 'N'){
                        break;
                }
        }
        max = arr[0];
        for (c = 1; c < count; c++) {
                if (arr[c] > max)
                {
                        max = arr[c];
                }
        }
        min = array[0];
        for (c = 1; c < count; c++)
        {
                if (array[c] < min)
                {
                        min = array[c];
                }

        }

        for (i=0; i<count; i++)
        {
                sum = sum + arr[i];
                average = sum/count;
                Number = count;
        }
        printf("\n Sum is: %f",sum);
        printf("\n Number of elements is: %d", count);
        printf("\n Average is: %f ", average);
        printf("\n Maximum is %f",max);
        printf("\n Minimum is %f",min);

        return 0;
}

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Есть несколько проблем с кодом, который вы упомянули. Во-первых здесь

int N;
double array[N];

что такое значение N?Так как N не инициализирован, он может принять ненужные данные и попытаться создать массив из такого количества элементов, что вызывает неопределенное поведение .Итак, сначала определите значение N.например,

#define N 5

Или делает следующие два утверждения printf ("Пожалуйста, введите максимальный размер массива:");зсапЕ ( "% d", & N);до объявления array.Например,

int N;
printf("Please enter maximum size of the array: ");
scanf("%d",&N);
double array[N];/* this works if compiler supports VLA */

Во-вторых , когда вы делаете array[i]=arr[j];, что содержит arr[j]?Это фигня.Так что, например,

arr[j] = array[i];

, поскольку array[i] содержит данные, отсканированные пользователем.

Также рассмотрим вариант использования, например, Предположим, что пользователь вводит N как 5, а если пользовательнажатие y внутри while(1) более чем в 5 раз, чем доступ к граничным данным в массиве, вызывает неопределенное поведение .Например, давайте рассмотрим приведенный ниже код

int N;
printf("Please enter maximum size of the array: ");
scanf("%d",&N); /* let say 5 */
double array[N]; /* max you can store 5 elements */
while(1){ /* it breaks when user press n or N */
   printf("Do you want to enter a number? ");
   scanf(" %c",&YesNo); /* what if user didn't press n or N after 5 times, loop doesn't break which makes array[i] going out of bound */
   if(YesNo =='y' || YesNo == 'Y'){
      scanf("%f", &array[i]); /* this cause problem if user has press y or Y more than N(5) times */
      arr[j] = array[i];
      /* some code */
    }
}

И наконец, для нахождения среднего значения

for (i=0; i<count; i++) {
       sum = sum + arr[i];
       average = sum/count;
       Number = count;
}

почему выполняется average = sum/count; count раз, так как он выполняет операцию, вместо этого выполните average = sum/count; только одинвремя после расчета sum.Например,

for (i=0; i<count; i++) {
       sum = sum + arr[i];
}
average = sum/count; /* do only once */
Number = count;

Пример кода (Изменено на основе вашего кода)

int main(void) {
        int N=0,i=0 ,c=0;
        double sum, average, min, max;
        printf("Please enter maximum size of the array: ");
        scanf("%d",&N);
        double array[N];
        double arr[N];
        char YesNo = 'y';
        int count = 0;
        while(count < N) {
                printf("Do you want to enter a number? ");
                scanf(" %c",&YesNo);

                if(YesNo =='y' || YesNo == 'Y'){
                        printf("Enter number: ");
                        scanf("%lf", &array[count]);
                        arr[count]=array[count];
                        count++;
                }
                else
                        break;
        }
        max = arr[0];
        for (c = 1; c < count; c++) {
                if (arr[c] > max)
                {
                        max = arr[c];
                }
        }
        printf("max ele in array : %lf \n",max);
        min = array[0];
        for (c = 1; c < count; c++) {
                if (array[c] < min)
                {
                        min = array[c];
                }
        }
        printf("min ele in array : %lf \n",min);
        for (i=0; i<count; i++) {
                sum = sum + arr[i];
        }
        average = sum/count;
        printf("Avg of array elements : %lf\n",average);
        return 0;
}
0 голосов
/ 25 октября 2018

array [N], вероятно, будет массивом размером 0, так как N не был установлен.

После считывания значения в массив [i] вы затем выполните:

array[i]=arr[j];

так что все, что было в массиве [I], теперь равно тому, что находится в arr [j], который, поскольку ничего не было установлено, будет равен 0.

Другие циклы, использующие arr, также будут иметь результат 0, так как arrникогда не устанавливайте ничего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...