C++プログラミングにおいて、for文は非常に重要な役割を果たします。
しかし、初心者にとってはfor文の使い方が難しく感じることもあるでしょう。
そこで本記事では、C++でのfor文の基本的な使い方から応用的な使い方まで詳しく解説していきます。
for文とは
for文は、プログラム内で同じ処理を繰り返し実行するための制御構造の一つです。C++言語においても、for文はよく使われる制御構造の一つです。
for文は、以下のような構文を持ちます。
for (初期化式; 条件式; 更新式) {
// 繰り返し実行する処理
}
初期化式では、ループ変数を初期化します。条件式では、ループ変数が条件を満たしているかどうかを判定します。更新式では、ループ変数を更新します。
例えば、1から10までの整数を順番に表示するプログラムを作成する場合、以下のようにfor文を使用することができます。
#include <iostream>
int main() {
for (int i = 1; i <= 10; i++) {
std::cout << i << std::endl;
}
return 0;
}
このプログラムでは、iというループ変数を1から10まで順番に増やしながら、std::cout
でiの値を表示しています。
for文で配列を扱う
for文を使って配列を扱う場合もあります。以下は、配列aの要素を順番に表示するプログラムです。
#include <iostream>
int main() {
int a[] = {1, 2, 3, 4, 5};
int length = sizeof(a) / sizeof(int);
for (int i = 0; i < length; i++) {
std::cout << a[i] << std::endl;
}
return 0;
}
このプログラムでは、配列aとその長さlengthを定義しています。for文内では、iが0からlength未満までインクリメントしながら繰り返し処理が実行されます。
以上がC++でのfor文の基本的な使い方です。
for文の応用例
for文は、繰り返し処理を行うための基本的な構文ですが、実際には様々な応用方法があります。
ここでは、for文の応用例をいくつか紹介します。
配列の要素を順番に処理する
配列とは、複数のデータをまとめて扱うためのデータ型です。配列に格納された要素を順番に処理する場合、for文が便利です。
以下は、int型の配列aに格納された要素を順番に表示するプログラム例です。
#include <iostream>
using namespace std;
int main() {
int a[] = {1, 2, 3, 4, 5};
int n = sizeof(a) / sizeof(a[0]); // 配列aの要素数
for (int i = 0; i < n; i++) {
cout << a[i] << endl;
}
return 0;
}
1
2
3
4
5
このプログラムでは、for文で変数iを0からn-1まで1ずつ増やしながら、配列aのi番目の要素を表示しています。
2次元配列の要素を順番に処理する
2次元配列とは、行列を持つ表形式などででデータを格納するためのデータ型です。
2次元配列に格納された要素を順番に処理する場合も、for文が便利です。
以下は、int型の2次元配列bに格納された要素を順番に表示するプログラム例です。
#include <iostream>
using namespace std;
int main() {
int b[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
cout << b[i][j] << " ";
}
cout << endl;
}
return 0;
}
1 2 3 4
5 6 7 8
9 10 11 12
このプログラムでは、外側のfor文で変数iを0から2まで1ずつ増やし、内側のfor文で変数jを0から3まで1ずつ増やしながら、2次元配列bの(i,j)座標にある要素を表示しています。
for文のネスト
for文は入れ子構造(ネスト)にすることも可能です。
これは、複雑な繰り返し処理が必要な場合や多次元データ構造(例えば画像データ)を扱う場合などで役立ちます。
以下は、九九表(1から9までの数字同士を掛け算した結果)を作成するプログラム例です。
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <=9 ; i++) {
for (int j =1 ; j <=9 ; j++) {
cout << i * j << " ";
}
cout << endl;
}
return(0);
}
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
for文の中で条件分岐
for文内でもif-else
等条件分岐命令が使えます。以下は、「100未満」か「100以上200未満」か「200以上」か判断して表示するプログラム例です。
#include<iostream>
using namespace std;
int main() {
int num = 50;
for (int i = 0; i < 5; i++) {
if (num < 100) {
cout << "num は 100 未満です" << endl;
}
else if (num >= 100 && num < 200) {
cout << "num は 100 以上かつ 200 未満です" << endl;
}
else {
cout << "num は 200 以上です" << endl;
}
num += 50;
}
return(0);
}
num は 100 未満です
num は 100 以上かつ 200 未満です
num は 100 以上かつ 200 未満です
num は 200 以上です
num は 200 以上です
このプログラムでは、初期値num=50 を設定し、その後5回繰り返します. 各回ごとにif-else 文で条件分岐させ、numの値に合わせて出力する文字列を変更しています。
for文の注意点
for文を使用する際には、以下のような注意点があります。
無限ループに注意
for文で無限ループを作成してしまうと、プログラムが停止しなくなってしまいます。無限ループに陥らないように、条件式を正しく設定することが重要です。
for(int i = 0; i < 10; i--){
// 無限ループに陥る
}
このコードでは、forループの条件式にi--
という減算演算子が使用されているため、反復処理ごとに変数iが1ずつ減算されていきます。
ですが、ループ条件がi < 10
であるため、永遠に条件式が成立してしまい、無限ループに陥ってしまいます。
カウンタ変数の初期化の忘れに注意
for文で使用するカウンタ変数は、必ず初期化する必要があります。初期化を忘れてしまうと、予期せぬ結果が生じる可能性があります。
int sum;
for(int i; i < 10; i++){
sum += i;
}
// 変数iが初期化されていないため、予期せぬ結果が生じる可能性がある。
カウンタ変数の更新の忘れに注意
for文で使用するカウンタ変数は、必ず更新する必要があります。更新を忘れてしまうと、無限ループに陥ってしまいます。
int sum;
for(int i = 0; i < 10;){
sum += i;
}
// 変数iを更新していないため、無限ループに陥ってしまう。
for文の中での変数のスコープに注意
for文内で宣言された変数は、そのブロック内でしか有効ではありません。そのため、for文外からアクセスすることはできません。
int sum = 0;
for(int i = 0; i < 10; i++){
int num = rand() % 10 + 1;
sum += num;
}
cout << num << endl;
// 変数numはfor文内で宣言されており、そのブロック外からアクセスすることはできない。
for文の中での配列の範囲外アクセスに注意
配列を使用した場合も同様です。配列外へアクセスしてしまうと、プログラムが異常終了してしまいます。
int array[5] = {1,2,3,4,5};
for(int i = 0; i <= 5; i++){
cout << array[i] << endl;
}
// 配列array[5]は存在しないため、範囲外アクセスでエラーが発生してしまう。