2017-02-22 2 views
0

Ich versuche, ein Programm zu entwerfen, das den Durchschnitt einer beliebigen Anzahl von Gleitkommazahlen bis EOF berechnet. Das Programm sollte auch prüfen, ob die Eingabe korrekt war und "Falsche Eingabe" zurückgeben, wenn z.B. Eingabe einer Zeichenfolge Der Code, den ich geschrieben habe, funktioniert, aber es gibt falsche Ausgaben für den Durchschnitt. Kann mir jemand sagen warum?Korrekte Verwendung von scanf() in C, falsche Ausgabe

#include <stdio.h> 

int main(void) { 
    int times = 0; 
    float sum = 0; 
    float scan; 
    float avrg; 
    int scanvalue = 1;  
    while (scanvalue == 1) {    
     scanvalue = scanf("%f", &scan); 
     sum = sum + scan; 
     times++;     
    }  
    if (scanvalue == EOF) { 
     avrg = sum/times; 
     printf("The average is %f\n", avrg); 
    } else { 
     printf("Wrong input"); 
    } 
    return 0; 
} 

Mit freundlichen Grüßen.

+0

Können Sie ein Beispiel Ein- und Ausgabe geben? – Marievi

+0

Ich vermute, * falsche Verwendung von 'scanf()' korrekte Ausgabe *, die wiederum war natürlich ** unerwartet **. –

+0

Was ist Ihr System und Compiler? Mit welchem ​​Schlüssel streichst du die Eingabe? –

Antwort

4

Sie überprüfen scanvalue nicht nach scanf() und verwenden immer noch den Wert scan, der den Durchschnitt durcheinander bringt. Beachten Sie, dass scanf()EOFzurückgibt und es wird daher seinen letzten Wert weiterhin haben, so dass Sie den letzten Wert zweimal hinzufügen.

Aber wenn man am Anfang ungültige Eingabe und geben Sie dann das Verhalten nicht definiert ist, ändern Sie ihn auf

while ((result = scanf("%f", &value)) == 1) { 
} 

Auch ich geändert absichtlich die Namen Ihrer Variablen zu benennen sie einen besseren Weg zu illustrieren.

+0

Vielen Dank! Allerdings: Warum brauche ich die Klammer innerhalb und kann nicht nur schreiben während (result = scanf ("% f", & Wert) == 1). Ich dachte, der Compiler liest solche Anweisungen von links nach rechts. – Mark

+1

1. Vorrang für den Betreiber. 2. Weil du auch nackt auf die Straße gehen kannst, aber du trägst immer noch Kleidung. 3. Weil es für menschliche Leser uneindeutig wird. 4. Weil es sehr hässlich ist. 5. Wirklich, weil es schrecklich aussieht. 6. Weil es schlecht aussieht, macht es das Lesen schwierig. Am wichtigsten ist jedoch die Vorrangstellung des Betreibers. –

+0

"Beachten Sie, dass, wenn' scanf() '' 'EOF' zurückgibt, wird' 'scan'' nicht besser als" bedenke. Wenn 'scanf()' weniger als 1 zurückgibt, wird 'scan' nicht verändert. Aber selbst das ist nicht ganz richtig. Bei dem seltenen Eingabefehler 'scanf()' kann 'EOF' zurückgegeben und' Scan' geändert werden. – chux

0

Sie müssen scanvalue nach dem scanf überprüfen, sonst werden die Zeiten inkrementiert, auch wenn Sie EOF eingeben und die Summe eine falsche Eingabe erhält, was dazu führt, dass der Durchschnitt falsch/durcheinander ist.

So sollten Sie

ändern
while (scanvalue == 1) {    
    scanvalue = scanf("%f", &scan); 
    sum = sum + scan; 
    times++;     
} 

Um

while (scanvalue == 1) { 
    scanvalue = scanf("%f", &scan); 
    if (scanvalue != 1) 
     break; 
    sum = sum + scan; 
    times++; 
} 
+0

Bitte überprüfen Sie die Formatierung Ihrer Antwort. –

+0

Besser zu verwenden 'if (scanvalue! = 1) Pause;' – chux

+0

richtig, danke –