[C++] while文の使い方と基本的な例
C++のwhile文は、条件が真である間、特定のコードブロックを繰り返し実行する制御構文です。
構文はwhile (条件) { 処理 }の形式で、条件が初めから偽の場合は一度も実行されません。
例えば、int i = 0; while (i < 5) { std::cout << i; i++; }は、変数iが5未満の間、iを出力し、インクリメントします。
無限ループを避けるため、条件が適切に更新されるよう注意が必要です。
while文とは
while文は、C++における制御構文の一つで、条件が真である限り、特定の処理を繰り返し実行するための構文です。
ループ処理を行う際に非常に便利で、条件が満たされなくなるまで処理を続けることができます。
基本的な構文は以下の通りです。
#include <iostream>
using namespace std;
int main() {
int count = 0; // カウント用の変数
while (count < 5) { // 条件が真である限りループ
cout << "カウント: " << count << endl; // カウントを表示
count++; // カウントを1増やす
}
return 0;
}このコードを実行すると、countが5未満の間、カウントの値が表示され続けます。
カウント: 0
カウント: 1
カウント: 2
カウント: 3
カウント: 4while文は、条件が変化するまでループを続けるため、動的な処理が必要な場面で特に有用です。
while文の基本的な使い方
while文は、特定の条件が満たされている限り、繰り返し処理を行うための基本的な構文です。
以下に、while文の基本的な使い方を示すサンプルコードを紹介します。
#include <iostream>
using namespace std;
int main() {
int number; // ユーザーからの入力を格納する変数
cout << "1から10の数字を入力してください: ";
cin >> number; // ユーザーからの入力を受け取る
// 入力された数字が1から10の範囲内である限りループ
while (number >= 1 && number <= 10) {
cout << "入力された数字: " << number << endl; // 入力された数字を表示
cout << "もう一度数字を入力してください: ";
cin >> number; // 再度ユーザーからの入力を受け取る
}
cout << "範囲外の数字が入力されました。プログラムを終了します。" << endl;
return 0;
}このコードでは、ユーザーが1から10の範囲内の数字を入力する限り、その数字を表示し続けます。
範囲外の数字が入力されると、ループが終了し、プログラムが終了します。
出力結果の例は以下の通りです。
1から10の数字を入力してください: 5
入力された数字: 5
もう一度数字を入力してください: 8
入力された数字: 8
もう一度数字を入力してください: 12
範囲外の数字が入力されました。プログラムを終了します。このように、while文を使用することで、条件に基づいた繰り返し処理を簡単に実装することができます。
while文の応用例
while文は、さまざまな場面で応用可能です。
ここでは、いくつかの具体的な例を示します。
1. ユーザーの入力を繰り返し受け取る
ユーザーからの入力を繰り返し受け取り、特定の条件でループを終了する例です。
#include <iostream>
using namespace std;
int main() {
string input; // ユーザーからの入力を格納する変数
cout << "終了するには 'exit' と入力してください。" << endl;
// ユーザーが 'exit' と入力するまでループ
while (true) {
cout << "入力: ";
cin >> input; // ユーザーからの入力を受け取る
if (input == "exit") { // 'exit' が入力されたらループを終了
break;
}
cout << "あなたの入力: " << input << endl; // 入力を表示
}
cout << "プログラムを終了します。" << endl;
return 0;
}このコードでは、ユーザーが exit と入力するまで、入力を受け取り続けます。
出力結果の例は以下の通りです。
終了するには 'exit' と入力してください。
入力: hello
あなたの入力: hello
入力: world
あなたの入力: world
入力: exit
プログラムを終了します。2. 配列の要素を合計する
while文を使用して、配列の要素を合計する例です。
#include <iostream>
using namespace std;
int main() {
int numbers[] = {1, 2, 3, 4, 5}; // 合計する配列
int sum = 0; // 合計を格納する変数
int index = 0; // 配列のインデックス
// 配列の要素を合計する
while (index < 5) {
sum += numbers[index]; // 現在の要素を合計に加える
index++; // インデックスを1増やす
}
cout << "配列の合計: " << sum << endl; // 合計を表示
return 0;
}このコードでは、配列の要素をすべて合計し、その結果を表示します。
配列の合計: 153. フィボナッチ数列の生成
while文を使って、フィボナッチ数列を生成する例です。
#include <iostream>
using namespace std;
int main() {
int n = 10; // フィボナッチ数列の項数
int a = 0, b = 1; // 初期値
int count = 0; // カウント用の変数
cout << "フィボナッチ数列: " << endl;
// フィボナッチ数列を生成
while (count < n) {
cout << a << " "; // 現在の値を表示
int next = a + b; // 次の値を計算
a = b; // aを更新
b = next; // bを更新
count++; // カウントを1増やす
}
cout << endl; // 改行
return 0;
}このコードでは、最初の10項のフィボナッチ数列を生成し、表示します。
フィボナッチ数列:
0 1 1 2 3 5 8 13 21 34これらの例からもわかるように、while文はさまざまな用途に応じて柔軟に使用できる強力な構文です。
無限ループの活用と注意点
while文を使用する際に、条件を常に真に保つことで無限ループを作成することができます。
無限ループは、特定の条件が満たされるまで処理を続ける必要がある場合に便利ですが、注意が必要です。
以下に無限ループの活用例と注意点を示します。
無限ループの活用例
無限ループは、ユーザーからの入力を常に受け付けるプログラムや、特定の条件が満たされるまで処理を続ける必要がある場合に使用されます。
以下は、ユーザーからの入力を受け取り続ける無限ループの例です。
#include <iostream>
using namespace std;
int main() {
string command; // ユーザーからのコマンドを格納する変数
cout << "コマンドを入力してください ('exit' で終了): " << endl;
// 無限ループ
while (true) {
cout << "> ";
cin >> command; // ユーザーからのコマンドを受け取る
if (command == "exit") { // 'exit' が入力されたらループを終了
break;
}
cout << "実行中のコマンド: " << command << endl; // コマンドを表示
}
cout << "プログラムを終了します。" << endl;
return 0;
}このコードでは、ユーザーが exit と入力するまで、コマンドを受け取り続けます。
出力結果の例は以下の通りです。
コマンドを入力してください ('exit' で終了):
> hello
実行中のコマンド: hello
> world
実行中のコマンド: world
> exit
プログラムを終了します。無限ループの注意点
無限ループを使用する際には、以下の点に注意が必要です。
| 注意点 | 説明 |
|---|---|
| ループの終了条件を設定する | 無限ループを作成する場合でも、必ず終了条件を設けることが重要です。 |
| リソースの消費 | 無限ループはCPUリソースを消費するため、適切に管理しないとシステムに負担をかける可能性があります。 |
| デバッグの難しさ | 無限ループに入ると、プログラムが停止しないため、デバッグが難しくなることがあります。 |
| ユーザーへの配慮 | ユーザーが意図しない操作を行った場合に備え、適切なエラーメッセージや終了方法を提供することが重要です。 |
無限ループは強力なツールですが、適切に使用しないとプログラムが意図しない動作をすることがあります。
使用する際は、十分な注意を払いましょう。
while文とbreak/continueの組み合わせ
while文は、breakやcontinueと組み合わせて使用することで、より柔軟な制御が可能になります。
breakはループを即座に終了させるために使用され、continueは現在のループの反復をスキップして次の反復に進むために使用されます。
以下にそれぞれの使い方を示します。
1. breakの使用例
breakを使用すると、特定の条件が満たされたときにループを終了することができます。
以下は、ユーザーが特定の数字を入力したときにループを終了する例です。
#include <iostream>
using namespace std;
int main() {
int number; // ユーザーからの入力を格納する変数
cout << "1から10の数字を入力してください (0で終了): " << endl;
// ユーザーが0を入力するまでループ
while (true) {
cin >> number; // ユーザーからの入力を受け取る
if (number == 0) { // 0が入力されたらループを終了
break;
}
cout << "入力された数字: " << number << endl; // 入力された数字を表示
}
cout << "プログラムを終了します。" << endl;
return 0;
}このコードでは、ユーザーが0を入力するまで数字を受け取り続け、0が入力されるとループが終了します。
出力結果の例は以下の通りです。
1から10の数字を入力してください (0で終了):
5
入力された数字: 5
3
入力された数字: 3
0
プログラムを終了します。2. continueの使用例
continueを使用すると、現在のループの反復をスキップし、次の反復に進むことができます。
以下は、偶数の数字だけを表示する例です。
#include <iostream>
using namespace std;
int main() {
int count = 0; // カウント用の変数
// 1から10までの数字をループ
while (count < 10) {
count++; // カウントを1増やす
if (count % 2 != 0) { // 奇数の場合はスキップ
continue;
}
cout << "偶数: " << count << endl; // 偶数を表示
}
return 0;
}このコードでは、1から10までの数字の中で偶数だけを表示します。
偶数: 2
偶数: 4
偶数: 6
偶数: 8
偶数: 103. breakとcontinueの組み合わせ
breakとcontinueを組み合わせて使用することも可能です。
以下は、特定の条件で偶数をスキップし、特定の数字でループを終了する例です。
#include <iostream>
using namespace std;
int main() {
int count = 0; // カウント用の変数
// 1から10までの数字をループ
while (count < 10) {
count++; // カウントを1増やす
if (count == 5) { // 5が入力されたらループを終了
break;
}
if (count % 2 != 0) { // 奇数の場合はスキップ
continue;
}
cout << "偶数: " << count << endl; // 偶数を表示
}
cout << "ループが終了しました。" << endl;
return 0;
}このコードでは、5がカウントされた時点でループが終了し、それまでの偶数が表示されます。
偶数: 2
偶数: 4
ループが終了しました。このように、while文とbreak、continueを組み合わせることで、より複雑な制御フローを実現することができます。
これにより、プログラムの柔軟性が向上します。
while文のネスト(入れ子構造)
while文は、他のwhile文の内部に配置することができ、これを「ネスト」と呼びます。
ネストされたwhile文を使用することで、複雑なループ処理を実現することができます。
以下に、while文のネストの具体例を示します。
1. 簡単なネストの例
以下の例では、外側のwhile文が行を制御し、内側のwhile文が列を制御します。
これにより、2次元の数値を表示することができます。
#include <iostream>
using namespace std;
int main() {
int rows = 3; // 行数
int cols = 4; // 列数
int row = 0; // 現在の行
int col; // 現在の列
// 行を制御する外側のループ
while (row < rows) {
col = 0; // 列を初期化
// 列を制御する内側のループ
while (col < cols) {
cout << "(" << row << ", " << col << ") "; // 行と列のインデックスを表示
col++; // 列を1増やす
}
cout << endl; // 行の終わりで改行
row++; // 行を1増やす
}
return 0;
}このコードでは、3行4列の座標を表示します。
(0, 0) (0, 1) (0, 2) (0, 3)
(1, 0) (1, 1) (1, 2) (1, 3)
(2, 0) (2, 1) (2, 2) (2, 3)2. ネストを使った条件付き処理
次の例では、ネストされたwhile文を使用して、特定の条件に基づいて数値を表示します。
外側のループは1から3までの数を、内側のループは1からその数までの数を表示します。
#include <iostream>
using namespace std;
int main() {
int number = 1; // 外側のループの初期値
// 外側のループ
while (number <= 3) {
int count = 1; // 内側のループの初期値
cout << number << "の倍数: ";
// 内側のループ
while (count <= 5) {
cout << number * count << " "; // 倍数を表示
count++; // カウントを1増やす
}
cout << endl; // 行の終わりで改行
number++; // 外側のループのカウントを1増やす
}
return 0;
}このコードでは、1から3までの数の倍数を表示します。
1の倍数: 1 2 3 4 5
2の倍数: 2 4 6 8 10
3の倍数: 3 6 9 12 153. ネストの注意点
ネストされたwhile文を使用する際には、以下の点に注意が必要です。
| 注意点 | 説明 |
|---|---|
| インデントを適切にする | コードの可読性を高めるために、インデントを適切に行うことが重要です。 |
| ループの終了条件を明確にする | 各ループの終了条件を明確に設定し、無限ループに陥らないように注意する必要があります。 |
| 処理の複雑さに注意 | ネストが深くなると、処理が複雑になり、デバッグが難しくなることがあります。 |
このように、while文のネストを活用することで、複雑なループ処理を実現することができますが、可読性や管理のしやすさを考慮して使用することが重要です。
まとめ
この記事では、C++におけるwhile文の基本的な使い方から応用例、無限ループの活用法、breakやcontinueとの組み合わせ、さらにはネストされたwhile文の利用方法について詳しく解説しました。
これらの知識を活用することで、より柔軟で効率的なプログラムを作成することが可能になります。
ぜひ、実際にコードを書いてみて、while文の特性を体験し、さまざまな場面で活用してみてください。