• 締切済み

Microsoft Visual C++ 6.0を使っています

プログラミングの練習をしていてどうしてもできない部分があります。 具体的にいうと、テストの教科名と点数を入力し、 テストの点数の高い順に並べるというものです。 テストの点数を並べることはできるのですが、そのテストの教科名を付随させて動かすことができません。 コードは #include<stdio.h> void main(){ char c[10]; //(1) int a[20],n,b,m,aa; printf("科目数を入力してください:"); scanf("%d",&n); for(b=0;b<n;b++){ printf("科目名を入力してください:");  scanf("%s",&c) //(2) printf("点数を入力してください:"); scanf("%d",&a[b]); } for(m=n;m>1;m--){ for(b=0;b<m;b++){ if(a[b]<a[b+1]){ aa=a[b]; a[b]=a[b+1]; a[b+1]=aa; } } printf("%s",c); //(3) printf("%d ",a[b]); } }                上記の(1)、(2)、(3)の部分などがわかりません。 点数の並び替えに伴って科目名も変えたいので、 for文の中にも科目名に関するプログラミングが必要だと思いますが、 そもそもchar型が適切かも分からないので手がつけられません。 プログラミング初心者なのでどなたか分かりやすく教えていただけませんか?

みんなの回答

  • benelli
  • ベストアンサー率51% (78/152)
回答No.2

練習内容や目的により内容が変わりますのでヒント程度しか書けませんがご了承ください。 ひとまず一番簡単な解決方法を書きたいと思います。(模範回答というわけではありません。あくまで理解しやすさを優先) (1) 点数を入れる変数aは「int a[20]」なので、配列が20なので点数という数字データは20個まで格納できますが、「char c[10]」では文字データの配列が10なだけなので単に10文字のデータを格納できるにすぎません。 方法はいろいろありますが、教科書的な解決方法としてはcharの二次元配列を使います。 ※「char c[10]」では10文字ではなく実質9文字しか入りませんが、そういった点はここでは考慮しませんでした。今は不要な知識だと思うので頭の片隅に入れておいてください。 (2) この行の二行下と同じように、変数cにも配列が必要です。ですが単に配列をcに追加するだけではダメです。ちょっと難しいかも知れませんが、以下を参考にしてはどうでしょうか?(1)(2)両方のヒントになるかと思います。 http://wisdom.sakura.ne.jp/programming/c/c19.html (3) 問題点の内容・解決方法は(2)と同じです。 配列の概念はC言語に限らずどの言語でも重要な要素です。特にchar型の配列は難しい点は多々ありますが、ポインタなどこれ以上に難しい部分も今後たくさん覚えなくてはなりませんので、きっちり覚えて使いこなせるようになってください。 それと問題とは直接関係ありませんが、配列名はもっと分かりやすいものにいたしましょう。このコードが教科書に載っていたものなら仕方ないですが、自分で作ったものでしたらアルファベット一文字などにするのではなく、変数名を見ただけでそれが何のために使用する変数なのか分かるようにしましょう。最低ローマ字でもよいのでkamokumeiやtensuなどでも構いません。これだけでも思考への負担がかなり軽減され理解が早くなりますので。

coralchief
質問者

お礼

とても分かりやすい解説ありがとうございます。 多次元のchar型が存在することをしりませんでしたので、 上の問題に役立てられそうです。 ありがとうございます。

coralchief
質問者

補足

度々もうしわけございません。 charの使い方についてはおかげ様で理解できましたが、 文字列を数字の配列と同じようにソートしてみたらできませんでした。 c[b]に収納されているのが数字ではなく文字であるため、「=」を使えないのは当然ですよね。 このような場合どうすればよいか教えていただけませんか? 変数名についてのご指摘ありがとうございます。以後気をつけます。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

教科名とその点数をペアにしたものを構造体とすることから始めましょう。 typedef struct subject_tag {  char subject_name[10];  int score; } subject; 教科ごとの点数を集めたものを配列にします。 subject result[20]; あとは result に各教科の点数を順に格納して、entry.score の値に応じてソートする。

coralchief
質問者

お礼

ありがとうございます。 少し難しそうですが試してみます

関連するQ&A

  • Visual C 2005について教えてください。

    プログラミング初心者です。学校でVisual Studio 2003で習っています。最近自宅で配布の2005を使い出したのですが簡単な質問なのですが、少し違うと思うと思うところがあるので教えてください。 例えば、 printf("数字入力"); scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); としてデバッグして全て5を入力した場合、エンターを押すと2003の場合、 数字入力5 5 5 と表示されたと思うんですが、2005の場合は 数字入力5 5 5 とエンターキーで改行してしまいます。 これを直す設定のようなものがあれば教えて欲しいです。お願いします。

  • 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; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください

  • C言語、ポインタについて。

    C言語初心者です。"やさしいC"などの入門書を呼んでいて「ポインタ」につまづきました。 別書を買ったり、サイトを見たりしたのですが、理解できませんでした。 "やさしいC"からの引用なのですが、 正: #include <stdio.h> int add(int *x1,int *x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(&n1,&n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int *x1, int *x2,int a){ *x1+=a; *x2+=a; } 誤: #include <stdio.h> int add(int x1,int x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(n1,n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int x1, int x2,int a){ x1+=a; x2+=a; } この2つの違いはなんでしょうか。 アドレスか、そうでないか、という違いはわかりますが、なぜ"誤"のコードだと正しく処理されないのかがわかりません。 教えてください、お願いします。 (「やさしいC」の回答より引用)

  • c言語のプログラムについて

    今年からC言語を始めた大学1年生です。レポートで四則計算を行うプログラムを6/19までに作らないといけないです。使えるのは今までに習った選択型、反復型、関数scanfです。このプログラムの留意点は次の4つです。 1.使う演算を選択してもらう   例えば   どんな演算をしますか? 1:+,2:-,3:*,4:/ (選択) 2.演算を行う数値を入力してもらう   例えば   a + b の計算をします。aを入力してください。 3.演算結果を表示する   ○+○の答えは ○です 4.計算終了か、それともほかの演算を行うか 決める   0:計算終了 1:他の計算を行う を選択してください  以下のプログラムはこのことを留意してプログラムをつくりました。どこがおかしいのでしょうか。 #include<stdio.h> main() { short a,b,m,n; long c,d,e,f; c = a + b; d = a - b; e = a * b; f = a / b; m = 1; printf("整数を入力してください:"); scanf("%d",&a); printf("どんな演算をしますか?:"); printf("1: +,2: -,3: ×,4: ÷ :"); scanf("%d",&n); while(m=1){ if(n<=4){ while(m=1){ switch (n<=4){ case 1: printf("整数を入力してください:"); scanf("%d",&b); printf("%d + %d = %d \n",a,b,c); break; case 2: printf("整数を入力してください:"); scanf("%d",&b); printf("%d - %d = %d \n",a,b,d); break; case 3: printf("整数を入力してください:"); scanf("%d",&b); printf("%d × %d = %d \n",a,b,e); break; case 4: printf("整数を入力してください:"); scanf("%d",&b); printf("%d ÷ %d = %d \n",a,b,f); break; } } } else { printf("計算できません。"); printf("演算をやり直してください。\n:"); } } printf("計算を終了しますか、それとも他の計算を行いますか?:"); printf("0:計算終了,1:他の計算を行う:"); scanf("%d",&m); printf("計算を終了します。\n"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

  • C初心者です。どうかお助けを

    独習Cという本で独学中なのですが #include<stdio.h> int main() { int a,b; char ch; printf("実行したい演算は\n"); printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか\n"); do{ printf("アルファベットの1文字を入力してください:"); ch=getchar(); while(getchar()!='\n'); }while(ch!='A' && ch!='S' && ch!='M' && ch!='D'); printf("\n"); printf("最初の数字を入力してください:"); scanf("%d",&a); printf("二つめの数字を入力してください:"); scanf("%d",&b); switch(ch){ case 'A': printf("%d",a+b); break; case 'B': printf("%d",a-b); break; case 'C': printf("%d",a*b); break; case 'D': if(b!=0)printf("%d",a/b); } return 0; } このプログラムでの14行目の while(getchar()!='\n');の必要性がわかりません。 どなたか有識者の方の回答をお願いします。

  • C++ キーボードから入力した文字を配列に

    キーボードから「a、aa、b、ab、・・・」などと 文字を入力し、配列にいれたいのですが、うまくいきません。 scanf("%s", orig); とすると、 aaababのようにしか入力できないため、 「aa」のように複数の文字列を1つのものとして入力することができません。 以下にプログラムをのせたので、 ご教授お願いします! int m; unsigned char orig[500]; for(m=0;;m++){ scanf("%s", orig[m]); if(orig[m]=='E') break; }

  • Visual C++でのプログラミング

    学校でプログラミングの課題が出たので自分のパソコンに Microsoft Visual C++ 2010 Express をインストールして作ってみました。 それが以下のプログラムです。 これは任意の値nを入力してa[n]までの配列をつくり それを降順に並び替えるものです。 #include <stdio.h> #define N 10000 int main(){ int a[N],i,j,max,min,n,temp; n=0; printf("n="); scanf("%d",n); if(N<n){ return 0; } else if(n<=0){ return 0; } else if(n<=N){ for(i=0;i<=n;i++){ printf("a[%d]",i); scanf("%d\n",&a[i]); } max=min=a[0]; for(i=1;i<n;i++){ if(max<a[i]){ max=a[i]; } else if(min>a[i]){ min=a[i]; } } printf("a[i]のソート結果\n"); for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]){ temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<n;i++){ printf("a[i]=%d\n",a[i]); } printf("Max=%d\n",max); printf("Min=%d\n",min); } } これをVisual C++でデバックすると 『test.exeの0x0fcbe42e(msvcr100d.dll)にハンドルされていない例外が発生しました:0C0000005: 場所 0x00000000 に書き込み中のアクセス違反が発生しました。』 と表示されて実行できません。 今日インストールしたばかりなのでどこでエラーが起きているのかわかりません。 これはプログラミングとVisual C++のどっちが原因なのでしょうか? もしお分かりになるならば、具体的な解決方法や プログラムの訂正点などを教えていただきたいです。

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

  • c言語

    c言語の問題なんですが 氏名を姓と名に半角空けて1列に入力し、姓と名の文字数を数えるプログラムを書いてみましたがうまく走りません原因がわからないので誰か教えてください。ちなみに、書いたプログラムは、 #include <stdio.h> void mojisu(char z[] ); int main() { char z[30]; printf("氏名を英語で入力\n"); scanf("%s\n",&z); mojisu(z); } void mojisu(char z[] ) { int sei,mei, b; for(b =0,sei=0; z[b]==' '; b++); { sei+=1; } printf("姓の文字数は%d\n",sei); for(b =sei+1,mei=0 ; z[b]=='\0'; b++); { mei+=1; } printf("名の文字数は%d\n", mei); }

  • C言語のswitch文について間違っているところを教えてください

    初めに初心者ですので間違っているところは説明つきの回答をしていただければありがたいです。 今回switch文を使って 「足し算、引き算、掛け算、割り算」のプログラムを作ったつもりなのですが、intを使うと割り算の小数点が出ないしfioat文を使うとswitch文には、使えないと出るしどのようにしたら良いのか御回答よろしくお願いします。 (今は、int文でプログラムを作っているつもりです。) #include <stdio.h> void main (void) { int a,b,k; printf("どのような計算をしたいか数字を選んでください。\n"); printf(" 1.足し算 (例 a+b)\n"); printf(" 2.引き算 (例 aーb)\n"); printf(" 3.掛け算 (例 a×b)\n"); printf(" 4.割り算 (例 a÷b)\n"); printf("計算したい番号を入力してください "); scanf("%d",&k); switch (k){ case 1: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a+b で %d です\n",a+b); break; case 2: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは aーb で %d です\n",a-b); break; case 3: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a×b で %d です\n",a*b); break; case 4: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a÷b で %d です\n",a/b); break; default: printf("明記してあるどれかの数字を再入力してください"); } }