• 締切済み

c言語のプログラミングについて聞きたいのですが

自分は課題で「10人分の名前と点数を入力して降順に並び替える」というプログラムを作ろうとしているのですが、なかなかうまくいきません。一応↓の形までできたのですがなぜか数字が変になります。 どうしてか教えていただけないでしょうか。 #include<stdio.h> int main(void) {     int i,j;     int tensu[10][3];     char namae[10][6]; for(i=0;i<10;i++){ printf("名前の入力>>"); scanf("%s",&namae[i]); printf("点数の入力>>"); scanf("%d",tensu[i]); } printf("名前   点数\n"); for(j=0;j<10;j++) { printf("%s ",&namae[j]); printf("%10d\n",tensu[j]); } return 0; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください

みんなの回答

回答No.3

#1 >namae[i]は2次元配列のうち1次元まで書いたものですから、char *型です。 >これに&をつけると、char **型になってしまいます。 namae[i]はchar[6]型だから、&namae[i]は、char(*)[6]型です。

kamimasita
質問者

お礼

回答ありがとございます

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

ソースコードを拝見するに、全体的に配列の理解が足りないようです。 習ったことを復習しましょう。 そのうえで以下を見直しましょう。 並び替えはそれができてからです。 > int tensu[10][3]; 何のために 10 * 3 個の int 領域をしているのですか? > scanf("%d",tensu[i]); 1番目を直すとたぶんここでエラーが出ます。しかし、おかしいのは1番目です。(tensu ではなく)tensu[i] の型が何か考え、scanf の2番目以降の引数で何を渡せばいいか調べて書き直しましょう。 > printf("%s ",&namae[j]); namae[j] の型が何か考えましょう。そうすれば不要なものがあることがわかります。

kamimasita
質問者

お礼

3つのことを考えて見直していたら間違っていた部分がわかりました。 ありがとございます

回答No.1

ソートを行う場合は一般的にポインタを使うのが多いですが、ここに書くには長すぎるので、最後に幾つかサイトを示すことにします。 まず scanf("%s",&namae[i]); が問題です。namae[i]は2次元配列のうち1次元まで書いたものですから、char *型です。これに&をつけると、char **型になってしまいます。scanfにおいて%sに対応する引数はchar *型ですから、&は必要ありません。 一方で、その2行後の scanf("%d",tensu[i]); では&が抜けています。 何故必要なのかという話はポインタを理解してからになりますが、"scanfでは通常&が必要で、%sの時には&が必要ない"というぐらいで覚えてみてください。 ひとまず、書かれているプログラムを直すならば、次のようになります。 #include<stdio.h> int main(void){     int i,j;     int tensu[10][3];     char namae[10][6];     for(i=0;i<10;i++){         printf("名前の入力>>");         scanf("%5s%*c",namae[i]);         printf("点数の入力>>");         scanf("%d%*c",&tensu[i]);     }     printf("名前   点数\n");     for(j=0;j<10;j++) {         printf("%s ",&namae[j]);         printf("%10d\n",tensu[j]);     }     return 0; } ソート部分を考慮すると、名前と得点はひとまとめにしたほうが良いでしょう。構造体の出番です。与えられた問題に対する、私の解答例を示しておきます。なお、名前に改行以外の空白文字が使われても許容するように書いています。なお、名前昇順・得点降順としました。 #include<stdio.h> #include<stdlib.h> #include<string.h> #define NUM 10 struct datas{ char name[32]; int point; }; int comp(const void *p1,const void *p2){ struct datas n1,n2; n1=*(struct datas *)p1; n2=*(struct datas *)p2; if(n1.point>n2.point) return -1; else if(n1.point<n2.point) return 1; else return strcmp(n1.name,n2.name); } int main(void){ struct datas person[NUM]; int i,j,k; for(i=0;i<NUM;i++){ printf("Input name>>>"); scanf("%31[^\n]%*c",person[i].name); printf("Input point>>>"); scanf("%d%*c",&person[i].point); } qsort(person,NUM,sizeof(struct datas),comp); printf("Name\tPoint\n"); for(i=0;i<NUM;i++) printf("%s\t%d\n",person[i].name,person[i].point); return 0; } 多分、文法事項を理解するのが早道であると思います。参考になるサイトを幾つか紹介しますので、見てみてください。 <参考サイト> 上記のソースは、概ねここのテキストを参考に書きました。 https://sites.google.com/site/tatuyanctext/home 昔から有名です。 http://homepage3.nifty.com/mmgames/c_guide/ ここも詳しくわかりやすいです。 http://www.geocities.jp/ky_webid/

参考URL:
https://sites.google.com/site/tatuyanctext/home
kamimasita
質問者

お礼

模範解答や参考サイトの紹介までしてくれてありがとございます 構造体は別の課題でも使うので助かりました

関連するQ&A

専門家に質問してみよう