Как остановить чтение программы, если введено -1, и соответственно рассчитать среднее - PullRequest
0 голосов
/ 29 мая 2019

Я новичок в C, и моя задача: Напишите программу, которая читает в массиве до 10 целых чисел, представляющих возраст людей в годах, и рассчитывает и печатает максимальный возраст, минимальный возраст и средний возраст. Ваша программа должна прекратить чтение, когда введено 10-е число или пользователь вводит -1. Если пользователь вводит любое другое отрицательное число или значение выше 150, его следует предупредить и снова попросить указать действительный возраст.

Мой код может найти максимальное и минимальное число и вычислить среднее значение, а также убедиться, что значение находится в диапазоне от 0 до 150. Однако я не могу остановить программу, если введено -1. Мои среднее, минимальное и максимальное значения также учитывают, что введено 10 значений, поэтому мне нужна помощь в подсчете количества значений, введенных пользователем до ввода (/ if) -1, чтобы они могли быть точными.

int ages[10];
int i, j;
double sum=0;

for (i=0; i<10; i++){
    printf("Enter number %d: ",i+1);
    scanf("%d", &ages[i]);
    if (ages[i]<-2 || ages[i]>150){
        printf("Invalid number, enter again: ");
            scanf("%d",&ages[i]);
        while (ages[i]==-1){
            break;
        }
    }
}

for (i=0; i<10; i++){
    sum=sum+ages[i];
}
printf("Average: %f \n", (sum/10));
int min=ages[0];
int max=ages[0];

for (j=0; j<10;j++){
    if (ages[j]>max){
       max=ages[j];
    }
    else if (ages[j]<min){
        min=ages[j];
    }
}
printf("Minimum: %d. Maximum: %d. \n", min, max);

Ответы [ 4 ]

1 голос
/ 29 мая 2019

Предупреждающая часть вашего кода работает неправильно.В то время как выглядит совершенно неуместным, и если бы имел смысл, а не время.Для подсчета фактического количества заданных входных данных предпочтителен другой счетчик.

int n = 0; // Will count the actual number of inputs provided
for (i=0; i<10; i++){
    printf("Enter number %d: ",i+1);
    scanf("%d", &ages[i]);

    while (ages[i]<-2 || ages[i]>150){
        // This will loop until a valid number is entered
        // The logic here is subtle as age[i], which is checked by the while loop,
        // is changed on every iteration of the warning 
        printf("Invalid number, enter again: ");
        scanf("%d",&ages[i]);
    }

    if (ages[i] == -1) {
        break;
    }

    n += 1;
}

Используйте n для вычисления среднего вместо 10. Кроме того, при расчете суммы и минимума ограничьте диапазон индексат.е.

Изменить

for (int i = 0; i < 10; i++)

на

for (int i = 0; i < n; i++)  
0 голосов
/ 29 мая 2019

Работа извне. Состояние вашего основного цикла: «пока i меньше 10, а ages[i] не равно -1».Это предполагает следующую структуру:

i = 0;
do
{
  // enter data
} while ( ages[i++] != -1 && i < 10 );

Этот цикл будет повторяться, пока последний введенный возраст не равен -1 и было принято менее 10 записей.Когда этот цикл завершится, i будет количеством записей в ages.Например, если вы введете -1 для третьего входа, i будет равно 3. Если вы не ввели -1 для каких-либо входов, i будет равно 10. Тогда ваша операция усреднения будет

for ( int j = 0; j < i; j++ )
  // sum up ages
// divide ages by i

Для чтения ввода вы можете использовать другой цикл do/while:

do
{
  printf( "Enter a number between 0 and 150, or -1 to quit: " )
  scanf( "%d", &ages[i] )
} while ( ages[i] < -1 || ages[i] > 150 );

Собрав все вместе, вы получите

int i = 0;
do
{
  do
  {
    printf( "Enter a number between 0 and 150, or -1 to quit: " );
    scanf( "%d", &ages[i] );
  } while ( ages[i] < -1 || ages[i] > 150 );
} while ( ages[i++] != -1 && i < 10 );
0 голосов
/ 29 мая 2019

Вы можете использовать этот фрагмент для достижения того, что вы хотите.

int ages[10],i=0,input,flag=0,j,min,max,sum=0,avg;
do{
    printf("Enter number %d: ",i+1);
    scanf("%d",&input);
    if(input == -1){
        flag = 1;
        break;
    }else if(input < -2 || input > 150){
        printf("Invalid number\n");
        continue;
    }
    ages[i] = input;
    i++;
}while(i < 10);

// Calculating avg, min, max
min=ages[0];
max=ages[0];
for(j=0;j<i;j++){
    sum+=ages[j];
    if(ages[j] > max){
        max = ages[j];
    }else if(ages[j] < min){
        min = ages[j];
    }
}
avg = sum/i;
printf(" Max: %d, Min: %d, Avg: %d \n", max,min,avg);

Примечание i только увеличивается, а массив ages обновляется, когда указан правильный возраст. Если был введен -1, то мы должны выйти из цикла do while.

В случае, если были заданы числа < -2 и > 150, мы вызываем continue для перехода на следующую итерацию без увеличения i или присвоения массиву ages нового значения.

Таким образом, мы гарантируем, что наш массив будет содержать допустимые значения. flag указывает, был ли введен -1 в цикле. Вы можете пропустить это, если вам все равно это не нужно.

0 голосов
/ 29 мая 2019

break просто остановит выполнение самого внутреннего цикла. В вашем случае это ваш while цикл.

Вы можете преобразовать while в оператор if, и break будет иметь ожидаемый эффект - он выведет вас из цикла for, фактически остановив чтение чисел!

Я бы также немного реструктурировал ваш код, чтобы сделать его менее запутанным для крайних случаев:

for (i=0; i<10; i++) {
    do {
      printf("Enter number %d: ",i+1);
      scanf("%d", &ages[i]);
    } while (ages[i] < -1 || ages[i] > 150);
    if (ages[i] == -1){
        break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...