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

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

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

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

Q&A

解決済

2回答

5152閲覧

do〜while文の複数条件を適用させたい

nejirin_boy

総合スコア21

Java

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

0グッド

0クリップ

投稿2017/12/21 12:32

Java

1//降順にソートするプログラム 2import java.util.Arrays; 3import java.util.Comparator; 4import java.io.*; 5 6class ToDo{ 7 int number; 8 int month; 9 int day; 10 String item; 11 int priority; 12} 13 14class sort8 15{ 16 public static void main(String[] args) throws IOException 17 { 18 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 19 20 ToDo[] ToDoList = new ToDo[100]; //配列の宣言 21 22 for(int i = 0; i < 100; i++){ 23 ToDoList[i] = new ToDo(); 24 } 25 26 int num_items = 0; 27 28 while(true){ 29 System.out.println("予定を追加するなら1を入力。予定を月順で表示するなら2、優先度順で表示するなら3を入力。"); 30 31 String str = br.readLine(); 32 int num = Integer.parseInt(str); 33 34 if(num == 1){ 35 do{ 36 System.out.println("月を入力して下さい(1〜12)"); 37 38 String month = br.readLine(); 39 ToDoList[num_items].month = Integer.parseInt(month); 40 41 }while(13 <= ToDoList[num_items].month && ToDoList[num_items].month <= 0); 42 //↑1〜12以外が入力されたら再入力を求める 43 44 do{ 45 System.out.println("日を入力して下さい(1〜31)"); 46 47 String day = br.readLine(); 48 ToDoList[num_items].day = Integer.parseInt(day); 49 50 }while(32 <= ToDoList[num_items].day); 51 52 System.out.println("予定"); 53 54 String item = br.readLine(); 55 ToDoList[num_items].item = item; 56 57 58 do{ 59 System.out.println("優先度を入力して下さい(1〜5)"); 60 61 String priority = br.readLine(); 62 ToDoList[num_items].priority = Integer.parseInt(priority); 63 64 }while(6 <= ToDoList[num_items].priority); 65 66 num_items++; 67 } 68 else if(num == 2){ 69 System.out.println("予定です。(月昇順)"); 70 71 Arrays.sort(ToDoList , 0, num_items, new Comparator<ToDo>(){ 72 public int compare(ToDo todo1, ToDo todo2){ 73 if(todo1.month < todo2.month){ 74 return -1; 75 } 76 else if(todo1.month == todo2.month){ 77 if(todo1.day <= todo2.day){ 78 return -1; 79 } 80 else{ 81 return 1; 82 } 83 } 84 else{ 85 return 1; 86 } 87 }}); 88 89 for(int i = 0; i < num_items; i++){ 90 System.out.println(ToDoList[i].month + "月" + ToDoList[i].day + "日 " + ToDoList[i].item + "優先度:" + ToDoList[i].priority); // 昇順になる 91 } 92 } 93 else if(num == 3){ 94 System.out.println("予定です。(優先度昇順)"); 95 Arrays.sort(ToDoList , 0, num_items, (a, b)->a.priority - b.priority); 96 97 for(int i = 0; i < num_items; i++){ 98 System.out.println(ToDoList[i].month + "月" + ToDoList[i].day + "日 " + ToDoList[i].item + "優先度:" + ToDoList[i].priority); // 昇順になる 99 } 100 } 101 } 102 } 103}

上記のプログラムで月を入力させる時に1〜12以外の数字を入力した時に再入力を求める様にしたいのですが、うまくいきません。
改善策を教えて下さい。
よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

このような汎用静的メソッドを用意しておくと便利かもしれませんね。

Java

1static final BufferedReader br = new BufferedReader( 2 new InputStreamReader(System.in) 3); 4 5static int readInt(String message) throws IOException { 6 while(true) { 7 try { 8 System.out.print(message); 9 return Integer.parseInt(br.readLine()); 10 } catch(NumberFormatException e) {} 11 } 12}

使用イメージ

Java

1int day; 2do { 3 day = readInt("日を入力して下さい(1~31): "); 4} while(!(1 <= day && day <= 31)); 5 6System.out.println(day);
日を入力して下さい(1~31): hoge 日を入力して下さい(1~31): fuga 日を入力して下さい(1~31): 32 日を入力して下さい(1~31): -19 日を入力して下さい(1~31): 4 4

java.time.LocalDateを適宜利用した方がコードが綺麗になる気もします。
ToDoクラスが構造体然としているのもだいぶ気になります。

投稿2017/12/21 12:46

編集2017/12/21 13:29
LouiS0616

総合スコア35660

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

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

umyu

2017/12/21 13:21

readIntですが、br.readLine()でコンパイルの参照エラーになるかと。
LouiS0616

2017/12/21 13:23

ご指摘ありがとうございます。 staticフィールドにbrを持つイメージで書いてます。
umyu

2017/12/21 13:24

なるほどー。失礼しましたー。
guest

0

ベストアンサー

Java

1 }while(13 <= ToDoList[num_items].month && ToDoList[num_items].month <= 0);

判断するための条件が正しくないからです。

Java

1 } while (!(1 <= ToDoList[num_items].month && ToDoList[num_items].month <= 12));

全体的に変更したソースコードを記載します。
ご参考まで。

Java

1import java.util.List; 2import java.util.ArrayList; 3import java.util.Comparator; 4import java.io.*; 5 6class ToDo { 7 int number; 8 int month; 9 int day; 10 String item; 11 int priority; 12 13 @Override 14 public String toString() { 15 return this.month + "月" + this.day + "日 " + this.item + "優先度:" + this.priority; 16 } 17} 18 19public class Q105888 { 20 public static void main(String[] args) throws IOException { 21 try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { 22 //配列から動的配列(ArrayList)に宣言を変更。 23 List<ToDo> ToDoList = new ArrayList<>(); 24 25 while (true) { 26 System.out.println("予定を追加するなら1を入力。予定を月順で表示するなら2、優先度順で表示するなら3を入力。"); 27 28 String str = br.readLine(); 29 int num = Integer.parseInt(str); 30 switch (num) { 31 case 1: 32 ToDo todo = new ToDo(); 33 do { 34 System.out.println("月を入力して下さい(1〜12)"); 35 String month = br.readLine(); 36 todo.month = Integer.parseInt(month); 37 } while (!(1 <= todo.month && todo.month <= 12)); 38 // ↑1〜12以外が入力されたら再入力を求める 39 40 do { 41 System.out.println("日を入力して下さい(1〜31)"); 42 String day = br.readLine(); 43 todo.day = Integer.parseInt(day); 44 } while (32 <= todo.day); 45 46 System.out.println("予定"); 47 String item = br.readLine(); 48 todo.item = item; 49 50 do { 51 System.out.println("優先度を入力して下さい(1〜5)"); 52 String priority = br.readLine(); 53 todo.priority = Integer.parseInt(priority); 54 } while (6 <= todo.priority); 55 56 ToDoList.add(todo); 57 break; 58 case 2: 59 display_month_order(ToDoList); 60 break; 61 case 3: 62 display_priority_order(ToDoList); 63 break; 64 } 65 } 66 } 67 } 68 69 private static void display_month_order(List<ToDo> ToDoList) { 70 System.out.println("予定です。(月昇順)"); 71 ToDoList.sort(new Comparator<ToDo>() { 72 @Override 73 public int compare(ToDo todo1, ToDo todo2) { 74 // 標準ライブラリのInteger.compareを使用すると、compareをシンプルに記述することができます。 75 int month = Integer.compare(todo1.month, todo2.month); 76 // ガード節による入れ子条件記述の置き換え 77 if (month != 0) { 78 return month; 79 } 80 return Integer.compare(todo1.day, todo2.day); 81 } 82 }); 83 ToDoList.forEach(t -> System.out.println(t)); 84 } 85 86 private static void display_priority_order(List<ToDo> ToDoList) { 87 System.out.println("予定です。(優先度昇順)"); 88 ToDoList.sort((a, b) -> a.priority - b.priority); 89 ToDoList.forEach(t -> System.out.println(t)); 90 } 91}

投稿2017/12/21 13:34

編集2017/12/22 12:33
umyu

総合スコア5846

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

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

nejirin_boy

2017/12/24 14:27

ベストアンサーが遅くなり申し訳ございません。 回答だけでなく、改善したソースコードも記載いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問