どうも、irisawaです。
今日は、コーディングについての授業を行いました。
以下、内容と感想です。
まず、始めに実習形式で1つのプログラムを組んでいきました。お題としては以下の通りです。
- サイコロを振って出た目の回数を保持し表示できる
- 出た目の数が奇数か偶数かを判定できる
- 偶数が出た確率を知る事が出来る
このお題に対して、最初に出来たのが次のプログラムコードです。
//出た目の回数を持つ配列
$array = array(1 => 0,
2 => 0,
3 => 0,
4 => 0,
5 => 0,
6 => 0);
//サイコロを振る回数
$count = 10;
//偶数が出た回数
$even_count = 0;
for($i = 0; $i < $count; $i++){
$num = rand(1,6);
if($num%2==0){
echo $num."は偶数です。n";
$array[$num] = $array[$num] + 1;
$even_count++;
}else{
echo $num."は奇数です。n";
$array[$num] = $array[$num] + 1;
}
}
foreach($array as $key => $value){
echo $key."の目は".$value."回出ましたn";
}
echo "偶数の目が出る確率は".(($even_count/$count)*100)."%ですn";
?>
このコードを、ユーザー定義関数を使って機能ごとに分けてみました。
//出た目の回数を持つ配列
$array = array(1 => 0,
2 => 0,
3 => 0,
4 => 0,
5 => 0,
6 => 0);
//サイコロを振る回数
$count = 10;
//偶数が出た回数
$even_count = dice_count($array,$count);
show_dice($array);
echo "偶数の目が出る確率は".(($even_count/$count)*100)."%ですn";
function show_dice($array){
foreach($array as $key => $value){
echo $key."の目は".$value."回出ましたn";
}
}
function dice_count(&$array,$count){
for($i = 0; $i < $count; $i++){
$num = rand(1,6);
if($num%2==0){
echo $num."は偶数です。n";
$array[$num] = $array[$num] + 1;
$even_count++;
}else{
echo $num."は奇数です。n";
$array[$num] = $array[$num] + 1;
}
}
return $even_count;
}
?>
このコードが完成した後、実際に見てもらい問題点を教えて頂きました。
【問題点】
- $arrayでは何についての配列か分からない。→ わかりやすい変数名を付けるようにする。
- dice_countという関数の中で表示をしてしまっている。 → 表示とカウントでは機能が違うので切り分ける。
以上の問題点を見直して、コーディングしたのがこれです。
//出た目の回数を持つ配列
$dice = array(1 => 0,
2 => 0,
3 => 0,
4 => 0,
5 => 0,
6 => 0);
//サイコロ振る回数
$count = 10;
//偶数が出た回数
$even_count = dice_count($dice,$count);
show_dice($dice);
echo "偶数の目が出る確率は".(($even_count/$count)*100)."%です。n";
function show_dice($dice){
foreach($dice as $key => $value){
echo $key."の目は".$value."回出ましたn";
}
}
function judge_dice($dice_num){
if($dice_num%2==0){
echo $dice_num."は偶数です。n";
}else{
echo $dice_num."は奇数です。n";
}
return $dice_num;
}
function dice_count(&$dice,$count){
$even_count = 0;
for($i = 0; $i < $count; $i++){
$num = judge_dice(rand(1,6));
if($num%2==0){
$dice[$num] = $dice[$num] + 1;
$even_count++;
}else{
$dice[$num] = $dice[$num] + 1;
}
}
return $even_count;
}
?>
このコードでも、まだ改良の余地があると思うので暇を見て直していきたいと思います。
ココを直したらもっとよくなる等ありましたら、コメント頂けると嬉しいです。
(2008/05/20 muroi追記)
動画アップしました!
part1.
part2.

by hasumi, on 05.20.08 @ 11:57 AM
もう大分複雑な事ができるんですね。
自分で関数を作れると面白くなってきますよね!!
コードを見ていて思ったのですが、dice_count()という関数は、「サイコロを振る」という関数と、「偶数が出た回数を取得する」という関数に分けた方が良いかもしれません。
そうしておくと、万が一 nt-3 先生に「やっぱ奇数の数の確立だしてみようか」などと言われた時も安心です。
僕もコードを書いてみましたが、ここにコードを書くと表示がおかしくなるようです。
分けた後の関数の中身が気になったら声かけてください。
by irisawa, on 05.21.08 @ 11:24 AM
>hasumiさん
コメントありがとうございます!
段々複雑になってきましたが、その分面白くなってきました。
コードの指摘していただいた部分、自分でも直してみました。
コード比較してみたいので、お暇なときにお願いします!