C言語編 第16章 同じ処理を繰り返す(do文)

このエントリーをはてなブックマークに追加

この章の概要

この章の概要です。

前判定と後判定

ループ構造には2つの形があります。 1つは前判定ループといい、「ループ内の処理」を実行するより前に「条件式」を判定する構造です。 もう1つは後判定ループといい、「ループ内の処理」を実行し終えてから「条件式」を判定する構造です

[前判定ループのフローチャート] 前判定ループ [後判定ループのフローチャート] 後判定ループ

左側が前判定ループ、右側が後判定ループを表しています。

このような処理の流れを表す図を、フローチャート(流れ図)と呼びます。 色々な図形を用いて描く宗派(?) もありますが、一番重要なのは「流れ」であって、図形自体はあまりこだわる必要は無いでしょう。 既にフローチャート自体が時代遅れと言わざるを得ないところまで来ています。

この2つのフローチャートを見比べると、前判定ループでは「ループ内の処理が1度も実行されないことがある」のだと分かります。 同様に、後判定ループでは「ループ内の処理が必ず1度は実行される」ことが分かります。

前判定ループの方は何のことは無く、これまでに紹介してきた while文や for文によって作られるループ構造を表しています。 この章の主題は、後判定ループを作る do文です。

do文

do文は後判定ループを作るために用意されており、次のように構造になっています。

do{
	ループさせる処理
} while( 条件式 );

do文は、whileキーワードがセットで付いてきます。そのため、do-while文と呼ぶこともあります。 なお、while の後ろにあるセミコロンを忘れないように注意して下さい。
やはり { } は、その内容が1文だけなら省略できますが、他の場面以上に不明瞭になりやすいため、 do文のときには省略しない人が多いはずです。

何が不明瞭かと言えば、後に付いてくる「while」が、do-while文を構成するための while なのか、 単独の while文なのかが分かりづらいということです。 何にせよ、{ } はいかなる場面でも省略しないことを勧めます。

do文を使う機会は少ないと言えます。 do文自体を嫌う人もいるようで、実際のところ、do文を使わずにプログラムを書き直すことは可能です(読み易さが同レベルかどうかは別)。 ただし、while文や for文で自然に書けるプログラムを、あえて do文を使う理由はありません。 後判定ループの方が、前判定ループよりもやや読みにくいと言えます。

do文を使う場面の一例としては、成功するまで入力を要求し続けるようなタイプのプログラムです。 例えば、次のような感じです。

#include <stdio.h>
#include <string.h>

int main(void)
{
	char password[16] = "password";
	char try_password[16];
	char str[16];


	do{
		puts( "正しいパスワードを入力して下さい。" );
		fgets( str, sizeof(str), stdin );
		sscanf( str, "%s", try_password );

	} while( strcmp( try_password, password ) != 0 );

	puts( "入力に成功しました。" );

	return 0;
}

実行結果:

正しいパスワードを入力して下さい。
passward
正しいパスワードを入力して下さい。
password
入力に成功しました。

do文を使うことによって、最初の1回を自然にループの中に含めることができます。 while文の場合だと、最初の1回を行うために、条件式が真になるように仕向ける必要があります。


練習問題

問題@ 標準入力から 'q' が入力されるまで、「q を入力して下さい。」と出力し続けるプログラムを作成して下さい。

問題A 本文中のサンプルプログラムを、while文で書き直し、do文の場合と読み比べてみて下さい。

問題B while文、for文のときと同様のプログラム「標準入力から受け取った文字を 10回表示する」を、do文を使って作成して下さい。


解答ページはこちら

参考リンク

更新履歴

'2009/4/11 新規作成。



前の章へ

次の章へ

C言語編のトップページへ

Programming Place Plus のトップページへ