0

データ ファイルから整数を読み取り、最小値と最大値を出力する簡単なプログラムを作成しようとしています。入力ファイルの最初の整数は、さらにいくつの整数が読み取られるかを示し、次に整数がリストされます。

プログラムは問題なくコンパイルされますが、テスト データ ファイルのセットに含まれていない値が返されます。この問題の診断を手伝ってくれる人はいますか?

int main(){
FILE *fp = fopen("data.txt", "r");
int count;
int num;
int i;
int min = 0;
int max = 0;

fscanf (fp, "%d", &count);

for (i = 0; i < count; i++)
    fscanf( fp, "%d", &i);  
    {   
    if (num < min)
        min = num;
    if (num > max)
        max = num;
    }
fclose (fp);

printf("Of the %d integers, the minimum value is %d and the maximum value is %d \n", count, min, max);} 
4

4 に答える 4

5

コードにいくつかのバグがあります。

まず、cnicutar が言うようにループ内に変更iします。入力を正しく読み取ることができるようにします。そして、左ブラケットはループの後にある必要があります。numfscanf{for

for (i = 0; i < count; i++)  {   // put the { here
    fscanf( fp, "%d", &num);

第二に、minandmaxが正しく開始されていません。INT_MAXそれらをとに変更する必要がありINT_MINます。そして#include <limits.h>

#include <stdio.h>
#include <limits.h>
......
int min = INT_MAX;
int max = INT_MIN;
于 2012-09-25T03:47:14.283 に答える
2

halfelf の変更に加えて、入力数値の少なくとも 1 つがその値より小さくなるように、min を任意の大きな値に初期化する必要があります。それ以外の場合、入力値がすべて正の場合、最小値 0 が表示されることになります。任意の大きな初期値よりも優れているのは、条件付きロジックを使用してループの初回を検出し、最小値と最大値を入力ストリームの最初の実際の値に設定することです。これにより、min を開始するサイズ (および max を開始するサイズは小さい) に関するジレンマが回避されます。これについては言及しませんでしたが、基本的には逆の問題です。

于 2012-09-25T03:48:19.357 に答える
0
int min=0;
int max=0;
int n = sizeof(arr);
for (int i=0;i<n;i++)
{
   if (i==0){ 
     min=arr[i];
     max=arr[i];
   }
   else{
     if (arr[i]<min) min=arr[i];
     if (arr[i]>max) max=arr[i];
   }

}
于 2014-09-20T07:48:19.000 に答える
0

num変数は空で、使用されていません。と を比較していmaxますmin。したがってmaxminと のガベージ値が格納されnumます。次のようにします。

int main(){
FILE *fp = fopen("data.txt", "r");
int count=0;
int i;
int min = 0;
int max = 0;
while (!feof(fp))
{
count++;
fscanf( fp, "%d", &i);
if (i < min)
min = i;
if (i > max)
max = i;
}
printf("Of the %d integers, the minimum value is %d and the maximum value is %d \n", count, min, max);}
于 2012-09-25T03:53:30.727 に答える