プロが教える店舗&オフィスのセキュリティ対策術

こちらまだC言語を勉強したてであまり知識がありません。どなたかお力をお貸しください。

全部で8名から代表者を3名を無作為に選びたい。一様乱数を0から7の間で発生させる。それを100回試行して最も回数の多い順に並べ替えを行って表示した例である。下のような結果を得るプログラムを作成せよ。

第1位 16回 Eさん
第2位 15回 Dさん
第3位 15回 Cさん
第4位 14回 Bさん
第5位 13回 Gさん
第6位 11回 Hさん
第7位 8回 Aさん
第8位 8回 Fさん


#include<stdio.h>
#include<math.h>
#include<string.h>
main(){
int i,j,n,count[8];
unsigned char x;
int w;
char *work;
char *name[8]={"Aさん","Bさん","Cさん","Dさん","Eさん","Fさん","Gさん","Hさん"};

// srand(time(NULL));
for(n=0;n<8;n++){
count[n]=0;
}
for(i=1;i<=100;i++){
x=rand()%8;
count[x]++;
}

for(i=0;i<7;i++){
for(j=i+1;j<8;j++){
ifj]){
work=count[i];
count[i]=count[j];
count[j]=work;
}
}
}

for(i=0;i<8;i++){
printf("第%d位 %3d回 %10s\n",i+1,count[i],name[i]);
}
}

第〜位、〜回はちゃんと表示されるのですが、最後の〜さんがAーHまで順番になってしまいます。
助けてください。よろしくおねがいします。

A 回答 (2件)

変数nameの内容を全然操作していません。

初期値のままなので、、、

> 最後の〜さんがAーHまで順番になってしまいます。

となるのは当然かと。(^^;
nameをどのように扱えばよいか、countとnameをどのようなデータ構造としたら処理効率がよいかを考えられるとよいです。

で、そういったことは使用するプログラミング言語に完全には依存しない部分かと思います。
例えば名前と回数がペアになったような(論理的な)データ構造を考え、処理手順を日本語で(1), (2), (3), ... とかいった箇条書きで設計されるとよいでしょう。
フローチャートなどのチャート図をご存知でしたらそれで書くのが楽で効率的でしょう。

参考まで。
    • good
    • 1
この回答へのお礼

ありがとうございました。次からはしっかりチャート図書きます。

お礼日時:2017/05/16 17:01

並び替えをしている部分で


対応している名前も一緒に入れ替えないとダメですよ

これで分かりますかね?
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!