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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

3回答

3813閲覧

C#電卓の作成について:連続で計算ができるようにしたいです。

koron102

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/11/12 06:29

プログラミングを学び始めて一か月の者です。
C#で電卓を作成しています。

作り方を調べながら進めているのですが、
一度目の計算が終わってから「C」を押して履歴をクリアし
次の計算に進もうとすると、最初に打ち込んだ数字が1~9の
どの数字でも「0」の判定になってしまいます。
(1+5をしたくても0+5の計算がされてしまう)
該当のソースコードは下記になります。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 電卓 { public partial class Window : Form { public Window() { InitializeComponent(); } string Input_str = ""; //入力された数字 double Result = 0; //計算結果 string Operator = null; //押された演算子 string History_str = ""; //クラス変数を追加 private void button0to9_Click(object sender, EventArgs e) { Button btn = (Button)sender;   //senderの詳しい情報を取り扱えるようにする string text = btn.Text; //押されたボタンの数字(または小数点の記号) Input_str += text; //入力された文字に連結する textBox1.Text = Input_str; //画面上に数字を出す History_str += btn.Text; //押されたボタンの数字をテキストボックス2に表示 textBox2.Text = History_str; } private void buttonOperator_Click(object sender, EventArgs e) { double num1 = Result; double num2; //入力された文字が空欄なら計算をスキップする if (Input_str != "") { //入力した文字を数字に変換 num2 = double.Parse(Input_str); //四則演算 if (Operator == "+") { Result = num1 + num2; } if (Operator == "-") { Result = num1 - num2; } if (Operator == "*") { Result = num1 * num2; } if (Operator == "/") { Result = num1 / num2; } //演算子を押されていなかった場合、入力されている文字をそのまま結果扱いにする if (Operator == null) { Result = num2; } //画面に結果を表示する textBox1.Text = Result.ToString(); //今入力されている数字をリセットする Input_str = ""; //演算子をOperator変数に入れる Button btn = (Button)sender; Operator = btn.Text; //演算子をテキストボックス2に連結して表示 History_str += Operator; textBox2.Text = History_str; //"="の処理 if (Operator == "=") { Operator = ""; History_str = Result.ToString(); textBox2.Text = History_str; } } } private void buttonC_Click(object sender, EventArgs e) { Result = 0; Input_str = ""; textBox1.Text = "0"; History_str = ""; textBox2.Text = ""; }   } }

また、連続した計算の際、「C」を押した後に1~9の数字ではなく、
最初の数字に0を入力しようとすると、エラーが出ます。

num2 = double.Parse(Input_str); System.FormatException: '入力文字列の形式が正しくありません。'

どなたかご助言いただけたら幸いです。よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

VisualStudio2017

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

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

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

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

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

guest

回答3

0

そのエラーが出た時のInput_strの内容がどうなってるか見てみましょう
全角文字の0が入ってたりしませんか

VisualStudioを使ってるなら、任意の行の左側をクリックすると赤い印がついて、そこで実行が止めれるようになります。
その状態で、変数のところにカーソル合わせると、変数の内容が見れます。
そうやって、1行づつ実行させるということもできるんでいろいろやってみればどうでしょう

投稿2018/11/12 08:24

編集2018/11/12 08:28
y_waiwai

総合スコア87719

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

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

koron102

2018/11/15 00:05

回答いただきありがとうございました! 確認したところ、y_waiwaiさんがおっしゃっていたように、「0」が全角になっておりました。 '入力文字列の形式が正しくありません。'とはそういうことだったのですね。 勉強になりました。 ご助言ありがとうございました!!
guest

0

前者の、次の計算で最初の数字が0になる原因は、最初の計算で「=」を押した際にOperatorを空白に設定しているため、2回目の計算の演算子を押したときに「入力されている文字をそのまま結果扱いにする」処理が走らないためだと思います。OperatorフィールドはNullで初期化されているため、「=」を押した際もNullに設定するのが適切かと思います。

後者のエラーは申し訳ありませんがわかりかねます。ただこのメソッドでこの例外が出るのは、Input_strが数値の形式になっていない時だったと思うので、y_waiwaiさんがおっしゃるようにデバッグで確認してみるのが良いと思います。

投稿2018/11/14 14:02

編集2018/11/14 14:03
Gurz1019_MP

総合スコア196

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

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

0

イベントハンドラーの設定がおかしくないですか?あるいは操作の経緯とエラーのタイミングが違うのではないでしょうか?

連続した計算の際、「C」を押した後に1~9の数字ではなく、

最初の数字に0を入力しようとすると、エラーが出ます。

とのことですが、仮にCを押して、buttonC_Clickがコールされ0を押してbutton0to9_Clickがコールされるとしたら、そのタイミングでbuttonOperator_Clickはコールされないので、num2 = double.Parse(Input_str);は実行されません(さらにいえばそのとき、Input_Strはstring.Emptyのはずなので、ifの中にすら入らないはず)。

'1' → '+' → '5' → '0' → '=' → 'C' → '0' → '+' → '5' → '='のいったいどこでどういうエラーがでるか具体的にお願いします。

投稿2018/11/14 08:45

編集2018/11/14 08:46
papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問