2017-09-04 1 views
4

Ich versuche einen einfachen Taschenrechner zu programmieren, aber ich lese und höre verschiedene Tutorials. Ich sollte der OOP-Methode folgen. Anstatt meinen gesamten Code in der Knopfklick-Methode zu haben, dachte ich, der logische Ansatz bestünde darin, alle Berechnungen in einer Form zu haben, z. add divide, percentage und die Klasse form1 übergeben die Variablenwerte an die Berechnungsklasse, in der die gesamte Logik vorkommt. Aber aus irgendeinem Grund ist Total immer gleich der Nummer, die ich zuletzt eingegeben habe und nicht die Summe von Summe + Summe. Jede Hilfe wird geschätzt.Eine Variable an eine andere Klasse übergeben, eine Berechnung durchführen und dann zurückgeben

namespace calculator 
{ 
    public partial class calculator : Form 
    { 
     public calculator() 
     { 
      InitializeComponent(); 
     } 

     private void btnInput_Click(object sender, EventArgs e) 
     { 
      Calculations calculations = new Calculations(); 
      calculations.total = Convert.ToInt32(txtPrice.Text); 

      calculations.GetPrice(); 
      displayBox.Text = Convert.ToString(calculations.total);  
     } 
    } 
} 

Berechnungen Klasse

class Calculations 
{ 
    public int total; 

    public int GetPrice() 
    { 
     total =+ total; 

     //See whats being stored in total 
     String totalCheck = Convert.ToString(total); 
     System.Windows.Forms.MessageBox.Show(totalCheck);      

     return total; 
    }   
} 
+1

Sie erstellen eine neue "Calculations" -Klasse jedes Mal, wenn auf die Schaltfläche geklickt wird. Es gibt also keine Möglichkeit, dass der vorherige Wert einbezogen wird. Nicht, dass es irgendwie wichtig wäre, weil Sie auch das 'total'-Feld jedes Mal direkt von der Benutzereingabe aus setzen, was den vorherigen Wert überschreiben würde, selbst wenn Sie eine einzelne Instanz herum behalten würden. Das Design ist sowieso nicht sehr nützlich, aber wenn Sie diesen Pfad fortsetzen möchten, sollten Sie ein Feld für die laufende Summe beibehalten und Methoden für die Operationen angeben, in denen Sie den Wert addieren, subtrahieren, teilen, multiplizieren usw . –

+0

Hallo Peter. Könntest du etwas mehr darüber erzählen, was genau du berechnen willst? Ist die von Ihnen hier angegebene Berechnungsklasse vollständig? Weil ich nicht sehen kann, warum das überhaupt kompilieren würde; Sie verwenden "calculation.totalPrice" in Ihrem Taschenrechnerformular, aber dieses Attribut existiert nicht in der gebuchten Berechnungsklasse. – rqnn

+0

Hallo, das ist der komplette Code, ich habe nur versucht, das funktioniert, bevor ich mehr Button hinzugefügt habe. Es fehlt nur noch die Verwendung von Systemanweisungen. Gesamtpreis sollte nur total sein. –

Antwort

0

ich eine Konsolenanwendung für diesen Ansatz gemacht haben. Ist einfach, es zu erreichen:

namespace Calculations 
{ 
    public class Program 
    { 
     private static List<Calculations> calcs = new List<Calculations>(); 

     public static void Main(string[] args) 
     { 
      Console.WriteLine("In this program you will put 10 different prices and a value will be returned."); 
      Console.WriteLine(); 
      for (int i = 0; i < 10; ++i) 
      { 
       Console.Write("Enter a price: "); 
       Calculations calc = new Calculations(int.Parse(Console.ReadLine())); 
       calc.GetPrice(); 
       calcs.Add(calc); //This is for example if you want to modify or re-access them 
      } 
     } 
    } 

    public class Calculations 
    { 
     private static Calculations instance; 
     private static int _total; 

     private static int total 
     { 
      get 
      { 
       return _total; 
      } 
      set 
      { 
       //The logic happens here. 
       instance.actsubtotal = value; 
       instance.acttotal = _total; 
       _total += value; //The single value will be summed to a stored absolute total. 
      } 
     } 

     //actsubtotal: Is the actual subtotal you entered. 
     //acttotal: Is the total that was stored in each case, if you enter for example: 
     //--- 30, 20, 50, you will have 3 instances, and the value of each acttotal will be: 30, 50, 100 
     public int actsubtotal, 
        acttotal; 

     public Calculations(int subtotal) 
     { 
      instance = this; //There is the magic, with this, you will tell the property where to find the last value. 
      total = subtotal; //Pass it as a single value (without summing it) 
     } 

     public void GetPrice() 
     { 
      Console.WriteLine("-------------"); 
      Console.WriteLine(); 
      Console.WriteLine("You actually entered: {0}", actsubtotal); 
      Console.WriteLine("Your current total is: {0}", total); 
      Console.WriteLine(); 
      Console.WriteLine("-------------"); 
     } 
    } 
} 

In diesem Programm können Sie einen Preis eingeben und es wird in insgesamt gespeichert sein, dass Sie später Zugriff erneut, wenn Sie wollen.

Ich weiß nicht, ob dies der bessere Weg ist, aber wie Sie sehen können, wird ein Wert in einer Zwischensumme gespeichert, die später in der Konsolenausgabe oder in Ihrem Fall in einer MessageBox geschrieben wird.

Auf diese Weise wird die Instanz von jeder Speichern rufen Sie Lage sein wird, den letzten Wert summieren Sie unter Verwendung einer Eigenschaft eingegeben.

+0

Was ist der Sinn von statischen Feldern? Dies ist eine Konsolen-App, aber die Frage betrifft Windows-Formulare. Warum müssen Sie alle Berechnungsobjekte verfolgen? – CodingYoshi

+0

Die statische Eigenschaft ist, weil es eine Summe ist. Es gibt keine individuelle Summe, die Summe ist die Summe jeder Instanz. Aus diesem Grund ist es logischer, eine statische Eigenschaft anstelle einer lokalen zu verwenden. – z3nth10n

+0

Glaubst du wirklich, dass du all diesen Code brauchst, um nur Zahlen hinzuzufügen? Das ist zu viel Engineering. – CodingYoshi

2

in GetPrice(), sollte es total += total; nicht total =+ total; sein.

danke für die Erinnerung von @Tipx.

Wegen meines schlechten Englisch, ich zitiere folgende Beschreibung auf https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/index+= und =+ zu erklären.

x + = y - Inkrement. Fügen Sie den Wert von y zum Wert von x hinzu, speichern Sie das Ergebnis in x und geben Sie den neuen Wert zurück.

+ x - gibt den Wert von x

Es gibt keinen Operator =+ ist, x =+ y bedeutet x = +y.

+1

Um zu erklären, was @cocoa geantwortet hat: + = bedeutet "füge Summe zur Summe hinzu und mache das den neuen Wert von total". Was du hast, = +, ist eigentlich "total = + total", also "setze total auf den" additiven nicht-inversen "Wert von total". – Tipx

+0

Während diese Antwort mit '+ =' übereinstimmt, macht das keinen Unterschied und die Antwort wird immer noch falsch sein. – CodingYoshi

0

Es gibt eine bessere Übung für den Unterricht, aber ich werde Ihrer Logik folgen, nur um Sie nicht zu verwirren, die ersten Dinge nie die Meldungsbox Show innerhalb einer Klasse (na ja, Sie können aber nicht eine gute Praxis sowieso nur verwendet es, um den Wert zu überprüfen, aber Übung mit Breakpoints):

public partial class calculator : Form 
{ 
    public calculator() 
    { 
     InitializeComponent(); 
    } 
     //assuming this is clicking the Add (+) Button 
    private void btnInput_Click(object sender, EventArgs e) 
    { 
     double fNum = 0.0; //initialize a variable with default value 
          //if you didn't include 0.0 you will get a "local variable" error 

     Calculations calculations = new Calculations(); 
     calculations.Total = Convert.ToInt32(txtPrice.Text); 

     fNum = calculations.GetPrice(); 

     //take Note the below code will really just return the value you have just entered in your textbox since you didn't used calculations.GetPrice(); 
     //displayBox.Text = Convert.ToString(calculations.Total); 

     //the below code will show the value you have entered added 
     //to itself since the logic from your class is just Total+=Total 
     // example I input 1. (so Total = 1) then fNum will be (Total = 1 + 1) 
     // which is 2 
     displayBox.Text = Convert.ToString(fNum); 


    } 
} 



public class Calculations 
{ 
    public int Total {get; set;} //Best practice to use CamelCase for properties inside a class 

    public int GetPrice() 
    { 
     Total += Total; 

     return Total; 
    }   
} 
+0

Dies führt zu einem falschen Ergebnis. Alles was es tut ist, dass es das Ergebnis verdoppeln und zurückgeben wird ... – CodingYoshi

+0

ja deshalb habe ich es im Kommentar angegeben. und ich fügte auch hinzu, dass ich seiner Logik folge, nur um Verwirrung zu vermeiden .. Ich brauche den Kerl nicht zu füttern. Lass ihn die Logik machen, die ich gerade gezeigt habe, was in seinem Programm schief gehen könnte –

Verwandte Themen