C# Calculateur De Classe
On m'a donné ce devoir à la maison, que j'ai été un moment difficile avec. Le formulaire a été écrit et nous avons eu à écrire la classe. Actuellement, lorsque je lance le programme est égal à mon bouton ne semble pas fonctionner. Je ne suis pas sûr pourquoi, et je me demandais si quelqu'un pouvait m'aider à comprendre ce que je suis absent. Je crois que j'ai écrite de ma classe correctement. Dans ma tête ce qui se passe est le calculateur est l'appel de la "currentValue" donc je suis constamment mise à jour avec la méthode que j'utilise dans ma opérateurs.
Suis-je dans la bonne direction?
Et pourquoi ce n'est pas mon égal bouton d'appel de la valeur actuelle. La dernière fois que j'ai couru ce, si j'ai tapé 9 + 3 + puis mon écran permettraient d'alimenter avec 12 et de m'attendre pour entrer dans le prochain numéro. Donc, en théorie, pourquoi ne pas mon égal bouton charger la réponse? Je crois que je vais appeler l'élément correct pourtant, je continue de faire mon inscription initiale. Par exemple, si j'ai tapé 9 + 9 et hit = je reçois 9.
Ici, c'est le calculateur de code (la partie fournis):
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;
}
}
}
}
Voici ma classe (La partie que j'ai écrit):
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;
}
}
}
}
- L'utilisation de l'ol' débogueur pour cela.
- 'calc.Equals(displayValue); " je ne vois pas
Equal()
méthode dans votre classe contiennent cette. Êtes-vous réussi à le compiler? - Dites-vous une autre méthode equals? un retour de la currentValue et un retour displayValue?
- dans votre code de classe, vous n'avez qu'une Égalité de méthode. Mais dans votre code, vous aide 'calc.Equals(displayValue)'. Donc, je suppose que vous avez besoin d'un autre l'Égalité de méthode pour prendre en 'displayValue paramètre.
- jhyap - quand j'ai essayé le code que j'obtiens un message d'erreur qui dit que le type ou l'espace de noms n'a pas pu être trouvé. est-ce parce que j'ai enlevé la déclaration du haut de ma page? (par l'utilisateur ci-dessous?)
- Dans le code Principal en haut de liste mettre ceci: à l'aide de la Calculatrice.Calculatrice
- à l'aide de la Calculatrice.Calculatrice m'a donné une erreur. il me dit calculatrice.la calculatrice est un type pas un espace de noms.
- quand je F11 à travers, je me retrouve bloqué lorsque le calculateur de charges, alors je peux entrer un numéro de l'échantillon et de se coincer à nouveau pouvez pas F11 par... des suggestions? Je sais que c'est une question stupide, mais je suis un novice dans ce domaine.
- laissez-nous continuer cette discussion dans le chat
- "Dans ma tête ce qui se passe est le calculateur est l'appel de la "currentValue""... Si vous êtes au point des événements dans votre cours, vous pouvez utiliser INotifyPropertyChanged de mettre à jour l'affichage du Formulaire msdn.microsoft.com/en-us/library/...
- Vous avez posté entièrement trop de code ici, et votre question est vague. Une phrase qui parle des problèmes avec la division, et les prochaines discussions sur les problèmes liés à la multiplication. Veuillez modifier votre question à inclure uniquement le code et de le rendre plus clair ce que vous nous demandez de vous aider, afin que nous puissions essayer de le faire. Ce qui nous attend à parcourir des centaines de lignes de code pour comprendre ce que vous me demandez, c'est un peu déraisonnable. Voir SSCCE pour plus d'informations sur la façon de le faire. Merci.
- Je m'en excuse. J'ai raccourci mon code, j'espère seulement y compris les renseignements pertinents. Je ne voulais pas accidentellement laisser quoi que ce soit.
- Oui, en effet, il ne.
- Puis-je supprimer la question? Réaliser le code est le même, la question est différente. Je vois comment c'est la même chose dans le sens que c'est le même code. Ma question, j'ai demandé l'autre jour, a propos de ma classe, pas le code. La raison pour laquelle le code du formulaire a été posté est parce que j'ai demandé.
- Pas maintenant, parce que vous avez reçu de réponses. Si le problème est en effet différent, vous devez le lien de cette autre question et expliquer que vous êtes à poster une autre question concernant le code, et dans les deux cas seulement après la partie pertinente du code. Si les questions sont différentes, la partie pertinente du code, il faut être différente. (Vous pouvez toujours le faire, de sorte que les modérateurs peuvent disposer de cette information lors de l'examen.)
Vous devez vous connecter pour publier un commentaire.
Dans le code principal, vous avez appelé l'Égalité() la méthode comme ceci:
Donc, vous devriez faire de cette première
Et pour votre 9 + 9 = 9 problème, c'est simplement parce que dans votre code, vous appuyez sur votre événement click Add_Button pour une fois. Faire un point de rupture à votre
Add()
méthode. Ensuite, essayez de faire comme ceci:9 --> appuyez sur votre Add_Button --> 9 --> appuyez sur votre Add_Button --> vérifiez vos currentValue
displayValue
est à la fois un champ de classe et l'argument d'une méthode. Est que votre intention? Vous avez besoin de fairethis.displayValue = ...
lorsque vous affectez à l'argument de champ afin de le rendre clair ce que vous faites. Actuellement, vous écraser la copie locale de l'argument et la valeur du champ est toujours 0.Il suffit de supprimer le
decimal displayValue;
déclaration (et de laClear()
fonction), puis stocker le displayValue à l'extérieur de la classe dans le formulaire.Calculate
classe était incorrect, et comment le résoudre.Le principal problème que je vois avec votre code, c'est que vous êtes seulement l'ajout de l'un de vos opérandes, par exemple, 8 + 8 est toujours égale à 8 par exemple.Que vous avez à faire quelque chose comme ceci ( inclus Ajouter et réciproque des fonctions uniquement):
N'ai pas testé le code, mais cela devrait fonctionner avec la classe de formulaire.
Regardons l'exigence:
"Les résultats de la multipication devrait pas montrer plus de décimales que le résultat du premier numéro que dans le deuxième numéro. Exemple de 55,5*89.68 = 4977.240"
Le naturel de la multiplication dans l'arithmétique de base signifie que ce qui se passe par défaut de toute façon. Par exemple. vous n'allez multiplier X. X X. XX et obtenez le résultat X. XXXXXXX... - il ne peut tout simplement pas se produire.
Mise en forme est donc facile - si vous devez explicitement format format num.ToString("#.##############") ce qui permet une tout en tas de chiffres.
Vous n'avez pas décrit toutes les exigences de la Division, donc je ne peux pas commenter.
BTW - si vous dites que x = 1 /3 et y = z * x, alors vous allez obtenir beaucoup de chiffres après la virgule, parce que x est .333333333... pour commencer. C'est au sein de l'exigence AFAICT.