プロが教える店舗&オフィスのセキュリティ対策術

ある100行の値がx列、y列の2列あるファイルを読み込んでそれを配列に入れ、yの最小値及びそれと同じ行にあるxの値を表示するプログラムを書きたいのですがy列の最小値を表示するプログラムを書き終えた所でコンパイルして実行してみると正しく値が表示されませんでした。それどころか実行するたびに値が変わってしまいます。どこがおかしいのかわからないため、ご指摘のほどよろしくお願いします。また、できれば同じ行にあるx列の値も表示させるプログラムを教えてください。
よろしくお願いします。

#include <stdio.h>
#include <stdlib.h>
#define N 100
int main(void)
{

int x[N],i;
double y[N],min;
FILE *fp;

fp=fopen("book.dat","r");
if(fp==NULL){
puts("can't open file!");
exit(-1);
}

for(i=0;i<N;i++){
fscanf(fp,"%d %lf", &x[N],&y[N]);
printf("x=%d\n y=%lf\n",x[N],y[N]);
}

min=y[0];
for(i=1;i<N;i++){
if(y[i]<min) min=y[i];
}


fclose(fp);
printf("最小値:%lf\n",min);

return 0;
}

A 回答 (5件)

#4さんの、keep の案をお借りして、ループが一回で済む形にしてみました。




for( i=0; i<N; i++) {
fscanf(fp,"%d %lf", &x[i],&y[i]);
printf("x=%d\n y=%lf\n",x[i],y[i]);

if ( i==0 ) { // i が 0の時はmin と keepに配列の先頭を代入
min = y[0];
keep = x[0];
} else {
if ( min > y[i] ) { // i が 1以上の時は、min と y[i] の小さい方をmin に代入
min = y[i]; // その時のx[i]を保存
keep = x[i];
}
}
}
    • good
    • 0

>>fscanf(fp,"%d %lf", &x[N],&y[N]);


fscanf(fp,"%d %lf", &x[i], &y[i]);
だね。上のだと常にx[100], y[100]に代入している。つまり、x[0~99], y[0~99]にはごみが入ってることになるから数値が変わってる。いっそセグッてくれたら分かりやすかったかも。

ついでに、最初に int keep; を宣言しておいて
if(y[i] < min){
min = y[i]
keep = x[i]
}
とすれば、同じ行のx列の値がkeepに保存されてるから
printf("x列:%d、最小値:%lf\n", keep, min);
とでもすればOK
    • good
    • 0

> fscanf(fp,"%d %lf", &x[N],&y[N]);


> printf("x=%d\n y=%lf\n",x[N],y[N]);

Nって
#define N 100
で定義したマクロですから、100って定数ですよね?
    • good
    • 0

>for(i=0;i<N;i++){


>fscanf(fp,"%d %lf", &x[N],&y[N]);
>printf("x=%d\n y=%lf\n",x[N],y[N]);
>}


ループして配列の各要素に読み込むはずなのに、常にx[N](というかx[10])に読み込んでますよ。ループ変数iは使わないの?


>min=y[i];
minに代入じゃなくて、iを代入するようにすればよいのでは?
最小値が入った添え字を格納するってことね。そうすると

>printf("最小値:%lf\n",min);
ここも少し変わるね。
    • good
    • 0

>#define N 100



>fscanf(fp,"%d %lf", &x[N],&y[N]);
>printf("x=%d\n y=%lf\n",x[N],y[N]);

上記をよく見てよく考えてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!