繁体   English   中英

C# Forms 中的简单计算器,运行总计

[英]Simple Calculator in C# Forms with Running Total

我正在在线学习通用学位,我们的任务是使用.Forms 开发一个简单的计算器

我能够非常简单地创建 GUI,但在开发跟踪运行总数并允许用户执行多个操作的变量时遇到了困难。

目前,我的代码允许两个输入和 1 个操作。 合计后,如果用户选择另一个数字进行运算,代码只需删除第一个输入并将其替换为第二个原始输入,然后获取第三个输入并替换第二个输入以进行新的计算。

例如,如果我想加 3 + 6,我的计算器会给我 9,但是如果我然后按 + 4,而不是得到 13(3+6+4,或者更好的是 9+4)我得到 10( 6+4)

我希望有人能指出正确的方向,为运行总计创建一个变量,该变量在执行操作后跟踪总计,然后允许用户继续执行操作,而无需清除仅两个输入的结果。

谢谢

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 IT232M2_McCarver_Par1
{
    public partial class Calculator : Form
    {
        string input = string.Empty;
        string operand1 = string.Empty;
        string operand2 = string.Empty;
        char operation;
        double result = 0.0;

        public Calculator()
        {
            InitializeComponent();
        }


        private void button11_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            input += 6;
            this.lblDisplay.Text += input;
        }

        private void button10_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            input += 1;
            this.lblDisplay.Text += input; 
        }

        private void cmdZero_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            input += 0;
            this.lblDisplay.Text += input;
        }

        private void cmdTwo_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            input += 2;
            this.lblDisplay.Text += input;
        }

        private void cmdThree_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            input += 3;
            this.lblDisplay.Text += input;
        }

        private void cmdFour_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            input += 4;
            this.lblDisplay.Text += input;
        }

        private void cmdFive_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            input += 5;
            this.lblDisplay.Text += input;
        }

        private void cmdSeven_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            input += 7;
            this.lblDisplay.Text += input;
        }

        private void cmdEight_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            input += 8;
            this.lblDisplay.Text += input;
        }

        private void cmdNine_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            input += 9;
            this.lblDisplay.Text += input;
        }
        private void cmdClear_Click(object sender, EventArgs e)
        {
            this.lblDisplay.Text = "";
            this.input = string.Empty;
            this.operand1 = string.Empty;
            this.operand2 = string.Empty;

        }

        private void cmdAdd_Click(object sender, EventArgs e)
        {
            operand1 = input;
            operation = '+';
            input = string.Empty;
        }

        private void cmdSubtract_Click(object sender, EventArgs e)
        {
            operand1 = input;
            operation = '-';
            input = string.Empty;
        }

        private void cmdMultiply_Click(object sender, EventArgs e)
        {
            operand1 = input;
            operation = '*';
            input = string.Empty;
        }

        private void cmdDivide_Click(object sender, EventArgs e)
        {
            operand1 = input;
            operation = '/';
            input = string.Empty;
        }

        private void cmdEqual_Click(object sender, EventArgs e)
        {
            string runningTotal = result.ToString();

            operand2 = input;
            double num1, num2;
            double.TryParse(operand1, out num1);
            double.TryParse(operand2, out num2);

            if (operation == '+')
            {
                result = num1 + num2;
                lblDisplay.Text = result.ToString();
            }
            else if (operation == '-')
            {
                result = num1 - num2;
                lblDisplay.Text = result.ToString();
            }
            else if (operation == '*')
            {
                result = num1 * num2;
                lblDisplay.Text = result.ToString();
            }
            else if (operation == '/')
            {
                if (num2 != 0)
                {
                    result = num1 / num2;
                    lblDisplay.Text = result.ToString();
                }
                else
                {
                   lblDisplay.Text = "Cant /Zero";
                }

            }
        }




    }
}

由于这是一项作业,我希望您的代码包含更多注释,详细说明您的算法

我认为你需要考虑一个真正的计算器是如何工作的。 我假设您正在做一个简单的操作,如果设置了两个操作数,则任何操作都可以触发计算 - 如果您将结果放入操作数 1 和未设置的操作数 2,则在计算之后:

想象一下用户按下1+2+4=

  • 将操作数 1 设置为 1
  • 将操作设置为 +
  • 将操作数 2 设置为 2
  • 两个操作数都已设置,因此计算,将操作数 1 设置为 4 并取消设置操作数 2 和运算符
  • 将操作设置为 +
  • 计算是因为 = 被按下但不要取消设置操作数 2(因为用户可以敲击 = 并每次加 4)

考虑使用一个计算方法,该方法采用 Boolean 指示它是否应该取消设置操作数 2/操作符。 计算应始终将运算结果传输到操作数 1。 是否设置了操作符应该用于确定用户正在输入的是操作数 1 还是操作数 2。 就我个人而言,我会取消输入并直接连接操作数 1 和 2。 我会决定在点击处理程序中扩展哪个。 我有一个专门的变量来表示最近何时按下等号,如果用户在按下等号后按下数字按钮,它将取消设置所有内容,或者保留操作数 1 并设置新操作并插入操作数 2,如果这是用户在等号后按下的操作

我们可以在您的代码中清理其他内容。 这个片段让我困惑了一阵子:

    private void cmdEight_Click(object sender, EventArgs e)
    {
        this.lblDisplay.Text = "";
        input += 8;
        this.lblDisplay.Text += input;
    }

这将更合乎逻辑:

    private void cmdEight_Click(object sender, EventArgs e)
    {
        input += 8;
        lblDisplay.Text = input: 
    }

但实际上,如果您的按钮只有 8 作为其文本,您可以这样做:

    private void cmdAny_Click(object sender, EventArgs e)
    {
        input += (sender as Button).Text;
        lblDisplay.Text = input: 
    }

每个按钮都使用相同的处理程序


如果您正在制作一个了解乘法和除法的计算器,则在加法和减法之前完成,您将必须将所有操作数和运算符存储在一个列表中,然后 go 通过列表执行某些操作,首先按下等于

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM