C++ のネストされたループ
-
C++ で二次元行列を初期化するために入れ子の
for
ループを使う -
C++ でネストした
while
ループを使って 2 次元行列を初期化する -
C++ で二次元行列を初期化するためにネストした
do...while
ループを使う
この記事では、C++ でさまざまなネストされたループを利用する方法について説明します。
C++ で二次元行列を初期化するために入れ子の for
ループを使う
ループは制御フローステートメントと呼ばれ、通常、プログラムカウンターを変更し、実行中の CPU をプログラム内の別の(通常は非順次)命令に移動させます。プログラムカウンタは、実行中のプログラムの次の命令を格納する CPU コアのレジスタです。
プログラムのアセンブリ言語レベルの表現の観点から考えてみましょう。各ステートメントは単一のマシン命令に対応します。コードは順次実行され、特に指示がない限り、CPU は次の命令をフェッチします(大まかに言えば、現代の CPU コアは大規模に最適化されたマシンであり、複数の命令をフェッチでき、多くの場合、プログラム内の非シーケンシャルな場所からフェッチできます)。したがって、ループを実装する場合は、実行をプログラムの別の部分に転送するための特別な命令をアセンブリ言語で示す必要があります。
ここで、C++ 言語の構文と、ループなどのさまざまな制御フローステートメントを実装する方法について考えてみましょう。
プログラミング言語で最も一般的なループステートメントの 1つは、for
ループと while
ループです。for
ループには、3つの部分からなるステートメントを含み、ループ本体の実行を制御するヘッダー部分があります。複数の for
ループステートメントを相互にネストして、多くのプログラミングタスクに役立つ構造を形成できます。
この記事では、ネストされた for
ループを使用して 2 次元行列を初期化する例を示します。ネストされた各ループレベルは、マトリックスの 1つの行を処理するため、この例では 2つのレベルがあります。ランダムな整数が指定された位置に割り当てられた後、要素も出力することに注意してください。後者のステップは実際のシナリオでは個別に実行されますが、このコードサンプルは教育目的のみです。
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
using std::setw;
constexpr int ROW = 4;
constexpr int COL = 3;
int main() {
int *matrix = new int[ROW * COL];
for (int i = 0; i < ROW; ++i) {
for (int j = 0; j < COL; ++j) {
matrix[j * ROW + i] = rand() % 100;
cout << setw(2) << matrix[j * ROW + i] << "; ";
}
cout << endl;
}
delete[] matrix;
return EXIT_SUCCESS;
}
出力:
83; 86; 77;
36; 93; 35;
86; 92; 14;
22; 62; 27;
C++ でネストした while
ループを使って 2 次元行列を初期化する
または、ネストされた while
ループステートメントを使用して前のコードを実装することもできます。このバリアントでは、インデックス変数 i
と j
を while
本体の外側で宣言し、同じスコープ内でそれらの 1つのみを初期化する必要があります。
行列の列位置に対応する 2 番目の変数 y
-は、外側の while
ループの各サイクルで 0
に初期化されることに注意してください。これにより、最初の行の処理後に内部ループが確実に実行されます。また、while
自体には反復を制御する条件付きヘッダーしかないため、各インデックス変数のインクリメントステートメントをそれぞれのループスコープに配置する必要があります。
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
using std::setw;
constexpr int ROW = 4;
constexpr int COL = 3;
int main() {
int *matrix = new int[ROW * COL];
int j, i = 0;
while (i < ROW) {
j = 0;
while (j < COL) {
matrix[j * ROW + i] = rand() % 100;
cout << setw(2) << matrix[j * ROW + i] << "; ";
j++;
}
i++;
cout << endl;
}
delete[] matrix;
return EXIT_SUCCESS;
}
出力:
83; 86; 77;
36; 93; 35;
86; 92; 14;
22; 62; 27;
C++ で二次元行列を初期化するためにネストした do...while
ループを使う
一方、C++ 言語には do...while
ループ構造もあり、これは特殊な反復の場合に適していますが、それを使用して同じコードスニペットを書き直すことができます。
do...while
ステートメントは、常に最初の反復を実行します。したがって、生成された行列には少なくとも 1x1 の次元があると想定しているため、この例ではこの機能の影響を受けません。
do...while
ループ構造は、上記の while
の例とほぼ同じです。これら 2つのヘッダー形式は類似しており、条件式のみが含まれているためです。
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
using std::setw;
constexpr int ROW = 4;
constexpr int COL = 3;
int main() {
int *matrix = new int[ROW * COL];
int j, i = 0;
do {
j = 0;
do {
matrix[j * ROW + i] = rand() % 100;
cout << setw(2) << matrix[j * ROW + i] << "; ";
j++;
} while (j < COL);
i++;
cout << endl;
} while (i < ROW);
delete[] matrix;
return EXIT_SUCCESS;
}
出力:
83; 86; 77;
36; 93; 35;
86; 92; 14;
22; 62; 27;