質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

JavaScriptで、while文の中にif文を入れた時に上手いことループしない

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 276

前提・実現したいこと

クイズもどきを作成しています。
promptの「日本の首都は?」という問いに対し、
「東京」と入力されれば「正解です!」のアラートの表示。
「東京」以外の入力であれば「不正解です!」のアラートの表示の後に、
もう一度「日本の首都は?」というpromptを出すようにループさせたいです。

しかし、promptに「東京」と入力しても何も出力されません。

発生している問題

var capital = prompt("日本の首都は?");

while(capital !== "東京"){
    alert("不正解です!")
    prompt("日本の首都は?")

if(capital === "東京"){
        alert("正解です!")
    }
};


whileとifの使い方が間違えているのは明白ですが、
何が間違えているのかが分かりません。
無知で申し訳ないですが、解決策が知りたいです。よろしくお願いします。

試したこと

基礎から学び直し、whileとifを色々組み換えて試しましたが
一向にうまくいきません。

補足情報

使用エディタ:VScode

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+5

while内のpromptの入力がcapitalに受けてませんよね?
後はwhileの条件とwhile内の条件がほぼ同じで無駄な気がします

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/03 20:37

    例えばこんな感じ
    var count=0;
    var flg=true;
    while(flg){
    if(++count>3){
    alert("game over");
    break;
    }
    if(flg=(prompt("日本の首都は?")!== "東京")){
    alert("不正解です!");
    continue;
    }
    alert("正解です!");
    }


    whileは無限ループになる可能性があるので、回数制限を設けたほうが
    よいです。(回数制限するならforでも良い気がしますが・・・)

    キャンセル

  • 2020/07/03 21:18

    ご回答ありがとうございます!
    回答例まで載せていただいて、ありがとうございます。
    もう一度、自分の力で解いてみます。

    キャンセル

+3

解決策が知りたいです

フローチャートを書けば処理を整理できます(アナログに紙に書く or ペン入力できる環境で書く)。
キーボード上で手先だけをカタカタするより、手を大胆に動かしたほうが良い刺激になるのでは。

※「試したこと」にある文言から、全く別の視点で回答させていただきました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/03 21:12

    VScodeをお使いなら、「VScode + PlantUML」など、いくつかフローチャート用の拡張があります。
    紙に書くのと、タイピングでは、使う頭が違うと思うので、性に合ってる方を選んだ方が良いですが。

    キャンセル

  • 2020/07/03 21:20

    AkitoshiManabe さんが似たような事を仰っていますが、気分転換や思考整理に「紙」、保存用に「電子データ」ですね、私の場合は。

    キャンセル

  • 2020/07/03 21:25

    ありがとうございます!
    VScodeってそんな拡張機能もあるんですね。驚きました。
    色々試してみて、自分に合うのを探していきます。

    キャンセル

+1

まず、再度、whileの基本から再度勉強しましょう。
while構文は、()内の式(値)が真である限り、処理を繰り返す、というものです。

  • つまり、質問のコードでは、
    東京と入力した時点で、中の構文は繰り返しの条件として真にならないため、実行されないので、何もおきません。
  • そして、東京以外の文字列を最初に入力してしまうと、無限ループとなり、whileの中身を実行し続けてしまいます。
    なぜなら、while処理の中で、capitalを入れ替えていないため、whileの実行条件が真であり続けてしまうからです。

なので、その二点を修正すれば、
解決するでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/03 21:02

    ご回答ありがとうございます!
    もう一度、基本に立ち返って、
    ご教示いただいた解決方法を用いて、再度挑んでみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る