1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        bool plus;
        bool minus;
        bool multiply;
        bool divide;

        private void button0_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "0";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "1";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "2";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "3";
        }

        private void button4_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "4";
        }

        private void button5_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "5";
        }

        private void button6_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "6";
        }

        private void button7_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "7";
        }

        private void button8_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "8";
        }

        private void button9_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "9";
        }

        private void buttonPlus_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                return;
            else
            {
                plus = true;
                textBox1.Text = textBox1.Text + " + ";
            }
        }

        private void buttonDivide_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                return;
            else
            {
                divide = true;
                textBox1.Text = textBox1.Text + " / ";
            }
        }

        private void buttonMinus_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                return;
            else
            {
                minus = true;
                textBox1.Text = textBox1.Text + " - ";
            }
        }

        private void buttonMultiply_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                return;
            else
            {
                multiply = true;
                textBox1.Text = textBox1.Text + " * ";
            }
        }

        private void buttonClear_Click(object sender, EventArgs e)
        {
            textBox1.Text = string.Empty;
        }

        private void buttonEquals_Click(object sender, EventArgs e)
        {
            if (plus)
            {

            }

            if (minus)
            {

            }

            if (multiply)
            {

            }

            if (divide)
            {

            }
        }


    }
}

我坚持的部分是在我按下数学按钮(+、-、/、*)之后。我只想在文本框中显示一个字符,除非我按另一个数字。

示例:现在,这就是发生的事情:87 + + + + + + +

我想要 87 + 并且我想要它,如果用户添加另一个数字,我可以添加另一个,比如 87 + 87 + 等。

另外,在添加数学逻辑时,我需要一点指导。

我正在考虑以某种方式将字符串中的任何内容存储在变量中的数学符号之前,然后对进行数学符号的数字执行相同的操作。这很好还是有更简单/不太复杂的方法来完成这个?

4

3 回答 3

3

我相信,使用状态来确定计算器的“时刻”,而不是测试字符串等,是使用计算器的好方法。让我们考虑一些状态:

  • NotInitialized:只接受数字。当给出第一个数字时,计算器转到接收
  • 接收:将连接更多数字。任何操作员都会将计算器带到NextNumber
  • NextNumber : 只接受数字。当给出第一个数字时,计算器转到接收

然后它就走了。试着弄清楚描述计算器操作的状态是什么。

于 2012-06-29T16:44:35.093 回答
0

对于 +-*\ 情况。我建议使用像 lastCharIsSymbol 这样的布尔属性。每当您单击一个数字时,将其设置为假,当您单击一个符号时,将其设置为真。然后你可以在你的符号点击事件中添加一个 if 语句来只添加符号 IF lastCharIsSymbol = false。

public Boolean lastCharIsSymbol {get;set;}

private void button9_Click(object sender, EventArgs e)
{
    textBox1.Text = textBox1.Text + "9";
    lastCharIsSymbol = false;
}

private void buttonPlus_Click(object sender, EventArgs e)
{
    if (textBox1.Text == "" || lastCharIsSymbol)
        return;
    else
    {
        plus = true;
        textBox1.Text = textBox1.Text + " + ";
        lastCharIsSymbol = true;
    }
}

如果您不想这样做,您也可以更改您的 if 语句以仅获取文本框中任何内容的子字符串并找出最后一个字符是什么。

于 2012-06-29T16:51:45.453 回答
0

虽然您可以简单地写入一个字符串,然后在用户按下 equals 时从那里解析它,但创建他们输入的内容的集合可能更有益。然后,当用户输入内容时,您可以确保他们不会将 2 个数字并排放置或 2 个运算符并排放置。例如,即使您只是在做一个简单的计算器,您也可以处理负数和多位数字。我会这样做,以便可以输入数字,并在按下操作员时,将数字和操作员提交到列表中。如果运算符是等号键,则迭代列表并执行计算。

一个例子是当前的 windows 计算器。您会注意到有 2 个文本框。一个给出当前的工作数字,而另一个给出整个方程。

这是一个例子。有更好的方法可以解决这个问题,但为了简单起见,可以为您指明正确的方向,这应该可行。

    List<object> calculatorChain = new List<object>();

    /// <summary>
    /// Handles the button press for the minus key
    /// </summary>
    /// <param name="sender">The originating object</param>
    /// <param name="e">Event arguments</param>
    private void buttonMinus_Click(object sender, EventArgs e)
    {
        CommitOperand(textBox1.Text, "-");
        textBox1.Text = string.Empty;
    }

    /// <summary>
    /// Commits the current working number to the calculator chain with a given operator
    /// </summary>
    /// <param name="operand">The current working number to add</param>
    /// <param name="operation">The operation to perform</param>
    private void CommitOperand(string operand, string operation)
    {
        if (string.IsNullOrWhiteSpace(operand) || string.IsNullOrWhiteSpace(operation))
        {
            return;
        }
        else
        {
            decimal number;
            if (decimal.TryParse(operand, out number))
            {
                calculatorChain.Add(number);
                calculatorChain.Add(operation);
            }
        }
    }
于 2012-06-29T17:02:28.150 回答