我正在为作业开发分数计算器,我可以很好地输入我的第一个分数,但是每当我点击 +、-、* 或 / 等操作按钮时,它只会将分数的值设置为 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());
}
}
我已经尝试了几乎所有我能想到的方法,但都无济于事。
如果我没记错的话,当您显示调用
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
来解决此问题。