回答編集履歴
3
推測と別解(追記)
test
CHANGED
@@ -63,3 +63,55 @@
|
|
63
63
|
|
64
64
|
|
65
65
|
わかりやすい解説をあげます。[Javaでbreak文/continue文/ラベル](https://www.sw-mono.blog/entry/2019/07/21/182506)
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
###
|
70
|
+
|
71
|
+
**推測と別解(追記)**
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
試したことを読むと、`while`ブロックをどう記述するか決めかねているように思えます。そこで仕様が「数字を入力する都度、積を表示する」ものとして別の回答を追記します。数値以外なら`continue`を使ってループをやり直します。
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
```Java
|
80
|
+
|
81
|
+
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {// 入力
|
82
|
+
|
83
|
+
double product = 1;// initial value
|
84
|
+
|
85
|
+
for (String str;(str = br.readLine()) != null && !str.isEmpty();) { // 入力された値が空なら入力終了
|
86
|
+
|
87
|
+
try {
|
88
|
+
|
89
|
+
product *= Double.valueOf(str);// 受け取った値を数値(Double type)に変換して変数"product"に代入
|
90
|
+
|
91
|
+
} catch (NumberFormatException e) {// 数値以外の入力なら例外発生
|
92
|
+
|
93
|
+
System.out.println("数値を入力してください");// その例外が発生したら出力
|
94
|
+
|
95
|
+
continue;
|
96
|
+
|
97
|
+
}
|
98
|
+
|
99
|
+
str = String.format("%,.16g", product);// 積算された値をString.format methodで編集してカンマ区切り
|
100
|
+
|
101
|
+
if (str.indexOf('.') >= 0)// search index of "."
|
102
|
+
|
103
|
+
str = str.replaceAll("0*$", "").replaceAll("\.$", "");
|
104
|
+
|
105
|
+
System.out.println("入力された値の積 : " + str);
|
106
|
+
|
107
|
+
}
|
108
|
+
|
109
|
+
} catch (IOException e) {
|
110
|
+
|
111
|
+
System.out.println("入出力例外が発生しました");
|
112
|
+
|
113
|
+
}
|
114
|
+
|
115
|
+
```
|
116
|
+
|
117
|
+
これがNGなら、正しい仕様を追記してください。この問題のテストケースがありませんか?
|
2
文言修正
test
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
|
37
37
|
- `while`のループ条件は入力が`null`以外
|
38
38
|
|
39
|
-
`CTL+Z+Enter`は入力が`null`
|
39
|
+
`CTL+Z+Enter`は入力が`null`、`while`ループから抜ける。`null`以外ならループに入る
|
40
40
|
|
41
41
|
- 空文字列は`str.isEmpty()`で判定
|
42
42
|
|
@@ -50,11 +50,11 @@
|
|
50
50
|
|
51
51
|
- `break`/`continue`はラベルを指定できる
|
52
52
|
|
53
|
-
- ラベルは`while`/`for`などのネストがあるとき、内側のループから外側のループに制御を
|
53
|
+
- ラベルは`while`/`for`などのネストがあるとき、内側のループから外側のループに制御を移すときに使う
|
54
54
|
|
55
55
|
|
56
56
|
|
57
|
-
ここでは`https:`というラベルを宣言。`https:`の後
|
57
|
+
ここでは`https:`というラベルを宣言。`https:`の後の`//teratail.com/questions/251709`はコメントとみなされます。`break https;`は`https`の付くブロックを退出する。質問の回答としてラベルは必要ありません。`break;`だけで十分です。
|
58
58
|
|
59
59
|
|
60
60
|
|
1
補足説明を追加
test
CHANGED
@@ -2,30 +2,64 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
`while`と`break`、`continue`は一緒に学習しましょう。
|
5
|
+
`while`と`break`、`continue`は一緒に学習しましょう。ついでにラベルの使い方も覚えてください。
|
6
6
|
|
7
7
|
|
8
8
|
|
9
9
|
```Java
|
10
10
|
|
11
|
-
|
11
|
+
https://teratail.com/questions/251709
|
12
12
|
|
13
|
-
|
13
|
+
while ((str = br.readLine()) != null) {
|
14
14
|
|
15
|
-
|
15
|
+
if (str.isEmpty())
|
16
16
|
|
17
|
-
|
17
|
+
break https; // 入力された値が空なら入力終了
|
18
18
|
|
19
|
-
|
19
|
+
try {
|
20
20
|
|
21
|
-
|
21
|
+
product *= Double.valueOf(str); // 受け取った値を数値(Double type)に変換して変数"product"に代入
|
22
22
|
|
23
|
-
|
23
|
+
} catch (NumberFormatException e) { // 数値以外の入力なら例外発生
|
24
24
|
|
25
|
-
|
25
|
+
System.out.println("数値を入力してください"); // その例外が発生したら出力
|
26
26
|
|
27
|
-
|
27
|
+
}
|
28
28
|
|
29
|
-
|
29
|
+
}
|
30
30
|
|
31
31
|
```
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
やっていることを簡単に説明します。
|
36
|
+
|
37
|
+
- `while`のループ条件は入力が`null`以外
|
38
|
+
|
39
|
+
`CTL+Z+Enter`は入力が`null`になり`while`ループから抜ける。`null`以外ならループに入る
|
40
|
+
|
41
|
+
- 空文字列は`str.isEmpty()`で判定
|
42
|
+
|
43
|
+
空文字列ならば`break`でループを抜ける
|
44
|
+
|
45
|
+
- 空文字以外なら文字列のdouble変換を行う
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
**ラベル**
|
50
|
+
|
51
|
+
- `break`/`continue`はラベルを指定できる
|
52
|
+
|
53
|
+
- ラベルは`while`/`for`などのネストがあるとき、内側のループから外側のループに制御を戻すときに使う
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
ここでは`https:`というラベルを宣言。`https:`の後ろの`//teratail.com/questions/251709`はコメントとみなされます。`break https;`は`https`のついたブロックを退出するという意味。質問の回答としてラベルは本来必要ありません。`break;`だけで十分です。
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
**参考**
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
わかりやすい解説をあげます。[Javaでbreak文/continue文/ラベル](https://www.sw-mono.blog/entry/2019/07/21/182506)
|