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

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

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

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

Q&A

解決済

5回答

22804閲覧

C# 簡易電卓アプリの計算した数値と演算子の履歴を表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

3クリップ

投稿2017/06/06 12:54

先週から全くの別業種からIT業界に転職をしていましてC#の勉強を社内でしています。現在C#で簡易電卓アプリをサンプルコードを参照しながらコードを書いています。
貼ってあるURLの内容はある程度理解して作成できました。
またクリアボタンを押した際のイベントハンドラーも作成できました。
しかしタイトル通り計算した数値と演算子の履歴を表示したいのですが
どうすればいいのか分かりません。
例えば 計算内容が5 + 5 * 10 ならばtextBox2に'5+5*10'と表示される
テキストボックスを作成したいのですが上手くいきません。
またクリアボタンを押しても履歴は残るモノを作りたいです。
会社の先輩に「文字の連結を使えばいい」とヒントをいただきましたが
さっぱり分かりませんでした。
VisualStudioのWindowsフォームアプリケーションで作成しております。

どなたか解決方法を教えてください・・・
拙い文章お許しください。
リンク内容
↑参照したURLです。

###該当のソースコード
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 WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string Input_str = "";
string Operator = null;
double Result = 0;

private void button11_Click(object sender, EventArgs e) //数値のボタンを押したときの反応 { Button btn = (Button)sender; string text = btn.Text; Input_str += text; textBox1.Text = Input_str; } private void Form1_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 = ""; Button btn = (Button)sender; Operator = btn.Text; if (Operator == "=") Operator = ""; } } private void button1_Click(object sender, EventArgs e)//クリアボタンを押したとき { textBox1.Text =String.Empty; Result = 0; Input_str = ""; Operator = null; } }

}
###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答5

0

ベストアンサー

そうです。表示させたいタイミングで

C#

1History_str += Operator; 2textBox2.Text = History_str;

や、

C#

1History_str += Result; 2textBox2.Text = History_str;

と入れてみてください。

ちなみに、

会社の先輩に「文字の連結を使えばいい」とヒントをいただきましたが

さっぱり分かりませんでした。

とありますが、

C#

1History_str += Operator;

これが、一番簡単な「文字の連結」です。 (+= の意味は理解できているでしょうか?)

投稿2017/06/07 04:16

suzu_cat

総合スコア81

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

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

退会済みユーザー

退会済みユーザー

2017/06/07 05:13

表示させたいタイミングはデバックでどのように処理されているかがわからないといけませんね。 += は代入演算子で a += b ↓ a = a+b aにbを足した結果をaに代入するという捉え方ですがよろしいでしょうか?
suzu_cat

2017/06/07 05:24

合っています。数値だとまた結果は変わりますが、 文字列の場合はどんどん後ろに連結されていっているのがわかっていただけると思います。 あとはクリアすべきタイミングがあれば、その文字列を空にしてあげればOKだと思います。
退会済みユーザー

退会済みユーザー

2017/06/07 06:51

private void button15_Click(object sender, EventArgs e) { { Button btn = (Button)sender; string text = btn.Text; Input_str += text; textBox1.Text = Input_str; History_str += btn.Text; textBox2.Text = History_str; } } private void button7_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; History_str += Operator; textBox2.Text = History_str; if (Operator == "=") Operator = ""; History_str += Result; textBox2.Text = History_str; } 上記が今のコードです。 OperatorとText.btnはそれぞれ入力するたびにtextBox2に代入されます。 しかし一つ問題が。。。 それはResultです。ResultのHistroy_strを作成すると1回目の演算子(+-*/)を入力するとそこで History_str = Result; textBox2.text= History_str; が一回目の演算子入力後に処理されてしまいます。 例えばですが textBox1.textに "1","+","1","=","2"と順に入れると textBox2では 1+11=2 と表示されてしまいます。 1回目の処理で1と入れると History_str+=btn.text;には1のみ代入され 演算子(+)を入力すると History_str+=Operator; に1+と代入されます。 ここでは特に問題はありませんが History_str+= Result; に1+1と代入されてしまいます... これもタイミングが悪いのでしょうか?
退会済みユーザー

退会済みユーザー

2017/06/07 07:08

Resultですがif文に{}がついていないためif文の機能が Operator ="";までしか機能がついていないことに気づきました。 ですので if(Operator == "=") { Operator =""; History_str += Result; textBox2.Text = History_str; } にしたところ私が作成したかった履歴表示機能が完成いたしました。 ありがとうございました。
suzu_cat

2017/06/07 07:12

if (Operator == "=") Operator = ""; History_str += Result; textBox2.Text = History_str; を、 if (Operator == "=") { Operator = ""; History_str += Result; textBox2.Text = History_str; } に変えてみてください。 最初の内は、{}を省略しないほうがいいかもしれませんね。 History_str += Result; textBox2.Text = History_str; は = を押された場合にやるべき処理ですが、 +を押した場合もここを通ってしまいます。 if (Operator == "=") に対してきいているのが、Operator = "";だけ、ということです。 言い方が難しいのですが、伝わりますか??
suzu_cat

2017/06/07 07:13

解決されたようですね、よかったです!
退会済みユーザー

退会済みユーザー

2017/06/07 07:16

とても分かりやすいサンプルコードと文章ありがとうございました。 とても助かりました! まだ基本部分が理解できていないところがあるのでもう一度見直してみます。
guest

0

ひとまず「履歴」は置いておいて、今実行した計算の計算式を組み立てて、「=」ボタンを押すと同時にメッセージボックスに表示するところから始めましょう。

(蛇足)
自動で生成されたコードの名前のまま( Form1 とか)コードを書くのを直ちに止めましょう。そうすれば「 //数値のボタンを押したときの反応」のような間抜けなコメントを書かずに済みます。

投稿2017/06/06 13:11

koko_u

総合スコア936

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

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

退会済みユーザー

退会済みユーザー

2017/06/06 13:54

早速の回答ありがとうございます。 メッセージボックスとはtextBox2.textのことでしょうか? 私なりにメッセージボックスを表示するコードを書いてみたのですがどうでしょうか。 if (Operator == "=") Operator = ""; textBox2.Text = Result.ToString(); を書いたところ入力した数値がテキストボックスに表示されるようになりました。 でもこれだと=を押してないのに数値を入力して他の演算子を入力するとその数値がテキストボックスに表示されてしまいました...
koko_u

2017/06/06 14:09

では更に後退して「=」を押した時点で Hello World とメッセージボックスを出す所からかな? それができたら、固定の Hello World を止めて、ユーザーが入力した計算式を出したいですね。 それができたら、メッセージボックスに出すのを止めて、「履歴」として溜めることもできるようになりますね。 何かを参考にコードを書くのはよいとして、それを自分で思ったように変更できるようになる必要があります。
退会済みユーザー

退会済みユーザー

2017/06/07 01:28

if (Operator == "=") textBox2.Text ="Hello World"; Operator = ""; にしたところ=を押したらHello Worldとメッセージボックスに表示されました。 そのあとに if (Operator == "=") textBox2.Text Result.ToString(); Operator = ""; にしたら今度は数値が表示されました。 メッセージボックスに溜めるには配列を作成する必要があるということでしょうか? 拙い文章お許しください。
YAmaGNZ

2017/06/07 01:59

仕事としてやっていくのであれば、早急に正しい用語を覚えるべきだと思います。 textbox2は「テキストボックス」であり「メッセージボックス」とは言いません。 通常、「メッセージボックス」と表現される場合、MessageBoxクラスを使用して 表示されるダイアログを指します。 こういった用語の勘違いは打ち合わせ等での正確な意思疎通が出来なくなる要因となります。
退会済みユーザー

退会済みユーザー

2017/06/07 02:20

YAmaGNZさん コメントありがとうございます。 その通りですね。 用語を覚えないと後々困ってしまうのは目に見えてるので用語を確実に覚えます。
guest

0

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 WindowsFormsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string Input_str = ""; //入力した数値
double Result = 0; //計算結果
string Operator = null; //押された演算子
string History_str ="";

private void button15_Click(object sender, EventArgs e) { { Button btn = (Button)sender; string text = btn.Text; Input_str += text; textBox1.Text = Input_str; History_str += btn.Text; textBox2.Text = History_str; } } private void button7_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; History_str += Operator; textBox2.Text = History_str; if (Operator == "=") { Operator = ""; History_str += Result; textBox2.Text = History_str; } } private void button2_Click(object sender, EventArgs e) { Form2 f = new Form2(); f.Show(); } private void Clear_Click(object sender, EventArgs e) { textBox1.Text = String.Empty; Result = 0; Input_str = ""; Operator = null; } }

}

投稿2017/06/07 07:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

クラス変数(string型、Input_Strと同じ感じでいいです)をもう1つ作り、
button11_Click、Form1_Click内でそれぞれ
1、クラス変数、btn.Text、OperatorをTextをくっつける処理、
2、そのクラス変数をテキストボックスに表示させる処理
を書いてあげれば良いのではないでしょうか?

例えば、

C#

1string Input_str = ""; 2string History_str = ""; // クラス変数を追加 3string Operator = null; 4double Result = 0; 5 6private void button11_Click(object sender, EventArgs e) //数値のボタンを押したときの反応 7{ 8Button btn = (Button)sender; 9 10string text = btn.Text; 11Input_str += text; 12textBox1.Text = Input_str; 13 14//ここから追加分 15History_str += btn.Text; 16textBox2.Text = History_str; 17}

としたら入力した数字が表示されませんか?
演算子をクリックされた場合は、btn.TextをOperatorに変更して…。

動かしていないのでやりたいことと違っていたらごめんなさい。

投稿2017/06/07 02:55

suzu_cat

総合スコア81

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

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

退会済みユーザー

退会済みユーザー

2017/06/07 04:06

返信ありがとうございます。 上記のコードでデバックしたところ数字がtextBox2.textに表示されました。 しかしInput_strに代入された数値のみで 他にもResult,Operatorも表示しなけれならないのですがこれも上記と同じようなコードを書けばよろしいのでしょうか?
suzu_cat

2017/06/07 04:19 編集

そうです。表示させたいタイミングで --- History_str += Operator; textBox2.Text = History_str; --- や、 --- History_str += Result; textBox2.Text = History_str; --- と入れてみてください。 ちなみに、 > 会社の先輩に「文字の連結を使えばいい」とヒントをいただきましたが さっぱり分かりませんでした。 とありますが、 --- History_str += Operator; --- これが、一番簡単な「文字の連結」です。 (+= の意味は理解できているでしょうか?) コメントしようとして間違えて新しく投稿してしまいました。削除依頼済みです。
guest

0

C#

1using System; 2using System.Collections.Generic; 3 4namespace aaaa 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 List<string> list = new List<string>() { "5", "+", "5", "*", "10" }; 11 Console.WriteLine(string.Join("", list)); 12 Console.ReadLine(); 13 } 14 } 15}

1.stringのリストを作ります。
2.入力された数字と記号をaddしていきます。(取り消された場合はRemoveAtなどで後ろから削除)
3.「=」ボタンが押されたらlistをjoinでくっつけてテキストボックスに表示。

ということではないだろうかと私は考えました。

投稿2017/06/06 14:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/06/07 01:22

返信ありがとうございます。 入力した数値と演算子が配列を使って履歴を表示することができそうですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問