2017-01-24 18 views
1
#include <stdio.h> 
int main(void) 
{ 
    int num, i, total, average, min, max; 
    min = num; 
    max = num; 
    FILE *ifile; 
    ifile = fopen("scores.txt", "r"); 

    i = total = 0; 
    while (fscanf(ifile, "%d", &num) != EOF) { 
     i++; 
     total += num; 
    } 

    printf("The total of the integers is %d.\n", total); 
    printf("The number of integers in the file is %d.\n", i); 

    average = total/i; 

    printf("The average of the integers is %d.\n", average); 

    while (fscanf(ifile, "%d", &num) != EOF) { 
     if (num < min) { 
      printf ("The minimum is %d\n", min); 
     } else if (num > max) { 
      printf ("The maximum is %d\n", max); 
     } 
    } 

    fclose(ifile); 
    return (0); 
} 

コードの部分が間違っています。 私はこれをループするか、min変数とmax変数を作成するかどうかはわかりません。ファイル内の最小値/最大値を見つける方法

+1

'分= numは、 max = num; 'ここで' num'は初期化されていません。いずれかのループの最初の反復でファイルからの値のいずれかに 'min'と' max'を初期化して比較してください。 –

+1

'min = num;'の行の 'num'の値は何ですか? – chux

+0

私はnumをファイルから作成しようとしていました –

答えて

1

あなたの最小/最大検出ループでは、少なくとも3つの問題があります。

まず、chuxによって示されるように、minmaxが初期化されていません。したがって、数字を反復するときには、文if (num < min)...は正しく動作することが保証されていません(もちろんmaxでも同じです)。 だから、すでに最初の反復でminmaxがあなたのファイルからの値に設定されるように、INT_MAXminを初期化し、INT_MINmax<limits.h>で定義された両方)を初期化します。

第2に、if (num < min)...のチェックでは、「ローカル」最小値、つまりこれまでに読み込まれたすべての数値の最小値が得られますが、「絶対」最小値はありません。最小値/最大値はループの最後に有効で、反復中は有効ではありません。

第3に、ファイルに数字が1つしかない場合、少なくともif (num < min) ... else if (num > max)は間違っています。

あなたのコードは、次のようになります。

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

はあなたのコードに以下の変更を検討:

#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; 
} 
関連する問題