C++ のネストされたループ

胡金庫 2023年10月12日
  1. C++ で二次元行列を初期化するために入れ子の for ループを使う
  2. C++ でネストした while ループを使って 2 次元行列を初期化する
  3. C++ で二次元行列を初期化するためにネストした do...while ループを使う
C++ のネストされたループ

この記事では、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 ループステートメントを使用して前のコードを実装することもできます。このバリアントでは、インデックス変数 ijwhile 本体の外側で宣言し、同じスコープ内でそれらの 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;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Loop