C++では、forループは繰り返し回数が既知である場合に適しています。しかし、繰り返し回数が不明確な場合には、whileループの方が適しています。構文は以下の通りです:
while (条件)
{
// ループ処理
}
ここで「条件」はブール値を返す式で、その値がtrueである限りループ処理が継続します。ループの最後に「条件」が再評価されます。
例えば、ソフトウェアを開発し、ユーザーがメニューからサービスを選択できるようにする場合を考えます。以下はそのようなプログラムの例です:
#include <iostream>
using namespace std;
int main()
{
int selection = -1;
while (selection != 3)
{
cout << "メニュー:\n1. オプション1\n2. オプション2\n3. 終了\n選択してください: ";
cin >> selection;
switch (selection)
{
case 1:
cout << "オプション1を選択しました\n";
break;
case 2:
cout << "オプション2を選択しました\n";
break;
case 3:
cout << "プログラムを終了します\n";
break;
default:
cout << "無効な選択です。もう一度選んでください\n";
}
}
return 0;
}
forとwhileループにはそれぞれ長所があり、どちらも必要に応じて使用できます。例えば、1から100までの数字を出力するプログラムはどちらでも実現可能です:
forループ:
for (int num = 1; num <= 100; num++)
{
cout << num << endl;
}
whileループ:
int num = 1;
while (num <= 100)
{
cout << num << endl;
num++;
}
ループのネスト
C++では、あるループの中に別のループを入れることで複雑な繰り返し処理を行うことができます。以下は単純なforループのネストの例です:
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 2; col++)
{
cout << "row = " << row << ", col = " << col << endl;
}
}
このコードの出力結果は次のようになります:
row = 0, col = 0
row = 0, col = 1
row = 1, col = 0
row = 1, col = 1
row = 2, col = 0
row = 2, col = 1
外側のループ変数rowが0から2まで変化し、外側のループの各イテレーションごとに内側のループ変数colが0から1まで変化します。
ループのネストは、例えば学校のクラスや学生、月や日、または棋盤のような多層的なデータ構造を処理する際などに役立ちます。
例題
例えば、5行6列の星印を出力するプログラムは以下のようになります:
#include <iostream>
using namespace std;
int main()
{
for (int row = 0; row < 5; row++) // 行の制御
{
for (int col = 0; col < 6; col++) // 列の制御
{
cout << '*';
}
cout << endl;
}
return 0;
}
また、ユーザーが指定した行数の直角三角形を出力するプログラムは以下のようになります:
#include <iostream>
using namespace std;
int main()
{
int lines;
cin >> lines;
for (int row = 1; row <= lines; row++) // 行の制御
{
for (int col = 1; col <= row; col++) // 列の制御
{
cout << '*';
}
cout << endl;
}
return 0;
}
さらに、100円で100匹の鶏を買う問題(百雞百钱問題)を解くプログラムは以下のようになります:
#include <iostream>
using namespace std;
int main()
{
for (int rooster = 0; rooster < 20; rooster++) // 公鶏の数のシミュレーション
{
for (int hen = 0; hen < 33; hen++) // 母鶏の数のシミュレーション
{
int chick = 100 - rooster - hen; // 小鶏の数の計算
if (chick % 3 == 0 && rooster * 5 + hen * 3 + chick / 3 == 100)
cout << rooster << " " << hen << " " << chick << endl;
}
}
return 0;
}