2016-09-10 2 views
-1

Ich habe zwei if-Anweisungen erstellt, um in die verknüpfte Liste zu wechseln und zu überprüfen, wie viele Zahlen über dem Durchschnitt liegen und wie viele unter dem Durchschnitt liegen. Wenn ich das Programm nach meinem Verständnis ausführe, zählen die if-Anweisungen nur eine Zahl. Wenn das Programm ausgeführt wird, wird außerdem nur eine der if-Anweisungen aufgerufen, nicht beide. Vielleicht übersehe ich etwas?Probleme mit if-Anweisungen in der Funktion 'CalAverage'

double CalAverage (NewNumber *start){ 

int res; 
double average = 0; 
double total = 0; 
int n = 1; 
int x = 1; 
int y = 1; 

/*if (res != 1){ 
    fprintf(stderr, "Something bad happened in CalAverage()\n"); 
    return add; 
}*/ 
while (start->next){ 
    average += start->newNum; 
    start = start->next; 
    ++n; 
} 
average += start->newNum; 
total = average/n; 
if(total < start->newNum){ 
     ++x; 
     printf("Numbers greater than average: %d\n",x); 
    }else if(total > start->newNum){ 
     ++y; 
     printf("Numbers less than average: %d\n", y); 
    } 
printf("The average is: %lf\n",total); 
return total; 
return x; 
return y; 

} 
+0

Sie haben zu viele Rückmeldungen; Sie können nur einen Wert von der Funktion zurückgeben. Nur eine der 'if'-Anweisungen kann true sein (oder keine, 'if total == start-> newNum'), so dass Sie nur die Ausgabe von einer von ihnen sehen. Du verpasst eine weitere Schleife. Zuerst berechnen Sie den Durchschnitt, dann müssen Sie die Liste erneut durchlaufen und für jede Zahl drucken, wenn sie über oder unter dem Durchschnitt liegt. – Robert

Antwort

1

zuerst, Sie verlieren den Zeiger auf den Anfang der Liste durch Überschreiben in der While-Schleife. Kopiere es beiseite, bevor du anfängst, es zu durchlaufen.

Zweitens, setzen Sie die if-Anweisungen in eine andere Schleife (nachdem Sie den Anfang der Liste neu zugewiesen haben), um den unteren/oberen Durchschnitt zu zählen.

double CalAverage (NewNumber *start){ 

    double average = 0; 
    double sum = 0; 
    int n = 0; 
    int x = 0; 
    int y = 0; 

    NewNumber *temp = start; 

    while (temp){ 
     sum += temp->newNum; 
     temp = temp->next; 
     ++n; 
    } 

    average = sum/n; 

    temp = start; 

    while (temp){ 

     if(average < temp->newNum){ 
      ++x; 
     }else if(average > temp->newNum){ 
      ++y; 
     } 

     temp = temp->next; 
    } 

    printf("The average is: %lf\n",average); 
    printf("Numbers greater than average: %d\n",x); 
    printf("Numbers less than average: %d\n", y); 
    return average; 
} 
+0

danke, ich dachte, es wäre eine andere Zeigervariable erstellt und steckte es in die While-Schleife, dass es eine andere unendliche While-Schleife erstellt hätte. –

0

Die if-Anweisungen sind nicht in der while-Schleife, so dass die Funktion startet, schließt die while-Schleife, und dann nur eine if-Anweisung genannt wird, weil es ein, wenn ist, elseif

+0

Ich würde sie in die While-Schleife einfügen, aber insgesamt existiert noch nicht in der While-Schleife. Ich legte sie in eine separate While-Schleife und verursachte eine unendliche While-Schleife. Irgendwelche Vorschläge? –

+0

Ich habe keine Ahnung, warum die zweite While-Schleife unendlich ist, es ist das gleiche wie die erste Schleife. Hinter den Kulissen muss etwas wirklich Seltsames passieren. Eine Möglichkeit, um es zu umgehen ist ein Index in der ersten Schleife zu zählen, damit Sie wissen, wie lange die zweite Schleife sein sollte Edit: Sie haben bereits 'n' als die Größe, die eine Ausgangsbedingung in der Sekunde sein kann Schleife. –