2017-02-17 25 views
2

Я написал программу, которая будет scanf дважды до printf и выведет два из того, что должно быть одним printf. Кажется, что проблема начинается с точки, в которой пользователю предлагается ввести число от 1 до 4, чтобы увидеть среднюю температуру для введенного количества дней.Loop repeating scanf и printf

Я не уверен, что вызывает эти двойные входы и выходы и случайные задержки. Вот мой код:

#include <stdio.h> 
#include <stdlib.h> 

int main (void) { 
    int i; 
    int limit; 
    int day[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    int high[10], low[10]; 

    printf("---===IPC Temperature Analyzer V2.0===---\n"); 

    printf("Please enter the number of days between 3 and 10, inclusive: "); 
    scanf("%d", &limit); 
    while (limit <= 2 || limit >= 11) { 
     printf("Invalid entry, please enter a number between 3 and 10, inclusive: "); 
     scanf("%d", &limit); 
    } 

    for (i = 0; i < limit; i++) { 
     printf("Day %d - High: ", day[i]); 
     scanf("%d", &high[i]); 
     printf("Day %d - Low: ", day[i]); 
     scanf("%d", &low[i]); 
    } 

    printf("\nDay Hi Low\n"); 
    for (i = 0; i < limit; i++) { 
     printf("%d %d %d\n", day[i], high[i], low[i]); 
    } 

    int max = 0; 
    int min = 0; 

    for (i = 0; i < limit; i++) { 
     if (high[max] < high[i]) 
      max = i; 
     if (low[min] > low[i]) 
      min = i; 
    } 

    printf("\nHighest temperature was: %d on day %d\n", high[max], day[max]); 

    printf("Lowest temperature was: %d on day %d\n", low[min], day[min]); 

    int n; 

    do { 
     printf("\nEnter a number between 1 and 4 to see the average temperature " 
       "for the entered number of days, enter a negative number to exit:"); 
     scanf("%d\n", &n); 

     while (n > 4) { 
      printf("Invalid entry, please enter a number between 1 and 4, inclusive: "); 
      scanf("%d", &n); 
     } 

     while (n < 0) { 
      printf("Goodbye!\n"); 
      exit(0); 
     } 

     float avgSum = 0.0; 
     for (i = 0; i < n; i++) { 
      float avgOfDay = (high[i] + low[i])/2.0; 
      avgSum += avgOfDay; 
     } 
     float overallAvg = avgSum/n; 
     printf("The average temperature up to day %d is: %.2f\n", day[n - 1], overallAvg); 

    } while (n > 0 || n < 4); 

    return 0; 
} 

Пример вывода:

Enter a number between 1 and 4 to see the average temperature for the entered number of days, enter a negative number to exit:5 
5 
Invalid entry, please enter a number between 1 and 4, inclusive: Invalid entry, please enter a number between 1 and 4, inclusive: 3 
The average temperature up to day 3 is: 2.50 

Enter a number between 1 and 4 to see the average temperature for the entered number of days, enter a negative number to exit: 2 
2 
The average temperature up to day 2 is: 2.75 

Enter a number between 1 and 4 to see the average temperature for the entered number of days, enter a negative number to exit: -1 
The average temperature up to day 2 is: 2.75 

Enter a number between 1 and 4 to see the average temperature for the entered number of days, enter a negative number to exit: -1 
Goodbye! 
+0

Ваш вопрос будет более ясным, если вы дадите ожидаемый результат и точный * фактический вывод. – kaylum

+0

Хорошо, я обновил свой пост на примере проблем, которые происходят. – Jinto

+0

Обратите внимание, что согласованность написания очень нужна программистам - это важно с именами переменных и хорошими внутренними сообщениями ('temeprature' ->' temperature'). –

ответ

1

while (n > 0 || n < 4); =>while (n > 0 && n < 4);

+1

Кодовые ответы не так полезны, и это не адресует проблема, о которой сообщает ОП. Некоторое объяснение того, что исправляет ваше предложение, было бы хорошим, и с дальнейшим углублением в фактическую проблему, о которой сообщает OP, вы могли бы превратить это в фактический ответ. –

+0

@DavidBowling, Спасибо за ваше предложение. Я новичок в stackoverflow, и мой английский не очень хорош. – Divlaker

0

я смог определить решение моей проблемы. Новая функция линии рядом с scanf и printf некоторых частей моего кода заставляла программу повторять определенные функции scanf и printf.

scanf("%d\n", &n) => 
printf("%d", &n) 

printf ("The average temeprature up to day %d is: %.2f\n", day[n-1], overallAvg); => 
printf ("The average temeprature up to day %d is: %.2f", day[n-1], overallAvg); 
5

Проблема вы описываете может быть прослежена к scanf() заявления в начале цикла do:

scanf("%d\n", &n); 

новой строки в конце строки формата является проблема. Когда scanf() встречает символ пробела в строке формата, он соответствует символам пробела во входном потоке, пока не встречается символ небелого пробела. Проблема заключается в том, что когда вы нажимаете клавишу ввода для ввода своего номера, это просто еще один символ пробела, поэтому scanf() жадно продолжает ждать большего ввода, пока не встретится символ небелого пробела или EOF. Когда пользователь вводит символ небелого пробела в этот момент, совпадение белого пробела scanf() терпит неудачу, введенный символ остается во входном потоке, scanf(), наконец, возвращается к вызывающей функции, и, наконец, следующий scanf() берет характер, который был просто отвергнут. Это причина спорадического ответа, который вы наблюдали.

Исправить это просто. Просто удалите \n с конца строки формата. Обычно бывает, что символ белого пробела в конце строки формата - это неправильная вещь.

Другие ошибки в коде. Тест в конце цикла do должен быть:

while (n > 0 && n < 4); 

тест для значения выхода был бы лучше, как if заявления вместо while цикла, и испытание должно быть для n < 1 вместо n < 0, чтобы избежать деление на ноль:

if (n < 1) { 
    printf("Goodbye!\n"); 
     exit(0); 
} 

кажется, что вы должны изменить входной строки на:

printf("\nEnter a number between 1 and 3 to see the average temperature for the entered number of days, enter a negative number to exit:"); 

Если пользователь выбирает здесь 4, но только вводит данные в течение 3 дней, расчет будет получать доступ к неинициализированным значениям в массивах high[] и low[].Вам также потребуется изменить этот входной контур на:

while (n > 3) { 
      printf("Invalid entry, please enter a number between 1 and 3, inclusive: "); 
      scanf("%d", &n); 
     } 

Возможно, возникнут другие проблемы, но это должно привести к тому, что все будет работать.