いやいや、ひねくれた例題ですね。間違い箇所が多く見られ、実際にまだコンパイルはされていないようですよね。レポートは明日までとのことですので参考に...。
ここでの一番の問題は、なぜ「void exchange_number(int order[M],char number[M][N]);」関数を作らなければいけないかの疑問です。結果は、ソート降順に行われることから、次の for() ループでは
order[i]=linear_search(score_cpy,score[i]);
の学生番号順にソート順番が何番であるかを求めるのではなく、
order[i]=linear_search(score,score_cpy[i]);
のソート結果に対して何番の学生番号が該当するのかのプログラム内容とならなければなりません。事例ではわざとかく乱させて、ご要望の関数を作らないとさも答えが出ないような内容になっています。例題は考えられています。
回答は、平均点が重なってもきちんと表示されるように「 signed char flag[M];」を追加してみました。したがって、要望の関数は不要です。とりあえず、動くかどうか試してみてください。
#include<stdio.h>
#define M 10
#define N 8// 余裕を持たせましょう。
void sort_score(int score_cpy[]);
int linear_search(int key, int score[], signed char flag[]);
int no;
int main(void) {
int i,score[M],score_cpy[M],order[M];
char number[M][N];
signed char flag[M];
printf("人数を入力して下さい:");
scanf("%d",&no);
("学生番号と平均点を入力して下さい。");
for(i=0;i<no;i++) {
printf("学生番号:");
scanf("%s",number[i]);
printf("得点:");
scanf("%d",&score[i]);
}
for(i=0;i<no;i++) {
score_cpy[i]=score[i];
flag[i] = 0;
}
sort_score(score_cpy);
for(i=0;i<no;i++)
order[i]=linear_search(score_cpy[i], score, flag);
printf("\n\n得点の高い順に並び替えて表示します\n\n");
for(i=0;i<no;i++)
printf("学生番号 :%s %d点\n", number[order[i]],score_cpy[i]);
return 0;
}
void sort_score(int score_cpy[]) {
int i,j,score;
for(j=0;j<no-1;j++) {
for(i=no-1;i>j;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 key,int score[], signed char flag[]) {
int i;
for(i=0;i<no;i++) {
if(key == score[i] && flag[i] == 0) {
flag[i] = -1;// 重複を回避する
break;
}
}
return i;
}
投稿日時 - 2010-01-21 20:12:36