Как добавить второй аргумент(число) в программу калькулятора?

#c# #unity3d #user-interface #text #type-conversion

Вопрос:

Я работаю над небольшой программой-калькулятором в Unity. Мне нужен калькулятор только для работы с двумя числами.

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

Проблема: Вместо добавления второго числа первое число перезаписывается, если на клавиатуре нажата другая цифра.

Вот сценарий, который я создал:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Functions : MonoBehaviour
{
    // Global Variable to display text on top panel
    public Text panelText;

    // Create a number variable
    string num;
    string num1;
    string num2;
    string mOpr;
    string calNum;
    string cbutton;
    string opr;
    bool isFirstNum;

    // Start is called before the first frame update
    void Start()
    {
    }


    // A function with an int argument
    public void NumberInputOne(string num)
    {
        num1 = num;
        num2 = num;
        if (panelText.text.Length < 1)
        {
            Debug.Log(num1);
            panelText.text = num1;
            isFirstNum = false;
        }

        else if (panelText.text.Length > 1 amp;amp; panelText.text.Length < 3)
        {
            num2 = num;
            Debug.Log(num2);
            panelText.text = num1   mOpr   num2;
        }
    }

    public void OperatorInput(string opr)
    {
        mOpr = opr;
        if (panelText.text.Length > 0 amp;amp; panelText.text.Length < 2)
        {
            panelText.text = num1   mOpr;
        }
    }

    // public void NumberInputTwo(int num)
    //{
    //    ResNum2 = num;
    //    Debug.Log(ResNum2);
    //    if (panelText.text.Length > 1 amp;amp; panelText.text.Length < 3)
    //    {
    //        panelText.text = ResNum1   opr   ResNum2;
    //    }
    // }

    public void RestartCal(string cButton)
    {
        panelText.text = "";
    }
}
 

Я также добавил запись экрана, чтобы зафиксировать проблему:

Первый номер перезаписывается

У вас есть какие-нибудь предложения?

Спасибо

Ответ №1:

используйте функцию NumberInputOne, как показано ниже;

 public void NumberInputOne(string num)
{
    if (num1 is null)
    {
        Debug.Log(num1);
        panelText.text = num1;
        num1 = num
    }

    else
    {
        num2 = num;
        Debug.Log(num2);
        panelText.text = num1   mOpr   num2;
    }
}
 

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

Ответ №2:

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

Лично я бы построил калькулятор, определив простое синтаксическое дерево для представления вводимой формулы. Включая методы отображения формулы и вычисления ответа. Например;

 public interface IValue
{
    int Calculate();
    string PrintValue();
}

public class Number : IValue
{
    public int? Value;
    public void AddDigit(int digit) => Value = (Value ?? 0) * 10   digit;
    public int Calculate() => Value ?? 0;
    public string PrintValue() => Value?.ToString();
}

public abstract class BinaryOperator : IValue
{
    public IValue Left;
    public IValue Right;

    public abstract int Operation(int left, int right);
    public abstract char Operator { get; }

    public int Calculate()
    {
        var left = Left.Calculate();
        var right = Right.Calculate();
        return Operation(left, right);
    }

    public string PrintValue() => $"{Left?.PrintValue()} {Operator} {Right?.PrintValue()}";
}

public class Addition : BinaryOperator
{
    public override char Operator => ' ';
    public override int Operation(int left, int right) => left   right;
}

// TODO define other operators
 

Затем подумайте о том, как каждая кнопка должна изменять синтаксическое дерево.

 // the entire formula
public IValue Root;
// the number currently being typed
public Number Input;

public void Display() {
    panelText.text = Root.PrintValue();
}

// start / clear
public void Start(){
    Root = Input = new Number(){
        Value = 0
    };
    Display();
}

public void Plus(){
    // left as an exercise for the reader
    Display();
}

public void Digit(int digit) {
    Input.AddDigit(digit);
    Display();
}

public void Calculate() {
    // left as an exercise for the reader
    Display();
}
 

Комментарии:

1.Если вам нужны все функции калькулятора, без каких-либо усилий, вы можете использовать await CSharpScript.EvaluateAsync<int>( [user input] ) itnext.io/…

2. Да, нет, я бы всегда предпочел в значительной степени ограничить пользователя, где это возможно …. CSharpScript.EvaluateAsync это круто и все такое, пока Пользователь не станет смешным и не наберет while(true){ } :’D …. он сам виноват, конечно, но зачем вообще рисковать 😉

3. В этом случае у вас есть полный контроль над тем, что может быть введено. Самое худшее, что может случиться, должно быть /0 .