はじめに
どうも! みなため(@MinatameT)です。
この記事では、10人の名前を入力すると、ランダムで2つのチームに分けてくれるプログラムを作成します。
今回の内容はやや難しいですが、「どういうことをしているのか」をコメント文に書いてありますので、よく読んでみてください。
問題文
10人の名前をキーボードから入力すると、5人ずつの計2チームにランダムで分けるプログラムを作成しましょう。
また、チーム分けの結果を「チームごとに」表示してください。
解答例
#include<stdio.h>
#include<stdlib.h> //忘れずに!
int main(void)
{
int n[10] = {1,1,1,1,1,2,2,2,2,2}; //10人分のチーム番号
int x,y; //配列の要素番号
int tmp; //交換時に一時的に利用する変数
char name[10][100]; //10人の名前(1人につき半角100文字まで。)
srand((unsigned)time(NULL)); //乱数の仕組みを初期化(あまり気にしなくて良い。)
for(x=0; x<10; x=x+1) //10人の名前の入力のためのループ
{
printf("名前を入力してください。>");
scanf(" %s",&name[x][0]); //名前の入力
}
for(x=0; x<10; x=x+1) //フィッシャー・イェーツのシャッフル
{
y = (rand())%(5); //0から4までのランダムな値(乱数)
//以下の3行で、n[x]とn[y]の中身を交換している。
tmp = n[x];
n[x] = n[y];
n[y] = tmp;
}
printf("\n【チーム1】\n\n");
for(x=0; x<10; x=x+1) //シャッフル結果の表示(チーム1のみ)
{
if(n[x]==1) //チーム1なら
{
printf("%sさん\n",name[x]); //名前を表示する。
}
}
printf("\n【チーム2】\n\n");
for(x=0; x<10; x=x+1) //シャッフル結果の表示(チーム2のみ)
{
if(n[x]==2) //チーム2なら
{
printf("%sさん\n",name[x]); //名前を表示する。
}
}
return(0);
}
まず、ランダムな値を発生させるための関数として、rand関数があります。ここで、ランダムな値の「偏り」を少なくするために、srand関数も使います。
rand関数やsrand関数を使うためには、#include<stdlib.h>を忘れずに記述しておきましょう。
チーム1が5人、チーム2も5人なので、配列nには1を5つ、2も5つ入れておきます。
このプログラムにはfor文が4つあります。それぞれ、次のような役割をしています。
- 名前を入力させるためのfor文
- チーム番号をシャッフルするためのfor文
- チーム1の人たちを表示するためのfor文
- チーム2の人たちを表示するためのfor文
チーム番号のシャッフルには「フィッシャー・イェーツのシャッフル」という方法を用いていますが、少し難しいので(理解したら簡単ですが)ここでは説明しません。
最後に、2次配列のnameについてです。
name[10][100]とは、10人分のスペースを作り、1人分のスペースにつき半角100文字ずつ入れられる……という意味です。
printf関数のname[x]というのは、ここでは「x人めの名前を表示する」という意味です。for文でxの値を変えていくことによって、全員の名前を簡単に表示できます。
それでは、実行結果の例を見ていきましょう。
名前を入力してください。>R.Okabe
名前を入力してください。>M.Shiina
名前を入力してください。>I.Hashida
名前を入力してください。>K.Makise
名前を入力してください。>M.Kiryu
名前を入力してください。>R.Urushibara
名前を入力してください。>N.Faris
名前を入力してください。>S.Amane
名前を入力してください。>M.Hiyajo
名前を入力してください。>K.Shiina
【チーム1】
M.Kiryuさん
R.Urushibaraさん
N.Farisさん
S.Amaneさん
M.Hiyajoさん
【チーム2】
R.Okabeさん
M.Shiinaさん
I.Hashidaさん
K.Makiseさん
K.Shiinaさん
このように、10人の名前を入力すると、チーム分けが自動でおこなわれました!
今回の内容は難しかったと思います。皆さん、お疲れ様でした。