このプログラムはユーザーに任意の人数を入力させて、それを元にグループ分けを行うプログラムです。
このプログラムは長くて難しいので、初心者の方は飛ばしていただいて結構です。
では例をみてみましょう。
流れは以下の通りです。
人数を入力=>人数分の名前を入力=>班数を入力=>班に人を割り当てる。
結果は以下の通りです。
では詳しく説明していきます。
〇 mainメソッドの外にメンバーを格納するための配列を作成しています。
staticについては「staticについて知ろう」の章で説明します。
〇以下の箇所では人数を入力させていますが、もし、正しくない数値を入力するとwhileで何回も×が表示されることになります。
無限ループとは今までの繰り返し文のように条件式がfalseにならないので、どこまでもループを繰り返します。
無限ループなので、どこかでbreakで抜けなくてはいけません。
MemberNumbersメソッドは正しく人数が入力されているかをチェックするメソッドですが、条件式がtrueであればbreakで抜けることが出来ます。
このようにifの条件式にメソッドを入れることが出来ることを覚えておいてください。
以下のように数字とは関係ないaなどを入力をすると×が出力されます。
これを行っているのが
そして、もちろん0人より多い数が入っていなくてはいけませんので、0より大きい数値が入っているのかを確認するために
もし、0より大きい数値が入っているのならばTRUEを返し、breakで抜けます。
正しく入力されないと何度でも「人数入力」と出力されますが、これがwhileで無限ループを使用している理由です。
〇次の箇所では人の名前の入力を行います。
numbers にはlineの値を整数値に変換した数値が入っています。
そして、for文で
そして
そしてカラではないならばlineをmembers配列に入れます。
もし空(未入力)であるならば
そして
つまり、無名の人数をカウントしています。
ではさらに詳しくisEmptyメソッドについて説明します。
カラであればTRUE、カラでなければFALSEになります。
この例では否定の「!」が付いていますので、カラではない時にTRUEになります。
ここまでは例えば以下のようになります。
〇以下の箇所ではグループの人数を入力します。
正しく人数が入力してあればbreakで抜けます。
ではGroupNumbersメソッドの説明をします(紙面の都合でメソッドの引数を2段目に書いています)。
次に以下の箇所を説明します。
この条件式に合致していればTRUEになります。
〇以下の箇所ではメンバーをシャッフルしています。
なぜなら、毎回同じ班分けになってしまうと意味が無いからです。
shuffleMembers();
以下のメソッドでメンバーをシャッフルします。
shuffleTimesの前にfinalが付いていますが、以下のような役割があります。
例えば
次に以下の箇所の説明をします。
以下の例で説明しますとaとbを交換するのに以下のプログラムでは交換にはなりません。
aとbを交換するには以下のプログラムを使います。
この例ではaをtmpに入れています。これによりaの値が上書きされないで済みます。
では例に戻りますが、このswapMemberメソッドのidx1とidx2にはランダムに入力された数が入っていますので、members配列の中の順番を逆にできるわけです。
この作業をshuffleTimesの数である30回行うわけですから、配列の中の順番はかなりランダムに変えることが出来ます。
〇次に以下の箇所の説明をします。
結果を出力するのはこの箇所ではありませんが、ここではグループ分けを行っています。
次は以下の箇所の説明をします。
「i % groups.length」の箇所はメンバーが4人で班が3だとするとループするごとに以下のように回ります。
つまり、ループするごとに
メンバーが4人でグループが3の場合には1周目で例えば
2周目では
3周目では
4周目では
〇最後にfor文でgroups変数を出力すると例えば以下のようになります。