回答編集履歴

4

② の回答を追記

2022/07/16 09:43

投稿

KOZ6.0
KOZ6.0

スコア2622

test CHANGED
@@ -1,3 +1,5 @@
1
+ **①計算後、数字を入力した際に値をクリアして入力**
2
+
1
3
  電卓のようなプログラムを作る際、状態遷移図、もしくは状態遷移表を作るといいです。
2
4
 
3
5
  「テストでバグ発見!(5)電卓プログラムに潜むバグ【出題編】」
@@ -25,4 +27,43 @@
25
27
  通常の処理は(1)~(7) になりますが、(6) で演算子ボタンが押されたら演算処理を行いますが、演算子と演算結果を保存し、状態は S2 に移ります。
26
28
  こんな感じで表を埋めてからプログラムにとりかかると迷いなくコーディング出来ると思います。
27
29
 
30
+ ### 追記
28
31
 
32
+ **②ラベルに表記される値を3桁毎に区切る**
33
+
34
+ これは意外にむずかしいです。
35
+ というのは、下手に編集しちゃうと小数点を入力したとき、1,000.0 も 1,000.00 も区別がつかなくなるからです。
36
+ 小数点以下の桁数を調べ、編集式を変えます。
37
+ メソッドを作っていちいちコールするのは面倒なので計算結果表示用のラベルを作成します。
38
+
39
+ ```C#
40
+ internal class ResultLabel : Label
41
+ {
42
+ public override string Text {
43
+ get {
44
+ return base.Text;
45
+ }
46
+ set {
47
+ if (value == null) {
48
+ value = string.Empty;
49
+ }
50
+ if (decimal.TryParse(value, out decimal decimalValue)) {
51
+ int decimalPosition = value.IndexOf('.');
52
+ if (decimalPosition == -1) {
53
+ base.Text = decimalValue.ToString("#,##0");
54
+ } else {
55
+ int decimalDigits = value.Length - decimalPosition - 1;
56
+ if (decimalDigits > 0) {
57
+ string formatString = "#,##0." + new string('0', decimalDigits);
58
+ base.Text = decimalValue.ToString(formatString);
59
+ } else {
60
+ base.Text = decimalValue.ToString("#,##0") + ".";
61
+ }
62
+ }
63
+ } else {
64
+ base.Text = value;
65
+ }
66
+ }
67
+ }
68
+ }
69
+ ```

3

ステータス修正

2022/07/16 04:05

投稿

KOZ6.0
KOZ6.0

スコア2622

test CHANGED
@@ -9,9 +9,9 @@
9
9
 
10
10
  状態(ステータス)として3つを上げていますが、市販の電卓と動きが違うので、もう一つ状態を加えるといいかなと思います。
11
11
 
12
- S1 入力待ちモード(数値1入力中
12
+ S1 数値1入力中
13
- S2 入力処理1モード(演算子入力後の入力待ち
13
+ S2 演算子入力後の入力待ち
14
- S3 入力処理2モード(数値2入力中
14
+ S3 数値2入力中
15
15
  S4 演算実行後、入力待ち
16
16
 
17
17
  (1) プログラムが起動すると、S1 になります。

2

文言修正

2022/07/16 00:29

投稿

KOZ6.0
KOZ6.0

スコア2622

test CHANGED
@@ -22,7 +22,7 @@
22
22
  (6) 「=」ボタンが押されたら、(3) で保存した演算子と数値、現在ラベルに表示されている値を使って演算を行い、演算結果をラベルに表示します。状態はS4 に移ります。
23
23
  (7) 数字ボタンが押されたら、ラベルに表示し、S1 に移ります。
24
24
 
25
- 通常の処理は(1)~(7) になりますが、(6) で演算子ボタンが押されたら演算処理を行いますが、演算子と、現在ラベルに表示されている値を保存し、状態は S2 に移ります。
25
+ 通常の処理は(1)~(7) になりますが、(6) で演算子ボタンが押されたら演算処理を行いますが、演算子と演算結果を保存し、状態は S2 に移ります。
26
26
  こんな感じで表を埋めてからプログラムにとりかかると迷いなくコーディング出来ると思います。
27
27
 
28
28
 

1

足りない処理を追加

2022/07/15 23:52

投稿

KOZ6.0
KOZ6.0

スコア2622

test CHANGED
@@ -22,7 +22,7 @@
22
22
  (6) 「=」ボタンが押されたら、(3) で保存した演算子と数値、現在ラベルに表示されている値を使って演算を行い、演算結果をラベルに表示します。状態はS4 に移ります。
23
23
  (7) 数字ボタンが押されたら、ラベルに表示し、S1 に移ります。
24
24
 
25
- 通常の処理は(1)~(7) になりますが、(6) で演算子ボタンが押されたら演算処理を行いますが、状態は S2 に移ります。
25
+ 通常の処理は(1)~(7) になりますが、(6) で演算子ボタンが押されたら演算処理を行いますが、演算子と、現在ラベルに表示されている値を保存し、状態は S2 に移ります。
26
26
  こんな感じで表を埋めてからプログラムにとりかかると迷いなくコーディング出来ると思います。
27
27
 
28
28