Простой калькулятор в C# формах с промежуточным итогом - PullRequest
0 голосов
/ 27 апреля 2020

Я изучаю в Интернете для получения общей степени, и нам поручено разработать простой калькулятор с использованием .Forms

. Мне удалось создать GUI довольно просто, но я борюсь с развитием в кодировании переменная, которая отслеживает промежуточные итоги и позволяет пользователю выполнять более одной операции.

В настоящее время мой код допускает два ввода и одну операцию. После подведения итогов, если пользователь выбирает другое число для работы, код просто отбрасывает первый ввод и повторно помещает его со вторым исходным вводом, затем берет третий ввод и заменяет второй ввод для нового вычисления.

для Например, если бы я хотел добавить 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 Ответ

0 голосов
/ 27 апреля 2020

Поскольку это задание, я ожидаю, что ваш код будет содержать намного больше комментариев, детализирующих ваш алгоритм

Я думаю, вам нужно подумать о том, как работает настоящий калькулятор. Я предполагаю, что вы делаете простую операцию, в которой любая операция может инициировать вычисление, если установлены оба операнда - после вычисления, если вы положили результат в операнд1 и неустановленный операнд2:

Представьте, что пользователь нажимает 1+2+4=

  • Установите операнд 1 на 1
  • Установите операцию на +
  • Установите операнд 2 на 2
  • Оба операнда установлены, поэтому рассчитайте, установив операнд 1 на 4 и Отмена операнда 2 и оператора
  • Установить операцию на +
  • Вычислять, потому что = нажата, но не сбрасывать операнд2 (потому что пользователь может забивать = и добавлять 4 каждый раз)

Рассмотрите возможность использования метода Calculate, который принимает логическое значение, указывающее, должен ли он сбрасывать операнд2 / оператор или нет. Вычисление всегда должно передавать результат операции в операнд1. Независимо от того, установлен оператор или нет, его следует использовать для определения того, печатает ли пользователь операнд1 или операнд2. Лично я бы покончил с вводом и конкатенацией операндов 1 и 2 напрямую. Я бы принял решение о расширении в обработчике кликов. У меня была бы специальная переменная для недавнего нажатия кнопки equals, которая будет сбрасывать все, если пользователь нажимает цифровую кнопку после нажатия кнопки equals, или сохраняет операнд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 через список, выполняя определенные операции сначала при нажатии равно

...