JavaScriptのwhileループとdo…whileループの違いと使い分けを徹底解説

JavaScriptにおけるループ構造は、プログラムの実行を繰り返すための基本的な機能の一つです。特に、whileループとdo…whileループは、条件に基づいて繰り返し処理を行うための重要なツールです。本記事では、これら二つのループの違いと使い分けについて詳しく解説し、実際のコード例や使用シナリオを通じて、その効果的な活用方法を紹介します。これにより、JavaScriptプログラミングの効率を大幅に向上させることができます。

目次

whileループの基本

whileループは、指定した条件が真である間、繰り返し処理を行うための構造です。条件が最初に評価され、条件が真であればブロック内のコードが実行されます。条件が偽になるとループが終了します。基本的な構文は以下の通りです。

whileループの構文

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

基本例

以下は、1から5までの数字をコンソールに出力するwhileループの例です。

let i = 1;
while (i <= 5) {
    console.log(i);
    i++;
}

このコードでは、変数iが5以下である間、ループが実行され、iの値が1から5まで順に出力されます。iが6になると条件が偽となり、ループが終了します。

do…whileループの基本

do…whileループは、少なくとも一度はループ内のコードを実行し、その後、指定した条件が真である限り繰り返し処理を行います。条件が最後に評価されるため、最初の一回は条件に関係なく必ず実行される点が特徴です。基本的な構文は以下の通りです。

do…whileループの構文

do {
    // 少なくとも一度は実行されるコード
} while (条件);

基本例

以下は、1から5までの数字をコンソールに出力するdo…whileループの例です。

let i = 1;
do {
    console.log(i);
    i++;
} while (i <= 5);

このコードでは、変数iが5以下である間、ループが実行され、iの値が1から5まで順に出力されます。iが6になると条件が偽となり、ループが終了します。do…whileループでは、条件が偽であっても最初の一回は必ず実行されるため、whileループとは異なる動作を示します。

ループの違い

whileループとdo…whileループは、どちらも条件に基づいて繰り返し処理を行いますが、動作には重要な違いがあります。

初回の実行タイミング

  • whileループ: 条件が最初に評価され、条件が真の場合にのみループが開始されます。したがって、条件が最初から偽の場合、ループ内のコードは一度も実行されません。
  • do…whileループ: ループ内のコードが少なくとも一度は実行され、その後条件が評価されます。初回の実行は条件に関わらず必ず行われます。

フローチャートの違い

  • whileループのフローチャート:
  1. 条件を評価する。
  2. 条件が真ならば、コードブロックを実行する。
  3. 再び条件を評価し、真であれば再度コードブロックを実行する。
  4. 条件が偽になるとループを終了する。
  • do…whileループのフローチャート:
  1. コードブロックを実行する。
  2. 条件を評価する。
  3. 条件が真ならば、再度コードブロックを実行する。
  4. 条件が偽になるとループを終了する。

使用シナリオの違い

  • whileループ: 条件が成立している間にのみ処理を繰り返したい場合に適しています。初回から条件が重要な役割を果たす場合に使用します。
  • do…whileループ: 少なくとも一度は処理を実行する必要がある場合に適しています。ユーザー入力の確認や、初回の実行が前提となる処理に有効です。

これらの違いを理解することで、適切なループを選択し、効率的にプログラムを作成することができます。

具体的なコード例

whileループとdo…whileループの具体的な使用例を示し、それぞれの違いと使い方を詳しく解説します。

whileループの例

以下の例では、ユーザーから入力された数値が10未満である限り、入力された数値を累積していくプログラムです。

let sum = 0;
let number = parseInt(prompt("Enter a number: "));

while (number < 10) {
    sum += number;
    number = parseInt(prompt("Enter another number: "));
}

console.log("The sum is: " + sum);

この例では、ユーザーが入力した数値が10未満である場合、sumにその数値を追加し、再度数値の入力を促します。ユーザーが10以上の数値を入力するとループが終了します。

do…whileループの例

次に、ユーザーから入力された数値が10未満である限り、入力された数値を累積していくプログラムをdo…whileループで実装します。

let sum = 0;
let number;

do {
    number = parseInt(prompt("Enter a number: "));
    sum += number;
} while (number < 10);

console.log("The sum is: " + sum);

この例では、最初の数値の入力を条件に関わらず実行し、その後に条件を評価します。ユーザーが最初に10以上の数値を入力しても、sumにその数値が一度加算されます。

例の解説

  • whileループの例: 最初の数値が10以上であれば、ループ内のコードは一度も実行されずに終了します。
  • do…whileループの例: 最初の数値が10以上であっても、少なくとも一度はsumにその数値が加算されます。

これにより、whileループとdo…whileループの動作の違いが明確になります。状況に応じて適切なループを選択することが重要です。

ループの使い分け

whileループとdo…whileループをどのような状況で使い分けるべきかについて解説します。これにより、適切なループを選択して効率的なプログラムを作成できるようになります。

whileループを使うべき場合

  • 条件が初回から重要な場合: whileループは、条件が最初に評価されるため、初回から条件が重要な場合に適しています。たとえば、ユーザー入力が特定の条件を満たすまで繰り返し処理を行う場合など。
  • 初回の条件チェックが必要な場合: ループを開始する前に条件を確認し、条件が偽の場合は一度も実行せずに終了させたい場合に有効です。

例: 初回から条件が重要な場合

let password = prompt("Enter your password: ");
while (password !== "secret") {
    alert("Incorrect password. Try again.");
    password = prompt("Enter your password: ");
}

この例では、正しいパスワードが入力されるまでユーザーに再入力を促します。初回から条件を確認する必要があります。

do…whileループを使うべき場合

  • 少なくとも一度は実行が必要な場合: do…whileループは、最初の一回は条件に関わらず必ず実行されるため、少なくとも一度は処理を実行する必要がある場合に適しています。
  • 初回実行が前提となる場合: ユーザー入力を一度受け取り、その後に条件を評価するようなケースに有効です。

例: 初回実行が前提となる場合

let input;
do {
    input = prompt("Enter a number (0 to stop): ");
    console.log("You entered: " + input);
} while (input != "0");

この例では、ユーザーが「0」を入力するまで繰り返し入力を受け付けます。少なくとも一度は入力を受け付ける必要があります。

まとめ

  • whileループ: 初回から条件が重要な場合に使用。
  • do…whileループ: 少なくとも一度は処理を実行する必要がある場合に使用。

状況に応じてこれらのループを使い分けることで、より効率的で直感的なコードを書くことができます。

実際のシナリオでの使用例

whileループとdo…whileループの違いを理解したところで、実際のシナリオにおける使用例を見ていきましょう。これにより、それぞれのループがどのように適用されるかを具体的にイメージできます。

ユーザー認証のシナリオ

ユーザーが正しいパスワードを入力するまで再試行させるケースを考えます。

whileループの使用例

let password = prompt("Enter your password: ");
while (password !== "secret") {
    alert("Incorrect password. Try again.");
    password = prompt("Enter your password: ");
}
alert("Access granted.");

この例では、ユーザーが最初にパスワードを入力した時点で条件を評価し、間違っている場合は再度入力を促します。

do…whileループの使用例

let password;
do {
    password = prompt("Enter your password: ");
    if (password !== "secret") {
        alert("Incorrect password. Try again.");
    }
} while (password !== "secret");
alert("Access granted.");

この例では、少なくとも一度はパスワードの入力を求め、その後に条件を評価します。初回から条件評価を必要としない場合に適しています。

数値の累積入力のシナリオ

ユーザーから数値を入力させ、特定の条件を満たすまでその数値を累積する場合を考えます。

whileループの使用例

let sum = 0;
let number = parseInt(prompt("Enter a number: "));
while (number > 0) {
    sum += number;
    number = parseInt(prompt("Enter another number: "));
}
alert("The total sum is: " + sum);

この例では、ユーザーが0以下の数値を入力するまで累積を続けます。最初の入力時に条件を評価します。

do…whileループの使用例

let sum = 0;
let number;
do {
    number = parseInt(prompt("Enter a number: "));
    if (number > 0) {
        sum += number;
    }
} while (number > 0);
alert("The total sum is: " + sum);

この例では、少なくとも一度は数値の入力を求め、その後に条件を評価します。初回から累積処理が必要な場合に適しています。

まとめ

これらのシナリオを通じて、whileループとdo…whileループの使い分けがより明確になります。条件の評価タイミングと初回実行の必要性に基づいて、適切なループを選択することで、プログラムのロジックをより明確かつ効率的に設計できます。

演習問題

ここでは、whileループとdo…whileループの違いを理解し、その使い分けを練習するための演習問題を提供します。問題を解くことで、実際のプログラムでこれらのループを適用するスキルを向上させることができます。

演習問題1: 逆数の累積

1から10までの整数の逆数を累積して、その合計を求めるプログラムを作成してください。whileループを使用して実装してください。

期待される出力:

1/1 + 1/2 + 1/3 + ... + 1/10 の合計は: 2.9289682539682538

解答例:

let sum = 0;
let i = 1;
while (i <= 10) {
    sum += 1 / i;
    i++;
}
console.log("1/1 + 1/2 + 1/3 + ... + 1/10 の合計は: " + sum);

演習問題2: 入力された数値の合計

ユーザーが入力した数値を累積して、その合計を表示するプログラムを作成してください。ユーザーが0を入力したら入力を終了し、合計を表示します。do…whileループを使用して実装してください。

期待される出力例:

Enter a number: 5
Enter a number: 10
Enter a number: 0
The total sum is: 15

解答例:

let sum = 0;
let number;
do {
    number = parseInt(prompt("Enter a number: "));
    sum += number;
} while (number !== 0);
alert("The total sum is: " + sum);

演習問題3: パスワード確認

ユーザーが正しいパスワードを入力するまで、入力を求めるプログラムを作成してください。正しいパスワードは “password123” とします。whileループを使用して実装してください。

期待される出力例:

Enter your password: wrongpass
Incorrect password. Try again.
Enter your password: password123
Access granted.

解答例:

let password = prompt("Enter your password: ");
while (password !== "password123") {
    alert("Incorrect password. Try again.");
    password = prompt("Enter your password: ");
}
alert("Access granted.");

演習問題4: 入力された文字列の確認

ユーザーが “exit” と入力するまで、入力された文字列を表示するプログラムを作成してください。do…whileループを使用して実装してください。

期待される出力例:

Enter a string: hello
You entered: hello
Enter a string: world
You entered: world
Enter a string: exit
Goodbye!

解答例:

let input;
do {
    input = prompt("Enter a string: ");
    if (input !== "exit") {
        console.log("You entered: " + input);
    }
} while (input !== "exit");
console.log("Goodbye!");

これらの演習問題を解くことで、whileループとdo…whileループの使い方を実践的に理解することができます。問題に取り組んだ後、自分の解答を確認し、どのように改善できるかを考えてみましょう。

よくある間違いとその対策

whileループとdo…whileループを使用する際に陥りやすい一般的な間違いと、それを防ぐための対策について解説します。

無限ループの発生

無限ループは、ループが終了条件を満たさずに永遠に続いてしまう状態を指します。これは特にwhileループやdo…whileループを使用する際に注意が必要です。

原因

  • 条件が常に真である場合。
  • ループ内の変数の更新が適切に行われていない場合。

対策

  • ループ条件が必ず偽になるように変数を更新すること。
  • デバッグの際にループカウンタを出力することで、意図通りに変数が更新されているか確認する。

例: 無限ループの例とその修正

// 無限ループの例
let i = 0;
while (i < 10) {
    console.log(i);
    // i++がないため無限ループになる
}

// 修正例
let j = 0;
while (j < 10) {
    console.log(j);
    j++;  // jを適切に更新することで無限ループを防ぐ
}

条件の評価タイミングの誤解

whileループとdo…whileループの条件評価タイミングの違いを理解していないと、意図しない動作を引き起こすことがあります。

原因

  • 初回の実行が必要な場合にwhileループを使用する。
  • 初回の条件チェックが必要な場合にdo…whileループを使用する。

対策

  • ループの動作フローを理解し、適切なループを選択する。
  • 条件の評価タイミングを意識してコードを書く。

例: 条件評価の誤解とその修正

// 初回実行が必要な場合にwhileループを使用してしまう例
let password;
while (password !== "secret") {
    password = prompt("Enter your password: ");
}

// 修正例: do...whileループを使用
let password;
do {
    password = prompt("Enter your password: ");
} while (password !== "secret");

ループの終了条件の設定ミス

ループの終了条件が適切に設定されていないと、予期せぬ動作やエラーを引き起こす可能性があります。

原因

  • 終了条件が明確でない。
  • 終了条件が変数の範囲外になる。

対策

  • 終了条件を明確に設定し、変数の更新が適切に行われるようにする。
  • ループ内での変数の更新や条件チェックを丁寧に行う。

例: 終了条件のミスとその修正

// 終了条件が適切でない例
let count = 0;
while (count !== 10) {
    console.log(count);
    count += 2;  // countが奇数になることはないため、終了しない
}

// 修正例
let count = 0;
while (count < 10) {
    console.log(count);
    count += 2;  // ループが10未満で終了するため適切
}

これらのよくある間違いと対策を理解することで、whileループとdo…whileループをより効果的に使用できるようになります。実際のプログラミングでは、これらのポイントを意識してコーディングすることが重要です。

まとめ

本記事では、JavaScriptにおけるwhileループとdo…whileループの基本的な使い方、動作の違い、具体的なコード例、使い分けのシナリオ、演習問題、そしてよくある間違いとその対策について詳しく解説しました。whileループは条件が初回から重要な場合に使用し、do…whileループは少なくとも一度は処理を実行する必要がある場合に適しています。

適切なループ構造を選択することで、コードの可読性と効率性が向上し、バグを防ぐことができます。今回の内容を理解し、実際のプログラムに応用することで、より堅牢で効率的なコードを書くことができるでしょう。

コメント

コメントする

目次