Visual Studio、C#で電卓を作りたい。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひかり

Visual Studio、C#で電卓を作りたい。

#1

投稿記事 by ひかり » 7年前

以前立てたトピックを「解決済み」にしてしまったので、もう一度立てます。
申し訳ございません。
今一度、どなたかお付き合いお願いいたします。

「=」を続けて押した場合の定数計算ができません。(ソースコードをどのようにいじればいいのか…(汗)
足し算の場合は「×2」されているようで、
それ以外の引き算、掛け算、割り算の場合は答えが毎回「0」になってしまいます。
(「2 + 2 = 4」から=を続けていくと、8、16、32と続きます。
「9 × 2 = 18」から=を押すと、0になります。掛け算、割り算も同様の問題です)

C#をはじめて、1週間弱ほどの初心者です。
よろしくお願いいたします。

※数値のボタンを「btnNumber」で一纏めに、
 液晶にあたる部分をTextBoxで作り「txtDisplay」と名づけてあります。

コード:

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 Cal
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        bool isFirst = true;
        decimal 値1 = 0;

        private void btnNumber_Click(object sender, EventArgs e)
        {
            if (isFirst)
            {
                txtDisplay.Text = "";
                isFirst = false;
            }
            String text = txtDisplay.Text + ((Button)sender).Text;
            decimal d = Convert.ToDecimal(text);
            String text2 = d.ToString();
            txtDisplay.Text = text2;
        }

        //クリア。
        private void btnC_Click(object sender, EventArgs e)
        {
            演算 = 四則演算の記号.未定義;
            txtDisplay.Text = "0";
            値1 = 0;
            isFirst = true;
        }

        enum 四則演算の記号 { 未定義, ADD, SUB, MUL, DIV };
        四則演算の記号 演算 = 四則演算の記号.未定義;

        //足し算。
        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.ADD;
        }

        //引き算。
        private void btnSub_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.SUB;
        }

        //掛け算。
        private void btnMul_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.MUL;
        }

        //割り算。
        private void btnDiv_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.DIV;
        }

        //イコール。
        private void btnEqu_Click(object sender, EventArgs e)
        {
            calc();
        }

        private void calc()
        {
            decimal 値2 = Convert.ToDecimal(txtDisplay.Text);
            switch (演算)
            {
                case 四則演算の記号.ADD:
                    値1 += 値2;
                    break;
                case 四則演算の記号.SUB:
                    値1 -= 値2;
                    break;
                case 四則演算の記号.MUL:
                    値1 *= 値2;
                    break;
                case 四則演算の記号.DIV:
                    値1 /= 値2;
                    break;
                default:
                    値1 = 値2;
                    break;
            }

            txtDisplay.Text = 値1.ToString();
            isFirst = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

    }
}

だんごさん
記事: 273
登録日時: 13年前

Re: Visual Studio、C#で電卓を作りたい。

#2

投稿記事 by だんごさん » 7年前

なぜ「×2」のような挙動をするかは理解していますか?
例えば、「2 + 2 = 4」と一回目に計算したとき、txtDisplayに値は結果である「4」が入ります。この時値1には結果である4が入っています。
次に2回目の計算が実行されるとき、この値1に対し、値2、つまり今txtDisplayに表示されている「4」が足され、結果が8になります。
同じ値同士で計算されているのです。なので引き算では「4 - 4 = 0」となるし、「4 / 4 = 1」となります。
ひかり さんが書きました:「9 × 2 = 18」から=を押すと、0になります。
とありますが掛け算割り算は0にはならないかと思います。何かミスがありましたか?

コードの処理としては、
1.もし入力数値を伴う計算処理(isFirstではない)の時は入力した数値を保管しておく
2.もし「=」だけの計算処理(isFirstである)の時は値2に前回の入力値を代入する
のようになると思います。

さらに詳しく説明しますと、
1 + 2 =と入力されたとき、=が押されたときは「2」が入力されていますので、これを保管(1の処理)tmp = 2;
計算が処理されたとき、値1とtxtDisplayは結果の値なので「3」です。
次に「=」だけを押されたとき、結果「3」に前回の値「2」を足したいので、txtDisplayから値を取るのではなく先ほど保管したtmpの値(2)を代入します。(2の処理)
このとき内部では3 + 2の処理が行われますので結果は「5」になります。

以下にコードを書きます。ひとつの答えになりますが、もっといい方法があるかもしれません。

コード:

        decimal tmp;
        private void calc()
        {
            decimal 値2;
            if (isFirst)
            {
                値2 = tmp;
            }
            else
            {
                値2 = Convert.ToDecimal(txtDisplay.Text);
                tmp = 値2;
            }


            switch (演算)
            {
                case 四則演算の記号.ADD:
                    値1 += 値2;
                    break;
                case 四則演算の記号.SUB:
                    値1 -= 値2;
                    break;
                case 四則演算の記号.MUL:
                    値1 *= 値2;
                    break;
                case 四則演算の記号.DIV:
                    値1 /= 値2;
                    break;
                default:
                    値1 = 値2;
                    break;
            }

            txtDisplay.Text = 値1.ToString();     
            isFirst = true;
        }
色々と書きましたがコードは単純でしたね…。
 Dango San

かずま

Re: Visual Studio、C#で電卓を作りたい。

#3

投稿記事 by かずま » 7年前

ひかり さんが書きました:足し算の場合は「×2」されているようで、
それ以外の引き算、掛け算、割り算の場合は答えが毎回「0」になってしまいます。
(「2 + 2 = 4」から=を続けていくと、8、16、32と続きます。
「9 × 2 = 18」から=を押すと、0になります。掛け算、割り算も同様の問題です)
前にも言ったように、一文字入力されるごとに
すべての変数がどう変わるかを確認しましたか?
確認しましたか?
ひかり さんが書きました: 「=」を続けて押した場合の定数計算ができません。(ソースコードをどのようにいじればいいのか…(汗)
「decimal 値1 = 0;」の下に「decimal 値2 = 0;」を追加する。
btnC_Click() に「値2 = 0;」を追加する。
btnNumber_Click() の最後に「値2 = Convert.ToDecimal(text2);」を追加する。
calc() の「decimal 値2 = Convert.ToDecimal(txtDisplay.Text);」を削除する。

ひかり

Re: Visual Studio、C#で電卓を作りたい。

#4

投稿記事 by ひかり » 7年前

返信、ありがとうございます。

一応、一つ入力されるごとに、
どのような変化が起こっているのか確認してはいます…。

今回の問題を丁寧に教えてくださり、ありがとうございました。
とても助かりました。

ひかり

Re: Visual Studio、C#で電卓を作りたい。

#5

投稿記事 by ひかり » 7年前

引き続き、どなたかお付き合いお願いいたします…。

・小数点の表示。
・四捨五入。
・桁数制限。
以上の問題が解決できず、困っています。

現在、初期値で「0」と表示されているようにしていて、そこに1~9までのボタンを押すと
0が消え、押されたボタンに応じた数字が入力されていきます。
最初に「.」(小数点)を押すと「0.」まではいいのですが、そこから続けて数字のボタンを押すと
「0.」が消え、正数として新しく数字が入力されてしまいます。

小数点以下第12位で四捨五入したいです。
調べていて、「Round」を使うのだろうな…、とはわかりましたが、
今あるソースコードにうまく埋め込めません。

また、表示される数値を12桁で止めたいのですが、その方法がわかりません。

よろしくお願いいたします。

※数値のボタンを「btnNumber」で一纏めに、
 液晶にあたる部分をTextBoxで作り「txtDisplay」と名づけてあります。

コード:

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 Cal
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        bool isFirst = true;
        decimal 値1 = 0;

        //数字のボタンをすべてグループ化のようなことをして、“btnNumber”と名付けてある。
        private void btnNumber_Click(object sender, EventArgs e)
        {
            if (isFirst)
            {
                txtDisplay.Text = "";
                isFirst = false;
            }
            String text = txtDisplay.Text + ((Button)sender).Text;
            decimal d = Convert.ToDecimal(text);
            String text2 = d.ToString();
            txtDisplay.Text = text2;
        }

        //クリア。
        private void btnC_Click(object sender, EventArgs e)
        {
            演算 = 四則演算の記号.未定義;
            txtDisplay.Text = "0";
            値1 = 0;
            isFirst = true;
        }

        //小数点。
        private void btnDot_Click(object sender, EventArgs e)
        {
            if (txtDisplay.Text.IndexOf(".") >= 0)
            {
                return;
            }
            txtDisplay.Text = txtDisplay.Text + ".";
        }

        enum 四則演算の記号 { 未定義, ADD, SUB, MUL, DIV };
        四則演算の記号 演算 = 四則演算の記号.未定義;

        //足し算。
        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.ADD;
        }

        //引き算。
        private void btnSub_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.SUB;
        }

        //掛け算。
        private void btnMul_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.MUL;
        }

        //割り算。
        private void btnDiv_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.DIV;
        }

        //イコール。
        private void btnEqu_Click(object sender, EventArgs e)
        {
            calc();
        }

        decimal tmp;
        private void calc()
        {
            decimal 値2;
            if (isFirst)
            {
                値2 = tmp;
            }
            else
            {
                値2 = Convert.ToDecimal(txtDisplay.Text);
                tmp = 値2;
            }

            switch (演算)
            {
                case 四則演算の記号.ADD:
                    値1 += 値2;
                    break;
                case 四則演算の記号.SUB:
                    値1 -= 値2;
                    break;
                case 四則演算の記号.MUL:
                    値1 *= 値2;
                    break;
                case 四則演算の記号.DIV:
                    値1 /= 値2;
                    break;
                default:
                    値1 = 値2;
                    break;
            }

            txtDisplay.Text = 値1.ToString();
            isFirst = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

    }
}

かずま

Re: Visual Studio、C#で電卓を作りたい。

#6

投稿記事 by かずま » 7年前

ひかり さんが書きました:最初に「.」(小数点)を押すと「0.」まではいいのですが、そこから続けて数字のボタンを押すと
「0.」が消え、正数として新しく数字が入力されてしまいます。
最初に「.」を押したときのすべての変数の値は確認しているんですよね。
txtDisplay.Text = "0."、isFirst = true。

次の数字、例えば「3」を押すと「0.3」となってほしいのに、
「3」となってしまう。
btnNumber_Click() で、isFirst が true だったら、"0." を "" に
変えているんだから、「3」になるのは当然ですね。
「0.3」になってほしいのなら、isFirst が false でないといけません。

だから、tbnDot_Click() に isFirst = false; を追加するべきなんです。

なんで、こんな簡単なことが分からないのか不思議でたまりません。
人からもらったコードを意味も考えずに、ただ追加しているだけでは
ないのですか?

例えば、値2 に関する修正ですが、本当にそれでいいんですか?
「9 + 2 = c =」と入力してみてください。

かずま

Re: Visual Studio、C#で電卓を作りたい。

#7

投稿記事 by かずま » 7年前

かずま さんが書きました:だから、tbnDot_Click() に isFirst = false; を追加するべきなんです。
単純に追加するんじゃなくて、isFirst が true かどうかのチェックも必要です。

コード:

        private void btnDot_Click(object sender, EventArgs e)
        {
            if (isFirst) {
                txtDisplay.Text = "0";
                isFirst = false;
            }
            if (txtDisplay.Text.IndexOf(".") >= 0) return;
            txtDisplay.Text = txtDisplay.Text + ".";
        }

かずま

Re: Visual Studio、C#で電卓を作りたい。

#8

投稿記事 by かずま » 7年前

今のままだと、「.」を最初に入れると、小数を入力できるけど、
「3 . 1 4」と入力しようとしても、「.」が消えるような気がするので
次のようにするのはどうでしょうか?

コード:

        boo isFirst = true;
        decimal 値1 = 0;
		decimal 値2 = 0;

        private void btnNumber_Click(object sender, EventArgs e)
        {
            if (isFirst || txtDisplay.Text == "0") {
                txtDisplay.Text = "";
                isFirst = false;
            }
		    txtDisplay.Text= txtDisplay.Text + ((Button)sender).Text;
        }

		private void void calc() {
			if (!isFirst) 値2 = Convert.ToDecimal(txtDisplay.Text);

			switch (演算) {
				case ADD: 値1 += 値2; break;
				case SUB: 値1 -= 値2; break;
				case MUL: 値1 *= 値2; break;
				case DIV: 値1 /= 値2; break;
				default: 値1 = 値2; break;
			}
			txtDisplay.Text = 値1.ToString();
			isFirst = true;
		}
btnC_Click() に「値2 = 0;」を忘れずに追加しましょう。

実は、まだ「=」に関するバグがありそうなんですが、それはまた後で。

ひかり

Re: Visual Studio、C#で電卓を作りたい。

#9

投稿記事 by ひかり » 7年前

ありがとうございます。

いただいたコードはその都度、意味を調べながら使用させていただいておりますが、
それらを自由に使いこなせるほど理解が追いついていないことは事実です。
不快にさせてしまい、申し訳ございません。

こちらのプログラムの提出期限が近いため、一度実装する機能の取捨選択をしていきたいと思います。

ありがとうございます。

かずま

Re: Visual Studio、C#で電卓を作りたい。

#10

投稿記事 by かずま » 7年前

ひかり さんが書きました:不快にさせてしまい、申し訳ございません。
いいえ、不快ではありません。
面白いトピックだと楽しんでいます。

ただ、私は C# でコードを書いたことがないので、正確なことが
分からずもやもやしていました。だから、
「9 + 2 = c =1」と入力どうなるかとか、
「3 . 1 4」と入力するとどうなるか
というこちらの疑問に答えてほしかったなあ、と思います。

昨夜、ついに Visual Studio に C# をインストールしたので、
これからは、もっとちゃんとした回答が書けると思います。

ひかり

Re: Visual Studio、C#で電卓を作りたい。

#11

投稿記事 by ひかり » 7年前

わざわざVisual Studioのインストールまでしてくださって…ありがとうございます。

>ただ、私は C# でコードを書いたことがないので、正確なことが
>分からずもやもやしていました。だから、
>「9 + 2 = c =1」と入力どうなるかとか、
>「3 . 1 4」と入力するとどうなるか
>というこちらの疑問に答えてほしかったなあ、と思います。
   失礼いたしました。
   (今更ではありますが)こちらは、それぞれ「1」、「3.14」ときちんと入力されていました。

今は、桁数制限まで設定し終わり、あとは割り切れずに小数点以下に
同じ数字が並んでしまった場合の切り捨て処理ができずにいるところです。
(10桁制限をかけているので、今のままだと「E」と表示されてしまうので…)

コード:

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 Cal
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //boolでisFirstを代入。
        bool isFirst = true;
        //decimalで値1を代入。
        decimal 値1 = 0;

        private void btnNumber_Click(object sender, EventArgs e)
        {
            if (isFirst)
            {
                txtDisplay.Text = "";
                isFirst = false;
            }

            //ディスプレイの入力文字数を10桁に制限する。
            if (txtDisplay.TextLength == 10)
            {
                return;
            }

            String text = txtDisplay.Text + ((Button)sender).Text;
            //文字列を数字に。
            decimal d = Convert.ToDecimal(text);
            //数字を文字列に。(先頭の“0”が消える)
            String text2 = d.ToString();
            txtDisplay.Text = text2;
        }

        //クリア。
        private void btnC_Click(object sender, EventArgs e)
        {
            演算 = 四則演算の記号.未定義;
            txtDisplay.Text = "0";
            値1 = 0;
            isFirst = true;

            //クリアボタンが押されたとき、E表示によって発生していたボタンの無効化が解除される。
            this.btn0.Enabled = true;
            this.btn1.Enabled = true;
            this.btn2.Enabled = true;
            this.btn3.Enabled = true;
            this.btn4.Enabled = true;
            this.btn5.Enabled = true;
            this.btn6.Enabled = true;
            this.btn7.Enabled = true;
            this.btn8.Enabled = true;
            this.btn9.Enabled = true;
            this.btnAdd.Enabled = true;
            this.btnSub.Enabled = true;
            this.btnMul.Enabled = true;
            this.btnDiv.Enabled = true;
            this.btnDot.Enabled = true;
            this.btnEqu.Enabled = true;
        }

        //小数点。
        private void btnDot_Click(object sender, EventArgs e)
        {
            //四則演算の記号を押された直後の . にも対応。(0. と続くようになる)
            if (isFirst)
            {
                txtDisplay.Text = "0";
                isFirst = false;
            }
            //小数点の重複チェック。
            if (txtDisplay.Text.IndexOf(".") >= 0)
            {
                //既に小数点がある。
                return;
            }
            txtDisplay.Text = txtDisplay.Text + ".";
            isFirst = false;
        }

        //“enum”で名前を付ける。
        enum 四則演算の記号 { 未定義, ADD, SUB, MUL, DIV };
        四則演算の記号 演算 = 四則演算の記号.未定義;

        //足し算。
        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.ADD;
        }

        //引き算。
        private void btnSub_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.SUB;
        }

        //掛け算。
        private void btnMul_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.MUL;
        }

        //割り算。
        private void btnDiv_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.DIV;
        }

        //イコール。
        private void btnEqu_Click(object sender, EventArgs e)
        {
            calc();

            //計算結果が11桁以上になった場合は、“E”(エラー)表示する。(イコールを複数回続けて押した場合も、これで対応できる))
            if (txtDisplay.TextLength >= 11)
            {

                txtDisplay.Text = "E";

                //Eが表示された場合、クリア以外のボタンを無効化する。
                this.btn0.Enabled = false;
                this.btn1.Enabled = false;
                this.btn2.Enabled = false;
                this.btn3.Enabled = false;
                this.btn4.Enabled = false;
                this.btn5.Enabled = false;
                this.btn6.Enabled = false;
                this.btn7.Enabled = false;
                this.btn8.Enabled = false;
                this.btn9.Enabled = false;
                this.btnAdd.Enabled = false;
                this.btnSub.Enabled = false;
                this.btnMul.Enabled = false;
                this.btnDiv.Enabled = false;
                this.btnDot.Enabled = false;
                this.btnEqu.Enabled = false;
            }
        }

        decimal tmp;
        private void calc()
        {
            decimal 値2;
            if (isFirst)
            {
                値2 = tmp;
            }
            else
            {
                値2 = Convert.ToDecimal(txtDisplay.Text);
                tmp = 値2;
            }

            switch (演算)
            {
                case 四則演算の記号.ADD:
                    値1 += 値2;
                    break;
                case 四則演算の記号.SUB:
                    値1 -= 値2;
                    break;
                case 四則演算の記号.MUL:
                    値1 *= 値2;
                    break;
                case 四則演算の記号.DIV:
                    値1 /= 値2;
                    break;
                default:
                    値1 = 値2;
                    break;
            }

            txtDisplay.Text = 値1.ToString();
            isFirst = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //テキストボックスを使用したtxtDisplayを読み取り専用にする。
            this.txtDisplay.ReadOnly = true;
        }

    }
}

ひかり

Re: Visual Studio、C#で電卓を作りたい。

#12

投稿記事 by ひかり » 7年前

期限が本日の17時までと差し迫っていたので、桁数オーバー時の処理を
「頭から10桁目までを表示。オーバー分は『 + e 』と表示する」というものにしました。

だんごさん、かずまさん。
ありがとうございました!
おかげさまで、期限に間に合いました!

本当に、ありがとうございました!!

コード:

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 Cal
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

//boolでisFirstを代入。
bool isFirst = true;
//decimalで値1を代入。
decimal 値1 = 0;

private void btnNumber_Click(object sender, EventArgs e)
{
if (isFirst)
{
txtDisplay.Text = "";
isFirst = false;
}

//ディスプレイの入力文字数を10桁に制限する。
if (txtDisplay.TextLength == 10)
{
return;
}

String text = txtDisplay.Text + ((Button)sender).Text;
//文字列を数字に。
decimal d = Convert.ToDecimal(text);
//数字を文字列に。(先頭の“0”が消える)
String text2 = d.ToString();
txtDisplay.Text = text2;
}

//クリア。
private void btnC_Click(object sender, EventArgs e)
{
演算 = 四則演算の記号.未定義;
txtDisplay.Text = "0";
値1 = 0;
isFirst = true;

//クリアボタンが押されたとき、e表示によって発生していたボタンの無効化が解除される。
this.btn0.Enabled = true;
this.btn1.Enabled = true;
this.btn2.Enabled = true;
this.btn3.Enabled = true;
this.btn4.Enabled = true;
this.btn5.Enabled = true;
this.btn6.Enabled = true;
this.btn7.Enabled = true;
this.btn8.Enabled = true;
this.btn9.Enabled = true;
this.btnAdd.Enabled = true;
this.btnSub.Enabled = true;
this.btnMul.Enabled = true;
this.btnDiv.Enabled = true;
this.btnDot.Enabled = true;
this.btnEqu.Enabled = true;
}

//小数点。
private void btnDot_Click(object sender, EventArgs e)
{
//四則演算の記号を押された直後の . にも対応。(0. と続くようになる)
if (isFirst)
{
txtDisplay.Text = "0";
isFirst = false;
}
//小数点の重複チェック。
if (txtDisplay.Text.IndexOf(".") >= 0)
{
//既に小数点がある。
return;
}
txtDisplay.Text = txtDisplay.Text + ".";
isFirst = false;
}

//“enum”で名前を付ける。
enum 四則演算の記号 { 未定義, ADD, SUB, MUL, DIV };
四則演算の記号 演算 = 四則演算の記号.未定義;

//足し算。
private void btnAdd_Click(object sender, EventArgs e)
{
if (!isFirst) calc();
演算 = 四則演算の記号.ADD;
}

//引き算。
private void btnSub_Click(object sender, EventArgs e)
{
if (!isFirst) calc();
演算 = 四則演算の記号.SUB;
}

//掛け算。
private void btnMul_Click(object sender, EventArgs e)
{
if (!isFirst) calc();
演算 = 四則演算の記号.MUL;
}

//割り算。
private void btnDiv_Click(object sender, EventArgs e)
{
if (!isFirst) calc();
演算 = 四則演算の記号.DIV;
}

//イコール。
private void btnEqu_Click(object sender, EventArgs e)
{
calc();

//計算結果が11桁以上になった場合は、“e”(エラー)表示する。(イコールを複数回続けて押した場合も、これで対応できる)
if (txtDisplay.TextLength >= 11)
{

string s;
//int型を文字列に変換
int i = txtDisplay.TextLength;
s = i.ToString();
string A = txtDisplay.Text;
string s1 = A.Substring(0, 10);

txtDisplay.Text = s1 + "+e";

//eが表示された場合、クリア以外のボタンを無効化する。
this.btn0.Enabled = false;
this.btn1.Enabled = false;
this.btn2.Enabled = false;
this.btn3.Enabled = false;
this.btn4.Enabled = false;
this.btn5.Enabled = false;
this.btn6.Enabled = false;
this.btn7.Enabled = false;
this.btn8.Enabled = false;
this.btn9.Enabled = false;
this.btnAdd.Enabled = false;
this.btnSub.Enabled = false;
this.btnMul.Enabled = false;
this.btnDiv.Enabled = false;
this.btnDot.Enabled = false;
this.btnEqu.Enabled = false;
}
}

//イコールを複数回続けて押したときのために、もともとの数値(それまでの計算の答え)を tmp に保管しておく。
decimal tmp;
private void calc()
{
decimal 値2;
if (isFirst)
{
値2 = tmp;
}
else
{
値2 = Convert.ToDecimal(txtDisplay.Text);
tmp = 値2;
}

switch (演算)
{
case 四則演算の記号.ADD:
値1 += 値2;
break;
case 四則演算の記号.SUB:
値1 -= 値2;
break;
case 四則演算の記号.MUL:
値1 *= 値2;
break;
case 四則演算の記号.DIV:
値1 /= 値2;
break;
default:
値1 = 値2;
break;
}

txtDisplay.Text = 値1.ToString();
isFirst = true;
}

private void Form1_Load(object sender, EventArgs e)
{
//テキストボックスを使用したtxtDisplayを読み取り専用にする。
this.txtDisplay.ReadOnly = true;
}

}
}

返信

“C言語何でも質問掲示板” へ戻る