C# 簡易電卓アプリの計算した数値と演算子の履歴を表示したい
解決済
回答 5
投稿
- 評価
- クリップ 3
- VIEW 15K+
先週から全くの別業種から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/ツール等のバージョンなど)
より詳細な情報
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
そうです。表示させたいタイミングで
History_str += Operator;
textBox2.Text = History_str;
や、
History_str += Result;
textBox2.Text = History_str;
と入れてみてください。
ちなみに、
会社の先輩に「文字の連結を使えばいい」とヒントをいただきましたが
さっぱり分かりませんでした。
とありますが、
History_str += Operator;
これが、一番簡単な「文字の連結」です。 (+= の意味は理解できているでしょうか?)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
ひとまず「履歴」は置いておいて、今実行した計算の計算式を組み立てて、「=」ボタンを押すと同時にメッセージボックスに表示するところから始めましょう。
(蛇足)
自動で生成されたコードの名前のまま( Form1 とか)コードを書くのを直ちに止めましょう。そうすれば「 //数値のボタンを押したときの反応」のような間抜けなコメントを書かずに済みます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
using System;
using System.Collections.Generic;
namespace aaaa
{
class Program
{
static void Main(string[] args)
{
List<string> list = new List<string>() { "5", "+", "5", "*", "10" };
Console.WriteLine(string.Join("", list));
Console.ReadLine();
}
}
}
1.stringのリストを作ります。
2.入力された数字と記号をaddしていきます。(取り消された場合はRemoveAtなどで後ろから削除)
3.「=」ボタンが押されたらlistをjoinでくっつけてテキストボックスに表示。
ということではないだろうかと私は考えました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
クラス変数(string型、Input_Strと同じ感じでいいです)をもう1つ作り、
button11_Click、Form1_Click内でそれぞれ
1、クラス変数、btn.Text、OperatorをTextをくっつける処理、
2、そのクラス変数をテキストボックスに表示させる処理
を書いてあげれば良いのではないでしょうか?
例えば、
string Input_str = "";
string History_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;
//ここから追加分
History_str += btn.Text;
textBox2.Text = History_str;
}
としたら入力した数字が表示されませんか?
演算子をクリックされた場合は、btn.TextをOperatorに変更して…。
動かしていないのでやりたいことと違っていたらごめんなさい。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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;
}
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/06/07 14:13
+= は代入演算子で
a += b
↓
a = a+b
aにbを足した結果をaに代入するという捉え方ですがよろしいでしょうか?
2017/06/07 14:24
文字列の場合はどんどん後ろに連結されていっているのがわかっていただけると思います。
あとはクリアすべきタイミングがあれば、その文字列を空にしてあげればOKだと思います。
2017/06/07 15:51
{
{
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 16:08
Operator ="";までしか機能がついていないことに気づきました。
ですので
if(Operator == "=")
{
Operator ="";
History_str += Result;
textBox2.Text = History_str;
}
にしたところ私が作成したかった履歴表示機能が完成いたしました。
ありがとうございました。
2017/06/07 16:12
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 = "";だけ、ということです。
言い方が難しいのですが、伝わりますか??
2017/06/07 16:13
2017/06/07 16:16
とても助かりました!
まだ基本部分が理解できていないところがあるのでもう一度見直してみます。