Problem mit Taschenrechner C#


Kamil1984

Grünschnabel
Hallo liebe Programmierer,
bin gerade am erstellen eines Taschenrechners und komme nicht mehr weiter. Er tut schon halbwegs das was er soll allerdings nur halbwegs.
Ich gebe Zahlen mit den Buttons 1-9 ein und nach klicken von hier besipielsweise Mal weist er dWert1 die Zahl der TextBox zu.

Code:
        private void buttonMal_Click(object sender, EventArgs e)
        {

            dWert1 += double.Parse(textBox1.Text);
            minus = true;
            plus = false;
            mal = false;
            geteilt = false;
            button = true;
        }
Der gleich Button löst dann folgendes aus:

Code:
        private void buttonErgebnis_Click(object sender, EventArgs e)
        {
            if (mal == true)
            {
                dWert2 =  dWert1 * (double.Parse(textBox1.Text));
                minus = false;
                dWert1 = 0;
            }

         }

Das Problem ist, dass er falsch rechnet. 5*5=25 Ist kein Problem.
Sobald aber eine dritte Zahl dazukommt als z.B. 5*5*5 kommt statt 125 nur 50 raus. Das erklär ich mir so, dass er 5+5*5 rechnet.
Habe es auch so probiert:

Code:
            dWert1 = double.Parse(textBox1.Text);
Damit erreiche ich aber nur das er immer nur 2 Zahlen mal nimmt.
Ich hab leider keine Idee mehr un bitte euch mir zu helfen sitze schon seid gestern dran smile
Ich danke im Voraus
MfG
Kamil
 

Spyke

Premium-User
Code:
dWert1 += double.Parse(textBox1.Text);
+= bedeutet du addierst den aktuellen Wert von dWert1 mit textBox1
müsste ein = sein.

Nachtrag:
Ups haste ja unten. ^^
Leg dir einfach eine weitere Summen Variable an die immer weiter gesetzt wird bis der Taschenrechen gecleart wird.

Nochn Nachtrag:
so ungefähr
Code:
dWert2 *= (double.Parse(textBox1.Text));
dWert2 ist der Summenwert und wird einfach immer weiter gesetzt
Code:
dWert2 += (double.Parse(textBox1.Text));
Code:
dWert2 -= (double.Parse(textBox1.Text));
Code:
dWert2 /= (double.Parse(textBox1.Text));
 
Zuletzt bearbeitet:

Kamil1984

Grünschnabel
Hallo, danke für die Antwort. Das ist zwar richtig was du geschrieben hast jedoch hilft mir das für mein vorhaben nicht weiter. Ich habs wie folg gelöst

Code:
        private void buttonMal_Click(object sender, EventArgs e)
        {
            ListeWert1.Add(double.Parse(textBox1.Text)) ;  
            mal = true;
            plus = false;
            minus = false;
            geteilt = false;
            button = true;
            bKomma = true;

        }


Code:
            if (mal == true)
            {
                ListeWert2.Add(double.Parse(textBox1.Text));
                for (int i = 0; i < ListeWert1.Count; i++)
                {
                    for (int y = 0; y < ListeWert2.Count; y++)
                    {
                        
                         ListeWert2[y]*= ListeWert1[i];
                         dErgebnis = ListeWert2[y];
                    }
                }
                
                mal = false;
               
            }
Klappt mit mal und plus wunderbar jedoch rechnet er mir bei geteilt und minus falsch. Eventuell weiss da einer weiter!?

Code:
                        ListeWert2[y] /= ListeWert1[i];
Danke

MfG
 

MasterDS

Erfahrenes Mitglied
Hast du im Debugger schon mal überprüft, welche Werte die beiden Variablen annehmen, bevor die Berechnung stattfindet?
 

Kamil1984

Grünschnabel
8/4=2 Klappt. Kommt nun eine dritte Zahl dazu also z.B. 8/4/3 = 1,3333 was natürlich falsch ist. Er rechnet nur 4/3 die 8 nimmt der garnicht mehr mit warum auch immer. Wie gesagt plus und mal funktionieren einwandfrei. Danke für deine Antwort, dachte ich wäre schon im falschen Forum :)
 

MasterDS

Erfahrenes Mitglied
Wofür genau benutzt du denn die ListeWert2? Das wird mir gerade nicht ganz klar. Und wieso nutzt dir eine globale Variable nichts, die die Summe aufnimmt?
 

Kamil1984

Grünschnabel
Hallo,
also ich gebe zahlen 5+5+5 das speichert er mir schön in ListeWert1. Sobald ich auf "Gleich" bzw Ergebis drücke, weisst er den letzten Wert ListeWert2 zu. Wie meinst du das mit globale Variable?
Danke
MfG
 

MasterDS

Erfahrenes Mitglied
Wenn in ListeWert2 nur ein Wert steht, dann musst du da keine ArrayList oder ähnliches verwenden, sondern einfach eine normale Double Variable.

Mit Globale Variable meine ich, dass du dir eine Variable erstellst, die immer das Ergebnis aufnimmt. Kann jetzt auf die schnelle keine Beispiel geben, da ich eigentlich nicht C# programmiere.

Du nimmst dir eine Variable. z.B. "Ergebnis".

Bei deinem Gleich-Button durchläufst du jetzt in einer Schleife alle Einträge aus ListeWert1.

Beispiel Multiplikation:

Code:
Für alle X in ListeWert1
    Ergebnis *= ListeWert1
Nächstes X

Ergebnis hält dann dein Ergebnis, welches du ausgeben kannst. Das ganze musst du natürlich in "richtigen" Quellcode übersetzen.
 

Kamil1984

Grünschnabel
Hallo,
achso das meinst du ja hab ich ja dErgebnis. Hab es jetzt so probiert wie du sagtest, rechnet halt nur die 2 letzten werte aus...Hab schon soviel probiert...muss auch sagen das ich c# erst seid ner woche mache hab ansonsten nur c++ kenntnisse
MfG
 

MasterDS

Erfahrenes Mitglied
Wieso rechnets dir nur die zwei letzten Werte aus? Wenn du alle Werte in der Liste hast und die in einer Schleife durchläufst, muss er ja alle berücksichtigen.

Wenns nicht klappt, poste am besten nochmal Code. Dann kann man dir besser helfen.
 

engelmarkus

Erfahrenes Mitglied
Das mit dem Liste durchgehen ist keine so gute Idee, glaub ich. Wenn du einfach drei globale Variablen nimmst:

Visual Basic:
Public Class Hauptfenster
     Private Ergebnis As Double         ' Hier wird das Ergebnis der Rechnung gespeichert
     Private letzteOperation As String  ' Hier die letzte Rechenoperation, die der Benutzer angeklickt hat
     Private aktuelleZahl As Double?    ' und hier die Zahl, die unmittelbar davor eingegeben worden ist
'...
End Class

Dann sollte das eigentlich genauso gehen.
Jedes Mal, wenn der Benutzer auf eine Zahl oder das Komma klickt, dann hängst du das Zeichen an den Text in der TextBox an, liest ihn ein und wandelst ihn mit "Double.Parse" in eine Zahl um, die du in aktuelleZahl speicherst.
Wenn der Benutzer dann auf eine Rechenoperation klickt, dann kannst du den Wert aus aktuelleZahl mit dem Wert aus Ergebnis addieren, usw. Den Wert schreibst du dann noch in die TextBox zurück, und schon hast dus eigentlich.
 

Kamil1984

Grünschnabel
Morgen,
meinst du das so dass er mir den Operator in die TextBox schreibtWäre jedenfalls eine Möglichkeit die ich aber nicht nehmen würde :).
Danke MfG
 

engelmarkus

Erfahrenes Mitglied
Nein, das mein ich nicht. :)
Jedes Mal, wenn der Benutzer eine Ziffer anklickt, hängst du die an die Textbox an und schreibst die komplette Zahl in die "aktuelleZahl".
Wenn er dann eine Rechenoperation anklickt, dann rechnest du zum Beispiel "ergebnis += aktuelleZahl" und leerst danach aktuelleZahl wieder. Dann gibst du "Ergebnis" noch in der TextBox oben aus und du hast einen Taschenrechner.
In 35 Zeilen kann mans schaffen, glaubs mir ;) .

Anscheinend hab ich fast nochmal dasselbe geschrieben wie oben...
 
Zuletzt bearbeitet:

Kamil1984

Grünschnabel
Ja sorry mache erst seid ner Woche C#, unter C++ war das irgendwie alles einfacher :).
Warscheinlich denk ich zu kompliziert.
Werde das jetzt mal probieren...
 

Kamil1984

Grünschnabel
hm Irgendwie will das nicht. Hab also die aktuelleZahl
Code:
 aktuelleZahl = decimal.Parse(textBox1.Text);
und klicke auf geteilt, aber was soll er denn Teilen er hat ja bis jetzt nur eine Zahl. Ergebnis steht auf 0. ergebnis/=aktuelleZahl ergbit natürlich 0.
je mehr ich daran arbeite desto verwirrtet bin ich ;)
 

engelmarkus

Erfahrenes Mitglied
Ein normaler Taschenrechner funktioniert doch so, dass du zuerst eine Zahl eingibst, dann die geteilt-Taste drückst, und dann die zweite Zahl eingibst. Wenn du jetzt auf "=" oder eine andere Rechenoperation drückst, bestimmt er erstmal das Ergebnis von der Division und nutzt das dann gleich wieder als erste Zahl für die nächste Operation.
Das heißt, du darfst erst rechnen, wenn beide Zahlen da sind...
 

engelmarkus

Erfahrenes Mitglied
Wart mal... ich hab hier einen Code, der funktioniert einwandfrei. Schau mal, ob dus verstehst, wenn nicht, dann frag :) . Ich glaub, du stehst wirklich grad auf der Leitung.

Visual Basic:
Public Class Hauptfenster
     Private Ergebnis As Double                       ' Hier wird das Ergebnis der Rechnung gespeichert
     Private letzteOperation As String             ' Hier die letzte Rechenoperation, die der Benutzer angeklickt hat
     Private aktuelleZahl As Double?               ' und hier die Zahl, die unmittelbar davor eingegeben worden ist

     Private Sub ZahlKlick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ...
          If Not aktuelleZahl.HasValue Then tbZahl.Text = ""

          tbZahl.Text += DirectCast(sender, Button).Text

          aktuelleZahl = Double.Parse(tbZahl.Text)
     End Sub

     Private Sub OperationKlick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ...
          If aktuelleZahl.HasValue Then
               Select Case letzteOperation
                    Case "+"
                         Ergebnis += aktuelleZahl
                    Case "-"
                         Ergebnis -= aktuelleZahl
                    Case "*"
                         Ergebnis *= aktuelleZahl
                    Case "/"
                         Ergebnis /= aktuelleZahl
                    Case Else
                         Ergebnis = tbZahl.Text
               End Select

               aktuelleZahl = Nothing
          End If

          tbZahl.Text = Ergebnis
          letzteOperation = DirectCast(sender, Button).Text
     End Sub
End Class
 

Neue Beiträge