• 締切済み

C言語のプログラムを見てください

ある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; }

みんなの回答

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.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]; } } }

  • XenoneX
  • ベストアンサー率85% (12/14)
回答No.4

>>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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> fscanf(fp,"%d %lf", &x[N],&y[N]); > printf("x=%d\n y=%lf\n",x[N],y[N]); Nって #define N 100 で定義したマクロですから、100って定数ですよね?

  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.2

>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); ここも少し変わるね。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

>#define N 100 >fscanf(fp,"%d %lf", &x[N],&y[N]); >printf("x=%d\n y=%lf\n",x[N],y[N]); 上記をよく見てよく考えてください。

関連するQ&A