• 締切済み

C言語 教えて下さい!!!

教えてください!! data01.txt というテストの得点が書き込んであるテキストファイルから得点を読み込んで、得点順に並べ替えて表示させるプログラミングなんですがコンパイルは成功します。 しかし、実行してみると全く違う結果になってしまいます。 どこが間違っているのか指摘してください。 #include <stdio.h> /* 構造体の宣言 */ struct data { int score; int rank; }d; /* 関数 */ void rank(struct data *x, int n) { int i, j; for ( i=0; i<n; i++) x[i].rank = 1; for ( i=0; i<n; i++) for ( j=0; j<n; j++) if(x[i].score < x[j].score) x[i].rank++; } /* main文 */ int main(void) { int a; struct data x[50]; /* ファイルから得点を読み込む */ FILE *fp; fp = fopen("data01.txt", "r"); for ( a=0; a<50; a++) x[a] = atoi(getc(fp); fclose(fp); /* 順位付け */ a = 50; rank(x,a); printf("Rank Score\n"); for ( a=0; a<50; a++) printf("%d %d\n", x[a].rank, x[a].score); return 0; } ちなみに data.txt は 左側の列は番号 右側の列が得点 1 50 2 62 3 73 4 42 5 99 6 10 7 68 8 54 9 87 10 98 11 54 12 30 13 15 14 60 15 78 16 98 17 65 18 75 19 32 20 99 21 80 22 64 23 52 24 31 25 99 26 10 27 20 28 5 29 65 30 53 31 54 32 35 33 45 34 23 35 26 36 97 37 88 38 99 39 56 40 42 41 32 42 56 43 56 44 54 45 0 46 54 47 80 48 99 49 54 50 56

みんなの回答

  • TYWalker
  • ベストアンサー率42% (281/661)
回答No.3

#1です。 まあもう少し親切に書きましょうかね。 (1) rank関数に入ったらすぐ、nおよび*xが何が渡されたかSTDERRに出力するコードを書いてください。 (2) rank関数の末尾に、なんという値を返そうとしているか、iおよびjを同様に出力するコードを書いてください。 (3)まず2つの数字の組をソートしてください。うまくいきましたか。 (4)3つの数字の組をソートしてください。うまくいきましたか。 (5)あなたの考えでは、(1)および(2)でどのような値が表示されるべきですか。現実はどうですか。 あとはデバッガーを使う。

回答No.2

>どこが間違っているのか指摘してください。 デバッグする姿勢が間違っています。 デバッグは自分でやるもので他人に依頼するものではありません。 デバッグをしてくれというのは質問でもありません。 入力・処理・結果の三要素だけです。入力が正しく予定の結果が得られないなら処理が間違っています。処理のどこが間違っているかは途中経過を見たりすれば明らかになります。また、入力を単純にすると解析しやすくもなります。ソートの問題なら3,4点にすれば割と簡単に解るでしょう。 人間ならどのようにソートするかを考えて、それに合わせたコーディングをすればわかり易いでしょう。

  • TYWalker
  • ベストアンサー率42% (281/661)
回答No.1

結果が出ないって、間違った順番に並ぶってことですか? データを2個、3個、4個と増やして、あとrank関数が何回、どういう引数でどういう値を返しているかチェックしたらわかるんじゃないですか。 他人はあなたの便利屋じゃないんで、こんな長大なプログラムとデータを読ませ、実行させて、結果だけ教えてもらおうっていうのはずうずうしいし、それでは力はつかないと思いますよ。 インターネットは暇な人がいるからあなたのプログラムをバカ正直に実行して、噛んで含めるように教えてくれる人もいると思いますけど、そう言う人も思いとどまった方がいいと思います。