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

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

ただいまの
回答率

88.33%

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

解決済

回答 5

投稿

  • 評価
  • クリップ 3
  • VIEW 15K+

tannon

score 17

先週から全くの別業種から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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+3

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

History_str += Operator;
textBox2.Text = History_str;


や、

History_str += Result;
textBox2.Text = History_str;


と入れてみてください。

ちなみに、

会社の先輩に「文字の連結を使えばいい」とヒントをいただきましたが
さっぱり分かりませんでした。

とありますが、

History_str += Operator;


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/07 16: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 = "";だけ、ということです。
    言い方が難しいのですが、伝わりますか??

    キャンセル

  • 2017/06/07 16:13

    解決されたようですね、よかったです!

    キャンセル

  • 2017/06/07 16:16

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/07 10:28

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

    キャンセル

  • 2017/06/07 10:59

    仕事としてやっていくのであれば、早急に正しい用語を覚えるべきだと思います。
    textbox2は「テキストボックス」であり「メッセージボックス」とは言いません。
    通常、「メッセージボックス」と表現される場合、MessageBoxクラスを使用して
    表示されるダイアログを指します。

    こういった用語の勘違いは打ち合わせ等での正確な意思疎通が出来なくなる要因となります。

    キャンセル

  • 2017/06/07 11:20

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

    キャンセル

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でくっつけてテキストボックスに表示。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/07 10:22

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

    キャンセル

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に変更して…。 

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/07 13:06

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

    キャンセル

  • 2017/06/07 13:18 編集

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

    ---
    History_str += Operator;
    textBox2.Text = History_str;
    ---
    や、
    ---
    History_str += Result;
    textBox2.Text = History_str;
    ---
    と入れてみてください。

    ちなみに、

    > 会社の先輩に「文字の連結を使えばいい」とヒントをいただきましたが
    さっぱり分かりませんでした。

    とありますが、
    ---
    History_str += 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%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る