第12章 制御構造・2

1 do while文

教科書P124〜126

1-1 while文とdo while文の違い


while文 do while文
フローチャート
コード while (条件)
{
  処理;
}
do
{
  処理;
} while (条件);
処理の流れ while文に入るとまず条件を調べ、成り立てばループ内の処理を行う。
ループ内の処理を1回も行わずに抜ける場合がある
do文に入るとまずループ内の処理を行い、その後、while文の条件を調べ、成り立てばループ内の処理を行う。
ループ内の処理は最低1回は行われる

[POINT]

練習問題

教科書126ページ練習問題29

2 switch case文

教科書P127〜129

2-1 if文とswitch case文の違い


if文 switch case文
フローチャート
コード if (条件)
{
  成り立つ場合の処理;
}
else
{
  成り立たない場合の処理;
}
switch (式)
{
 case 値1:
  値1の処理;
  break;
 case 値2:
  値2の処理;
  break;
  ・
  ・
  ・
 default:
  それ以外の値の処理;
}
処理の流れ if文に入るとまず条件を調べ、成り立てば「成り立つ場合の処理」を、成り立たなければ「成り立たない場合の処理」を実行してif文を抜ける。
2パターンの分岐しかできない
switch文に入るとまず式の値を調べ、その値によって処理を分岐させる。また、caseで指定した値以外の処理はdefault句で指定できる。
任意の数だけ分岐できる

[POINT]

[例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");
}

2-2 breakの使い方

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
水曜日
木曜日
金曜日
土曜日
データエラー

2-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

3 else if文

教科書P130〜131

3-1 else if文

例えば次のような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]

練習問題

教科書131ページ練習問題31

第12章4 break文

教科書P132〜133

4-1 break文とは

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]

4-2 ネストしたループからのbreakについて

ループ中にbreakが実行されると、最も内側のループから抜ける。ループがネストしている場合、最も内側のループのみ抜け出す何重もネストしたループから一気に抜けることはできない

練習問題

教科書133ページ練習問題32

5 continue文

教科書P134

5-1 continue文とは

繰り返し文(for, while, do while)の途中から先頭に戻ることができる。

[フローチャート]

[例] 自機と敵キャラ(最大50匹)とのあたり判定

for (i=0 ; i<50 ; i++)
{
    if ( 敵キャラ(i)は死んでいる )  /* 死んでたらこれ以降の処理は行わない */
        continue;

    if ( 自機と敵キャラ(i)は衝突している )
        衝突しているときの処理;
    ・
    ・
    ・
}

[POINT]

6 return文

6-1 return文とは

値を返す関数で、呼び出し元の関数にreturnの後に記述する値を返し、関数を抜け出す(終了させる)ことができる。
returnの後に値を指定しない場合、呼び出し元には何も値を返さずに関数を抜け出す

[例] 引数に与えられた文字列を表示する関数

void strout (char *str)
{
    if ( strlen(str) == 0 )  /* 文字列の長さが0なら処理を行わない(関数を抜ける) */
        return;

    printf("与えられた文字列は「%s」です。", str);

}

[POINT]

7 exit文

教科書P134

7-1 exit文とは

(関数ではなく)プログラム自身を終了させることができる。

[フローチャート]

[例] 入力データがおかしかったらプログラムを終了させる

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]

7-2 プログラムの戻り値

 exit文はプログラム内でexit();と括弧をつけて記述する。カッコ内に式を指定すると、OSに対して値を返すことができる
 UNIX系のOSは、OSから実行するプログラムは全てエラーコードを返すように設計されている。そのため、プログラムが正常に終了したことをOSに知らせるために、プログラムの最後にexit(1);と記述するのが望ましい。この場合、main関数はint型で宣言するべきである(int main(void))
 MS-DOS系のOSはそのように設計されていないが、プログラムから帰ってきた値をバッチ・ファイルなどで利用することができる。


[ TOP ]