
以下のプログラムを実行結果のように作りたいのですがexchange_numberの中身の書き方(配列の入れ替え方)が分らないので教えて下さい。
#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,number[M][N],score[M],score_cpy[M],order[M];
printf("人数を入力して下さい:");
scanf("%d",no);
("学生番号と平均点を入力して下さい。");
for(i=0;i<M;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])
{?}
ちなみに実行結果は以下の通りです。
人数を入力して下さい:10
学生番号と平均点を入力して下さい。
学生番号:y3051 得点:85
学生番号:y3052 得点:65
学生番号:y3053 得点:75
学生番号:y3054 得点:63
学生番号:y3055 得点:95
学生番号:y3056 得点:68
学生番号:y3057 得点:80
学生番号:y3058 得点:90
学生番号:y3059 得点:83
学生番号:y3060 得点:70
得点の高い順に並び替えて表示します
学生番号:y3055 95 点
学生番号:y3058 90 点
学生番号:y3051 85 点
学生番号:y3059 83 点
学生番号:y3057 80 点
学生番号:y3053 75 点
学生番号:y3060 70 点
学生番号:y3056 68 点
学生番号:y3052 65 点
学生番号:y3054 63 点
プログラム中で間違えがありましたら指摘して頂けると幸いです。それで良いお待ちしております。
No.5ベストアンサー
- 回答日時:
いやいや、ひねくれた例題ですね。
間違い箇所が多く見られ、実際にまだコンパイルはされていないようですよね。レポートは明日までとのことですので参考に...。ここでの一番の問題は、なぜ「void exchange_number(int order[M],char number[M][N]);」関数を作らなければいけないかの疑問です。結果は、ソート降順に行われることから、次の for() ループでは
order[i]=linear_search(score_cpy,score[i]);
の学生番号順にソート順番が何番であるかを求めるのではなく、
order[i]=linear_search(score,score_cpy[i]);
のソート結果に対して何番の学生番号が該当するのかのプログラム内容とならなければなりません。事例ではわざとかく乱させて、ご要望の関数を作らないとさも答えが出ないような内容になっています。例題は考えられています。
回答は、平均点が重なってもきちんと表示されるように「 signed char flag[M];」を追加してみました。したがって、要望の関数は不要です。とりあえず、動くかどうか試してみてください。
#include<stdio.h>
#define M 10
#define N 8// 余裕を持たせましょう。
void sort_score(int score_cpy[]);
int linear_search(int key, int score[], signed char flag[]);
int no;
int main(void) {
int i,score[M],score_cpy[M],order[M];
char number[M][N];
signed char flag[M];
printf("人数を入力して下さい:");
scanf("%d",&no);
("学生番号と平均点を入力して下さい。");
for(i=0;i<no;i++) {
printf("学生番号:");
scanf("%s",number[i]);
printf("得点:");
scanf("%d",&score[i]);
}
for(i=0;i<no;i++) {
score_cpy[i]=score[i];
flag[i] = 0;
}
sort_score(score_cpy);
for(i=0;i<no;i++)
order[i]=linear_search(score_cpy[i], score, flag);
printf("\n\n得点の高い順に並び替えて表示します\n\n");
for(i=0;i<no;i++)
printf("学生番号 :%s %d点\n", number[order[i]],score_cpy[i]);
return 0;
}
void sort_score(int score_cpy[]) {
int i,j,score;
for(j=0;j<no-1;j++) {
for(i=no-1;i>j;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 key,int score[], signed char flag[]) {
int i;
for(i=0;i<no;i++) {
if(key == score[i] && flag[i] == 0) {
flag[i] = -1;// 重複を回避する
break;
}
}
return i;
}
No.4
- 回答日時:
またまたすみません。
実行結果を見ると学生番号にはyという文字が入っているので文字列ですね。ということはnumberは文字型配列にしないといけませんね。Mが学生数で、Nは学生番号の最大数だったのでしょうか? プログラムだけ見て実行結果に注意をしていませんでした。ごめんなさい。でも、前回のサンプルプログラムが参考になると思います。これを参考に自分で少し考えてみることをお勧めします。
この回答への補足
こちらの説明不足で何度もお答えさせてしまい申し訳ありません。
この回答の通り、numberは学生を表す文字型配列でMが学生数、Nが学生番号の最大数です。この場合で考えると、文字型なので1文字ずつ入れ替えるように作るんですかね?明日までに、レポートとして提出しなければならないので、出来れば前回のサンプルプログラムを書きなおして欲しいのですが・・・宜しくお願い致します。
No.2
- 回答日時:
このプログラムに関して3点ほど質問があります。
質問1 なぜ学生番号を%Sで読み込む必要があるのか?
質問2 なぜnumber配列は2次元である必要があるのか?
質問3 define定義されているMとNはどんな意味を持つのか?
で、次のように勝手に解釈して作ったプログラムを以下に示します。
いろいろ突っ込みが入るかもしれませんが参考にして下さい。
解釈1 学生番号は%dで読み込む
解釈2 numberは1次元配列にする
解釈3 Mは使用しない。Nは学生の最大人数
<プログラム> オリジナルから修正を加えた部分はコメントを入れておきました。
#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],int number[M]);//numberはint型です。
int no;
int main(void)
{
int i,number[M],score[M],score_cpy[M],order[M];//numberを2次元配列にするのはなぜ?
printf("人数を入力して下さい:");
scanf("%d",&no);//&がない
printf("学生番号と平均点を入力して下さい。");//printfがない
for(i=0;i<no;i++){//no回くりかえせばいい
printf("学生番号:");
scanf("%d",&number[i]);//%dでよいのでは?Nしか確保していないのにNにいれてはダメ
//そもそも2次元配列にする意味が解らない
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("学生番号 :%d %d点\n",number[i],score_cpy[i]);//numberはintなので%sでなく%d
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],int number[M]){
int i;
int tmp[M];
//numberを全てコピーして
for(i=0;i<M;i++){
if(order[i]==-1) break;
tmp[i]=number[i];
}
//該当箇所にセット
for(i=0;i<M;i++){
if(order[i]==-1) break;
number[order[i]]=tmp[i];
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Java Java 配列<選挙> 4 2023/07/31 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
if と配列の組み合わせ
-
C++でvectorにテキストファイル...
-
(int *)の意味
-
C言語 エラーの原因がわからな...
-
C#で配列の分割
-
「{ } で囲むだけ」は正しい?
-
エラー 添字が付けられた値が、...
-
数字列を3桁ごとにカンマで区切...
-
BMPを白黒画像にする方法。
-
各桁の和を返す関数
-
C言語
-
c/c++でのファイルの上書き保存...
-
ラップ関数とはどんなものですか?
-
c言語の配列を使ってサイコロを...
-
acceptをalarmでタイムアウトさ...
-
異なる文字列のマッチングを、D...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
int型の変数値をバイト列として...
-
std::set<int> で、ある値が何...
-
PowerShellがうまくいかない
-
(int *)の意味
-
CStringの配列要素を関数で受け...
-
ColorをRGBで指定する方法
-
「{ } で囲むだけ」は正しい?
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
read関数をノンブロッキングで...
-
(マルチスレッド)_beginthrea...
-
int16_t の _t は何?
おすすめ情報