みなためラボ

【C言語課題解説】10人の名前を入力し、ランダムな2チームに分けるプログラム

文字サイズ

はじめに

どうも! 高杉 皆為(@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つあります。それぞれ、次のような役割をしています。

  1. 名前を入力させるためのfor文
  2. チーム番号をシャッフルするためのfor文
  3. チーム1の人たちを表示するためのfor文
  4. チーム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人の名前を入力すると、チーム分けが自動でおこなわれました!

今回の内容は難しかったと思います。皆さん、お疲れ様でした。


 

みなためじゃんけん

このコーナーは、私と擬似的にじゃんけんできるコーナーです。

みなためじゃんけん、じゃんけんぽん!

私が出したのは……





チョキ

チョキでした! グーの勝利です!



この記事をSNSでシェアする

プログラミングカテゴリーの最新記事(5件)

最新記事(10件)

管理人のTwitter

内部リンク集