はじめに
この実験では、C++ におけるさまざまな制御フロー構造を実装する方法を学びます。これには、単一および複数分岐の if-else 文、switch 文、カウンタ制御の for ループ、入力制御の while ループ、出力制御の do-while ループ、およびネストされたループが含まれます。また、break 文と continue 文を使用してループの実行を制御する方法についても学びます。これらの基本的なプログラミング構文は、C++ でより複雑で動的なアプリケーションを構築するために不可欠です。
この実験では、条件文の作成から異なる実行ロジックを持つループの作成まで、幅広いトピックが扱われます。この実験が終了すると、これらの制御フロー構造をどのように使用するかを十分に理解し、C++ プログラムをより柔軟にしてさまざまなシナリオに対応できるようになります。
単一および多分岐の if-else 文を書く
このステップでは、C++ で単一および複数分岐の if-else 文を記述する方法を学びます。条件文を使用することで、プログラムが特定の条件に基づいて決定を下し、異なるコードブロックを実行できます。
まず、プロジェクトディレクトリに移動し、この実験用の新しい C++ ファイルを作成します。
cd ~/project
touch conditional_statements.cpp
WebIDE で conditional_statements.cpp ファイルを開き、単一および複数分岐の if-else 文を調べるために次のコードを追加します。
#include <iostream>
int main() {
// 単一の if 文
int number = 10;
if (number > 5) {
std::cout << "Number is greater than 5" << std::endl;
}
// if-else 文
int age = 20;
if (age >= 18) {
std::cout << "You are an adult" << std::endl;
} else {
std::cout << "You are a minor" << std::endl;
}
// 複数分岐の if-else 文
int score = 75;
if (score >= 90) {
std::cout << "Grade: A" << std::endl;
} else if (score >= 80) {
std::cout << "Grade: B" << std::endl;
} else if (score >= 70) {
std::cout << "Grade: C" << std::endl;
} else if (score >= 60) {
std::cout << "Grade: D" << std::endl;
} else {
std::cout << "Grade: F" << std::endl;
}
return 0;
}
プログラムをコンパイルして実行します。
g++ conditional_statements.cpp -o conditional_statements
./conditional_statements
実行結果の例:
Number is greater than 5
You are an adult
Grade: C
if-else 文の種類を分解してみましょう。
単一の
if文:- 条件が true の場合、コードブロックを実行します。
- 条件が false の場合、代替のアクションはありません。
if-else文:- 2 つの実行パスを提供します。
- 条件が true の場合、1 つのブロックを実行します。
- 条件が false の場合、別のブロックを実行します。
複数分岐の
if-else文:- 複数の条件をチェックできます。
else ifを使用してさらに条件を追加します。elseブロックはデフォルトのケースとして機能します。
if-else 文に関する重要なポイント:
- 条件は上から下に評価されます。
- 1 つのコードブロックのみが実行されます。
- コードブロックを定義するには波括弧
{ }を使用します。 - 条件には
>,>=,<,<=,==,!=などの比較演算子が使用されます。
複数のケースラベル付きの switch 文を作成する
このステップでは、C++ の switch 文を使用して、単一の変数に基づいて複数の条件を処理する方法を学びます。switch 文は、変数をさまざまな定数値と比較する際に、複数の if-else 文の代替手段を提供します。
まず、プロジェクトディレクトリに移動し、新しい C++ ファイルを作成します。
cd ~/project
touch switch_statement.cpp
WebIDE で switch_statement.cpp ファイルを開き、switch 文を調べるために次のコードを追加します。
#include <iostream>
int main() {
// 複数のケースラベル付きの基本的な switch 文
int dayNumber = 3;
switch (dayNumber) {
case 1:
std::cout << "Monday" << std::endl;
break;
case 2:
std::cout << "Tuesday" << std::endl;
break;
case 3:
std::cout << "Wednesday" << std::endl;
break;
case 4:
std::cout << "Thursday" << std::endl;
break;
case 5:
std::cout << "Friday" << std::endl;
break;
case 6:
std::cout << "Saturday" << std::endl;
break;
case 7:
std::cout << "Sunday" << std::endl;
break;
default:
std::cout << "Invalid day number" << std::endl;
}
// 同じコードブロックを共有する複数のケース付きの switch 文
char grade = 'B';
switch (grade) {
case 'A':
case 'B':
std::cout << "Excellent performance!" << std::endl;
break;
case 'C':
case 'D':
std::cout << "Good performance" << std::endl;
break;
case 'F':
std::cout << "Need improvement" << std::endl;
break;
default:
std::cout << "Invalid grade" << std::endl;
}
return 0;
}
プログラムをコンパイルして実行します。
g++ switch_statement.cpp -o switch_statement
./switch_statement
実行結果の例:
Wednesday
Excellent performance!
switch 文に関する重要なポイント:
- 実行する複数のコードブロックの 1 つを選択するために使用されます。
- 整数型 (int、char、enum) で動作します。
- 各
caseは可能な値を表します。 break文は次のケースにフォールスルーするのを防ぎます。defaultケースは他のケースで一致しない値を処理します。- 複数のケースは同じコードブロックを共有できます。
重要な switch 文のルール:
- 各
caseはbreakまたはreturnで終了する必要があります。 - ケースは定数式でなければなりません。
- 1 つのコードブロックのみが実行されます。
defaultケースは省略可能ですが、推奨されます。
カウンタ制御の for ループを初期化する
このステップでは、C++ でカウンタ制御の for ループを使用する方法を学びます。for ループは、特定の回数だけコードブロックを実行するために不可欠であり、既知の反復回数での反復が必要なタスクに最適です。
まず、プロジェクトディレクトリに移動し、新しい C++ ファイルを作成します。
cd ~/project
touch for_loops.cpp
WebIDE で for_loops.cpp ファイルを開き、for ループを初期化および使用するさまざまな方法を調べるために次のコードを追加します。
#include <iostream>
int main() {
// 基本的なカウンタ制御の for ループ
std::cout << "Counting from 1 to 5:" << std::endl;
for (int i = 1; i <= 5; i++) {
std::cout << i << " ";
}
std::cout << std::endl;
// 初期化に複数のステートメントを含む for ループ
std::cout << "Counting even numbers from 0 to 10:" << std::endl;
for (int j = 0, k = 10; j <= k; j += 2) {
std::cout << j << " ";
}
std::cout << std::endl;
// 乗法表の for ループ
std::cout << "Multiplication table for 5:" << std::endl;
for (int m = 1; m <= 10; m++) {
std::cout << "5 x " << m << " = " << (5 * m) << std::endl;
}
return 0;
}
プログラムをコンパイルして実行します。
g++ for_loops.cpp -o for_loops
./for_loops
実行結果の例:
Counting from 1 to 5:
1 2 3 4 5
Counting even numbers from 0 to 10:
0 2 4 6 8 10
Multiplication table for 5:
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50
for ループの主要なコンポーネント:
- 初期化:
int i = 1- カウンタの初期値を設定します。 - 条件:
i <= 5- ループが続行する条件を定義します。 - インクリメント/デクリメント:
i++- 各反復後にカウンタを変更します。
重要な for ループの特性:
- 既知の反復回数に最適。
- 複数の初期化ステートメントを持つことができる。
- 各反復で複数の変数を変更できる。
- ループの実行を制御する際の柔軟性がある。
エントリ制御ロジックを持つ while ループを作成する
このステップでは、C++ で while ループを使用する方法を学びます。while ループは、指定された条件が true の間、コードブロックを繰り返し実行する入力制御ループです。条件は各反復の前にチェックされるため、初期条件が false の場合、ループはまったく実行されない場合があります。
まず、プロジェクトディレクトリに移動し、新しい C++ ファイルを作成します。
cd ~/project
touch while_loops.cpp
WebIDE で while_loops.cpp ファイルを開き、while ループを使用するさまざまな方法を調べるために次のコードを追加します。
#include <iostream>
int main() {
// 基本的な while ループによるカウント
std::cout << "Counting from 1 to 5:" << std::endl;
int count = 1;
while (count <= 5) {
std::cout << count << " ";
count++;
}
std::cout << std::endl;
// ユーザー入力の検証付きの while ループ
int userNumber;
std::cout << "Enter a number between 1 and 10: ";
std::cin >> userNumber;
while (userNumber < 1 || userNumber > 10) {
std::cout << "Invalid input. Enter a number between 1 and 10: ";
std::cin >> userNumber;
}
std::cout << "You entered a valid number: " << userNumber << std::endl;
// 階乗を計算する while ループ
int number = 5;
int factorial = 1;
int i = 1;
std::cout << "Calculating factorial of " << number << ":" << std::endl;
while (i <= number) {
factorial *= i;
i++;
}
std::cout << number << "! = " << factorial << std::endl;
return 0;
}
プログラムをコンパイルして実行します。
g++ while_loops.cpp -o while_loops
./while_loops
実行結果の例:
Counting from 1 to 5:
1 2 3 4 5
Enter a number between 1 and 10: 15
Invalid input. Enter a number between 1 and 10: 7
You entered a valid number: 7
Calculating factorial of 5:
5! = 120
while ループの主な特性:
- 各反復の前に条件がチェックされます。
- 初期条件が false の場合、ループは実行されない場合があります。
- ループ変数の手動インクリメント/更新が必要です。
- 事前に反復回数がわからない場合に便利です。
重要な while ループのコンポーネント:
- ループの前にループ変数を初期化すること。
- ループの実行を制御する条件。
- ループ本体の中でループ変数を更新すること。
終了制御ロジック用の do-while ループを実装する
このステップでは、C++ の do-while ループについて学びます。while ループとは異なり、do-while ループは終了制御型であり、これはループ本体を実行した後に条件がチェックされることを意味します。これにより、初期条件に関係なく、ループ本体が少なくとも 1 回は実行されることが保証されます。
まず、プロジェクトディレクトリに移動し、新しい C++ ファイルを作成します。
cd ~/project
touch do_while_loops.cpp
WebIDE で do_while_loops.cpp ファイルを開き、do-while ループを使用するさまざまな方法を調べるために次のコードを追加します。
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
// ユーザー入力検証用の基本的な do-while ループ
int userNumber;
do {
std::cout << "Enter a number between 1 and 10: ";
std::cin >> userNumber;
} while (userNumber < 1 || userNumber > 10);
std::cout << "You entered a valid number: " << userNumber << std::endl;
// サイコロ振りゲームのシミュレーション
srand(time(0)); // 乱数生成のシード
int attempts = 0;
int targetNumber = 6;
int diceRoll;
std::cout << "Dice Rolling Game:" << std::endl;
do {
diceRoll = rand() % 6 + 1; // 1 から 6 の間の乱数を生成
attempts++;
std::cout << "Roll " << attempts << ": You rolled " << diceRoll << std::endl;
} while (diceRoll!= targetNumber);
std::cout << "Congratulations! You rolled the target number "
<< targetNumber << " in " << attempts << " attempts." << std::endl;
return 0;
}
プログラムをコンパイルして実行します。
g++ do_while_loops.cpp -o do_while_loops
./do_while_loops
実行結果の例:
Enter a number between 1 and 10: 15
Enter a number between 1 and 10: 7
You entered a valid number: 7
Dice Rolling Game:
Roll 1: You rolled 1
Roll 2: You rolled 5
Roll 3: You rolled 2
Roll 4: You rolled 5
Roll 5: You rolled 5
Roll 6: You rolled 3
Roll 7: You rolled 4
Roll 8: You rolled 2
Roll 9: You rolled 2
Roll 10: You rolled 2
Roll 11: You rolled 2
Roll 12: You rolled 2
Roll 13: You rolled 1
Roll 14: You rolled 1
Roll 15: You rolled 6
Congratulations! You rolled the target number 6 in 15 attempts.
do-while ループの主な特性:
- ループ本体を実行した後に条件がチェックされます。
- ループの少なくとも 1 回の実行が保証されます。
- 入力検証やゲームに便利です。
- 構文は
whileループと異なり、末尾で条件がチェックされます。
重要な do-while ループのコンポーネント:
doキーワードがループ本体を開始します。- ループ本体は常に少なくとも 1 回実行されます。
while条件は各反復の後に評価されます。while条件の後にセミコロン;が必要です。
break を使ってループを早期に終了させる
このステップでは、C++ で break 文を使ってループを早期に終了させる方法を学びます。break 文を使うと、ループを即座に終了させて、ループの後の最初の文に制御を移すことができます。
まず、プロジェクトディレクトリに移動し、新しい C++ ファイルを作成します。
cd ~/project
touch break_statement.cpp
WebIDE で break_statement.cpp ファイルを開き、break 文を使うさまざまな方法を調べるために次のコードを追加します。
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
// 条件が満たされたときに for ループを抜ける
std::cout << "最初の偶数を見つける:" << std::endl;
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
std::cout << "最初の偶数が見つかりました:" << i << std::endl;
break;
}
}
// 数字当てゲームをシミュレートする
srand(time(0)); // 乱数生成のシード
int targetNumber = rand() % 10 + 1; // 1 から 10 の間の乱数
int guess;
int attempts = 0;
std::cout << "\n数字当てゲーム:" << std::endl;
while (true) {
std::cout << "あなたの予想を入力してください (1-10): ";
std::cin >> guess;
attempts++;
if (guess == targetNumber) {
std::cout << "おめでとうございます!あなたは "
<< attempts << " 回で数字を当てました。" << std::endl;
break;
} else if (guess < targetNumber) {
std::cout << "もっと低いです。もう一度試してください。" << std::endl;
} else {
std::cout << "もっと高いです。もう一度試してください。" << std::endl;
}
}
return 0;
}
プログラムをコンパイルして実行します。
g++ break_statement.cpp -o break_statement
./break_statement
実行結果の例:
最初の偶数を見つける:
最初の偶数が見つかりました: 2
数字当てゲーム:
あなたの予想を入力してください (1-10): 5
もっと低いです。もう一度試してください。
あなたの予想を入力してください (1-10): 8
もっと高いです。もう一度試してください。
あなたの予想を入力してください (1-10): 6
おめでとうございます!あなたは 3 回で数字を当てました。
break 文の主な特性:
- 最内側のループを即座に終了させます。
- ループの後の最初の文に制御を移します。
for、while、およびdo-whileループで使用できます。- 条件に基づいてループを早期に終了させるのに便利です。
重要な break 文の使い方:
- 特定の条件が満たされたときにループを終了させる。
- 検索アルゴリズムを実装する。
- ユーザー入力を伴う対話型プログラムを作成する。
- 不要な反復を防ぐ。
continue 文を使ってループの反復処理をスキップする
このステップでは、C++ で continue 文を使ってループの現在の反復をスキップし、次の反復に移る方法を学びます。continue 文を使うと、特定の条件に基づいてループの一部を選択的にスキップすることができます。
まず、プロジェクトディレクトリに移動し、新しい C++ ファイルを作成します。
cd ~/project
touch continue_statement.cpp
WebIDE で continue_statement.cpp ファイルを開き、continue 文を使うさまざまな方法を調べるために次のコードを追加します。
#include <iostream>
int main() {
// ループ内で偶数をスキップする
std::cout << "1 から 10 までの奇数を表示する:" << std::endl;
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 偶数をスキップする
}
std::cout << i << " ";
}
std::cout << std::endl;
// 合計計算で負の数を除外する
int sum = 0;
int numbers[] = {5, -3, 10, -7, 8, -2, 15};
int arraySize = sizeof(numbers) / sizeof(numbers[0]);
std::cout << "\n正の数の合計を計算する:" << std::endl;
for (int j = 0; j < arraySize; j++) {
if (numbers[j] < 0) {
continue; // 負の数をスキップする
}
sum += numbers[j];
std::cout << "加えた:" << numbers[j] << ", 現在の合計:" << sum << std::endl;
}
std::cout << "正の数の最終合計:" << sum << std::endl;
return 0;
}
プログラムをコンパイルして実行します。
g++ continue_statement.cpp -o continue_statement
./continue_statement
実行結果の例:
1 から 10 までの奇数を表示する:
1 3 5 7 9
正の数の合計を計算する:
加えた: 5, 現在の合計: 5
加えた: 10, 現在の合計: 15
加えた: 8, 現在の合計: 23
加えた: 15, 現在の合計: 38
正の数の最終合計: 38
continue 文の主な特性:
- 現在のループ反復の残りをスキップします。
- ループの次の反復に制御を移します。
for、while、およびdo-whileループで使用できます。- フィルタリングや条件付き処理に便利です。
重要な continue 文の使い方:
- 条件に基づいて特定の反復をスキップする。
- ループ内でデータをフィルタリングする。
- 不要な計算を回避する。
- ループのロジックを単純化する。
行列演算用のネストされたループを作成する
このステップでは、C++ で 2 次元配列(行列)に対して演算を行うためにネストされたループをどのように使用するかを学びます。ネストされたループを使うと、行列の行と列を反復処理でき、複雑なデータ操作や計算が可能になります。
まず、プロジェクトディレクトリに移動し、新しい C++ ファイルを作成します。
cd ~/project
touch nested_loops.cpp
WebIDE で nested_loops.cpp ファイルを開き、ネストされたループを使った行列演算を調べるために次のコードを追加します。
#include <iostream>
#include <iomanip>
int main() {
// 3x3 の行列を定義する
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 元の行列を表示する
std::cout << "元の行列:" << std::endl;
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
std::cout << std::setw(4) << matrix[row][col];
}
std::cout << std::endl;
}
// 行の合計を計算する
std::cout << "\n行の合計:" << std::endl;
for (int row = 0; row < 3; row++) {
int rowSum = 0;
for (int col = 0; col < 3; col++) {
rowSum += matrix[row][col];
}
std::cout << "行 " << row + 1 << " の合計:" << rowSum << std::endl;
}
// 掛け算表を作成して表示する
std::cout << "\n掛け算表:" << std::endl;
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
std::cout << std::setw(4) << (i * j);
}
std::cout << std::endl;
}
return 0;
}
プログラムをコンパイルして実行します。
g++ nested_loops.cpp -o nested_loops
./nested_loops
実行結果の例:
元の行列:
1 2 3
4 5 6
7 8 9
行の合計:
行 1 の合計: 6
行 2 の合計: 15
行 3 の合計: 24
掛け算表:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
ネストされたループの主な特性:
- 内側のループは外側のループの各反復に対してすべての反復を完了します。
- 多次元配列を扱うのに便利です。
- 複雑なパターンを作成したり、行列演算を行ったりするのに使えます。
- 通常、2 次元配列(行列)や多次元データ構造とともに使用されます。
重要なネストされたループの概念:
- 外側のループが内側のループが実行される回数を制御します。
- 各ループには独自のカウンタ変数があります。
- 行と列に基づく演算に便利です。
- パターンを生成したり、計算を行ったり、データを操作したりするのに使えます。
無限ループ防止を行う
このステップでは、適切なループ制御メカニズムを実装することで、C++ で無限ループを防止する方法を学びます。ループの条件が偽にならない場合、無限ループが発生し、プログラムが無限に実行されます。
まず、プロジェクトディレクトリに移動し、新しい C++ ファイルを作成します。
cd ~/project
touch infinite_loop_prevention.cpp
WebIDE で infinite_loop_prevention.cpp ファイルを開き、無限ループを防止するさまざまな戦略を調べるために次のコードを追加します。
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
// 例 1: 最大反復回数制限による無限ループの防止
std::cout << "例 1: 反復回数制限による防止" << std::endl;
int counter = 0;
const int MAX_ITERATIONS = 5;
while (true) {
std::cout << "反復:" << counter + 1 << std::endl;
counter++;
if (counter >= MAX_ITERATIONS) {
std::cout << "最大反復回数に達しました。ループを終了します。" << std::endl;
break;
}
}
// 例 2: 入力検証付きのユーザー制御ループ
std::cout << "\n例 2: ユーザー制御ループ" << std::endl;
char continueChoice;
int attempts = 0;
const int MAX_ATTEMPTS = 3;
do {
std::cout << "1 から 10 までの数字を入力してください:";
int userNumber;
std::cin >> userNumber;
if (userNumber >= 1 && userNumber <= 10) {
std::cout << "有効な数字が入力されました:" << userNumber << std::endl;
break;
}
attempts++;
std::cout << "無効な入力です。残りの試行回数:" << MAX_ATTEMPTS - attempts << std::endl;
if (attempts >= MAX_ATTEMPTS) {
std::cout << "最大試行回数に達しました。終了します。" << std::endl;
break;
}
std::cout << "もう一度試しますか?(y/n): ";
std::cin >> continueChoice;
} while (continueChoice == 'y' || continueChoice == 'Y');
// 例 3: 制御された反復回数のランダムな数字ゲーム
std::cout << "\n例 3: ランダムな数字ゲーム" << std::endl;
srand(time(0)); // 乱数生成のシード
int targetNumber = rand() % 10 + 1;
int guess;
int gameAttempts = 0;
const int MAX_GAME_ATTEMPTS = 4;
std::cout << "1 から 10 までの数字を予想してください" << std::endl;
while (gameAttempts < MAX_GAME_ATTEMPTS) {
std::cout << "試行 " << gameAttempts + 1 << ": 予想を入力してください:";
std::cin >> guess;
if (guess == targetNumber) {
std::cout << "おめでとうございます!あなたは数字を当てました。" << std::endl;
break;
}
gameAttempts++;
if (gameAttempts >= MAX_GAME_ATTEMPTS) {
std::cout << "残念ですが、試行回数が足りません。数字は "
<< targetNumber << std::endl;
break;
}
}
return 0;
}
プログラムをコンパイルして実行します。
g++ infinite_loop_prevention.cpp -o infinite_loop_prevention
./infinite_loop_prevention
実行結果の例:
例 1: 反復回数制限による防止
反復: 1
反復: 2
反復: 3
反復: 4
反復: 5
最大反復回数に達しました。ループを終了します。
例 2: ユーザー制御ループ
1 から 10 までの数字を入力してください: 1
有効な数字が入力されました: 1
例 3: ランダムな数字ゲーム
1 から 10 までの数字を予想してください
試行 1: 予想を入力してください: 2
試行 2: 予想を入力してください: 3
試行 3: 予想を入力してください: 4
試行 4: 予想を入力してください: 5
残念ですが、試行回数が足りません。数字は 8
無限ループを防止するための主な戦略:
- 最大反復回数を設定する
break文を使ってループを終了する- 入力検証を実装する
- ループの実行を制御するための条件付きチェックを追加する
- ユーザー制御メカニズムを提供する
重要な無限ループ防止技術:
- 常にループ条件が偽になることを確認する
- 反復回数を制限するためにカウンタ変数を使用する
- ループ内に終了条件を実装する
- ユーザー入力を検証する
- 必要に応じて
breakを使ってループを終了する
まとめ
この実験では、C++ でさまざまな制御フロー構造を実装する方法を学びました。それには、単一および多分岐の if-else 文、switch 文、カウンタ制御の for ループ、入力制御の while ループ、出力制御の do-while ループ、およびネストされたループが含まれます。また、break 文と continue 文を使ってループの実行を制御する方法を調べ、無限ループを処理する技術を学びました。これらの制御フロー構造は、C++ プログラミングにおいて基本的なものであり、特定の条件に基づいて決定を行い、異なるコードパスを実行できるように、より複雑で動的なプログラムを書くことができます。
この実験では、これらの制御フロー構造の実際の応用を手を動かしたコーディング演習を通じて学び、それらの使い方を深く理解し、自分自身の C++ プロジェクトで効果的に適用できる能力を身につけました。



