繰り返し処理(For, While)と条件分岐(If .. Then .. Else, Switch .. Case)
=============================================================================
CにおけるFor, While, If ....Then ...Else, Switch ...Case,はだいたいBASICと同じ感覚で使えるので、
BASICでプログラムを組んでいれば、すぐに使えるでしょう。
(※)Forの仕様は旧BasicとCとで結構異なる部分があるので要注意
BASICのForの仕様については、Forループの落とし穴をご参照下さい。
Cに関しては無条件分岐と補助制御文、Forループのスゴ技もご参照下さい。
=============================================================================
1 繰り返し処理
【FORの構文】
FOR(式1; 式2; 式3) 文; FOR(式1; 式2; 式3) { 文; 文;・・・} 式1は初期条件 式2は終了判定条件 式3は更新条件で{ 文; }が実行された後に実行される 式1、式2、式3 および文は省略されることもある |
例えば1から10まで画面に出力するには以下のようになります。
<BASIC> | <C> |
for i=1 to 10 step 1 print i; next |
for( i=1; i<=10; i++) printf("%d",i); |
初期条件を設定する式1はForループに入るときに1回だけ実行されます。
終了判定条件の式2はループを回るたびにForループの最初で実行されます。
更新条件の式3はループが終わりに来るたびに最後に実行されます。
FORの式2が最初から偽のとき、文は1回も実行されません。
(※)頭書きでだいたい同じ感覚と書きましたが、Forの仕様的にはCと旧BASICでかなり異なります。
BASICのForの仕様については、Forループの落とし穴をご参照下さい。
Cに関しては無条件分岐と補助制御文、Forループのスゴ技もご参照下さい。
【WHILEの構文】
WHILE(式) 文; WHILE(式) {文; 文; ・・・} 式が真の間、文が実行される。 |
WHILEの式が最初から偽のとき、文は1回も実行されずWHILEループをぬけます。
それでは、1からNまでの総和を求めるプログラムを作ってみましょう。
FOR と WHILE の両方で求めています。
/* 総和を求める 1+2+3...+n */ #include <stdio.h> main(){ |
2 無限ループとBREAK
次のように書くといずれも、無限ループになります。ループのなかから抜ける命令としてBREAKが
あります。無限ループから抜けるには、ループ内で条件判定し、ある条件のときBREAKを使えば
よいわけです。
FOR ( ; ; ){
処理 } 終了判定条件がないので無限ループになる
WHILE(1) {
処理 } 判定式が常に1(=真)なので無限ループになる。
無限ループは、ユーザーからキー入力があるまで、待機状態(無限ループさせている)
にする場合などに使います。
例えば、次のように書くとキーが押されるまでループさせることができます。
WHILE(!KBHIT( )) {
処理 }
KBHIT(
)はキーが押されたかどうかチェックする関数である。キーが押されれば真になる。
!はその否定なので、キーが押されない限りループする。
3 IF ...ELSE SWITCH ..CASE による条件分岐
(1) IF ...ELSE
CにおけるIF文は、BASICとそうたいして変わりません。構文は以下のとおりです。
If(式) 文; If(式) 文; else 文; 文が複数の場合は{文; 文;}になります。 If(式) {文; 文;} |
式の中には関係演算子や論理演算子が使われますが、それらの演算子については
「Cの演算子の8関係演算子と論理演算子」をご参照下さい。
If文の入れ子について。
以下のようなIf文を書くこともできます。
if(式1) {文1} else if(式2) {文2} else if(式3) {文3} else {文4}
この場合、以下のような流れになります。
式1が真 → 文1が実行
| -> 式1が偽 → 式2が真なら文2を実行
|-> 式2が偽 →式3が真なら文3を実行
|-> 式3が偽なら文4を実行
If(式1) if(式2) 文1 else 文2elseは最も近いIfとペアになるという決まりなので、上記のように書くとこのelseはIf(式2)とペアになります。
If(式1) {if(式2) 文1} else 文2
(2) SWITCH...CASE
SWITCH...CASEはBASICでいうと SELECT...CASEに相当します。(古いBasicには、Select
... Caseがない場合
も多いですけど)
SWITCH(式) { CASE 定数式: 文; [文;] CASE 定数式: 文; [文;] ............ DEFAULT: 文; } [ ]は省略可 SWITCHで与えられた式とCASEの後の定数式が同じなら、文が実行されます。一致するものがなければ DEFAULT の文が実行されます。 あるCASEと一致した場合、そこでSWITCHから抜けるのではなく、次のCASEとの比較が順次行われ ていきます。あるCASEと一致したらそこでSWITCHをぬけるにはBREAKを使います。 |
Switch ... Caseの使用例。
下記の例は自作ゲーム
Chase.Cの自キャラの移動の部分です。
X座標で2から39、Y座標で5から19までの範囲が移動可能な範囲です。
キー入力により 2で下、 4で左、 6で右、 8で上に移動させています。
また、2例めは、自分のキャラクタと他のキャラクタが重なった(同じ座標にいる)場合の
判定の部分です。
g[x][y]は、(x,y)座標にいるキャラ判定用の配列で、
その値が2の場合はポイントキャラで、重なるとポイント加算
3、4は敵キャラで、重なると終了フラグを立てています(end=1 にする)
(Turbo C用のソースです)
void move(){ int c; for(;;){ if(!kbhit())break; else c=getch(); } gotoxy(x,y);putchar(' ');g[x][y]=0; /* ここからswitch caseの使用 */ /* cにはgetch()で読み込んだキーコードが入っている */ switch(c){ case '2': if(y<19) y++; else y=19; break; case '4': if(x>2) x--; else x=2; break; case '6': if(x<39) x++; else x=39; break; case '8': if(y>5) y--; else y=5; break; } gotoxy(x,y);putchar('@'); /* 2例め キャラ判定 */ switch(g[x][y]){ case 2: point=point+5;setp(); break; case 3: end=1;break; case 4: end=1;break; } g[x][y]=1; } |