繰り返し処理

[C言語] do-while文の使い方

C言語におけるdo-while文は、少なくとも一度はループ内のコードを実行したい場合に使用されます。

このループは、doブロック内のコードを実行した後にwhile条件を評価し、条件が真である限り繰り返します。

通常のwhileループとは異なり、条件が最初に評価されないため、ループ内の処理が必ず一度は実行されることが保証されます。

この特性を利用して、ユーザー入力の検証やメニュー選択の繰り返し処理などに活用されます。

do-while文とは

C言語におけるdo-while文は、少なくとも一度はループ内の処理を実行したい場合に使用される制御構造です。

do-while文は、ループの最後に条件を評価するため、条件が偽であっても一度はループが実行されるという特徴があります。

do-while文の基本構造

do-while文の基本的な構造は以下の通りです。

#include <stdio.h>
int main() {
    int count = 0;
    // do-while文の開始
    do {
        printf("カウント: %d\n", count);
        count++;
    } while (count < 5); // 条件がtrueの間、ループを続ける
    return 0;
}

このコードでは、countが5未満の間、ループが実行されます。

doブロック内の処理が実行された後にwhileの条件が評価されるため、countが0から始まって5未満になるまでループが続きます。

カウント: 0
カウント: 1
カウント: 2
カウント: 3
カウント: 4

do-while文とwhile文の違い

do-while文とwhile文の主な違いは、条件の評価タイミングです。

以下の表にその違いをまとめます。

特徴do-while文while文
条件評価のタイミングループの後ループの前
最低実行回数1回0回
使用例少なくとも1回は実行したい場合条件が真の場合のみ実行したい場合

do-while文の利点と欠点

do-while文にはいくつかの利点と欠点があります。

利点:

  • 少なくとも一度はループを実行する必要がある場合に便利です。
  • ユーザー入力の検証やメニュー選択のような場面で役立ちます。

欠点:

  • 条件が最初に偽であっても一度は実行されるため、意図しない動作を引き起こす可能性があります。
  • 他のループ構造と比べて、使用頻度が低いため、コードの可読性が下がることがあります。

do-while文は、特定の条件下で非常に有用ですが、使用する際にはその特性を理解し、適切に活用することが重要です。

do-while文の基本的な使い方

do-while文は、特定の条件が満たされるまで繰り返し処理を行うためのループ構造です。

ここでは、基本的な使い方から応用的な使用法までを解説します。

do-while文の基本的な例

do-while文の基本的な使い方を示す例を以下に示します。

#include <stdio.h>
int main() {
    int number = 0;
    // do-while文の開始
    do {
        printf("現在の数値: %d\n", number);
        number++;
    } while (number < 3); // 条件がtrueの間、ループを続ける
    return 0;
}

この例では、numberが3未満の間、ループが実行されます。

doブロック内の処理が実行された後にwhileの条件が評価されるため、numberが0から始まって3未満になるまでループが続きます。

現在の数値: 0
現在の数値: 1
現在の数値: 2

無限ループを作成する方法

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

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

#include <stdio.h>
int main() {
    int count = 0;
    // 無限ループの開始
    do {
        printf("無限ループ中: %d\n", count);
        count++;
        // 無限ループを終了するための条件を設定することが重要
        if (count > 10) break; // 例として10回でループを終了
    } while (1); // 常にtrue
    return 0;
}

このコードでは、whileの条件が常に1(真)であるため、無限ループが発生します。

ただし、break文を使用して、countが10を超えたときにループを終了しています。

入力を検証するためのdo-while文の使用

ユーザーからの入力を検証する際に、do-while文は非常に便利です。

以下の例では、ユーザーに正の整数を入力させるまで繰り返し入力を求めます。

#include <stdio.h>
int main() {
    int input;
    // 入力の検証を行うdo-while文
    do {
        printf("正の整数を入力してください: ");
        scanf("%d", &input);
        if (input <= 0) {
            printf("無効な入力です。もう一度入力してください。\n");
        }
    } while (input <= 0); // 入力が正の整数でない限りループを続ける
    printf("入力された正の整数: %d\n", input);
    return 0;
}

このプログラムは、ユーザーが正の整数を入力するまで、入力を繰り返し求めます。

入力が無効な場合には、エラーメッセージを表示し、再度入力を促します。

これにより、ユーザーの入力が正しい形式であることを保証できます。

do-while文の応用例

do-while文は、基本的なループ処理だけでなく、さまざまな応用シナリオで活用できます。

ここでは、do-while文を使ったいくつかの応用例を紹介します。

メニュー選択ループの実装

ユーザーにメニューを表示し、選択に応じて異なる処理を行うプログラムをdo-while文で実装することができます。

#include <stdio.h>
int main() {
    int choice;
    // メニュー選択ループの開始
    do {
        printf("メニュー:\n");
        printf("1. オプション1\n");
        printf("2. オプション2\n");
        printf("3. 終了\n");
        printf("選択してください: ");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                printf("オプション1が選択されました。\n");
                break;
            case 2:
                printf("オプション2が選択されました。\n");
                break;
            case 3:
                printf("プログラムを終了します。\n");
                break;
            default:
                printf("無効な選択です。もう一度選択してください。\n");
        }
    } while (choice != 3); // 終了が選択されるまでループを続ける
    return 0;
}

このプログラムは、ユーザーが「3. 終了」を選択するまでメニューを表示し続けます。

選択に応じて異なるメッセージを表示し、無効な選択の場合は再度選択を促します。

ユーザー入力の再試行

ユーザー入力が特定の条件を満たすまで再試行させる場合にもdo-while文が役立ちます。

#include <stdio.h>
int main() {
    int number;
    // ユーザー入力の再試行
    do {
        printf("10から20の間の数を入力してください: ");
        scanf("%d", &number);
        if (number < 10 || number > 20) {
            printf("無効な入力です。もう一度入力してください。\n");
        }
    } while (number < 10 || number > 20); // 条件を満たすまでループを続ける
    printf("入力された数: %d\n", number);
    return 0;
}

この例では、ユーザーが10から20の間の数を入力するまで、入力を繰り返し求めます。

条件を満たさない場合にはエラーメッセージを表示し、再入力を促します。

ファイル読み込みの繰り返し処理

ファイルからデータを読み込む際に、do-while文を使って繰り返し処理を行うことができます。

#include <stdio.h>
int main() {
    FILE *file;
    char buffer[256];
    // ファイルの読み込み
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("ファイルを開くことができませんでした。\n");
        return 1;
    }
    // ファイル読み込みの繰り返し処理
    do {
        if (fgets(buffer, sizeof(buffer), file) != NULL) {
            printf("%s", buffer);
        }
    } while (!feof(file)); // ファイルの終わりに達するまでループを続ける
    fclose(file);
    return 0;
}

このプログラムは、example.txtというファイルを開き、内容を1行ずつ読み込んで表示します。

ファイルの終わりに達するまで、do-while文を使って繰り返し処理を行います。

ファイルが存在しない場合にはエラーメッセージを表示します。

do-while文を使ったエラーハンドリング

do-while文は、エラーハンドリングの場面でも有効に活用できます。

特に、エラーが発生した場合に再試行を行う処理や、エラーメッセージを表示する際に役立ちます。

エラーチェックの基本

エラーチェックは、プログラムが予期しない状況に対処するために重要です。

do-while文を使うことで、エラーが解消されるまで処理を繰り返すことができます。

#include <stdio.h>
int main() {
    int number;
    int success;
    // エラーチェックの基本
    do {
        printf("正の整数を入力してください: ");
        success = scanf("%d", &number);
        if (success != 1 || number <= 0) {
            printf("無効な入力です。もう一度入力してください。\n");
            // 入力バッファをクリア
            while (getchar() != '\n');
        }
    } while (success != 1 || number <= 0); // 入力が正しい形式になるまでループを続ける
    printf("入力された正の整数: %d\n", number);
    return 0;
}

この例では、ユーザーが正の整数を入力するまで、入力を繰り返し求めます。

入力が無効な場合にはエラーメッセージを表示し、再入力を促します。

do-while文でのリトライ処理

do-while文を使って、特定の操作が成功するまでリトライを行うことができます。

以下の例では、ファイルのオープンに失敗した場合に再試行を行います。

#include <stdio.h>
int main() {
    FILE *file;
    char filename[256];
    int attempts = 0;
    // リトライ処理の開始
    do {
        if (attempts > 0) {
            printf("ファイルを開くことができませんでした。もう一度試してください。\n");
        }
        printf("ファイル名を入力してください: ");
        scanf("%s", filename);
        file = fopen(filename, "r");
        attempts++;
    } while (file == NULL && attempts < 3); // 3回までリトライを許可
    if (file != NULL) {
        printf("ファイルを開きました。\n");
        fclose(file);
    } else {
        printf("ファイルを開くことができませんでした。\n");
    }
    return 0;
}

このプログラムは、ユーザーにファイル名を入力させ、ファイルを開くことができるまで最大3回リトライを行います。

ファイルが開けない場合にはエラーメッセージを表示します。

エラーメッセージの表示

エラーメッセージを表示することで、ユーザーに問題の内容を伝えることができます。

do-while文を使って、エラーが解消されるまでメッセージを表示し続けることが可能です。

#include <stdio.h>
int main() {
    int number;
    // エラーメッセージの表示
    do {
        printf("1から10の間の数を入力してください: ");
        scanf("%d", &number);
        if (number < 1 || number > 10) {
            printf("エラー: 入力が範囲外です。もう一度入力してください。\n");
        }
    } while (number < 1 || number > 10); // 条件を満たすまでループを続ける
    printf("入力された数: %d\n", number);
    return 0;
}

この例では、ユーザーが1から10の間の数を入力するまで、エラーメッセージを表示し続けます。

入力が範囲外の場合には、エラーメッセージを表示し、再入力を促します。

do-while文のパフォーマンスと最適化

do-while文は、特定の条件が満たされるまで繰り返し処理を行うためのループ構造ですが、パフォーマンスや最適化の観点からも考慮する必要があります。

ここでは、do-while文のパフォーマンス特性や最適化のヒント、他のループ構造との比較について解説します。

do-while文のパフォーマンス特性

do-while文のパフォーマンスは、主にループ内の処理内容とループの回数に依存します。

以下に、do-while文のパフォーマンス特性を示します。

  • 初回実行の確実性: do-while文は、条件に関係なく少なくとも一度はループ内の処理を実行します。

これにより、初回実行が保証されるため、初期化処理などに適しています。

  • 条件評価のタイミング: 条件がループの最後に評価されるため、条件評価のオーバーヘッドが他のループ構造と比較して若干異なる場合があります。
  • ループ回数の影響: ループ回数が多い場合、ループ内の処理がパフォーマンスに大きく影響します。

効率的なコードを書くことが重要です。

最適化のためのヒント

do-while文を使用する際の最適化のヒントを以下に示します。

  • ループ内の処理を簡潔に: ループ内の処理をできるだけ簡潔にし、不要な計算や処理を避けることで、パフォーマンスを向上させます。
  • 条件評価の効率化: 条件評価が複雑な場合、事前に計算しておくことで、ループ内での評価を効率化できます。
  • ループの早期終了: break文を使用して、必要に応じてループを早期に終了させることで、無駄な処理を避けることができます。

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

do-while文は、他のループ構造(while文やfor文)と比較して、特定の用途に適しています。

以下に、各ループ構造の特徴を比較します。

ループ構造初回実行条件評価のタイミング主な用途
do-while文必ず実行ループの後少なくとも一度は実行したい場合
while文条件次第ループの前条件が真の場合のみ実行したい場合
for文条件次第ループの前繰り返し回数が明確な場合

do-while文は、少なくとも一度はループを実行する必要がある場合に最適です。

while文やfor文と比較して、条件評価のタイミングが異なるため、用途に応じて適切なループ構造を選択することが重要です。

まとめ

do-while文は、少なくとも一度はループを実行する必要がある場面で有効なループ構造です。

この記事では、do-while文の基本的な使い方から応用例、エラーハンドリング、パフォーマンスの最適化までを解説しました。

これにより、do-while文の特性を理解し、適切な場面で活用できるようになったでしょう。

今後は、実際のプログラムでdo-while文を試し、効果的に活用してみてください。

関連記事

Back to top button