みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

この質問と同じ質問が他に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点

投稿日時 - 2010-01-21 19:55:12

QNo.5611595

すぐに回答ほしいです

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

いろいろ突っ込みが入りそうですが、あなたのプログラムの原型をできる限りいじらずに作ってみました。変更箇所には変更のコメントを入れてあります。

#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を使用
}
}

投稿日時 - 2010-01-21 20:47:36

お礼

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

投稿日時 - 2010-01-22 00:56:06

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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]);

ではないでしょうか

投稿日時 - 2010-01-21 20:16:44

ANo.1

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

投稿日時 - 2010-01-21 20:12:09