
プログラミングにおけるループ構造は効率的なコード作成の基盤となる。特にwhileループは、特定の条件が満たされている間、同じ処理を自動的に繰り返す強力な機能だ。データ処理やユーザー入力の検証など、様々な場面で活用される。
whileループの仕組みと実用例
whileループの基本構文は条件式とその条件下で実行される処理ブロックから構成される。条件が真である限り、処理ブロックは何度も実行され続ける。
while (条件式) {
// 繰り返し実行する処理
}
具体的な動作原理を理解するため、簡単な例を見てみよう。以下のコードはカウンターを使った典型的なwhileループだ。
#include <stdio.h>
int main() {
int count = 0;
while (count < 5) {
printf("count = %d\n", count);
count++;
}
return 0;
}
出力
count = 0
count = 1
count = 2
count = 3
count = 4
このプログラムでは、最初に変数countを0に初期化する。続いてwhile文の条件部分で「countが5より小さい間」という条件を設定する。条件が真である間、ループ内の処理が実行され、countの値を表示した後、その値を1増やす。countが5になると条件が偽となり、ループを抜けてプログラムが続行する。
whileループを使う際の重要なポイントは、必ず条件が変化する仕組みを組み込むことだ。そうしないと、条件が永遠に真のままとなり、無限ループに陥る危険性がある。
#include <stdio.h>
int main() {
int count = 0;
while (count < 5) {
printf("count = %d\n", count);
// countを増やす処理がない!
}
return 0;
}
上記のコードではcountを増やす処理がないため、countは常に0のままとなる。結果として条件は常に真となり、プログラムは強制終了するまで永遠に同じ処理を繰り返す。
実用的なwhileループの活用例として、ユーザー認証システムがある。正しいパスワードが入力されるまでログイン試行を繰り返すのは、whileループの典型的な使用法だ。
#include <stdio.h>
#include <string.h>
int main() {
char password[20];
int authenticated = 0;
while (!authenticated) {
printf("パスワードを入力してください: ");
scanf("%s", password);
if (strcmp(password, "secure123") == 0) {
authenticated = 1;
printf("ログインに成功しました\n");
} else {
printf("パスワードが間違っています\n");
}
}
return 0;
}
このプログラムでは、認証状態を示す変数authenticatedが0(偽)の間、ログイン処理を繰り返す。正しいパスワードが入力されるとauthenticatedが1(真)になり、ループを抜ける。
whileループはデータ処理にも効果的だ。例えば、ファイルの終わりまで読み取る処理は以下のように実装できる。
#include <stdio.h>
int main() {
FILE *file = fopen("data.txt", "r");
char line[100];
if (file != NULL) {
while (fgets(line, sizeof(line), file) != NULL) {
printf("%s", line);
}
fclose(file);
}
return 0;
}
このコードでは、fgets関数がNULLを返す(ファイルの終わりに達する)まで、ファイルから1行ずつ読み取って表示する。
ゲーム開発においてもwhileループは中心的な役割を果たす。ゲームの基本構造であるメインループは、ユーザーが終了を選択するまでゲームを実行し続ける。
#include <stdio.h>
int main() {
int gameRunning = 1;
int userChoice;
while (gameRunning) {
printf("1: ゲームプレイ\n");
printf("2: 設定変更\n");
printf("0: 終了\n");
printf("選択してください: ");
scanf("%d", &userChoice);
switch (userChoice) {
case 0:
gameRunning = 0;
printf("ゲームを終了します\n");
break;
case 1:
printf("ゲームをプレイします\n");
// ゲームプレイの処理
break;
case 2:
printf("設定を変更します\n");
// 設定変更の処理
break;
default:
printf("無効な選択です\n");
}
}
return 0;
}
このように、whileループはプログラムに反復処理と条件判断の能力を与え、動的で応答性の高いアプリケーション開発を可能にする重要な構文要素だ。
do…whileループの構造と特徴
プログラミングにおいて繰り返し処理を実装する方法はいくつか存在するが、do…whileループは特殊な動作特性を持っている。通常のwhileループと異なり、条件判定の位置が処理ブロックの後にある。
do…whileループの基本構文は以下のとおりだ。
do {
// 繰り返し実行する処理
} while (条件式);
最大の特徴は、条件の真偽にかかわらず処理ブロックが最低1回は実行されることだ。これは条件判定がループの最後に置かれているためで、先に処理を行い、その後で条件をチェックする流れになる。
以下に具体的な例を示す。
#include <stdio.h>
int main() {
int count = 0;
do {
printf("count = %d\n", count);
count++;
} while (count < 5);
return 0;
}
このプログラムの実行結果は以下のようになる。
count = 0
count = 1
count = 2
count = 3
count = 4
実行の流れを追うと、まずcount変数が0に初期化される。次にdo…whileループに入り、条件チェック前に処理ブロックが実行される。この処理でcountの値(0)が表示され、countがインクリメントされて1になる。その後、条件count < 5がチェックされ、真であるため再度ループが実行される。この流れがcountが5になるまで続き、最終的に条件が偽になるとループが終了する。
whileループとの違いを明確にするために、最初から条件が偽である場合の挙動を比較してみよう。
// do...whileの場合
#include <stdio.h>
int main() {
int count = 10; // 初期値が既に条件を満たさない
do {
printf("do...while: count = %d\n", count);
count++;
} while (count < 5);
return 0;
}
// 通常のwhileの場合
#include <stdio.h>
int main() {
int count = 10; // 初期値が既に条件を満たさない
while (count < 5) {
printf("while: count = %d\n", count);
count++;
}
return 0;
}
do…whileを使った例では、条件count < 5が最初から偽(10 < 5は偽)であっても、「count = 10」が1回だけ表示される。一方、通常のwhileループでは初回の条件チェックで偽と判定され、ループ内の処理は一度も実行されない。
do…whileが適している場面としては、ユーザー入力の検証などがある。例えば、有効な入力を得るまで繰り返し入力を求めるプログラムは以下のように実装できる。
#include <stdio.h>
int main() {
int number;
do {
printf("1から10までの数字を入力してください: ");
scanf("%d", &number);
if (number < 1 || number > 10) {
printf("範囲外です。再入力が必要です。\n");
}
} while (number < 1 || number > 10);
printf("入力された数字: %d\n", number);
return 0;
}
このプログラムではユーザーに1から10までの数字の入力を求め、範囲外の数字が入力された場合は再入力を促す。do…whileループを使用しているため、入力要求は必ず1回実行され、さらに入力が無効である限りループが続く。
メニュー選択システムもdo…whileの典型的な使用例だ。
#include <stdio.h>
int main() {
int choice;
do {
printf("\nメニュー:\n");
printf("1. ファイル表示\n");
printf("2. ファイル編集\n");
printf("3. ファイル保存\n");
printf("0. 終了\n");
printf("選択してください: ");
scanf("%d", &choice);
switch(choice) {
case 1:
printf("ファイルを表示します\n");
break;
case 2:
printf("ファイルを編集します\n");
break;
case 3:
printf("ファイルを保存します\n");
break;
case 0:
printf("プログラムを終了します\n");
break;
default:
printf("無効な選択です\n");
}
} while (choice != 0);
return 0;
}
このメニュープログラムでは、まずメニューを表示して選択を受け付け、ユーザーが終了(0)を選択するまでループを続ける。do…whileループを使用することで、最初に必ずメニューが表示される。
注意点としては、do…whileループを使用する際は必ず中括弧{}で処理ブロックを囲む必要がある。処理が1行だけであっても中括弧は省略できない。また、ループ終了条件の後にセミコロン(;)を忘れないように注意が必要だ。これはwhileループとの構文上の違いで、do…whileループではセミコロンが文の終端を示す重要な要素となる。
プログラムの可読性の観点からは、処理が必ず1回は実行されるという振る舞いが明確に必要な場合にのみdo…whileループを使用するのが適切だ。そうでない場合は、条件判定が先行する通常のwhileループの方が処理の流れを理解しやすくなる。