ああああああああああああああああああああああああああああああああああああ
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/03 05:56
2021/09/03 05:58 編集
2021/09/03 06:06 編集
2021/09/03 06:13
2021/09/03 06:13
2021/09/03 06:14
2021/09/03 06:14
2021/09/03 10:54
回答3件
0
こんな風にも書けます。
Java
1 switch (x) { 2 default: System.out.println("ランクなし"); break; 3 case 1: case 2: case 3: case 4: case 5: 4 while (x <= 5) 5 System.out.println("ランク" + ".ABCDE".charAt(x++) + "突破"); 6 }
投稿2021/09/03 09:10
総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/03 09:26
2021/09/03 09:30
0
ベストアンサー
今回の場合、switch...caseを使わなくても実装できそうです。
でも追記では「必ずswitch...caseを使え」という定義のようなので、
他の方も仰っているように、「フォールスルー」を行う必要がありますね。
(この質問に出会うまで、知らなかったけど)
「フォールスルーとは」で検索すると、ここがヒットしました。
上記によると、単純にbreakを置かないだけ。らしいです。
私ならまず最初に仕様を確認します。
で、今回の冗長と言われたコード(質問にあるコード)を見ると、
1のとき: Aランク Bランク ... Eランク 2のとき: Bランク ... Eランク 3のとき: Cランク ... 4のとき: Dランク ... ...
と言う風になっていますね。
では、これらの規則性を見てみましょう。
1 -> 2 -> 3 ... と数字が上がるごとに、A,B,C, ... のアルファベット表記のランクが下がっています。
逆を言えば、「数字が小さくなれば小さくなるほど、高ランクも通る」的なものですね。
別の視点で見てみましょうか。
Aランクを突破するのはどういう条件でしょうか。
そう、x=1 を満たすときだけです。
{ 1 } だけ。
後はどうやっても突破できない。
では、Bランクは? そう、x≧2 を満たすときだけ。
つまり、{ 1, 2 } のどちらかじゃないとできない。
では Cランクは? そう、x > 3 を満たすときだけ。
つまり、{ 1, 2, 3 } のときだけ。
……と考えていくと、
「単純に、数字を1,2,3,4, ... と並べていき、フォールスルー方式でやればいい」ですね。
あえて疑似コードで書くと、
SWITCH( 対象 ): 1の場合: // Aランク到達 2の場合: // Bランク到達 3の場合: // Cランク到達 ...
って感じでしょうか。
ただ、1~5以外のもの(default)だと、「ランク無し」となりますから、区別を付けないと、「ランク無し」まで行ってしまいます。
ということで、1~4はフォールスルー方式でbreak無しでやり、5のときだけbreakで抜ける。
的な処理になるかと。
そうすれば重複している部分( 2のときは 1の時の「Aランク突破」が重複しているし ) を省くことができますよ。
[追記1]
※ ご指摘を受けての追記です。
上記でやっているフォールスルーをやる場合は、規則性を見付ける必要があります。
1~4は、「下位ランクも含まれている」ため、あえてbreakを省きます。
まずは、上記で述べたように1の場合,2の場合,... のそれぞれの「到達するランク」を列挙してみてください。
おそらく、以下のようになるはずです。
1: A, B, C, D, E 2: B, C, D, E 3: C, D, E 4: D, E 5: E その他: <ランク無し>
1~4は 下位ランクも含んでいますね。
つまり、1は 2のやつを含んでいて、2のやつは 3のやつを含んでいて、...という感じです。
ちょっと考えを変えてみると、3の場合は、 <5> + <4> + <3> となっていますね。
よって、疑似コードで書くと、
SWITCH( 対象 ): 1の場合: 「Aランク」 2の場合: 「Bランク」 3の場合: 「Cランク」 4の場合: 「Dランク」 5の場合: 「Eランク」 BREAK その他: 「該当なし」系
となるはずです。
上記疑似コードを使ってシミュレーションしてみましょう。
たとえば、X = 1 の場合。
1. まず SWICH(...) で調べる 2. 「1の場合」を見る 3. 「Aランク」が該当する 4. breakが無いので「2の場合」も見る 5. 「Bランク」も該当する 6. breakが無いので「3の場合」も見る 7. 「Cランク」も該当する ... 10. breakが無いので「5の場合」を見る 11. 「Eランク」も該当する 12. breakがあるのでSWITCHから抜ける
となり、
Aランク到達 Bランク到達 Cランク到達 Dランク到達 Eランク到達
となります。
X = 2 の場合も、
1. まずSWITCH(...)で調べる 2. 「1の場合」を見る 3. (→ 条件を満たさないため スルー) 4. 「2の場合」を見る 5. 「Bランク」に該当 6. breakが無いため 「3の場合」を見る 7. 「Cランク」も該当 ... 12. breakがあるのでSWITCHから抜ける
となり、
Bランク該当 Cランク該当 Dランク該当 Eランク該当
となる。
X = 5 のときは、
1. まずSWITCH(...)で調べる 2. 「1の場合」を見る 3. (→ 条件を満たさないため スルー) 4. 「2の場合」を見る 5. (→ 条件を満たさないため スルー) 6. breakが無いため 「3の場合」を見る 7. (→ 条件を満たさないため スルー) ... 10. breakが無いので「5の場合」を見る 11. 「Eランク」も該当する 12. breakがあるのでSWITCHから抜ける
となり、
Eランク該当
のみとなる。
で、X が 15以外の数字の場合は、上記の(1)(12)は完全スルーして、
1. まずSWITCH(...)で調べる 2. 「1の場合」を見る 3. (→ 条件を満たさないため スルー) 4. 「2の場合」を見る 5. (→ 条件を満たさないため スルー) 6. breakが無いため 「3の場合」を見る 7. (→ 条件を満たさないため スルー) ... 13. 上記の条件すべてに満たさないため defaultに 14. よって「該当無し」とする
となり、
該当なし
的なものになるはずです。
switch...caseは上からチェックしていき、該当するものがあれば、breakが出るか、最後までと到達するまで処理するようなので、今回の X が 1~4 までは break無しで処理をして、
5 で 処理をした直後にbreakを置く。
となるはずです。
投稿2021/09/03 06:31
編集2021/09/03 10:32総合スコア4962
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/03 06:37
2021/09/03 09:51
2021/09/03 09:53
0
たぶんフォールスルーを勉強するための課題っぽいですが
どうしても switch 使うなら
java
1package kadai.pda.k.oonuki2; 2 3public class KadaiSwitch2 { 4 5 public static void main(String[] args) { 6 int x=0; 7 switch(x) { 8 case 1: p("ABCDE"); 9 break; 10 case 2: p("BCDE"); 11 break; 12 case 3: p("CDE"); 13 break; 14 case 4: p("DE"); 15 break; 16 case 5: p("E"); 17 break; 18 default : 19 System.out.println("ランクなし"); 20 } 21 22 } 23 24 public static void p(String s) { 25 String[] a = s.split(""); 26 for (int i=0; i<a.length; i++) { 27 System.out.println("ランク" + a[i] + "突破"); 28 } 29 } 30 31}
自分ならこんなかんじでにげるかな。
投稿2021/09/03 12:31
総合スコア7466
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。