[C言語] while文の書き方を解説
C言語におけるwhile
文は、条件が真である間、特定のコードブロックを繰り返し実行するための制御構造です。
基本的な構文はwhile (条件) { /* 繰り返し実行するコード */ }
です。
条件が最初に評価され、真であればブロック内のコードが実行されます。
条件が偽になると、ループは終了します。
無限ループを避けるために、ループ内で条件を変化させるコードを含めることが重要です。
典型的な使用例として、カウンタ変数を用いたループや、ユーザー入力を待つループなどがあります。
while文の基本構造
while文とは
while
文は、C言語における基本的なループ構造の一つで、指定した条件が真である間、繰り返し処理を実行するための制御文です。
条件が偽になるとループを終了します。
while
文は、繰り返し処理を行う際に非常に便利で、特に繰り返し回数が事前に決まっていない場合に適しています。
while文の基本的な書き方
while
文の基本的な構造は以下の通りです。
#include <stdio.h>
int main() {
int count = 0; // カウンタ変数の初期化
// while文の開始
while (count < 5) {
printf("カウント: %d\n", count); // カウントを表示
count++; // カウンタをインクリメント
}
return 0;
}
この例では、count
が5未満である間、printf関数
を使ってカウントを表示し、count
をインクリメントしています。
カウント: 0
カウント: 1
カウント: 2
カウント: 3
カウント: 4
このプログラムは、count
が5になるまでループを繰り返し、各ループでカウントを表示します。
while文の動作の流れ
while
文の動作は以下のように進行します。
- 条件式を評価する。
- 条件式が真であれば、ループ内のブロックを実行する。
- 条件式が偽になるまで、ステップ1に戻る。
この流れにより、while
文は条件が満たされている間、繰り返し処理を行います。
無限ループの作成
while
文を使って無限ループを作成することも可能です。
無限ループは、条件が常に真である場合に発生します。
以下は無限ループの例です。
#include <stdio.h>
int main() {
while (1) { // 条件が常に真
printf("無限ループ中\n");
}
return 0;
}
このプログラムは、while
文の条件が常に真であるため、printf関数
を無限に実行し続けます。
無限ループは、特定の条件でループを終了させるためにbreak
文を使用することが一般的です。
while文の使用例
基本的なループの例
while
文を使った基本的なループの例を以下に示します。
この例では、0から9までの数字を順に表示します。
#include <stdio.h>
int main() {
int i = 0; // ループカウンタの初期化
// 0から9までの数字を表示
while (i < 10) {
printf("%d\n", i);
i++; // カウンタをインクリメント
}
return 0;
}
0
1
2
3
4
5
6
7
8
9
このプログラムは、i
が10未満である間、printf関数
を使ってi
の値を表示し、i
をインクリメントします。
条件付きループの例
次に、条件付きでループを終了する例を示します。
この例では、ユーザーが入力した数値が10以上になるまでループを続けます。
#include <stdio.h>
int main() {
int number = 0; // ユーザー入力を格納する変数
// ユーザーが10以上の数を入力するまでループ
while (number < 10) {
printf("10以上の数を入力してください: ");
scanf("%d", &number); // ユーザーからの入力を受け取る
}
printf("入力された数: %d\n", number);
return 0;
}
10以上の数を入力してください: 5
10以上の数を入力してください: 8
10以上の数を入力してください: 12
入力された数: 12
このプログラムは、ユーザーが10以上の数を入力するまで、scanf関数
を使って入力を受け取り続けます。
入力を受け取るループの例
while
文を使って、ユーザーからの入力を繰り返し受け取る例を示します。
この例では、ユーザーが”exit”と入力するまで文字列を受け取ります。
#include <stdio.h>
#include <string.h>
int main() {
char input[100]; // ユーザー入力を格納する文字列
// "exit"が入力されるまでループ
while (1) {
printf("文字列を入力してください (終了するには 'exit' と入力): ");
scanf("%s", input); // ユーザーからの入力を受け取る
if (strcmp(input, "exit") == 0) {
break; // "exit"が入力されたらループを終了
}
printf("入力された文字列: %s\n", input);
}
return 0;
}
文字列を入力してください (終了するには 'exit' と入力): hello
入力された文字列: hello
文字列を入力してください (終了するには 'exit' と入力): world
入力された文字列: world
文字列を入力してください (終了するには 'exit' と入力): exit
このプログラムは、ユーザーが”exit”と入力するまで、scanf関数
を使って文字列を受け取り、入力された文字列を表示します。
strcmp関数
を使って入力された文字列が”exit”であるかを確認し、break
文でループを終了します。
while文と他のループ構造の比較
C言語には、while
文の他にfor
文とdo-while
文というループ構造があります。
それぞれのループには特徴があり、用途に応じて使い分けることが重要です。
while文とfor文の違い
特徴 | while文 | for文 |
---|---|---|
初期化 | ループの外で行う | ループヘッダで行う |
条件判定 | ループの先頭で行う | ループの先頭で行う |
更新処理 | ループ内で行う | ループヘッダで行う |
- while文は、繰り返し回数が事前に決まっていない場合や、条件が複雑な場合に適しています。
初期化や更新処理を自由に配置できるため、柔軟性があります。
- for文は、繰り返し回数が明確に決まっている場合に適しています。
初期化、条件判定、更新処理を一行で記述できるため、コードが簡潔になります。
while文とdo-while文の違い
特徴 | while文 | do-while文 |
---|---|---|
条件判定 | ループの先頭で行う | ループの末尾で行う |
最低実行回数 | 0回 | 1回 |
- while文は、条件が真である限りループを実行しますが、条件が最初に評価されるため、条件が偽の場合は一度も実行されません。
- do-while文は、ループの内容を少なくとも一度は実行したい場合に適しています。
条件がループの末尾で評価されるため、条件が偽でも一度は実行されます。
どのループを選ぶべきか
ループを選ぶ際には、以下のポイントを考慮すると良いでしょう。
- 繰り返し回数が決まっている場合:
for
文を使用すると、コードが簡潔で読みやすくなります。 - 繰り返し回数が不明な場合:
while
文を使用すると、条件に応じた柔軟なループが可能です。 - 少なくとも一度は実行したい場合:
do-while
文を使用すると、条件に関わらず一度はループを実行できます。
これらの特徴を理解し、適切なループ構造を選択することで、効率的で読みやすいコードを書くことができます。
while文の応用
while
文は基本的なループ構造ですが、応用することでより複雑な処理を実現できます。
ここでは、while
文の応用例をいくつか紹介します。
ネストされたwhile文
while
文をネストして使用することで、二重ループを実現できます。
以下は、二次元配列の要素をすべて表示する例です。
#include <stdio.h>
int main() {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 2x3の行列
int i = 0, j = 0; // 行と列のカウンタ
// 行のループ
while (i < 2) {
j = 0; // 列のカウンタをリセット
// 列のループ
while (j < 3) {
printf("%d ", matrix[i][j]);
j++;
}
printf("\n");
i++;
}
return 0;
}
1 2 3
4 5 6
このプログラムは、while
文をネストして二次元配列の各要素を表示します。
複数条件のwhile文
while
文で複数の条件を組み合わせることができます。
以下は、二つの条件を持つループの例です。
#include <stdio.h>
int main() {
int a = 0, b = 10;
// aが5未満かつbが5より大きい間ループ
while (a < 5 && b > 5) {
printf("a: %d, b: %d\n", a, b);
a++;
b--;
}
return 0;
}
a: 0, b: 10
a: 1, b: 9
a: 2, b: 8
a: 3, b: 7
a: 4, b: 6
このプログラムは、a
が5未満かつb
が5より大きい間、ループを実行します。
フラグを使ったループ制御
フラグ変数を使ってループを制御することができます。
以下は、フラグを使ってループを終了する例です。
#include <stdio.h>
int main() {
int flag = 1; // フラグ変数
int count = 0;
// フラグが真である間ループ
while (flag) {
printf("カウント: %d\n", count);
count++;
if (count >= 5) {
flag = 0; // フラグを偽にしてループを終了
}
}
return 0;
}
カウント: 0
カウント: 1
カウント: 2
カウント: 3
カウント: 4
このプログラムは、count
が5以上になるとフラグを偽にしてループを終了します。
break文とcontinue文の活用
break
文とcontinue
文を使うことで、ループの制御をより柔軟に行うことができます。
- break文: ループを即座に終了します。
- continue文: ループの残りの処理をスキップし、次の反復に進みます。
以下は、break
文とcontinue
文を使った例です。
#include <stdio.h>
int main() {
int i = 0;
while (i < 10) {
i++;
if (i == 5) {
continue; // iが5のときはスキップ
}
if (i == 8) {
break; // iが8のときはループを終了
}
printf("%d\n", i);
}
return 0;
}
1
2
3
4
6
7
このプログラムは、i
が5のときにcontinue
文でスキップし、i
が8のときにbreak
文でループを終了します。
while文を使った実践的なプログラム
while
文は、実際のプログラムでさまざまな用途に利用されます。
ここでは、while
文を使った実践的なプログラムの例を紹介します。
ユーザー入力を検証するプログラム
ユーザーからの入力を検証し、正しい入力が得られるまで繰り返し入力を求めるプログラムです。
#include <stdio.h>
int main() {
int number;
// ユーザーが1から10の間の数を入力するまでループ
while (1) {
printf("1から10の間の数を入力してください: ");
scanf("%d", &number);
if (number >= 1 && number <= 10) {
break; // 正しい入力が得られたらループを終了
} else {
printf("無効な入力です。もう一度試してください。\n");
}
}
printf("入力された数: %d\n", number);
return 0;
}
1から10の間の数を入力してください: 15
無効な入力です。もう一度試してください。
1から10の間の数を入力してください: 5
入力された数: 5
このプログラムは、ユーザーが1から10の間の数を入力するまで、入力を繰り返し求めます。
メニュー選択ループの実装
ユーザーにメニューを表示し、選択に応じた処理を行うプログラムです。
#include <stdio.h>
int main() {
int choice;
// ユーザーが0を選択するまでメニューを表示
while (1) {
printf("メニュー:\n");
printf("1. オプション1\n");
printf("2. オプション2\n");
printf("0. 終了\n");
printf("選択してください: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("オプション1が選択されました。\n");
break;
case 2:
printf("オプション2が選択されました。\n");
break;
case 0:
printf("終了します。\n");
return 0; // プログラムを終了
default:
printf("無効な選択です。もう一度試してください。\n");
}
}
}
メニュー:
1. オプション1
2. オプション2
0. 終了
選択してください: 1
オプション1が選択されました。
メニュー:
1. オプション1
2. オプション2
0. 終了
選択してください: 0
終了します。
このプログラムは、ユーザーが0を選択するまでメニューを表示し、選択に応じたメッセージを表示します。
ファイル読み込みループの例
ファイルからデータを読み込み、ファイルの終わりまでループするプログラムです。
#include <stdio.h>
int main() {
FILE *file;
char line[100];
file = fopen("example.txt", "r"); // ファイルを読み取りモードで開く
if (file == NULL) {
printf("ファイルを開けませんでした。\n");
return 1;
}
// ファイルの終わりまで行を読み込む
while (fgets(line, sizeof(line), file) != NULL) {
printf("%s", line); // 行を表示
}
fclose(file); // ファイルを閉じる
return 0;
}
ファイルの内容が表示されます。
このプログラムは、example.txt
というファイルを開き、ファイルの終わりまで各行を読み込んで表示します。
ファイルが存在しない場合は、エラーメッセージを表示します。
まとめ
while
文は、C言語における基本的なループ構造であり、条件が真である間、繰り返し処理を実行します。
この記事では、while
文の基本構造、使用例、他のループ構造との比較、応用例、実践的なプログラム、そしてよくある質問について解説しました。
これらの知識を活用して、より効率的で柔軟なプログラムを作成することができます。
この記事を参考に、実際のプログラムでwhile
文を活用してみてください。