教科書P124〜126
while文 do while文 フローチャート コード while (条件)
{
処理;
}do
{
処理;
} while (条件);処理の流れ while文に入るとまず条件を調べ、成り立てばループ内の処理を行う。
ループ内の処理を1回も行わずに抜ける場合があるdo文に入るとまずループ内の処理を行い、その後、while文の条件を調べ、成り立てばループ内の処理を行う。
ループ内の処理は最低1回は行われる[POINT]
- do while文のwhileの後ろにはセミコロン「
;」が付くことに注意!!- for文やwhile文と比べdo while文は使用頻度は少ないが、
Case by Caseで使い分けたい練習問題
教科書126ページ練習問題29
教科書P127〜129
if文 switch case文 フローチャート コード if (条件)
{
成り立つ場合の処理;
}
else
{
成り立たない場合の処理;
}switch (式)
{
case 値1:
値1の処理;
break;
case 値2:
値2の処理;
break;
・
・
・
default:
それ以外の値の処理;
}処理の流れ if文に入るとまず条件を調べ、成り立てば「成り立つ場合の処理」を、成り立たなければ「成り立たない場合の処理」を実行してif文を抜ける。
2パターンの分岐しかできないswitch文に入るとまず式の値を調べ、その値によって処理を分岐させる。また、caseで指定した値以外の処理はdefault句で指定できる。
任意の数だけ分岐できる[POINT]
- case 値 の右側はセミコロン「;」ではなく、コロン「
:」であることに注意!![例1]
switch (w) { case 0: printf("日曜日\n"); break; case 1: printf("月曜日\n"); break; case 2: printf("火曜日\n"); break; case 3: printf("水曜日\n"); break; case 4: printf("木曜日\n"); break; case 5: printf("金曜日\n"); break; case 6: printf("土曜日\n"); break; default: printf("データエラー\n"); }
switch case文で使用しているbreak文は、「
これ以降の処理は行わず、switch文を抜ける」という意味である。case句内の処理が終わったら次のcase句が始まる前にbreak文を付けないと、switch文内のそれ以降の処理を全て実行してしまう。[例2]
scanf("%d", &w); switch (w) { case 0: printf("日曜日\n"); case 1: printf("月曜日\n"); case 2: printf("火曜日\n"); case 3: printf("水曜日\n"); case 4: printf("木曜日\n"); case 5: printf("金曜日\n"); case 6: printf("土曜日\n"); default: printf("データエラー\n"); }このプログラムで入力データを3とした場合、次のように出力されてしまう。
>3
水曜日
木曜日
金曜日
土曜日
データエラー
switch文のカッコ内には「
式」を指定し、case文には「値(0, 1, 'A'など)」を指定する。
値には文字列は指定できない。また、OR演算子(||)を使って1つのcase文に複数の値を指定することはできない。[エラーになる例]
switch (m) { case 2: lastday = 28; break;case 4 || 6 || 9 || 11:← ここがエラー lastday = 30; break; default: lastday = 31; }[エラーにならない例]
switch (m) { case 2: lastday = 28; break;case 4: ← break文を付けないことにより、処理を下に流すcase 6:case 9:case 11:lastday = 30; break; default: lastday = 31; }練習問題
教科書129ページ練習問題30
教科書P130〜131
例えば次のようなif文がある。
if (m == 2) { lastday = 28; } else { if (m == 4 || m == 6 || m == 9 || m == 11) { lastday = 30; } else { lastday = 31; } }これは
else if文を使い、次のように記述できる。
if (m == 2) { lastday = 28; } else if (m == 4 || m == 6 || m == 9 || m == 11) { lastday = 30; } else { lastday = 31; }[POINT]
else if文は、ただのif else文である!!
(C言語はフリーフォーマットであるという性質を利用し、if else文を分かりやすく記述しているだけ)練習問題
教科書131ページ練習問題31
教科書P132〜133
switch case文または繰り返し文(for, while, do while)を抜け出すことができる。
[ループから抜ける場合のフローチャート]
![]()
[例] −1が入力されるまで入力データを加算する
今までのプログラム break文を使用したプログラム while (scanf("%d", &num), num != (-1))
{
sum += num;
}while (1) ← 永久ループ
{
scanf("%d", &num);
if (num == (-1))
break;
sum += num;
}[POINT]
- 構造化プログラミングの考え方には反するプログラミングになってしまうが、Case by Caseで使い分けよう
ループ中にbreakが実行されると、最も内側のループから抜ける。ループがネストしている場合、
最も内側のループのみ抜け出す。何重もネストしたループから一気に抜けることはできない。![]()
練習問題
教科書133ページ練習問題32
教科書P134
繰り返し文(for, while, do while)の途中から先頭に戻ることができる。
[フローチャート]
![]()
[例] 自機と敵キャラ(最大50匹)とのあたり判定
for (i=0 ; i<50 ; i++) {if ( 敵キャラ(i)は死んでいる )/* 死んでたらこれ以降の処理は行わない */continue;if ( 自機と敵キャラ(i)は衝突している ) 衝突しているときの処理; ・ ・ ・ }[POINT]
- elseで以降の処理を記述すればよいが、場合によってはこちらのほうが見やすくなる。Case by Caseで使い分けよう
値を返す関数で、呼び出し元の関数にreturnの後に記述する値を返し、関数を抜け出す(終了させる)ことができる。
returnの後に値を指定しない場合、呼び出し元には何も値を返さずに関数を抜け出す。[例] 引数に与えられた文字列を表示する関数
void strout (char *str) {if ( strlen(str) == 0 )/* 文字列の長さが0なら処理を行わない(関数を抜ける) */return;printf("与えられた文字列は「%s」です。", str); }[POINT]
- elseで以降の処理を記述すればよいが、場合によってはこちらのほうが見やすくなる。Case by Caseで使い分けよう
教科書P134
(関数ではなく)プログラム自身を終了させることができる。
[フローチャート]
![]()
[例] 入力データがおかしかったらプログラムを終了させる
void main(void) { int num; printf("2, 4, 6, 8のいずれかを入力>"); scanf("%d", &num); /* 入力データチェック(違う値ならプログラムを終了する) */if (!(num == 2 || num == 4 || num == 6 || num == 8))exit();switch (num) { case 2: 下方向移動処理 ・ ・ ・[POINT]
- elseで以降の処理を記述すればよいが、場合によってはこちらのほうが見やすくなる。Case by Caseで使い分けよう
exit文はプログラム内で
exit();と括弧をつけて記述する。カッコ内に式を指定すると、OSに対して値を返すことができる。
UNIX系のOSは、OSから実行するプログラムは全てエラーコードを返すように設計されている。そのため、プログラムが正常に終了したことをOSに知らせるために、プログラムの最後にexit(1);と記述するのが望ましい。この場合、main関数はint型で宣言するべきである(int main(void))。
MS-DOS系のOSはそのように設計されていないが、プログラムから帰ってきた値をバッチ・ファイルなどで利用することができる。