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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1511閲覧

ごちゃごちゃしてるのでスッキリさせたい

bafubafu_

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/02/20 01:59

前提・実現したいこと

教科の点数を入力して、合格の場合は各教科ごとに合格、赤点の場合も各教科ごとに不合格と表示させ、合計点と平均点をだすプログラムを書きました。プログラムは正常に動くんですが、中間らへんの怒涛のif else文がすごく気になるので、もっと短縮して書く方法などがあれば教えていただきたいです。まだ始めて一週間なので文法などはここまでしか学んでいません。

該当のソースコード

java

1package rensyuu5; 2 3public class Rensyuu5 { 4 5 public static void main(String[] args) { 6 // TODO 自動生成されたメソッド・スタブ 7 8 System.out.println("今からあなたのテストについて聞きます"); 9 System.out.println("あなたの国語の点数を教えてください"); 10 11 int write1 =new java.util.Scanner(System.in).nextInt(); 12 System.out.println("次にあなたの数学の点数を教えてください"); 13 14 int write2 =new java.util.Scanner(System.in).nextInt(); 15 System.out.println("次にあなたの英語の点数を教えてください"); 16 17 int write3 =new java.util.Scanner(System.in).nextInt(); 18 System.out.println("次にあなたの理科の点数を教えてください"); 19 20 int write4 =new java.util.Scanner(System.in).nextInt(); 21 22 System.out.println("最後にあなたの社会の点数を教えてください"); 23 int write5 =new java.util.Scanner(System.in).nextInt(); 24 25 int writeborder =35; 26 27 28 if(write1>writeborder) { 29 System.out.println("国語合格"); 30 }else{ 31 System.out.println("国語不合格"); 32 } if(write2>writeborder) { 33 System.out.println("数学合格"); 34 }else{ 35 System.out.println("数学不合格"); 36 } if(write3>writeborder) { 37 System.out.println("英語合格"); 38 }else{ 39 System.out.println("英語不合格"); 40 } if(write4>writeborder) { 41 System.out.println("理科合格"); 42}else{ 43 System.out.println("理科不合格"); 44} if(write5>writeborder) { 45 System.out.println("社会合格"); 46}else{ 47System.out.println("社会不合格"); 48} 49 50 int sum =0; 51 int [] total = {write1,write2,write3,write4,write5}; 52 for(int i =0;i<total.length;i++) { 53 sum +=total[i]; 54 } 55 int avg =sum/total.length; 56 57 System.out.println("あなたの合計点は"+sum+"点で、"+"平均点は"+avg+"点です。"); 58 59 int border =180; 60 if(sum>border) { 61 System.out.println("あなたは合計が180点以上なので合格です。"); 62 }else { 63 System.out.println("あなたは180点以下なので不合格です。以後追試を行います。"); 64 } 65 } 66 67} 68

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

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

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

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

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

guest

回答2

0

ベストアンサー

最初に…

if文がごちゃごちゃしているのは分かりますが、まずインデントを合わせて欲しい
Win版しか知りませんが、EclipseならCtrl+Shift+FIntelliJ IDEAならCtrl+Alt+Lで組み込みのフォーマッタで整形してくれます。
スコープを理解し、インデントを合わせるだけでコードの印象が大分変わります。

さて本題。
1教科分のデータ考えてリスト化、それを回せば単純にif文自体が減りそうですね。
swordoneさんの意見も取り入れて書いてみました。
目についた部分を直していったらもとよりコードが増えてしまうというオチが付いてしまいましたが、まあ必要な部分だけつまみ食いしてみれば良いと思います。

動作サンプル

https://paiza.io/projects/Wa6x3TCQgWNc5sJD1Td5ng

正直今はまだ読むのがキツイと思うんですが、配列とかリスト、クラス辺りを覚えた時にもう一度見ると良いかと思います。

Java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 new Main().test(); 6 } 7 8 private void test() { 9 // 教科名、入力点数を持つデータリストを作る 10 List<ScoreData> datas = new ArrayList<>() {{ 11 add(new ScoreData("国語", 0)); 12 add(new ScoreData("数学", 0)); 13 add(new ScoreData("理科", 0)); 14 add(new ScoreData("社会", 0)); 15 add(new ScoreData("英語", 0)); 16 }}; 17 18 System.out.println("今からあなたのテストについて聞きます"); 19 20 // try文を使うと、tryを抜ける時に要closeなstream系オブジェクトをクローズしてくれる 21 // とはいえ、今回は標準入力だし要らないか…。ちゃんとデバッグしておこうという事で今回はこのままにする 22 // @see https://qiita.com/Air_Hold/items/6535b96a06ec7308fda5 23 try (Scanner scan = new Scanner(System.in)) { 24 // 点数入力 25 int datasSize = datas.size(); 26 for (int i = 0; i < datasSize; i++) { 27 ScoreData data = datas.get(i); 28 String prefix; 29 if (i == 0) { 30 prefix = ""; 31 } else if (i < datasSize - 1) { 32 prefix = "次に"; 33 } else { 34 prefix = "最後に"; 35 } 36 String msg = "あなたの" + data.subject + "の点数を教えてください"; 37 System.out.println(prefix + msg); 38 39 // 教科の点数をデータリスト内に格納している 40 data.score = scan.nextInt(); 41 } 42 }; 43 44 // 教科別合否判定(合計点も計算しておく) 45 int sum = 0; 46 for (ScoreData data : datas) { 47 sum += data.score; 48 System.out.println(data.subject + (data.score > 35 ? "合格" : "不合格")); 49 } 50 51 // 合計合否判定 52 int avg = sum / datas.size(); 53 System.out.println("あなたの合計点は" + sum + "点で、" + "平均点は" + avg + "点です。"); 54 55 int border = 180; 56 if (sum > border) { 57 System.out.println("あなたは合計が" + border + "点を超えているので合格です。"); 58 } else { 59 System.out.println("あなたは" + border + "点以下なので不合格です。以後追試を行います。"); 60 } 61 } 62 63 private class ScoreData { 64 String subject; 65 int score; 66 ScoreData(String subject, int score) { 67 this.subject = subject; 68 this.score = score; 69 } 70 } 71}

投稿2021/02/20 05:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bafubafu_

2021/02/20 06:38

細かいところまで教えて下さりありがとうございます!動作サンプル見ましたが、addやtryなどまだ分からないことが多かったので、早く勉強して使いこなせるよう頑張りたいと思います。
guest

0

java

1 if(write1>writeborder) { 2 System.out.println("国語合格"); 3 }else{ 4 System.out.println("国語不合格"); 5 }

java

1 System.out.println(write1>writeborder ? "国語合格" : "国語不合格");

他も同様に書き換えられる

投稿2021/02/20 03:20

swordone

総合スコア20669

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

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

bafubafu_

2021/02/20 06:34

凄く見やすくて分かりやすいです!これから使っていきたいと思います。 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問