後判定と先判定
繰り返し処理であるfor文、while文は、条件判定を先に行い、繰り返し処理が実行されます。
繰り返し処理を先に実施してから条件判定を実行する構文が以下になります。
do
{
繰り返し処理;
}while(条件式);
処理のイメージは、while文と全く同じです。
実行される順番と、while(条件式);の最後に ; が付くことが異なります。
重ね重ねになりますが、do~while文は、
①繰り返し処理を実行
②条件式の判定
③結果が真の場合は再度①を実行
結果が偽の場合はdo~while文は終了
繰り返し処理が必ず1回は実行されます。
while文の方は、条件判定によっては繰り返し処理を一度も実行せずに終了することがあります。
入力チェック
C言語で物理層に近い開発をする場合は、printfやscanfは使いません(その為、これまでも割愛しています)
しかし、if文とwhile文を合わせた処理を学んでいただく為に解説をしたいと思います。
do~while文の利点である「繰り返し処理を1度は実行する」意味がどの様なcaseで効力があるのかを見てみましょう。
参考書のコードを例に解説したいと思います。
#include <stdio.h>
int main(void)
{
int r;
double s;
printf("半径?:");
scanf("%d",&r);
while(r < 0)
{
printf("半径?:");
scanf("%d",&r);
}
s = r * r * 3.14;
printf("面積は %f です。\n", s);
return 0;
}
scanf関数でキーボードからの入力値を取得します。
変数 r に入力値が格納されているので、while文の条件式で判定にかけます。
この判定で0よりも小さい値が格納されていると、不定値として再度入力を促すようになっています(while文の繰り返し処理部分)
正の値が入力されたことでwhile文を抜けて、17行目の面積の演算処理に進みます。
このプログラムで問題はありませんが、8~9行目と13~14行目で同じ処理が2度出てくるのがスマートではありません。
プログラミング自体に問題はないものの、設計思想の多くは同じコードを何度も使用したり、
あちらこちらで点在するような記述は、できるだけ一つに集約することが望ましいです。
そこで、複数同じ処理を記載しないコードが以下になります。
#include <stdio.h>
int main(void)
{
int r;
double s;
do
{
printf("半径?:");
scanf("%d",&r);
}while(r < 0);
s = r * r * 3.14;
printf("面積は %f です。\n", s);
return 0;
}
繰り返し処理が必ず1度は実行されるdo~while文にすることで、冒頭に入力読み込み処理を書く必要はなくなりました。
他人が可読する際にも、設計した自分も分かりやすいコードになることを心掛けてみてください。