C++でのwhile文の使い方についてわかりやすく詳しく解説

C++プログラミングを学び始めたばかりの皆さん、こんにちは!この記事では、C++の基本的なループ構造の一つであるwhile文について詳しく解説します。

while文の基本的な使い方から、応用的な使い方、他のループ構造との比較、そして注意点やベストプラクティスまで、初心者の方にもわかりやすく説明します。

この記事を読むことで、while文を使ったプログラムの作成方法がしっかりと理解できるようになります。

目次から探す

while文とは

C++におけるwhile文は、特定の条件が真である間、繰り返し処理を実行するための制御構造です。

while文を使うことで、条件が満たされている限り、同じコードブロックを何度も実行することができます。

これにより、プログラムの効率を高めたり、特定のタスクを自動化することが可能になります。

while文の基本構造

while文の基本構造は以下の通りです。

while (条件式) {
    // 繰り返し実行されるコードブロック
}

条件式が真(true)である限り、コードブロックが繰り返し実行されます。

条件式が偽(false)になると、while文のループは終了し、次のコードに進みます。

以下に、基本的なwhile文の例を示します。

#include <iostream>
int main() {
    int count = 0;
    while (count < 5) {
        std::cout << "Count: " << count << std::endl;
        count++;
    }
    return 0;
}

このプログラムは、countが5未満である間、Count:とcountの値を出力し、countを1ずつ増加させます。

出力結果は以下の通りです。

Count: 0
Count: 1
Count: 2
Count: 3
Count: 4

while文の動作原理

while文の動作原理は非常にシンプルです。

以下のステップで動作します。

  1. 条件式を評価します。
  2. 条件式が真(true)であれば、コードブロックを実行します。
  3. コードブロックの実行が完了したら、再び条件式を評価します。
  4. 条件式が再び真(true)であれば、再度コードブロックを実行します。
  5. 条件式が偽(false)になると、while文のループを終了し、次のコードに進みます。

この動作を理解するために、もう一つの例を見てみましょう。

#include <iostream>
int main() {
    int number;
    std::cout << "Enter a number (negative to quit): ";
    std::cin >> number;
    while (number >= 0) {
        std::cout << "You entered: " << number << std::endl;
        std::cout << "Enter another number (negative to quit): ";
        std::cin >> number;
    }
    std::cout << "Goodbye!" << std::endl;
    return 0;
}

このプログラムは、ユーザーが負の数を入力するまで、入力された数を表示し続けます。

ユーザーが負の数を入力すると、ループが終了し、Goodbye!と表示されます。

このように、while文は条件が満たされている限り、繰り返し処理を実行するための強力なツールです。

適切に使用することで、効率的なプログラムを作成することができます。

while文の基本的な使い方

基本的なwhile文の例

while文は、指定された条件がtrueである限り、繰り返し処理を行うためのループ構造です。

基本的な構造は以下の通りです。

while (条件) {
    // 繰り返し実行される処理
}

具体的な例を見てみましょう。

以下のコードは、1から5までの数字を順に出力するプログラムです。

#include <iostream>
int main() {
    int i = 1; // 初期化
    while (i <= 5) { // 条件
        std::cout << i << std::endl; // 繰り返し実行される処理
        i++; // インクリメント
    }
    return 0;
}

このプログラムを実行すると、以下のように出力されます。

1
2
3
4
5

無限ループの作成

while文を使って無限ループを作成することも可能です。

無限ループは、条件が常にtrueである場合に発生します。

以下の例では、無限に Hello, World! を出力し続けるプログラムを示します。

#include <iostream>
int main() {
    while (true) { // 常にtrue
        std::cout << "Hello, World!" << std::endl;
    }
    return 0;
}

このプログラムは、ユーザーが手動で停止するまで Hello, World! を出力し続けます。

無限ループは、特定の条件が満たされるまでプログラムを実行し続けたい場合に便利ですが、適切に制御しないとプログラムが停止しなくなるため注意が必要です。

条件付きループの作成

while文は、特定の条件が満たされるまでループを続けるために使用されます。

以下の例では、ユーザーが入力した数値が0になるまでループを続けるプログラムを示します。

#include <iostream>
int main() {
    int number;
    std::cout << "0を入力すると終了します。" << std::endl;
    while (true) {
        std::cout << "数値を入力してください: ";
        std::cin >> number;
        if (number == 0) {
            break; // ループを終了
        }
        std::cout << "あなたが入力した数値は " << number << " です。" << std::endl;
    }
    return 0;
}

このプログラムでは、ユーザーが0を入力するまで数値の入力を求め続けます。

0が入力されると、break文によってループが終了します。

以上が、while文の基本的な使い方に関する解説です。

次のセクションでは、while文の応用について詳しく見ていきます。

while文の応用

入力を使ったループ

ユーザー入力を待つループ

while文はユーザーからの入力を待つループを作成するのに非常に便利です。

例えば、ユーザーが特定の文字を入力するまでプログラムを繰り返し実行する場合、以下のように書くことができます。

#include <iostream>
using namespace std;
int main() {
    char input;
    while (true) {
        cout << "Enter 'q' to quit: ";
        cin >> input;
        if (input == 'q') {
            break;
        }
    }
    cout << "Program terminated." << endl;
    return 0;
}

このプログラムは、ユーザーが’q’を入力するまでループを続けます。

‘q’が入力されると、break文によってループが終了し、プログラムが終了します。

入力が特定の条件を満たすまでループ

次に、ユーザーの入力が特定の条件を満たすまでループを続ける例を見てみましょう。

例えば、ユーザーが正の整数を入力するまでループを続ける場合、以下のように書くことができます。

#include <iostream>
using namespace std;
int main() {
    int number;
    while (true) {
        cout << "Enter a positive number: ";
        cin >> number;
        if (number > 0) {
            break;
        }
        cout << "Invalid input. Please try again." << endl;
    }
    cout << "You entered: " << number << endl;
    return 0;
}

このプログラムは、ユーザーが正の整数を入力するまでループを続けます。

正の整数が入力されると、break文によってループが終了し、入力された数値が表示されます。

ファイル読み込みでのwhile文の使用

ファイルの終わりまで読み込むループ

ファイルの内容を読み込む際にもwhile文は非常に有用です。

例えば、ファイルの終わりまでデータを読み込む場合、以下のように書くことができます。

#include <iostream>
#include <fstream>
using namespace std;
int main() {
    ifstream file("example.txt");
    string line;
    if (file.is_open()) {
        while (getline(file, line)) {
            cout << line << endl;
        }
        file.close();
    } else {
        cout << "Unable to open file" << endl;
    }
    return 0;
}

このプログラムは、example.txtというファイルを開き、ファイルの終わりまで各行を読み込んで表示します。

getline関数はファイルから1行ずつ読み込み、ファイルの終わりに達するとfalseを返すため、ループが終了します。

特定の条件でファイルを読み込むループ

特定の条件を満たす行だけを読み込む場合もwhile文を使用できます。

例えば、ファイル内の特定の文字列を含む行だけを表示する場合、以下のように書くことができます。

#include <iostream>
#include <fstream>
using namespace std;
int main() {
    ifstream file("example.txt");
    string line;
    if (file.is_open()) {
        while (getline(file, line)) {
            if (line.find("keyword") != string::npos) {
                cout << line << endl;
            }
        }
        file.close();
    } else {
        cout << "Unable to open file" << endl;
    }
    return 0;
}

このプログラムは、example.txtというファイルを開き、各行にkeywordという文字列が含まれているかどうかをチェックします。

含まれている場合、その行を表示します。

find関数は文字列が見つかった位置を返し、見つからない場合はstring::nposを返すため、この条件を使って特定の行だけを表示することができます。

while文と他のループ構造の比較

C++にはwhile文以外にもループを実現するための構造がいくつか存在します。

ここでは、for文do-while文について解説し、それぞれの使い分けについて説明します。

for文との比較

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以下の間ループを実行し、各ループの最後にiを1ずつ増加させます。

while文とfor文の使い分け

while文for文はどちらもループを実現するための構造ですが、使い分けにはいくつかのポイントがあります。

  • for文: ループの回数が明確に決まっている場合に使用します。

例えば、配列の全要素に対して処理を行う場合などです。

  • while文: ループの回数が事前に決まっていない場合に使用します。

例えば、ユーザーの入力を待つ場合や、特定の条件が満たされるまでループを続ける場合などです。

以下に、同じ処理をfor文while文で実装した例を示します。

#include <iostream>
int main() {
    // for文を使った例
    for (int i = 1; i <= 10; ++i) {
        std::cout << i << std::endl;
    }
    // while文を使った例
    int j = 1;
    while (j <= 10) {
        std::cout << j << std::endl;
        ++j;
    }
    return 0;
}

do-while文との比較

do-while文の基本構造

do-while文は、少なくとも一度はループを実行したい場合に使用します。

基本的な構造は以下の通りです。

do {
    // ループ内の処理
} while (条件);

例えば、ユーザーが特定の入力をするまでループを続けるdo-while文は以下のようになります。

#include <iostream>
int main() {
    int input;
    do {
        std::cout << "Enter a number (0 to exit): ";
        std::cin >> input;
    } while (input != 0);
    return 0;
}

このコードは、ユーザーが0を入力するまでループを続けます。

while文とdo-while文の使い分け

while文do-while文の主な違いは、ループの実行回数が0回である可能性があるかどうかです。

  • while文: 条件が最初に評価されるため、条件が最初からfalseの場合、ループは一度も実行されません。
  • do-while文: 条件が最後に評価されるため、少なくとも一度はループが実行されます。

以下に、同じ処理をwhile文do-while文で実装した例を示します。

#include <iostream>
int main() {
    int input;
    // while文を使った例
    std::cout << "Enter a number (0 to exit): ";
    std::cin >> input;
    while (input != 0) {
        std::cout << "Enter a number (0 to exit): ";
        std::cin >> input;
    }
    // do-while文を使った例
    do {
        std::cout << "Enter a number (0 to exit): ";
        std::cin >> input;
    } while (input != 0);
    return 0;
}

このように、while文do-while文は使い分けることで、プログラムの意図を明確にすることができます。

while文の注意点とベストプラクティス

while文を使う際には、いくつかの注意点とベストプラクティスを守ることで、コードの品質と可読性を向上させることができます。

ここでは、無限ループの回避方法、条件式の適切な設定、ループ内での変数の適切な管理について詳しく解説します。

無限ループの回避方法

while文を使用する際に最も注意すべき点の一つが無限ループです。

無限ループは、条件が常に真であるためにループが終了しない状態を指します。

これを避けるためには、以下の点に注意しましょう。

  1. 条件式の確認:

条件式が適切に設定されているかを確認します。

条件が常に真にならないように注意します。

  1. ループ内での条件変更:

ループ内で条件を変更する処理を忘れないようにします。

例えば、カウンタ変数をインクリメントするなどの処理が必要です。

#include <iostream>
int main() {
    int count = 0;
    while (count < 5) {
        std::cout << "Count is: " << count << std::endl;
        count++; // カウンタ変数をインクリメント
    }
    return 0;
}

上記の例では、countが5未満の間ループが実行され、countがインクリメントされることでループが終了します。

条件式の適切な設定

条件式が適切に設定されていないと、意図しない動作を引き起こす可能性があります。

以下の点に注意して条件式を設定しましょう。

  1. 境界条件の確認:

境界条件を明確にし、条件式が正しく設定されているか確認します。

  1. 論理演算子の使用:

複数の条件を組み合わせる場合、論理演算子(&&, ||)を適切に使用します。

#include <iostream>
int main() {
    int number;
    std::cout << "Enter a number between 1 and 10: ";
    std::cin >> number;
    while (number < 1 || number > 10) {
        std::cout << "Invalid input. Please enter a number between 1 and 10: ";
        std::cin >> number;
    }
    std::cout << "You entered: " << number << std::endl;
    return 0;
}

上記の例では、ユーザーが1から10の範囲外の数値を入力した場合に再入力を促すループが実行されます。

ループ内での変数の適切な管理

ループ内で使用する変数は適切に管理することが重要です。

特に、ループの各反復で変数が正しく更新されるように注意します。

  1. 変数の初期化:

ループ内で使用する変数は適切に初期化します。

  1. 変数のスコープ:

変数のスコープを適切に設定し、必要な範囲でのみ使用します。

#include <iostream>
int main() {
    int sum = 0;
    int number;
    std::cout << "Enter numbers to sum (enter 0 to stop): " << std::endl;
    while (true) {
        std::cin >> number;
        if (number == 0) {
            break; // 0が入力されたらループを終了
        }
        sum += number; // sumにnumberを加算
    }
    std::cout << "Total sum is: " << sum << std::endl;
    return 0;
}

上記の例では、ユーザーが0を入力するまで数値を入力し続け、その合計を計算します。

変数sumはループの外で初期化され、ループ内で適切に更新されます。

これらの注意点とベストプラクティスを守ることで、while文を効果的に使用し、バグの少ないコードを書くことができます。

まとめ

while文の利点と欠点

while文はC++における基本的なループ構造の一つであり、特定の条件が満たされるまで繰り返し処理を行うために使用されます。

ここでは、while文の利点と欠点について詳しく見ていきましょう。

利点

  1. シンプルな構造: while文は非常にシンプルな構造を持っており、条件式が真である限りループを続けるという直感的な動作をします。
  2. 柔軟性: ループの開始前に条件を評価するため、ループの初回実行前に条件をチェックする必要がある場合に適しています。
  3. 無限ループの作成が容易: 条件式を常に真にすることで、簡単に無限ループを作成することができます。

これは特定の条件が発生するまでプログラムを待機させる場合などに有用です。

欠点

  1. 無限ループのリスク: 条件式が常に真である場合、無限ループに陥るリスクがあります。

これにより、プログラムが停止しなくなる可能性があります。

  1. 初期化の必要性: ループの条件式に使用する変数を適切に初期化しないと、予期しない動作を引き起こす可能性があります。
  2. 可読性の低下: 複雑な条件式やループ内の処理が多い場合、コードの可読性が低下することがあります。

効果的なwhile文の使用方法

while文を効果的に使用するためには、いくつかのポイントに注意する必要があります。

以下に、while文を適切に使用するための方法を紹介します。

1. 明確な終了条件を設定する

while文を使用する際には、明確な終了条件を設定することが重要です。

終了条件が不明確だと、無限ループに陥るリスクが高まります。

例えば、カウンタ変数を使用して特定の回数だけループを実行する場合や、ユーザーの入力に基づいてループを終了する場合などがあります。

#include <iostream>
using namespace std;
int main() {
    int count = 0;
    while (count < 5) {
        cout << "Count: " << count << endl;
        count++;
    }
    return 0;
}

2. ループ内の処理を適切に管理する

ループ内で行う処理が多い場合、コードが複雑になりがちです。

適切に関数を分割して、ループ内の処理を整理することで、コードの可読性を向上させることができます。

#include <iostream>
using namespace std;
void printMessage(int count) {
    cout << "Count: " << count << endl;
}
int main() {
    int count = 0;
    while (count < 5) {
        printMessage(count);
        count++;
    }
    return 0;
}

3. 無限ループを避けるための工夫

無限ループを避けるためには、ループの条件式を適切に設定し、ループ内で条件を変化させる処理を忘れないようにすることが重要です。

また、デバッグ時にはループの条件が正しく変化しているかを確認するためのログ出力を行うと良いでしょう。

#include <iostream>
using namespace std;
int main() {
    int count = 0;
    while (count < 5) {
        cout << "Count: " << count << endl;
        count++;
        // デバッグ用のログ出力
        cout << "Debug: count is now " << count << endl;
    }
    return 0;
}

4. 適切なループ構造を選択する

while文が最適な選択でない場合もあります。

例えば、ループの回数が決まっている場合はfor文を使用する方が適しています。

また、少なくとも一度はループを実行したい場合はdo-while文を使用する方が良いでしょう。

適切なループ構造を選択することで、コードの可読性と効率性を向上させることができます。

#include <iostream>
using namespace std;
int main() {
    for (int i = 0; i < 5; i++) {
        cout << "Count: " << i << endl;
    }
    return 0;
}

以上のポイントを押さえることで、while文を効果的に使用することができます。

while文は非常に強力なツールですが、適切に使用することでその利点を最大限に活かすことができます。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

目次から探す