Как запретить системе принимать дозорное значение в качестве входных данных?

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

#include <stdio.h>

int main()
{
    int temperature, highest = 0, lowest = 0, counter = 1, counter2 = 0, total = 0;
    float average;
    
    printf("Enter temperature (-999 to stop) > ");
    scanf("%d", &temperature);
    
    if (temperature == -999) {
    printf("No temperature is captured.");
    return 0;
    }
    
    else if (temperature > 40)
    counter2++;
    
    do {
        printf("Enter temperature (-999 to stop) > ");
        scanf("%d", &temperature);
        
        if (temperature >= highest)
        highest = temperature;
        
        if (temperature <= lowest)
        lowest = temperature;
        
        if (temperature > 40)
        counter2++;
        
        total += temperature;
        counter++;
    } while (temperature != -999);
    
    average = total / counter;
    
    printf("Total days with temperature more than 40'C > %d\n", counter2);
    printf("The lowest temperature  > %d\n", lowest);
    printf("The highest temperature > %d\n", highest);
    printf("Average of temperature  > %.2f\n", average);
}

person Yong Yung Fook    schedule 25.09.2020    source источник
comment
шаг через код. Если вы не хотите, чтобы он записывал -999, могу ли я предложить оператор if (каждый раз, а не только первый).   -  person Kenny Ostrom    schedule 25.09.2020
comment
Что сказал @KennyOstrom. Нет ничего странного в том, что это продолжается, если вы не пишете никакого кода для предотвращения этого.   -  person klutt    schedule 25.09.2020
comment
О, это нормально, если я добавлю, если ( температура == 999 ) перерыв; после первого сканирования в цикле, чтобы вычисление после него не включало -999? @ке   -  person Yong Yung Fook    schedule 25.09.2020


Ответы (2)


Вы включаете дозорное значение (-999), потому что добавляете значение до, когда вы достигаете кода, который проверяет значение дозорного. Вам необходимо протестировать сразу после ввода данных.

Но даже если это будет исправлено, проблем будет больше.

Вы начинаете с установки lowest на ноль, поэтому, если я введу 20, а затем -999, то lowest все равно будет равно нулю.

Вы не сохраняете первый ввод (кроме увеличения count2), поэтому ваш окончательный результат будет неправильным. Опять же, если я введу 20, а затем -999, то total будет равно нулю (при условии, что мы уже исправили проблему часового). И если я введу 20 40 -999, total будет только 40, а среднее значение будет 20, потому что count увеличивается дважды.

Кроме того, вы всегда должны проверять возвращаемое значение scanf.

Поэтому вам нужно реорганизовать свой код. Например, как:

#include <stdio.h>

int main()
{
    int temperature, highest = 0, lowest = 0, counter = 0, counter2 = 0, total = 0;
    float average;
    
    printf("Enter temperature (-999 to stop) > ");
    if (scanf("%d", &temperature) != 1) exit(1);
    
    if (temperature == -999) {
    printf("No temperature is captured.");
    return 0;
    }
    
    lowest = temperature;
    highest = temperature;

    do {
        
        if (temperature >= highest)
        highest = temperature;
        
        if (temperature <= lowest)
        lowest = temperature;
        
        if (temperature > 40)
        counter2++;
        
        total += temperature;
        counter++;

        printf("Enter temperature (-999 to stop) > ");
        if (scanf("%d", &temperature) != 1) exit(1);
    } while (temperature != -999);
    
    average = total / counter;
    
    printf("Total days with temperature more than 40'C > %d\n", counter2);
    printf("The lowest temperature  > %d\n", lowest);
    printf("The highest temperature > %d\n", highest);
    printf("Average of temperature  > %.2f\n", average);
}
person 4386427    schedule 25.09.2020

Ваш код слишком сложен. Почему у вас есть первый вход температуры вне цикла? В первом входе нет ничего особенного.

Вы хотите что-то вроде этого:

#include <stdio.h>

int main()
{
  int temperature, highest = 0, lowest = 0, counter = 1, counter2 = 0, total = 0;
  float average;

  do {
    printf("Enter temperature (-999 to stop) > ");
    scanf("%d", &temperature);

    if (temperature == -999)
      break;

    if (temperature >= highest)
      highest = temperature;

    if (temperature <= lowest)
      lowest = temperature;

    if (temperature > 40)
      counter2++;

    total += temperature;
    counter++;
  } while (temperature != -999);

  average = total / counter;

  printf("Total days with temperature more than 40'C > %d\n", counter2);
  printf("The lowest temperature  > %d\n", lowest);
  printf("The highest temperature > %d\n", highest);
  printf("Average of temperature  > %.2f\n", average);
}

Есть еще баги, и если вообще не вводить температуру, то программа работает некорректно. Но я позволю тебе это самому. Это не должно быть слишком сложно.

person Jabberwocky    schedule 25.09.2020
comment
я должен изменить перерыв; вернуть 0; ? - person Yong Yung Fook; 25.09.2020
comment
Нет, это не проблема. Зачем возвращать 0 вместо перерыва? По сути, если вы введете -999, вы хотите остановить цикл. Но посмотрите, что произойдет, если вы введете -999 в качестве первого числа. А также проверьте, правильно ли отображается самая низкая температура. - person Jabberwocky; 25.09.2020
comment
но извините, я не могу найти никакой ошибки, так как все данные равны 0, например, самый высокий, самый низкий и средний, можете ли вы быть более конкретным? - person Yong Yung Fook; 25.09.2020
comment
Например, введите 3 температуры 7,8 и 9. Теперь посмотрите, что показывает программа для самой низкой температуры. - person Jabberwocky; 25.09.2020