2016-10-16 2 views
0

У меня есть цикл while, который позволяет пользователю вводить любое количество чисел, разделенных пробелом, и программа должна заканчиваться, показывая наивысшее число пользователю, когда пользователь вводит 0.Хотя цикл не останавливается при выполнении условия

#include <stdio.h> 

int main(){ 
    float fResult[100], fMax; 
    int c = 1; 
    while (fResult[c] != 0){ 
    scanf(" %f ", &fResult[c]); 
    if (fResult[c] > fMax){ 
     fMax = fResult[c]; 
    } 
    c = c + 1; 
    } 
    if (fResult[1]==0){ 
    printf("empty sequence"); 
    } else { 
    printf("%.3f ", fMax); 
    } 
} 

Он отлично работает, пока пользователь не вводит последовательность ничего, кроме отрицательных чисел. Затем результат отображается как 0.

Например, когда пользователь вводит -3 -4 -100 -5 0, результат должен быть -3, но вместо этого я получаю 0, что технически максимальное число. Но разве цикл while не должен игнорироваться, если пользователь вводит 0?

+0

Вы никогда не проверяете, действительно ли «scanf» успешно завершается. –

+1

'while (fResult [c]! = 0)' вы не вводили никаких данных в 'fResult' –

+4

Вы не инициализировали fMax – SMA

ответ

0

fMax инициализировать к первому значению для чтения. Нет необходимости сохранять значения в массиве. Всегда проверяйте возвращаемое значение scanf().

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

int main(void) { 
    float f, fMax; 

    if (scanf("%f", &fMax) != 1) { 
     exit(EXIT_FAILURE); 
    } 
    if (fMax == 0.0) { 
     (void) printf("empty sequence\n"); 
    } else { 
     for (;;) { 
      if (scanf("%f", &f) != 1) { 
       exit(EXIT_FAILURE); 
      } 
      if (f == 0.0) { 
       break; 
      } 
      if (f > fMax) { 
       fMax = f; 
      } 
     } 
     (void) printf("%.3f\n", fMax); 
    } 
    return 0; 
} 
0

Здесь вы принимаете входные данные сначала, после сравнения и назначения fMax вы проверяете состояние цикла .

инициализировать fMax и fResult[1] перед тем, как сравнивать, а также проверить c не больше tha 100, чтобы избежать индекса массива из задержек.

0

Просто случай неопределенного поведения:

fmax является случайно нулю, при оставил неинициализированным. Автоматическая переменная, если она оставлена ​​неинициализированной, может содержать любое количество мусора. Это нуль в вашем случае. Таким образом, в первых четырех итерациях fmax остался бы при нулевом значении при сравнении с отрицательными значениями.

Вы должны следовать принципу: заселить первый - то доступ

Смежные вопросы