• ベストアンサー

学生番号が正常に出力されていません

この質問と同じ質問が他に1つありますが、何分急いでいますのでご了承下さい。以下のプログラムで実行結果が、入力された得点に対応する学生番号を得点の高い順に並び替えて出力したいのです。得点の方は正常に出力されているのですが学生番号がおかしな出力になっています。しかし、どこをどう直せば良いか分かりません。なので分かりやすく説明お願い致します。 #include<stdio.h> #define M 10 #define N 5 void sort_score(int score_cpy[M]); int linear_search(int score_cpy[M],int key); void exchange_number(int order[M],char number[M][N]); int no; int main(void) { int i,score[M],score_cpy[M],order[M]; char number[M][N]; printf("人数を入力して下さい:"); scanf("%d",&no); ("学生番号と平均点を入力して下さい。"); for(i=0;i<no;i++){ printf("学生番号:"); scanf("%s",&number[i][N]); printf("得点:"); scanf("%d",&score[i]); } for(i=0;i<=M;i++){ score_cpy[i]=score[i]; } sort_score(score_cpy); for(i=0;i<M;i++){ order[i]=linear_search(score_cpy,score[i]); } exchange_number(order,number); printf("\n\n得点の高い順に並び替えて表示します\n\n"); for(i=0;i<no;i++){ printf("学生番号 :%s %d点\n",number[i],score_cpy[i]); } return 0; } void sort_score(int score_cpy[M]) { int i,j,score; for(j=0;j<no-1;j++){ for(i=no-1;i>0;i--){ if(score_cpy[i-1]<score_cpy[i]){ score=score_cpy[i-1]; score_cpy[i-1]=score_cpy[i]; score_cpy[i]=score; } } } } int linear_search(int score_cpy[M],int key) { int i; for(i=0;i<no;i++){ if(score_cpy[i]==key){ return i; } } return -1; } void exchange_number(int order[M],char number[M][N]) { int i,temp[M]; for(i=0;i<M;i++){ if(order[i]==-1)break; temp[i]=number[i][N]; } for(i=0;i<M;i++){ if(order[i]==-1)break; number[order[i]][N]=temp[i]; } } 人数を入力して下さい:10 学生番号:y3051 得点:85 学生番号:y3052 得点:65 学生番号:y3053 得点:75 学生番号:y3054 得点:63 学生番号:y3055 得点:95 学生番号:y3056 得点:68 学生番号:y3057 得点:80 学生番号:y3058 得点:90 学生番号:y3059 得点:83 学生番号:y3060 得点:70 得点の高い順に並び替えて表示します 学生番号 : 95点 学生番号 :y3051y3052y3053y3054y3055y3056y3057y3058y3059y3060 90点 学生番号 :y3052y3053y3054y3055y3056y3057y3058y3059y3060 85点 学生番号 :y3053y3054y3055y3056y3057y3058y3059y3060 83点 学生番号 :y3054y3055y3056y3057y3058y3059y3060 80点 学生番号 :y3055y3056y3057y3058y3059y3060 75点 学生番号 :y3056y3057y3058y3059y3060 70点 学生番号 :y3057y3058y3059y3060 68点 学生番号 :y3058y3059y3060 65点 学生番号 :y3059y3060 63点

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

いろいろ突っ込みが入りそうですが、あなたのプログラムの原型をできる限りいじらずに作ってみました。変更箇所には変更のコメントを入れてあります。 #include<stdio.h> #include <string.h> //変更 strcpyを使用するときに必要 #define M 10 #define N 6 //変更 学生番号が5桁なら5+1=6桁分の領域が必要 void sort_score(int score_cpy[M]); int linear_search(int score_cpy[M],int key); void exchange_number(int order[M],char number[M][N]); int no; int main(void) { int i,score[M],score_cpy[M],order[M]; char number[M][N]; printf("人数を入力して下さい:"); scanf("%d",&no); ("学生番号と平均点を入力して下さい。"); for(i=0;i<no;i++){ printf("学生番号:"); scanf("%s",number[i]);//変更 &number[i][0]でもOK printf("得点:"); scanf("%d",&score[i]); } for(i=0;i<=M;i++){ score_cpy[i]=score[i]; } sort_score(score_cpy); for(i=0;i<M;i++){ order[i]=linear_search(score_cpy,score[i]); } exchange_number(order,number); printf("\n\n得点の高い順に並び替えて表示します\n\n"); for(i=0;i<no;i++){ printf("学生番号 :%s %d点\n",number[i],score_cpy[i]); } return 0; } void sort_score(int score_cpy[M]) { int i,j,score; for(j=0;j<no-1;j++){ for(i=no-1;i>0;i--){ if(score_cpy[i-1]<score_cpy[i]){ score=score_cpy[i-1]; score_cpy[i-1]=score_cpy[i]; score_cpy[i]=score; } } } } int linear_search(int score_cpy[M],int key) { int i; for(i=0;i<no;i++){ if(score_cpy[i]==key){ return i; } } return -1; } void exchange_number(int order[M],char number[M][N]) { int i; char tmp[M][N]; //変更 numberの退避領域なので、numberと同じ型 for(i=0;i<M;i++){ if(order[i]==-1)break; strcpy(tmp[i],number[i]); //変更 文字列のコピーはstrcpyを使用 } for(i=0;i<M;i++){ if(order[i]==-1)break; strcpy(number[order[i]],tmp[i]); //変更 文字列のコピーはstrcpyを使用 } }

freezeb
質問者

お礼

先ほど、実際にプログラムを書きなおし起動させてみると見事に実行結果通りの正常な値が出ました!。本当にありがとうございます。

その他の回答 (2)

  • papagal
  • ベストアンサー率50% (7/14)
回答No.2

> printf("人数を入力して下さい:"); > scanf("%d",&no); > ("学生番号と平均点を入力して下さい。"); > for(i=0;i<no;i++){ > printf("学生番号:"); > scanf("%s",&number[i][N]); > printf("得点:"); > scanf("%d",&score[i]); > } 学生番号をscanfする時に読み込むアドレスが違うからでしょう 正しくは scanf("%s",&number[i][0]); ではないでしょうか

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

Cでの文字列の基本を忘れてます。 終端記号'\0'がつくので、見掛け上の文字数+1の領域が必要です。

関連するQ&A