パソコン活用研究シリコンバレー(C、C++、の活用研究)

繰り返し処理(For, While)と条件分岐(If .. Then .. Else, Switch .. Case)

=============================================================================
CにおけるFor, While, If ....Then ...Else, Switch ...Case,はだいたいBASICと同じ感覚で使えるので、
BASICでプログラムを組んでいれば、すぐに使えるでしょう。
=============================================================================
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);   

まあ、だいたい同じ感覚ですね。FORの式2が最初から偽のとき、文は1回も実行されません。

【WHILEの構文】

WHILE(式) 文;
WHILE(式) {文; 文; ・・・}
式が真の間、文が実行される。

WHILEの式が最初から偽のとき、文は1回も実行されずWHILEループをぬけます。

それでは、1からNまでの総和を求めるプログラムを作ってみましょう。
FOR と WHILE の両方で求めています。

/* 総和を求める 1+2+3...+n */

#include <stdio.h>

main(){
  int n,i,j,sum1=0,sum2=0;
  printf("Nまでの総和(1+2+3...+n)を求める。");
  scanf ("%d", &n);
  for (i=1; i<=n;i++) sum1=sum1+i;
  printf("\nResult %d",sum1);
/* while */
  j=1;
  while(j<=n) {
  sum2=sum2+j; j++;}
  printf("\nResult %d",sum2);
}

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文はelseがIf(式1)のelseなのか、If(式2)のelseなのか紛らわしいのですが・・。
If(式1) if(式2) 文1 else 文2
elseは最も近いIfとペアになるという決まりなので、上記のように書くとこのelseはIf(式2)とペアになります。

もしelseをIf(式1)とペアにしたいならif(式2) 文1を{ }に括って以下のように書きます。
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;
}

 


TopPage