每当我尝试操作时,我的 C# GUI 分数计算器的值都会设置为 0/0。我做错了什么?

问题描述 投票:0回答:1

我正在为作业开发分数计算器,我可以很好地输入我的第一个分数,但是每当我点击 +、-、* 或 / 等操作按钮时,它只会将分数的值设置为 0/ 0 不保存刚刚输入的内容。

这是主体代码。

public partial class FractionForm : Form
{
    private enum OPERATION { ADD, SUB, MULT, DIV }
    private enum DISPLAY_MODE { CURRENT_VALUE, ACCUMULATOR, ERROR }
    public enum FractionValue { numerator, denominator }

    private FractionValue fractionValue = FractionValue.numerator;
    private Fraction accumulator = new Fraction();
    private OPERATION currentOperation = OPERATION.ADD;
    private Fraction currentValue = new Fraction();
    private DISPLAY_MODE displayMode = DISPLAY_MODE.CURRENT_VALUE;

    public FractionForm()
    {
        InitializeComponent();
    }

    private void UpdateDisplay()
    {
        switch (displayMode)
        {
            case DISPLAY_MODE.ACCUMULATOR:
                textBox1.Text = accumulator.ToString();
                break;

            case DISPLAY_MODE.CURRENT_VALUE:
                textBox1.Text = currentValue.ToString();
                break;

            case DISPLAY_MODE.ERROR:
                textBox1.Text = "Error";
                break;

        }
    }

    private void NumberKeyHit(int number)
    {
        displayMode = DISPLAY_MODE.CURRENT_VALUE;
        if (fractionValue == FractionValue.numerator)
        {
            currentValue.Numerator = currentValue.Numerator * 10 + number;
        }
        else
        {
            currentValue.Denominator = currentValue.Denominator * 10 + number;
        }
        UpdateDisplay();
    }

    private void OperationKeyHit(OPERATION op)
    {
        PerformOperation();
        currentOperation = op;
        UpdateDisplay();
    }

    private void PerformOperation()
    {
        displayMode = DISPLAY_MODE.ACCUMULATOR;
        switch (currentOperation)
        {
            case OPERATION.ADD:
                accumulator += currentValue;
                break;

            case OPERATION.SUB:
                accumulator -= currentValue;
                break;

            case OPERATION.MULT:
                accumulator *= currentValue;
                break;

            case OPERATION.DIV:
                if (currentValue.Denominator == 0)
                    displayMode = DISPLAY_MODE.ERROR;
                else
                    accumulator /= currentValue;
                break;
        }
        currentValue.Numerator = 0;
        currentValue.Denominator = 0;
        UpdateDisplay();
    }

    private void FractionForm_Load(object sender, EventArgs e)
    {
        UpdateDisplay();
    }

    private void button_add_Click(object sender, EventArgs e)
    {
        OperationKeyHit(OPERATION.ADD);
    }

    private void button_sub_Click(object sender, EventArgs e)
    {
        OperationKeyHit(OPERATION.SUB);
    }

    private void button_mult_Click(object sender, EventArgs e)
    {
        OperationKeyHit(OPERATION.MULT);
    }

    private void button_div_Click(object sender, EventArgs e)
    {
        OperationKeyHit(OPERATION.DIV);
    }

    private void button_C_Click(object sender, EventArgs e)
    {
        currentValue.Numerator = 0;
        currentValue.Denominator = 0;
        displayMode = DISPLAY_MODE.CURRENT_VALUE;
        UpdateDisplay();
    }

    private void button_AC_Click(object sender, EventArgs e)
    {
        currentValue.Numerator = 0;
        currentValue.Denominator = 0;
        accumulator.Numerator = 0;
        accumulator.Denominator = 0;
        displayMode = DISPLAY_MODE.CURRENT_VALUE;
        currentOperation = OPERATION.ADD;
        UpdateDisplay();

    }

    private void button_equals_Click(object sender, EventArgs e)
    {
        PerformOperation();
    }

    private void button_frac_Click(object sender, EventArgs e)
    {
        
        if (fractionValue == FractionValue.numerator)
        {
            fractionValue = FractionValue.denominator;
        }
        else
        {
            fractionValue = FractionValue.numerator;
        }
        textBox1.Text = currentValue.ToString() + "/";
        UpdateDisplay();
    }
}

这是 Fraction 类的代码

internal class Fraction
{
    public int Numerator = 0;
    public int Denominator = 0;

    public static Fraction Parse(string str)
    {
        Fraction newFrac = new Fraction();

        int indexSlash = str.IndexOf("/");
        newFrac.Numerator = int.Parse(str.Substring(0, indexSlash));
        newFrac.Denominator = int.Parse(str.Substring(indexSlash + 1));
        while (newFrac.Denominator == 0)
        {
            Console.WriteLine("\nError you cannot divide by 0!");
            newFrac.Denominator = Value("a different denominator!");
        }

        return newFrac;
    }

    public static Fraction operator +(Fraction first, Fraction second)
    {
        Fraction Sum = new Fraction();
        Sum.Numerator = first.Numerator * second.Denominator + first.Denominator * second.Numerator;
        Sum.Denominator = first.Denominator * second.Denominator;
        return Sum;
    }

    public static Fraction operator -(Fraction first, Fraction second)
    {
        Fraction Sum = new Fraction();
        Sum.Numerator = first.Numerator * second.Denominator - first.Denominator * second.Numerator;
        Sum.Denominator = first.Denominator * second.Denominator;
        return Sum;
    }

    public static Fraction operator *(Fraction first, Fraction second)
    {
        Fraction Sum = new Fraction();
        Sum.Numerator = first.Numerator * second.Numerator;
        Sum.Denominator = first.Denominator * second.Denominator;
        return Sum;
    }

    public static Fraction operator /(Fraction first, Fraction second)
    {
        Fraction Sum = new Fraction();
        Sum.Numerator = first.Numerator * second.Denominator;
        Sum.Denominator = first.Denominator * second.Numerator;
        return Sum;
    }

    override public string ToString()
    {
        return Numerator.ToString() + "/" + Denominator.ToString();
    }

    static int Value(string item)
    {
        Console.Write("Enter " + item + ": ");
        return int.Parse(Console.ReadLine());
    }
}

我已经尝试了几乎所有我能想到的方法,但都无济于事。

c# winforms calculator fractions
1个回答
0
投票

如果我没记错的话,当您显示调用

UpdateDisplay
函数的值时,它会使用
textBox1
或调用
accumulator
函数的
currentValue
字符串设置
ToString()
的文本字符串。 一切正常,但出现“0/0”的原因是来自
PerformOperation()
的以下代码:

switch (currentOperation) { ... }
currentValue.Numerator = 0;
currentValue.Denominator = 0;
UpdateDisplay();

您将

currentValue
Numerator
Denominator
设置为 0,并且当显示文本时,
ToString()
函数返回
"0" + "/" + "0"
。您可以先拨打
UpdateDisplay()
,然后重置
currentValue
来解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.