2017-01-24 3 views
1

Der Teil des Codes, der falsch ist, ist das Ende über Mins/Maxes. Ich bin mir nicht sicher, ob man dafür eine Schleife einfügt oder gar selbst Min- und Max-Variablen erstellt.Wie finde ich die Min/Max Werte in einer Datei?

+1

'min = num; max = num; 'hier ist' num' nicht initialisiert. Initialisiere "min" und "max" auf einen der Werte aus der Datei in einer der Schleifen bei der ersten Iteration und vergleiche sie dann. –

+1

Was ist der Wert von 'num' in der Codezeile' min = num; '? – chux

+0

Ich habe versucht, eine Nummer aus der Datei zu machen –

Antwort

1

Es gibt mindestens drei Ausgaben in der Min/Max-Detektionsschleife:

Zuerst wird, wie durch CHUX angegeben, und minmax nicht initialisiert werden; Daher ist die Anweisung if (num < min)... bei der Iteration der Zahlen bei weitem nicht garantiert, ordnungsgemäß zu funktionieren (dasselbe gilt natürlich für max). initialisieren So min mit INT_MAX und initialisieren max mit INT_MIN (beide definiert in <limits.h>), so dass bereits in der ersten Iteration min und max wird auf Werte aus der Datei festgelegt werden.

Zweitens, die Überprüfung für if (num < min)... gibt Ihnen ein "lokales" Minimum, d. H. Das Minimum für alle bisher gelesenen Zahlen, aber nicht das "absolute" Minimum, da zu einem späteren Zeitpunkt kleinere Zahlen kommen können. Also ist min/max am Ende der Schleife gültig, nicht während der Iteration.

Drittens ist if (num < min) ... else if (num > max) zumindest dann falsch, wenn die Datei nur eine Nummer enthält.

Ihr Code wie folgt aussehen könnte:

int min = INT_MAX; 
int max = INT_MIN; 
while (fscanf(ifile, "%d", &num) != EOF) { 
    if (num < min) 
     min = num; 
    if (num > max) 
     max = num; 
} 
// min/max are valid earliest at this point: 
printf ("The minimum is %d\n", min); 
printf ("The maximum is %d\n", max); 

// Note that min/max will not be correct if the file does not contain any number; 
// Note further, that fscanf(ifile, "%d", &num) != EOF may result in an endless loop if the file contains characters that "%d" will not read as a valid integral value. 
// But this is left to the OP for further improvement :-) 
0

Betrachten Sie die folgende Änderung an Ihrem Code:

#include <stdio.h> 

int main(void) { 
    int num, i, total, average, min, max; 

    // open file 
    FILE *ifile = fopen("scores.txt", "r"); 
    // if opening file fails, print error message and exit 1 
    if (ifile == NULL) { 
     perror("Error: Failed to open file."); 
     return 1; 
    } 

    // initialize i and total to zero. 
    i = total = 0; 
    // read values from file until EOF is returned by fscanf, 
    // or until an error (hence the comparison "== 1") 
    while(fscanf(ifile, "%d", &num) == 1) { 
     // In first round of loop, initialize min and max 
     // to the number being read (num) 
     // After min/max have been initialized, they can then 
     // be compared and modified in the second if statement 
     // in the remaining loop rounds 
     if (i == 0) { 
      min = num; 
      max = num; 
      total += num; 
      ++i; 
      continue; 
     } 
     if (num < min) { 
      min = num; 
     } else if (num > max) { 
      max = num; 
     } 
     total += num; 
     ++i; 
    } 

    // initialize average 
    average = total/i; 

    // summary 
    printf("The sum of all integers in file is %d.\n", total); 
    printf("The number of integers in file is %d.\n", i); 
    printf("The average of all integers in file is %d.\n", average); 
    printf ("The minimum is %d\n", min); 
    printf ("The maximum is %d\n", max); 

    fclose(ifile); 
    return 0; 
} 
Verwandte Themen