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

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

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

#1

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

はじめまして。
課題で、Visual Studioで電卓を作らなければなりません。
「A + B」のような2つの計算まではできるのですが、
「A + B + C」のような3つ以上の計算ができずにいます。
どなたか、助けてください!

※数値のボタンを「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)
{
値1 = Convert.ToDecimal(txtDisplay.Text);
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 butC_Click(object sender, EventArgs e)
{
txtDisplay.Text = "0";
}

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

四則演算の記号 演算 = 四則演算の記号.未定義;

private void btnAdd_Click(object sender, EventArgs e)
{
演算 = 四則演算の記号.ADD;
isFirst = true;
}

private void btnSub_Click(object sender, EventArgs e)
{
演算 = 四則演算の記号.SUB;
isFirst = true;
}

private void btnMul_Click(object sender, EventArgs e)
{
演算 = 四則演算の記号.MUL;
isFirst = true;
}

private void btnDiv_Click(object sender, EventArgs e)
{
演算 = 四則演算の記号.DIV;
isFirst = true;
}

private void btnEqu_Click(object sender, EventArgs e)
{
decimal 値2 = Convert.ToDecimal(txtDisplay.Text);
decimal 結果 = 0;

switch (演算)
{

case 四則演算の記号.ADD:
結果 = 値1 + 値2;
break;
case 四則演算の記号.SUB:
結果 = 値1 - 値2;
break;
case 四則演算の記号.MUL:
結果 = 値1 * 値2;
break;
case 四則演算の記号.DIV:
結果 = 値1 / 値2;
break;
}

txtDisplay.Text = 結果.ToString();

}

}
}

よろしくお願いします!

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

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

#2

投稿記事 by usao » 8年前

オフトピック
(振る舞いは仕様次第ではあるでしょうが)
本物の電卓でも,Windowsにある電卓でも良いので
> 「A + B + C」のような
操作をした場合にどのように動いているかを観察してみてはいかがでしょうか.
(2回目の + を押した時点で,A+Bが計算されて,その値が2回目の+演算の左辺の値になるような動きをしませんか?)

ひかり

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

#3

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

返信、ありがとうございます。
実際の電卓を触ってみました。

現在のプログラムでは「1 + 2 + 3 = 5」となっており、
最後の数値以外は飛んでしまっています。
「A + B + C」をする際に、「A + B = AB」のAB部分を
labelなど数値の一時保管場所を作って、
そこに「C」を足せばいいのでしょうか?

また、この場合は今のプログラムをどう変えればいいのでしょうか?

よろしくお願いします。

かずま

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

#4

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

入力が 1 + 2 + 3 = の場合を考えてみましょう。
次の表で空いている変数の値を埋めてください。
現在のプログラムでどうなるかではなく、
期待する動作でどうなってほしいかです。

コード:

              txtDisplay.Text  isFirst   値1   演算
  開始した           0           true     0    未定義
  1 が入力された     1           
  + が入力された     1
  2 が入力された     2
  + が入力された     3
  3 が入力された     3
  = が入力された     6
現在のプログラムでは、2つめの + が入力されたとき
txtDisplay.Text を 3 にする処理がありません。
計算は、= が押されたときにしか実行していません。

何が悪いか分かったでしょう。
各変数もどうなってほしいかを考え、そうなるようなコードを書きましょう。
さらに変数の追加が必要かもしれません。

かずま

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

#5

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

C# は書いたことないのですが、こんな感じでどうでしょうか?

コード:

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 butC_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;
        }
        // btnSub_Click, btnMul_Click, btnDiv_Click も同様

        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;
        }
    }
}

ひかり

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

#6

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

返信が遅くなり、申し訳ありません。
少しずつ理解はできつつあるのですが…もうしばらく、お付き合いお願いいたします。

現在、足し算は問題なく機能しております。
ですが、引き算をする際に「9 - 1 - 1 = 7」まではいいのですが、
クリアボタン(btnC)を押して、新しく計算しようとすると
「9 -」と入力した時点で答えが「- 9」となってしまい、「9 - 9 = -18」と表示されます。

また、掛け算と割り算はクリアボタンを入れると、
どの数字を入れて計算しようとしても「0」と表示されてしまいます。

※液晶にあたる部分を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;

//0~9までの数字。
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)
{

}

}
}

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

かずま

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

#7

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

ソースコードの表示がおかしいのは、最初の質問で経験済みでしょう。
フォーラムルールに従って、codeタグを使用してください。
ひかり さんが書きました:現在、足し算は問題なく機能しております。
ですが、引き算をする際に「9 - 1 - 1 = 7」まではいいのですが、
クリアボタン(btnC)を押して、新しく計算しようとすると
「9 -」と入力した時点で答えが「- 9」となってしまい、「9 - 9 = -18」と表示されます。
btnC_Click() に「演算 = 四則演算の記号.未定義;」を忘れているだけでしょう。

ひかり

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

#8

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

たった今、無事完成しました!
usaoさん、かずまさん、ありがとうございました!!

かずま

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

#9

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

ひかり さんが書きました:たった今、無事完成しました!
本当に完成ですか?
= を続けて 2回以上入力した場合の動作は想定通りですか?

ひかり

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

#10

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

申し訳ありません!
実際の電卓動作と見比べてみたところ、
「=」を続けて押した場合の答えが全然違いました……。

足し算は「× 2」されていて、
引き算、掛け算、割り算は「0」となります…。

あと、先ほどの「フォーラムルール」についての指摘、
ありがとうございました。

返信

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