C# Taschenrechner Klasse
Erhielt ich diese Hausaufgabe, die ich habe eine harte Zeit mit. Die form wurde geschrieben und wir hatten die zum schreiben der Klasse. Derzeit, wenn ich das Programm starte meine equals-Taste scheint nicht zu funktionieren. Ich bin mir nicht sicher warum, und ich Frage mich, wenn mir jemand helfen könnte zu verstehen, was ich bin fehlt. Ich glaube, dass ich geschrieben habe, meiner Klasse richtig. In meinem Kopf, was passiert ist, ist der Rechner Aufruf des "currentValue" ich bin also ständig zu aktualisieren mit der Methode, die ich benutze in meinem Betreiber.
Bin ich in die richtige Richtung?
... Und warum nicht meine ist-gleich-Taste ruft den aktuellen Wert. Das Letzte mal lief ich das, wenn ich getippt, 9 + 3 + dann mein display bevölkern mit 12, und warten Sie für mich, um in der nächsten Nummer. So in der Theorie, warum würde nicht meine ist-gleich-Taste laden Sie die Antwort? Ich glaube, ich rufe das richtige Element, das ich noch immer meinen ersten Eintrag. Zum Beispiel, wenn ich getippt, 9 + 9 und hit = ich erhalte 9.
Hier ist der Rechner code (der Teil zur Verfügung gestellt):
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;
}
}
}
}
Hier ist meine Klasse (Der Teil, den ich schrieb):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Calculator
{
public class Calculator
{
public Decimal displayValue;
public Decimal currentValue;
public void Add(Decimal displayValue)
{
currentValue += displayValue;
}
public void Subtract(Decimal displayValue)
{
currentValue -= displayValue;
}
public void Multiply(Decimal displayValue)
{
currentValue *= displayValue;
}
public void Divide(Decimal displayValue)
{
currentValue /= displayValue;
}
public void SquareRoot(Decimal displayValue)
{
currentValue = (decimal)Math.Sqrt(Convert.ToDouble(displayValue));
}
public void Reciprocal(Decimal displayValue)
{
currentValue = 1 / displayValue;
}
public decimal Equals()
{
return currentValue;
}
public void Clear()
{
currentValue = 0;
displayValue = 0;
}
public decimal CurrentValue
{
get
{
return currentValue;
}
}
}
}
- Verwenden Sie die ol' debugger für diese.
- 'calc.Equals(displayValue); " ich sehe keine
Equal()
Methode in der Klasse enthalten ist. Sind Sie auf verwalten, um es zu kompilieren? - Sagen Sie, weitere equals-Methode? eine Rücksendung der currentValue und eine Rückkehr displayValue?
- in Ihrer Klasse code, Sie müssen nur eine Gleiche Methode. Aber in Ihrem Haupt-code, den Sie mit 'calc.Equals(displayValue)'. Von daher würde ich denke, Sie müssen eine andere Gleichwertige Methode zu nehmen, 'displayValue' parameter.
- jhyap - als ich versuchte, die code bekomme ich eine Fehlermeldung die besagt, dass der Typ oder namespace " konnte nicht gefunden werden. ist diese entfernt, weil ich die Erklärung von oben auf meine Seite? (pro dem Benutzer unter?)
- An der Haupt-code-top gibt es setzen diese: mit Taschenrechner.Taschenrechner
- mit Taschenrechner.Taschenrechner gab mir eine Fehlermeldung. es sagt mir, Taschenrechner.Rechner ist ein Typ, nicht auf einen namespace.
- wenn ich F11 durch stecken ich, wenn der Rechner lädt, dann kann ich geben Sie eine sample-Nummer und stecken wieder nicht F11 durch... irgendwelche Vorschläge? Ich weiß es ist eine blöde Frage, aber ich bin ein Anfänger in diesem.
- lassen Sie uns weiter, diese Diskussion im chat
- "In meinem Kopf, was passiert ist, ist der Rechner Aufruf des "currentValue""... Wenn Sie an der Stelle der Ereignisse in Ihrem Kurs, die Sie nutzen könnten INotifyPropertyChanged zur Aktualisierung der Form-display msdn.microsoft.com/en-us/library/...
- Du hast geschrieben ganz zu viel code hier, und deine Frage ist ungenau. Ein Satz spricht über Probleme mit der division, und die nächsten Gespräche über die Probleme mit der Multiplikation. Bitte Bearbeiten Ihre Frage zu include nur der entsprechende code und machen es klarer, was du fragst uns, helfen Sie mit, damit wir versuchen können und tun. Erwartet, dass wir waten durch Hunderte von Zeilen code, um herauszufinden, was Sie Fragen, ist ein wenig unvernünftig. Siehe SSCCE für Informationen über wie Sie dies tun. Danke.
- Ich entschuldige mich. Ich verkürzt mein code, hoffentlich nur mit relevanten Informationen. Ich wollte nicht versehentlich verlassen etwas aus.
- Ja, ja er Tat.
- Kann ich den löschen der Frage? Die Realisierung der code ist der gleiche, die Frage ist anders. Ich sehe, wie er das gleiche in dem Sinne, es ist der gleiche code. Meine Frage, die ich den anderen Tag war über meine Klasse, nicht der code. Der Grund ist der form-code gepostet wurde, war, weil ich danach gefragt.
- Nicht jetzt, weil Sie erhalten haben, Antworten auf Sie. Wenn das problem ist in der Tat anders, sollten Sie eine andere Frage und erklären, dass Sie die Buchung eine andere Frage in Bezug auf den code, und in beiden Fällen nur nach den relevanten Teil des Codes. Wenn die Fragen unterschiedlich sind, wird der relevante Teil des Codes sollte auch anders sein. (Sie können dies immer noch tun, so können die Moderatoren haben, dass Informationen, wenn Sie zu überprüfen.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Haupt-code, den Sie genannt haben, die Gleich () - Methode wie diese:
So, Sie sollten dies tun, erste
Und für Ihre 9 + 9 = 9 problem, es ist einfach, weil in Ihrem code, den Sie nur drücken Sie Ihre click-Ereignis Add_Button einmal. Machen Sie eine Pause in Ihrem
Add()
Methode. Dann versuchen Sie, dies so tun:9 --> drücken Sie Ihre Add_Button --> 9 --> drücken Sie Ihre Add_Button --> überprüfen Sie Ihre currentValue
displayValue
ist sowohl ein Klasse-Feld und eine Methode argument. Ist das deine Absicht? Sie brauchen, umthis.displayValue = ...
bei der Zuweisung an das Feld argument, um deutlich zu machen, was Sie tun. Derzeit sind Sie überschreiben die lokale Kopie des Arguments und das Feld Wert ist immer 0.Löschen Sie einfach die
decimal displayValue;
Erklärung (und von derClear()
- Funktion) und speichern Sie dann die displayValue außerhalb der Klasse in form.Calculate
Klasse war falsch und wie man es beheben.Das Hauptproblem sehe ich mit deinem code ist, dass Sie nur das hinzufügen einer Ihrer Operanden, Also z.B. 8 + 8 entspricht immer 8 zum Beispiel.Sie haben, so etwas zu tun ( im Lieferumfang enthalten Hinzufügen und reziproke Funktionen nur):
Noch nicht getestet aber das sollte funktionieren mit der form-Klasse.
Schauen wir uns die Anforderung:
"Die Ergebnisse multipication sollte die Karte nicht mehr Dezimalstellen als Ergebnis die erste Zahl als die zweite Zahl. Beispiel 55.5*89.68 = 4977.240"
Die Natürliche Vermehrung in den Grundrechenarten bedeutet, dass dies geschieht standardmäßig sowieso. ZB. du wirst niemals zu vermehren X. X X. XX und bekommen Ergebnis X. XXXXXXX... - es kann einfach nicht passieren.
Formatierung ist daher einfach, wenn Sie brauchen, um explizit das format, und formatieren Sie anschließend, wie num.ToString("#.##############") das kann für eine Weile Bündel von zahlen.
Haben Sie nicht dargelegt alle Anforderungen, die für die Teilung, so kann ich nicht kommentieren.
BTW - wenn du sagst, dass x = 1 /3 und y = z * x, dann sind Sie gehen zu bekommen eine Menge von zahlen nach dem Komma, denn x ist .333333333... um mit zu beginnen. Dies ist in der Anforderung AFAICT.