我正在做家庭作业,在这项任务中,我获得了入门代码。我们正在处理以前做过的课程,似乎不知所措。首发代码让我感到困惑,我本人宁愿自己开始分配。我有几个问题,我想知道是否有人可以帮助我解释它,所以我可以把这个任务搞定。
我遇到的最大问题非常简单。如果你有一个计算器,你有第一个数字,那么你的第二个数字。因此,如果用户输入1 + 1,那么您基本上拥有您的数字。我们给出的代码没有firstNumber和secondNumber。相反,如果我正确理解它,它有displayValue和currentValue(?)我不完全确定这些值是如何存储的,我相信它们已经存在了?
这正是我想要找到的,然后我是否正在编写我的课程,因为我已经挂断了我输入的实际数字正在程序中存储。
以下是提供的代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Calculator
{
public partial class frmCalculator : Form
{
public frmCalculator()
{
InitializeComponent();
}
// The following fields are used to store the value that's currently
// displayed by the calculator. displayString is a string value that's
// constructed as the user clicks numeric keys and the decimal and +/-
// key. The Convert.ToDecimal method is then used to convert this to a decimal
// field that's stored in displayValue.
private string displayString;
private decimal displayValue;
// The following bool fields are used to control numeric entry.
// newValue indicates whether the calculator is ready to receive a
// new numeric value. Once the user clicks a digit button, newValue is
// set to false. When the user clicks a button that "enters" the value,
// such as Add or Equals, newValue is set to true so the user can enter
// another value.
// decimalEntered is used to restrict the entry to a single decimal point.
// It is set to true whenever newValue is set to true, and it is set to
// false whenever the user clicks the decimal point button.
private bool newValue;
private bool decimalEntered;
private Calculator calc = new Calculator();
private void Form1_Load(object sender, System.EventArgs e)
{
displayValue = 0;
displayString = displayValue.ToString();
newValue = true;
decimalEntered = false;
}
// This method handles the 0 through 9 keys, appending the digit clicked
// to the displayString field.
private void btnNumber_Click(object sender, System.EventArgs e)
{
if (newValue)
{
displayString = "";
newValue = false;
}
displayString += ((Button)sender).Tag.ToString();
displayValue = Convert.ToDecimal(displayString);
txtDisplay.Text = displayValue.ToString();
}
// This method removes the last character from the displayString field.
private void btnBackSpace_Click(object sender, System.EventArgs e)
{
if (displayString.Length > 1)
{
displayString = displayString.Substring(0, displayString.Length - 1);
displayValue = Convert.ToDecimal(displayString);
txtDisplay.Text = displayValue.ToString();
}
else
{
displayString = "";
displayValue = 0;
txtDisplay.Text = displayValue.ToString();
}
}
private void btnClear_Click(object sender, System.EventArgs e)
{
calc.Clear();
displayString = "";
displayValue = 0;
txtDisplay.Text = displayValue.ToString();
newValue = true;
decimalEntered = false;
}
// This method appends a decimal point to the displayString field if the
// user has not already entered a decimal point.
private void btnDecimal_Click(object sender, System.EventArgs e)
{
if (newValue)
{
displayString = "0";
newValue = false;
}
if (!decimalEntered)
{
displayString += ".";
displayValue = Convert.ToDecimal(displayString);
txtDisplay.Text = displayValue.ToString();
decimalEntered = true;
}
}
private void btnSign_Click(object sender, System.EventArgs e)
{
displayValue = -displayValue;
txtDisplay.Text = displayValue.ToString();
}
private void btnAdd_Click(object sender, System.EventArgs e)
{
calc.Add(displayValue);
newValue = true;
decimalEntered = false;
displayValue = calc.CurrentValue;
txtDisplay.Text = displayValue.ToString();
}
private void btnSubtract_Click(object sender, System.EventArgs e)
{
calc.Subtract(displayValue);
newValue = true;
decimalEntered = false;
displayValue = calc.CurrentValue;
txtDisplay.Text = displayValue.ToString();
}
private void btnMultiply_Click(object sender, System.EventArgs e)
{
calc.Multiply(displayValue);
newValue = true;
decimalEntered = false;
displayValue = calc.CurrentValue;
txtDisplay.Text = displayValue.ToString();
}
private void btnDivide_Click(object sender, System.EventArgs e)
{
calc.Divide(displayValue);
newValue = true;
decimalEntered = false;
displayValue = calc.CurrentValue;
txtDisplay.Text = displayValue.ToString();
}
//private void btnSqrt_Click(object sender, System.EventArgs e)
//{
// calc.SquareRoot(displayValue);
//displayValue = calc.CurrentValue;
//txtDisplay.Text = displayValue.ToString();
//}
//private void btnReciprocal_Click(object sender, System.EventArgs e)
//{
// try
// {
// calc.Reciprocal(displayValue);
// displayValue = calc.CurrentValue;
//txtDisplay.Text = displayValue.ToString();
//}
//catch (DivideByZeroException)
//{
// displayValue = 0;
// txtDisplay.Text = "Cannot divide by zero.";
//newValue = true;
//decimalEntered = false;
//}
}
private void btnEquals_Click(object sender, System.EventArgs e)
{
try
{
if (newValue)
calc.Equals();
else
calc.Equals(displayValue);
displayValue = calc.CurrentValue;
txtDisplay.Text = displayValue.ToString();
newValue = true;
decimalEntered = false;
}
catch (DivideByZeroException)
{
displayValue = 0;
txtDisplay.Text = "Cannot divide by zero.";
newValue = true;
decimalEntered = false;
}
}
}
}
然后是我班上的一个样本(以节省空间和时间,我只会做一个我的操作数)
namespace Calculator
{
public class Calculator
{
public Decimal displayValue;
public Decimal currentValue;
public Decimal firstNumber;
public Decimal secondNumber;
public decimal Add(Decimal displayValue)
{
return displayValue + currentValue;
}
然后我假设因为没有currentValue并且来自类我假设它将是引用displayValue?虽然我不确定这是否会回到用户刚刚输入的内容,或者它是否会重复出现? (如果这是有道理的......但我的意思是你可以看到我对这部分感到困惑)。
所以,是的,我只是在寻找有人解释这一点,只是让我知道我是否理解正确并朝着正确的方向前进......否则我想我已经搞砸了......
提前致谢。
答案 0 :(得分:4)
您必须将结果存储在current Value
变量中,因为稍后会在代码中使用该变量。此外,计算器方法的使用表明它们不应返回任何值。
public void Add(Decimal displayValue)
{
currentValue += display Value;
}
这样做的原因是来自btnAdd_Click
的以下行:
displayValue = calc.CurrentValue;
它希望CurrentValue
属性保持当前值。
答案 1 :(得分:1)
有问题的代码是模拟科学计算器的完整过程的一部分。
您有一个displayValue
并且您有一个currentValue
以及其他变量。
如果您考虑真实计算器的工作方式,当您输入数字时,它会显示在显示屏上。当您输入第二个数字时,它会将已存在的数字推到左侧,并将新数字固定在单个地方。因此,如果您输入1,则您有1.如果您接下来按0,现在您有10.这已经由点击方法处理,因此displayValue
始终是您按顺序键入的数字。当你点击+ - * /然后这些应该执行加,减,乘,除的缺失方法。
计算器的“显示”部分已完成,因此您可以专注于这些计算方法的工作方式。他们应该使用displayValue
并针对currentValue
执行操作,更新流程中的当前值。
答案 2 :(得分:0)
当前值和显示值的原因是因为您实际上没有第一个数字和第二个数字。在真正的计算器中,您通常可以根据需要继续添加值 - 因此按键可能会像2 + 2 = + 3 = +3 + 3 + 3之类的东西。试图存储这将是浪费,并使用第一个数字秒限制。因此,当按下操作符时,您可以告诉代码获取显示的值,并将其设置为当前值。然后,当您在操作员后按数字时,该值是显示值,并根据操作员执行计算。
因此,例如,您按
2
然后按
+
。您可以做的是取显示值 - 2 - 并将其保持为currentValue。然后你可以选择按
3
,然后
=
。它将对指定的数字 - 2 + 3执行+的动作,并给出答案 - 5。
这样做的好处是你不必停在那里。然后,您可以按
+ 5
然后
=
你会得到10的值。所以你可以在需要的时候继续这样做,而不需要大量的内存使用。
如果你想要一个计算器的完整代码,那么我不得不为一个项目做一次,所以你可以要求它,我会在这个回复中添加代码。