Version 2.9
縦横無尽!
「えっと、これまでに見てきたのは……」
『繰り返す while と、ばあいわけする if だよ』
「じつは、このふたつがあれば十分。だから、憶えるの面倒だったらこのふ
たつだけでいいよ」
『とか言って、他の人が書いたプログラム読むときどうするのーなんて言う
んでしょ』
「ま、ね。でも結局は while と if の派生って感じだから、大丈夫だと思
うよ。まずは do-while を見てみようか」
void CCalcDlg::OnBEqual()
{
do
{
TRACE( "do - while の中です。\n" );
}while( 0 );
}
『あ、 while が後ろに来てる。えっと、ビルドして実行っと』
do - while の中です。
『あ、1度だけ表示された』
「 while は最初にチェックしてたけど、 do - while は中カッコを実行し
たあとにチェックします。だから、かならず一度は中カッコの中が実行され
るってわけ」
『だから1度だけってことね』
「そ。ちなみにそれ以外は while と同じ。ゼロならやめて、それ以外なら
繰り返す、ってこと」
『使い道は?』
「とりあえず1度は実行させたいとき」
『まんまね』
「ま、これは while や if と見た目がかなり違うから、個人的には好き
じゃないけどね。じゃ、次、 for を見てみようか」
『ぱっぱ行くね』
「これはどんなプログラム?」
void CCalcDlg::OnBEqual()
{
int iBox
= 1;
while( iBox < 6 )
{
TRACE( "%d ", iBox );
++iBox;
}
}
『えっとねー、まず iBox って変数作って、それに1入れて、で、while の
チェック、……』
「iBox が6より少ないなら iBox < 6 は1になる、1だと」
『中カッコの中を実行。中に入って、まず1を表示して、1増やして2にし
て、上に戻って while のチェック、まだ6より少ないからふたたび中カッ
コの中に……で、5を表示して、1増やして6、今度は iBox < 6 がゼロに
なるから、これで終了。ってことは、1から5まで表示ってことね』
「はい正解。お疲れさま」
『まーねー』
「で、プログラムを作るときにはこういう〈単純な繰り返し〉をよくするか
ら、 while じゃなく for っていうので繰り返せるようになってます」
『ふぉー?』
void CCalcDlg::OnBEqual()
{
for( int iBox = 1; iBox < 6; ++iBox )
{
TRACE( "%d ", iBox );
}
}
『ビルドして実行。あ、結果同じ!』
「この for を使ったのと、さっきの while はまったく同じ意味だから。for
を分解すると……」
for(
int iBox = 1; //while の前。
iBox < 6; //while の小カッコの中。
++iBox ) //一周して while に戻る直前。
『while のときに長々と書いててたのが、1行に詰まったってことなのね』
「そういうこと。ただ繰り返しをするときには、for の方がいいかな」
『なんで?』
「変数の関係かな。 iBox は繰り返しの計算に使ってるわけでしょ。それが
while だと、変数を作るのも、1増やすのも別々だから」
『for なら1行にまとまってるものね』
「そういうこと。じゃ、最後に switch について」
『すいっち、ね』
void CCalcDlg::OnBEqual()
{
int iBox = 1;
switch( iBox )
{
case 0:
TRACE( "ゼロです。\n" );
break;
case 1:
TRACE( "1です。\n" );
break;
default:
TRACE( "それ以外です。\n" );
break;
}
}
『ビルドして実行』
1です。
『あ、これは if に似てるの?』
「そう。 switch は、小カッコの中の数字を調べて、中カッコの中の case
の数字に同じのがあるかどうか調べて、あったらそこに飛んで実行。なかっ
たら default に飛びます」
『case が else if 、 default が else と同じってことね』
「だいたいそうなんだけど、まったくおなじってわけでもないんだよね」
void CCalcDlg::OnBEqual()
{
int iBox = 0;
switch( iBox )
{
case iBox: //エラー!
TRACE( "おなじです。\n" );
break;
default:
TRACE( "ちがいます。\n" );
break;
}
}
『あれ? ビルドしたらエラー出たよ?』
「if と違って、 switch は〈数字〉としか比べられないんだわ。変数とは
比較できないってわけ」
『へ〜』
「それに、 if のときは < とか != とか使っていろんな比較ができたで
しょ。でも switch はそれもできないんだわ」
『自由度低いってことね。あ、そういえばさ、 break ってなに?』
「そうそう、break も必要なんだよね。これ試してみて」
void CCalcDlg::OnBEqual()
{
int iBox = 1;
switch( iBox )
{
case 0:
TRACE( "ゼロです。\n" );
case 1:
TRACE( "1です。\n" );
default:
TRACE( "それ以外です。\n" );
}
}
『ビルドして実行っと』
1です。
それ以外です。
『あれれ? if だったら〈それ以外です〉はないよね』
「そう。 switch はその辺を自動的にはしてくれないんだよね。だから、
case 1 を実行したあと、その他のをよけたりはしてくれません。そこで、
break っていうのを使います」
『ぶれーく、ね』
「これは while、 do-while 、 for 、 switch の中カッコからひとつ外へ
抜け出てくれます。だから、こんな使い方もできたり」
void CCalcDlg::OnBEqual()
{
int iBox
= 0;
while( 1 )
{
++iBox;
TRACE( "%d\n", iBox );
if( iBox == 5 )
{
break;
}
}
}
『あれ? while ってゼロ以外だとループするんでしょ? これじゃ終わん
ないじゃん』
「そ。こういうのを〈無限ループ〉っていいます。で、このループから抜け
るのに break を使ってるわけ」
『?? えっと、なんどもループさせて、 i が5になったら if の次の行
が実行されて、で、 break で…… if の外へ?』
「ううん、 break は if には効かないから、このときは while の外に出る
ことになるわけ」
『あ、だから繰り返しがちゃんと止まるんだ。……でもこれって do-while
と一緒じゃない?』
「ま、そうだけどね。ま、見やすさの違いかな」
『 do-while が嫌いだから、こっちを使うってこと』
「ま、そんなとこかな。で!」
『で?』
「これまで出てきた〈繰り返しや分岐〉をするものの中で、使うのは if 、
for、 while のみっつで十分だから」
『 if で分岐、for と while で繰り返しってことね』
「そういうこと」
/*
Preview Next Story!
*/
『下積みっていつまで〜?』
「あと2回くらいかな」
『え? 結構すぐだね』
「そこまで行けば、色々できるようになるから」
『というわけで次回』
< Version 2.10 関数を作ろう! >
「につづく!!」
『色々ってどんな?(ワクワク)』
「……いやっ、実は何もできないんだよ、ホント……」
『水希ちゃん、あたしの目を見て言ってみな〜?』