第6章の6 do~while文

1. do~while文の記述方法

while文とfor文は、いずれも前判定で繰り返しを行う制御文です。それに対して、do~while文は、まず処理を実行してから、繰り返すかどうかを判定します。この特徴により、少なくとも1回は必ず処理が実行されます。

【書き方】
do {
  文;
} while (継続条件式);

  • まず文を実行してから、継続条件の判定を行う。
  • 継続条件式が真である間、文を繰り返し実行。
  • while文は一度も実行されないことがあるが(最初から条件が’偽’のとき)、 do~while文ではとりあえず 1回は文を実行する。
  • 文は複合文({ }で囲んだ文の集合)も可。
  • 単文なら { } 省略可。
  • 継続条件式の後の(;)を忘れないよう注意。
// 0を入力するまで加算を繰り返す例
#include <stdio.h>

int main(void)
{
    int wa = 0, data;

    do {                            // ループ開始
        printf("整数値入力> ");
        scanf("%d", &data);         // dataを入力
        wa += data;                 // waに加算
        printf("wa = %d\n", wa);
    } while (data != 0);            // dataが0でない間ループ

    return 0;
}

【実行結果例】
整数値入力> 3
wa = 3
整数値入力> 5
wa = 8
整数値入力> 8
wa = 16
整数値入力> 0
wa = 16

 水色文字はキーボードからの入力

  • while文と異なり、まず処理をするため、data が 0 か否か判定するため、ループ処理の前に data を入力する必要がない。
  • do~while文は使用頻度は高くないが、「とりあえず 1回は実行する。場合によっては繰り返す」場合に便利。

2. while文とdo~while文の比較

while文の例

// while文を用いて -1 まで繰り返す
#include <stdio.h>

int main(void)
{
	int a[] = {1, 2, 3, 4, -1}, b[5] = {0};

	// 配列aの内容を配列bにコピー
	int i = 0;
	while (a[i] != -1) {
		b[i] = a[i];
		i++;
	}

	// 配列bの内容を確認
	for (i = 0; i < 5; i++)
		printf("%d ", b[i]);
	printf("\n");

    return 0;
}

【実行結果例】
1 2 3 4 0 ← –1はコピーされない

do~while文の例

// do~while文を用いて -1 まで繰り返す
#include <stdio.h>

int main(void)
{
	int a[] = {1, 2, 3, 4, -1}, b[5] = {0};

	// 配列aの内容を配列bにコピー
	int i = 0;
	do {
		b[i] = a[i];
	} while (a[i++] != -1);

	// 配列bの内容を確認
	for (i = 0; i < 5; i++)
		printf("%d ", b[i]);
	printf("\n");

    return 0;
}

【実行結果例】
1 2 3 4 -1 ← -1もコピーされる

  • whileでは、a[4] != -1 でループを終了するので、
    b[4] = a[4];
    は実行されません。
  • do~whileでは、
    b[4] = a[4];
    を実行してからa[4] != -1を判定してループを終了します。
  • do ~ whileの
    while (a[i++] != -1);
    は、a[i] != -1 を判定してから i++ で i をインクリメントします。

〇 演習問題

do~while文を使って、以下のフローチャートをプログラミングしなさい。

問1

【実行結果例】
整数値を入力 500
data1 = 500
整数値を入力 300
data1 = 200
整数値を入力 250
data1 = -50

水色文字はキーボードからの入力

問2

【実行結果例】
文字列入力 computer
str2 = computer

水色文字はキーボードからの入力

解答例

// 問1
#include <stdio.h>

int main(void)
{
    int data1 = 1000;
    int data2;

    do {
        printf("整数値を入力 ");
        scanf("%d", &data2);
        data1 = data1 - data2;
        printf("data1 = %d\n", data1);
    } while (data1 > 0);

    return 0;
}
// 問2
#include <stdio.h>

int main( void )
{
    char str1[100], str2[100];
    int i;

    printf("文字列入力 ");
    scanf( "%99s", str1 );

    i = 0;
    do {
        str2[i] = str1[i];
    } while (str1[i++] != '\0');

    printf("str2 = %s\n", str2);

    return 0;
}

コメント