ここまでのプログラムでは for
や if
の後ろは、実行されるべき文を
必ず '{' と '}' で括りブロックを形成していた。
C では、この '{' と '}' は必ずしも必要ではない。
実はfor
文は、繰り返し処理を行う文を1つだけ取る。
同様に if
文で、条件が成立した際に実行されるのも単一の文である。
ところが、実際に行いたい処理が単一文で書くことができるのは滅多にない。
そのような場合には、 '{' と '}' で文を括ることにより、それらの複数の文は
一つの文と同じように扱われる。
これを「複文(compound statement)」と呼ぶ。
単一の文であっても、'{' と '}' でくくって複文としても良いので、これまでは
必ず複文にしていたのである。
C で利用できる繰り返し処理の方法には、これまでに出てきた for
文、
while
文に加えて、do〜while
文が存在する。
for
文
for (初期化; 条件式; 再初期化) 繰り返し文
for
に突入した段階で、「初期化」文を実行し、繰り返し文を実行する。
次に再初期化を行い、条件式が真か偽かの判断を行う。
条件が成立していれば再び繰り返し文を実行する。
以下、条件が成立している限り「繰り返し文」→「再初期化」を繰り返す。
初期化、条件式、再初期化の各文については不要な部分を省略することができる。
while
文
while (条件式) 繰り返し文
条件式が成立している限り、実行文を繰り返す。
while
文に突入した時点で、条件が成立していなければ、繰り返し文は一度も実行されない
あらかじめ、繰り返し回数が判っていない場合などに、よく用いられる。
do〜while
文
do 繰り返し文 while (条件式)
while
文に良く似ている。異なる点は、条件判定が、繰り返し文を実行したあとに行われる点である。
したがって、繰り返し文は、必ず一度は実行される点がwhile
文とは大きく異なる。
上記 3種の構造は次のような図で表すことができる。
C で利用できる条件分岐としては、今まで学習した if(-else)
に加えて
switch
文がある。
if
文
if (条件) 条件が成立した場合の文; else 条件が成立しなかった場合の文;
条件式が成立しているかどうかで、実行文を切り替える。
不要であれば、else
以下は省略することができる。
各場合で行う処理が複数ある場合は複文にするのを忘れないように。
「条件が成立しなかった場合の文」にも if
文を書くことができるので、複数の条件で分岐したい場合には次のような形となる。
if (条件1) 条件1が成立した場合の文; else if (条件2) 条件1が成立せず、条件2が成立した場合の文; else 条件1も条件2も成立しなかった場合の文;
switch
文
switch (式) { case 定数式1: 実行文1; break; case 定数式2: 実行文2; break; default: 実行文n; }
switch
文ではある式の結果によって三つ以上の場合分けを行う事ができる。
式の結果を case
ラベルで示される定数式と比較して、一致するものがあれば、
対応する実行文が実行される。
case
ラベルは
と書き、定数式の後ろはコロン「:」である事に注意。
また、各実行文の後ろに break;
をつけ忘れると、
プログラムの続きにかかれている文も実行されてしまう事にも注意が必要。
どの定数式にも一致しなかった場合は、default
ラベルがあれば
対応する実行文が実行される。
次のプログラムを実行し、switch 文の振る舞いについて確認せよ。
/* switch_test.c */ /* switch 文の確認 */ #include <stdio.h> int main(int argc, char *argv[]) { switch (argc) { case 1: printf("引数がありません\n"); break; case 2: case 3: case 4: printf("引数は %dつです\n", argc - 1); break; default: printf("引数はたくさんです。\n"); break; } return 0; }
次の関数が何をするものかを調べ、この関数を使ったプログラムを作成せよ。 また、余裕があれば同じ機能を実現する他の方法を考えよ。
/* rot.c */ int rot(int *ch, int shift) { char tmp; if (*ch > 0x40 && *ch <= 0x5a) { tmp = *ch - 'A'; tmp = tmp + shift; tmp = tmp % 26; *ch = 'A' + tmp; return 0; } if (*ch > 0x60 && *ch <= 0x7a) { tmp = *ch - 'a'; tmp = tmp + shift; tmp = tmp % 26; *ch = 'a' + tmp; return 0; } return 1; }
5日目の問題 4、7日目の問題 6に 対する解答プログラムができていることも確認すること。
8日目 | 表紙 | 10日目 |