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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1064閲覧

条件が3つある条件分岐がうまくいきません

satooo

総合スコア6

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/02/07 11:44

ど素人が質問させていただきます。
実行しても最後のプレミアム席がなぜか出てきません。
どのような書き方をすれば出るのかを教えていただきたく思います。

let age = 18;
let ticket = "あり";
let fanclubticket = "あり";

if (ticket === "あり") {
if (age >= 18) {
console.log("通常席");
} else {
console.log("帰れ");
}
} else if (age >= 18) {
if (ticket === "あり") {
console.log("通常席");
} else {
console.log("帰れ");
}
} else if (age === 18) {
if (ticket === "あり") {
if (fanclubticket === "あり") {
console.log("プレミアム席");
}
}
}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/02/07 11:50

コードはマークダウンのcode機能を利用してご提示ください。
satooo

2020/02/07 12:14

マークダウンのcode機能すらわからずごめんなさい。調べてきます。
guest

回答3

0

ベストアンサー

下記のようにしてみればどこを通っているか分かるわけです。

js

1let age = 18; 2let ticket = "あり"; 3let fanclubticket = "あり"; 4 5console.log(1); 6if (ticket === "あり") { 7 if (age >= 18) { 8console.log(2); 9 console.log("通常席"); 10 } else { 11console.log(3); 12 console.log("帰れ"); 13 } 14} else if (age >= 18) { 15 if (ticket === "あり") { 16console.log(4); 17 console.log("通常席"); 18 } else { 19console.log(5); 20 console.log("帰れ"); 21 } 22} else if (age === 18) { 23 if (ticket === "あり") { 24console.log(6); 25 if (fanclubticket === "あり") { 26console.log(7); 27 console.log("プレミアム席"); 28 } 29 } 30} 31 32 33/** 34出力結果: 351 362 37通常席 38 39**/

ifって「条件に一致した」らもうそこしか入りません。
幾らelseがあっても既に条件一致してればあとの条件は見られません。

なので一発目の「if (ticket === "あり") {」が成り立った時点で
2か3しか選択肢がなく、if (age >= 18) {が成り立つので、そこで終わります。

プレミアム席を出力したいのでしたらこのロジックは出来ません。
fanclubticketの分岐が生命線なのであれば、そこから最初のifを始めれば良いのでは?

ネストせずに&&でつなげれば次のifにいけると思います。
あと条件はもうちょっとまとめても良いのかなと。

下記なんて「チケットあって18歳以上なら通常席それ以外は”帰れ”」を入れ替えてるだけで同じじゃないですか?

js

1if (ticket === "あり") { 2 if (age >= 18) { 3 console.log("通常席"); 4 } else { 5 console.log("帰れ"); 6 } 7} else if (age >= 18) { 8 if (ticket === "あり") { 9 console.log("通常席"); 10 } else { 11 console.log("帰れ"); 12 } 13}

チケット持ってて18歳未満の場合はどうするんでしょう。条件に入ってない気がします。
「帰れ」でいいなら下記で済むかと。

例:

js

1if (age === 18 && ticket === "あり" && fanclubticket === "あり"){ 2 console.log("プレミアム席"); 3}else if(ticket === "あり" && age >= 18){ 4 console.log("通常席"); 5}else{ 6 console.log("帰れ"); 7} 8 9 10

投稿2020/02/07 12:04

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satooo

2020/02/07 12:15

これです。これが知りたかったんです。 マークダウンのcodeすらよくわかってなかったに色々と汲んでいただきありがとうございます。
guest

0

内容としてはvnsa7221さん、m.ts10806さんの内容で満たされていますが、「ガード節」という書き方をご紹介します。
分岐する条件が複数あるときに、ifの中にifを書いて……というのを繰り返すと、書くのも読むのも大変なので、特殊な条件(エラーなど)の場合はさっさと return (あるいは throw) しようというものです。

ガード節を意識して、かつあなたのコードの不足(と思われる部分)を修正すると、こんな感じになるかと思います。
「(と思われる部分)」とわざわざ書いたのは、あなたのコードの意図が100%私に伝わらなかったためです。人に見せるコードにはなるべくコメントを入れましょう。
自分だけが見るコードだとしても、数週間方っておいた後から見ると当時の自分が何をやりたかったのか分からんというのはプログラマあるあるです。

js

1function checkYourSheet(age, ticket, fanclubticket) { 2 // チケットを持っていない者には鉄槌を下して処理を中断する 3 if (ticket !== "あり") return "帰れ"; 4 5 // 18歳に満たない者には鉄槌を下して処理を中断する 6 if (age < 18) return "帰れ"; 7 8 // ちょうど18歳で、ファンクラブチケットを持っている者にはプレミアム席を案内する 9 if (age === 18 && fanclubticket === "あり") return "プレミアム席"; 10 11 // いずれの条件も満たさない者には通常席を案内する 12 return "通常席"; 13} 14 15console.log( 16 'チケットとファンクラブチケットを持つ18歳', 17 checkYourSheet(18, "あり", "あり") 18); 19// -> チケットとファンクラブチケットを持つ18歳 プレミアム席 20 21console.log( 22 'チケットとファンクラブチケットを持つ17歳', 23 checkYourSheet(17, "あり", "あり") 24); 25// -> チケットとファンクラブチケットを持つ17歳 帰れ 26 27console.log( 28 'チケットはないがファンクラブチケットを持つ19歳', 29 checkYourSheet(19, "なし", "あり") 30); 31// -> チケットはないがファンクラブチケットを持つ19歳 帰れ 32 33console.log( 34 '何も持たぬ42歳', 35 checkYourSheet(42, "なし", "なし") 36); 37// -> 何も持たぬ42歳 帰れ

投稿2020/02/07 12:19

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

else if (age >= 18)

この部分はageが18以上(18, 19, 20...)の場合は条件を満たします。

仮にこの部分を条件を満たさなかった場合

(age === 18)

となっていますが、ここはageが18の時のみ条件を満たします。

すでに上の条件式でageが18の場合は条件を満たすのでこのままではどう頑張ってもプレミアム席まではたどり着かないです。

else if (age > 18)

このようにすればageが18より大きい(19, 20...)場合条件を満たすようになるのでageが18では条件を満たさず、次の条件式まで到達することができます。

投稿2020/02/07 12:00

vnsa7221

総合スコア348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/02/07 12:07

そもそも ticket === "あり" が満たされてそれで終わってます。 ageの条件幾ら変えたところでプレミアムにはたどり着かないのでは?
vnsa7221

2020/02/07 12:18 編集

第一条件はまずそこですね。 自分の勝手な早とちりで変数部分の値をどのように変えてもたどり着かないのはなぜかと質問いただいているのかなと思ってしまいました。 なのでlet ticket = "なし"に変更したとしてもそのあとの処理でageをどのように変えても2番目の条件式を満たさず、3番目の条件式を満たすようにすることができないので、そちらを変えないといけないですよと回答させていただきました。 ちょっと不親切だったかもしれないですね。
m.ts10806

2020/02/07 12:47

もともとの要件が不明瞭なのもありますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問