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

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

締切り済みの質問

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型が適切かも分からないので手がつけられません。

プログラミング初心者なのでどなたか分かりやすく教えていただけませんか?

投稿日時 - 2007-11-19 00:21:25

QNo.3529466

困ってます

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

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

回答(2)

ANo.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などでも構いません。これだけでも思考への負担がかなり軽減され理解が早くなりますので。

投稿日時 - 2007-11-19 01:38:02

補足

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

このような場合どうすればよいか教えていただけませんか?

変数名についてのご指摘ありがとうございます。以後気をつけます。

投稿日時 - 2007-11-19 03:37:20

お礼

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

投稿日時 - 2007-11-19 03:16:16

ANo.1

教科名とその点数をペアにしたものを構造体とすることから始めましょう。

typedef struct subject_tag {
 char subject_name[10];
 int score;
} subject;

教科ごとの点数を集めたものを配列にします。

subject result[20];

あとは result に各教科の点数を順に格納して、entry.score の値に応じてソートする。

投稿日時 - 2007-11-19 01:11:03

お礼

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

投稿日時 - 2007-11-19 02:53:40

あなたにオススメの質問