ページ 11

C言語の課題について

Posted: 2010年4月21日(水) 00:29
by バーナー ブルース
生徒の番号、名前と点数を入力した後、それを昇順に並べ直したいのですが
実行はできるのですが、うまく並び替えられません


#include<stdio.h>
struct data{
int bango;
char name[10];
int ten;
};
struct data seiseki[6];
main(){
int i,j;
for(i=0;i<5;i++){
printf("%d人目 番号 名前 点数\n",i+1);
scanf("%d %s %d",&seiseki.bango,&seiseki.name,&seiseki.ten);
}
for(j=0;j<4;j++){
for(i=1;i<5;i++){
if(seiseki[j].ten>seiseki.ten){
seiseki[6]=seiseki;
seiseki=seiseki[j];
seiseki[j]=seiseki[6];
}
}
}
printf("番号 名前 点数\n");
for(i=0;i<5;i++){
printf("%d %4s %4d\n",seiseki.bango,seiseki.name,seiseki.ten);
}
}


自分ではif文の辺りが間違っているような気がします

Re:C言語の課題について

Posted: 2010年4月21日(水) 00:52
by フリオ
 
 どううまくいかないのか、具体的に書いたほうがいいです。
 
>scanf("%d %s %d",&seiseki.bango,&seiseki.name,&seiseki.ten);
 &seiseki.name の & はいりません。

 また、seiseki[6] は、配列の範囲外です。
 

Re:C言語の課題について

Posted: 2010年4月21日(水) 23:40
by バーナー ブルース
1人目 番号 名前 点数
2
2
2
2人目 番号 名前 点数
3
3
3
3人目 番号 名前 点数
4
4
4
4人目 番号 名前 点数
5
5
5
5人目 番号 名前 点数
1
1
1


上のように5人分のデータを入力するところまではいいのですが、下の実行結果のように順序がバラバラになってしまうんです


番号 名前 点数
1 1 1
5 5 5
4 4 4
2 2 2
3 3 3

Re:C言語の課題について

Posted: 2010年4月24日(土) 00:13
by ウルスラ
seiseki[6]は配列範囲外です。
配列は、"宣言した数値 - 1"までの配列しか使うことが出来ません。
なので、上記のように指定すると、seiseki[0]からseiseki[5]までの配列を使用することが出来ます。

よって、このプログラムの場合、seiseki[6]を"a"などの仮変数にして、順序を入れ替えたほうが分かりやすいです。

<例>
int a; /* 最初に宣言 */

a = seiseki;
seiseki = seiseki[j];
seiseki[j] = a;

あと、
for(j=0;j<4;j++){
for(i=1;i<5;i++){
if(seiseki[j].ten>seiseki.ten){
<中略>
}
}
}
上記の部分の、for文を次のように直してください
これで出来ると思います。
for( j = 0 ; j < 5 ; j++ ){
for( i = j + 1 ; i < 6 ; i++ ){
if( seiseki[j].ten > seiseki.ten ){  
<中略>
}
}
}

これでどうでしょう?
意味が分からなければ、またお答えします。

Re:C言語の課題について

Posted: 2010年4月24日(土) 00:26
by box
> int a; /* 最初に宣言 */
>
> a = seiseki;

aとseiseki[/url]の型が違うので、アウト。

Re:C言語の課題について

Posted: 2010年4月24日(土) 12:32
by ウルスラ
おっと。型を見逃していました。

int a;ではなく、

struct data a;

で、ビルドできますね。