内 容
- do〜while文
- continu文とbreak文
- while文
do〜while文
do〜while文
do〜while文は与えられた処理を何度も繰り返すための構文です。繰り返したい処理は、doの後のコードブロック{ }の中に記述します。繰り返し処理を継続するか否かはwhileの直後の括弧の中に記述する条件式によって決まります。条件式が真(true)ならばコードブロック{}の先頭に再び戻って処理を継続します。もし、偽(false)ならばdo〜while文を終了します。
次のプログラム例は、整数値を入力してその値が非負の整数ならば繰り返し処理を継続し、負の整数ならば繰り返し処理を終了します。
例 dowhile.c
#include <stdio.h>
int main(void)
{
int n;
do {
printf("非負の整数>> ");
scanf("%d", &n);
if (n<0){
printf("非負の整数ではありません。もう一度入力し直してください。\n");
}
} while (n<0);
return 0;
}
構文:
do {
繰り返す処理
} while (条件式)
流れ図:
繰り返しの判定条件が処理の後ろにあるので、必ず1度は処理が行われる。
カウントアップ、カウントダウン
while文を使って、1から10までカウントアップしながら整数を表示するプログラムです。
例 countup10.c
#include <stdio.h>
int main(void)
{
int i = 1;
do {
printf("%d\n", i);
i = i + 1; // カウントアップ
} while (i<=10); // iの値が11になったら終了する
return 0;
}
次は、10から1までカウントダウンしながら整数を表示するプログラムです。
例 countdown10.c
#include <stdio.h>
int main(void)
{
int i = 10;
do {
printf("%d\n",i);
i = i - 1; // カウントダウン
} while (i>0); // iの値が−1になったら終了する
return 0;
}
繰り返しの判定、プログラムは必ず終了しなければならない
次のプログラムは、整数を入力して偶数か奇数かを繰り返し判定することができるプログラムです。繰り返し処理do〜whileを継続するか否かを判定するために、ここではy(yes)/n(no)のいずれかの文字の入力を求めて、'y'が入力された場合にのみ継続することにしました。
例 yesno.c
#include <stdio.h>
int main(void)
{
int n;
char ch;
do {
printf("整数>> ");
scanf("%d", &n);
if(n%2)
puts("奇数です。\n");
else
puts("偶数です。\n");
printf("続けて入力する?[y/n]>> ");
scanf("%*c%c", &ch); // %*cで前のscanfで読み込んだ改行文字を読み捨てる
} while (ch=='y');
return 0;
}
プログラムは必ず終了しなければならい。
文字を読み込むためのscanfの連続使用時の注意点
scanfを使ってキーボードから入力する際、その入力を確定するためには必ず最後にenterキーを入力します。例えば、文字yを入力すためには、[y] [enter]と入力します。この時、入力バッファには文字'y'に加えて改行文字'\n'が入力されます。つまり1文字入力するために2文字が入力されているわけです。しかし、scanf("%c", &c)は1文字'y'だけしか読み込んではくれません。入力バッファには改行文字'\n'が残ることになります。そのため、次のscanf("%c", &c)は、入力バッファに残った改行文字'\n'を読み込んでしまい、次に入力する文字を正しく読み込んではくれないのです。
では、どうしたら良いのでしょう。とにかく不要な改行文字'\n'を読み捨てれば良いので、いくつかの方法が考えられます。上記のプログラム例では、scanf("%*c%c", &ch);として、その前のscanfで入力された改行文字'\n’を「読み込むが代入はしない」という変換指定子%*cを使って読み捨てるようにします。
1からNまでの合計値を求める
1からNまでの合計値を求める方法を考えてみます。
1〜2までの合計値は、1+2
1〜3までの合計値は、1+2+3
1〜4までの合計値は、1+2+3+4
1〜5までの合計値は、1+2+3+4+5
・・・
1〜Nまでの合計値は、1+2+3+・・+i+・・+(N-1)+N
となります。
同様の計算をプログラムとして表現するために、これを「手順」に置き換えてみます。
手順1:合計値を格納する変数sumを用意して0で初期化する。
手順2:合計値に加算する値を格納する変数iの値を1にする。
手順3:変数sumに変数iの値を加算した結果を変数sumに代入する。
手順4:変数iの値をインクリメントする。
手順5:変数iの値がN以下である間、手順3〜4を繰り返す。
これをプログラムにしたものが次の例sumof.cです。
例 sumof.c
#include <stdio.h>
int main(void)
{
int sum=0, i=1,n; //合計
printf("整数>> ");
scanf("%d", &n);
do {
sum = sum + i;
i = i + 1;
} while (i<=n);
printf("1から%dまでの合計は、%dです。\n", n,sum);
return 0;
}
0からNまでの合計を求めるためには、
0で初期化した変数sumに、1〜Nまでの値を順番に加算していく。
cotinue文とbreak文
正の整数を入力して、その平方根を求めるプログラムを考えます。
continue文
C言語には平方根を求めるための関数sqrt()が用意されています。この関数を利用するためにヘッダファイルmath.hでをインクルードします。次に、sqrtは負の値に対する解を求めることができないので、正の整数だけを受け付けるようにします。入力部分にdo while文を使って正の数が入力されるまで処理を繰り返すという方法もありますが、ここでは
continue文を使って実現しています。continue文は、ブロック内のそれ以降の処理をキャンセルする命令です。この例では、負数が入力された場合には、直後のprintf文を処理せず、ブロックの先頭に戻ることになります。
whileCotinue.c
#include <stdio.h>
#include <math.h>
int main(void)
{
int a;
do {
printf("正の整数(99入力で終了)>> ");
scanf("%d", &a);
if(a<=0) continue; //真ならばブロック内の以降の処理を行わない
printf("%.3f\n",sqrt(a)); //sqrtの引数、戻り値ともdouble型
} while(a!=99);
return 0;
}
無限ループとbreak文
次の例も、上記と同様に関数sqrt()を使って、平方根の値を求めるプログラムです。ただし、繰り返し入力を実現するためにdo while文の条件式を1、すなわち「真(true)」として無限ループを構成しています。もちろん、それだけではいつまでたっても終了することができないため、99が入力された時にだけブロック内から脱出するための命令break文を設定します。
whileBreak.c
#include <stdio.h>
#include <math.h>
int main(void)
{
int a;
do {
printf("正の整数(99入力で終了)>> ");
scanf("%d", &a);
if(a == 99) break; //ブロックを脱出する
if(a<=0) continue; //真ならば以降の処理を行わない
printf("%.3f\n",sqrt(a)); //sqrtの引数、戻り値ともdouble型
} while(1);
return 0;
}
while文
繰り返し画面に表示する
while文もdo〜while文と同様に繰り返し処理をするための構文です。この二つの構文の大きな違いは、do〜while文の繰り返しの判定条件が処理の後にあるのに対してwhile文が処理の前にある点です。do〜while文が繰り返し条件の真偽にかかわらず波括弧{}の中を少なくとも1回は処理するのに対して、while文は条件によっては一度も処理をしない可能性があります。
画面にメッセージを10回繰り返して表示するプログラム例c6-3.cです。int型の変数iは、繰り返しの回数を数えあげるためのカウンタ変数です。値0で初期化されているので、
例 whileLoop.c
#include <stdio.h>
int main(void)
{
int i=0;
while(i<10){
printf("I love C programing.¥n");
i++; //カウントアップ
}
return 0;
}
構文:
while(条件式) {
繰り返す処理
}
流れ図:
条件によっては一度も処理されないことがある。
expand_lessBack to TOP