ど素人が質問させていただきます。
実行しても最後のプレミアム席がなぜか出てきません。
どのような書き方をすれば出るのかを教えていただきたく思います。
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/07 12:14
回答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
総合スコア80875
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/07 12:15
2020/02/07 12:46
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
総合スコア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
総合スコア348
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/07 12:07
2020/02/07 12:18 編集
2020/02/07 12:47
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。