ERLEDIGT
JA
JA
ANTWORTEN
15
15
ZUGRIFFE
1231
1231
EMPFEHLEN
-
30.05.08 11:10 #1
- Registriert seit
- Feb 2008
- Beiträge
- 13
Hallo. Ich bin grade dabei aus übungszwecken einen Taschenrechner zu programmieren.
Ich arbeite Dialogfeldbasierend und bin bereits mit dem Design der Oberfläche fertig.
Die Knöpfe wurden mit Hilfe des Klassen-Assistenten ebenfalls implementiert.
So, nun bin ich dabei die Zahlen einfach schlicht anzeigen zu lassen und dies funktioniert nur begrenzt.
Zuerst möchte ich nur mit den Zahlen "0" und "1" arbeiten.
Sobald ich auf 1 drücke, wird mir die 1 angezeigt. Drücke ich dann auf die 0, um eine 10 aus der Zahl zu machen, wird jedoch keine 10, sondern die 0 angezeigt. Der Fehler liegt auf der hand -> die Variable wird überschrieben.
Also habe ich eine zweite Variable und eine neue Funktion, getZahl(), erstellt.
Bis jetzt sieht das so aus
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
void CTaschenrechnerDlg::getZahl(){ GetDlgItemText( IDC_ERGEBNIS, mZahl2); mZahl2 = mZahl+mZahl2; } void CTaschenrechnerDlg::OnButton0() { mZahl = "0"; SetDlgItemText( IDC_ERGEBNIS, mZahl ); getZahl(); SetDlgItemText( IDC_ERGEBNIS, mZahl2 ); } void CTaschenrechnerDlg::OnButton1() { mZahl = "1"; SetDlgItemText( IDC_ERGEBNIS, mZahl ); getZahl(); SetDlgItemText( IDC_ERGEBNIS, mZahl2 ); }
Die Idee dahinter ist, dass ich durch das drücken von "1" die 1 anzeigen lasse, dieser Wert dann in mZahl2 gespeichert wird ( durch getZahl() ) und dann mZahl2 ausgegeben wird.
Drücke ich nun die "0", wird ganz kurz die 0 ausgegeben, dann aber mit mZahl2 "addiert" und dann sofort erneut als "10" ausgegeben. Fürs menschliche Auge wäre die 0 am anfang nicht zu sehen...
Aber das funktioniert so irgendwie NICHT.
Das einzige was ich bekomme sind dann ausgaben alá "11" oder "00" nach einem einzigen Knopfdruck auf 1 oder 0.
Wie lässt sich sowas realisieren...? Wie muss der Code aussehen damit ich z.B. 5x auf die 1 drücke und mir dann schön nacheinander erst die 1, dann 11, dann 111, usw. ausgegeben wird?
Später kommt noch das Plus, Minus, ect... damit hab ich mich aber noch nicht beschäftigt... wer will kann mir dazu aber auch ein paar Tips geben...
Danke schon mal und mit freundlichen Grüßen
Stay TunedGeändert von Stay Tuned (30.05.08 um 11:15 Uhr)
-
Hallo,
du bräuchtest eigentlich gar keine spezielle Variable, da du direkt auf dem Ausgabefeld arbeiten kannst.
Das Anfügen einer neuen Ziffer kann in einer eigenen Methode erfolgen.
GrußCode cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
void CTaschenrechnerDlg::OnButton0() { AddZahl("0"); } void CTaschenrechnerDlg::OnButton1() { AddZahl("1"); } void CTaschenrechnerDlg::AddZahl(CString strZahl) { CString strAusgabe; GetDlgItemText(IDC_ERGEBNIS, strAusgabe); strAusgabe += strZahl; SetDlgItemText(IDC_ERGEBNIS, strAusgabe); }
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
30.05.08 12:51 #3
- Registriert seit
- Feb 2008
- Beiträge
- 13
Hallo.
Danke für die schnelle Antwort. Die Zahlen werden jetzt richtig angezeigt.
Allerdings macht mich die Tatsache, dass ich jetzt nur eine Variable benutze, etwas stutzig.
Komme ich denn jetzt nicht in die Bredulie wenn ich z.B. die Funktion ... OnMal erstelle?
Wie multipliziere ich denn jetzt etwas? Ich brauche doch zwei Variablen um etwas multipizieren zu können, oder nicht?
MfG Stay Tuned
-
Hallo,
bei Rechenoperationen musst du natürlich speichern, aber das brauchst du erst zu machen, wenn die Operation ausgeführt wird.
Bei einer Operationstaste (z.B. OnMal) wird die Anzeige in z.B. "Operand" gespeichert und beim späteren Gleichheitszeichen wird der aktuelle Anzeigewert mit "Operand" multipliziert und angezeigt.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
31.05.08 21:00 #5
- Registriert seit
- Feb 2008
- Beiträge
- 13
Hallo,
die Theorie ist mir bekannt. Ich denke ich weiß wie ich alles funktionieren soll... jedoch ist es mir schleierhaft wie ich das in validen Code umsetzen soll.
So habe ich keine ahnung wie OnButtonGleich ( also für das Gleichheitszechen ) das Ergebnis ausgeben soll, welches wirklich gewünscht ist.
Klar könnte ich sagen "Wert von Operand + Wert von Anzeige", was ist aber wenn subtrahiert ect. wird?
Wie erkennt man welcher Operationsmodus gewählt wurde?
Der Windows Taschenrechner kennt sogar das Ergebnis wenn mehrere Zahlen und Operationen benutzt werden... ( z.B. 5 + 5 * 6 / 2 )
Vielleicht will ich für einen Anfänger etwas hoch hinaus, aber so schwer kanns nun doch auch nicht sein...
Grüße, Stay Tuned
-
01.06.08 12:04 #6
- Registriert seit
- Jun 2005
- Ort
- Bad Arolsen (Hessen)
- Beiträge
- 556
Hallo,
dazu brauchst du nur ein Flag für jede Rechenoperation. Wenn du die erste Zahl eingibst, wird sie in einer Puffervariablen gespeichert. Wenn du dann z.B. die Multiplikationstaste drückst, speicherst du die Zahl in Variable 1, setzt das Flag für Multiplikation auf TRUE und löschst die Puffervariable. Dort kann jetzt die zweite Zahl aufbereitet werden. Wenn du jetzt die Ergebnistaste drückst, speicherst du diese Zahl in Variable zwei, prüfst, welches Flag gesetzt ist und führst dann die entsprechende Operation aus. Danach das Flag wieder auf FALSE setzen und dein Taschenrechner ist bereit für die nächste Berechnung.
Mfg
langer
-
01.06.08 23:19 #7
- Registriert seit
- Feb 2008
- Beiträge
- 13
Hallo!
Ah, alles klar. Danke!
Aber warum funktioniert das lösches des Speichers nicht so wie ich es möchte?
delete XYZ... was muss ich löschen? Wie heist die Puffervariable? ist das mein strAusgabe? Wenn ja, klappt das irgendwie nicht.
error C2665: 'delete' : Durch keine der 3 Ueberladungen kann Parameter 1 vom Typ 'const char *' konvertiert werden
MfG,
Stay Tuned
-
02.06.08 10:02 #8
- Registriert seit
- Jun 2005
- Ort
- Bad Arolsen (Hessen)
- Beiträge
- 556
Hi, du mußt nicht die Variable als Speicher freigeben, sondern auf 0 setzen. Und mit Puffervariable meine ich eine Variable, in die du deine Eingabe speicherst, z.B. CString P. Dann hast du noch zwei Variable double A und double B, in die du die erste und zweite eingegebene Zahl speicherst, da der String ja konvertiert werden muß.
Wenn du weitergehende Hilfr brauchst, poste mal den Code, wo es hakt.
Mfg
langer
-
Ich denke, du solltest dir (unabhängig davon, wie das dann als Code aussieht) mal Gedanken über den grundsätzlichen Ablauf machen, also etwa wann welche Daten gespeichert werden müssen, damit du bei einer anstehenden Berechnung alles zur Verfügung hast. Dazu kommen auch solche Spezialitäten, dass bei der nächsten Zifferntaste nach einer Operationstaste in der Anzeige eine neue Zahl geschrieben werden muss oder auch die Regel "Punktrechnung vor Strichrechnung" bei mehreren Operanden.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
02.06.08 13:05 #10
- Registriert seit
- Feb 2008
- Beiträge
- 13
Hallo,
Dies sind die drei grundlegenen Codeblöcke die ich bis jetzt habe.
Code :1 2 3 4 5
void CTaschenrechnerDlg::AddZahl(CString strZahl){ strAusgabe += strZahl; SetDlgItemText(IDC_ERGEBNIS, strAusgabe); }Code :1 2 3 4 5 6 7 8
void CTaschenrechnerDlg::OnButtonPlus() { GetDlgItemText(IDC_ERGEBNIS, addieren); strAusgabe = "0"; PlusFlag = TRUE; }Code :1 2 3 4 5 6 7 8 9 10 11 12 13
void CTaschenrechnerDlg::OnButtonGleich() { if( PlusFlag = TRUE ){ GetDlgItemText(IDC_ERGEBNIS, addieren2); addieren + addieren2 = strAusgabe; SetDlgItemText(IDC_ERGEBNIS, strAusgabe); PlusFlag = FALSE; } }
Also es geht schon mal das nach dem drücken des Operanden "+" die Zahlen wieder bei 0 beginnen und ich eine zweite Variable eingeben kann.
Jedoch wird bei mir nichts addiert und die Zweite Variable fängt bei mir immer mit "0" an ( z.B.: 011 anstatt 11 )
Ich habe bis jetzt in meinen alten Programmen ja, wenn überhaupt, nur zwei Integer Variablen miteinander addiert ect... mit Strings zu arbeiten ist für mich in diesem Stil komplettes Neuland.
Und meinen Lehrer kann ich in der Hinsicht nur bedingt ansprechen...
Grüße
Stay TunedGeändert von Stay Tuned (02.06.08 um 13:15 Uhr)
-
Hallo,
Strings müssen für die Berechnung in numerische Typen und wieder zurück konvertiert werden. Dafür kannst du "atoi()" und die Format-Methode von CString verwenden:
GrußCode cpp:1
strAusgabe.Format("%d", atoi(addieren) + atoi(addieren2));
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
02.06.08 18:45 #12
- Registriert seit
- Feb 2008
- Beiträge
- 13
Hallo,
haha. Alles klar! Jetzt wo ichs weiß, ersscheint es mir auch logisch das man mit Strings nicht rechnen kann.
Danke für Hilfe. Von alleine wäre ich nie auf atoi() gekommen, da mir in meinem MSDEV der index fehlt und ich selbst nur beschränkt nach codes suchen kann
Damit habe ich es bis jetzt geschafft jeden Operanden zu Programmieren ( naja, hat man einen, hat man alle ) doch Zeitgleich damit taucht ein neues Problem auf. Ein ziemlich banales und doch zugleich fatales.
Entweder bekommt mir die Hitze in den letzten Tagen nicht, oder... ich weiß nicht.
Addieren funktioniert, der Flag wird erkannt. Alle anderen aber anscheinend nicht.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
void CTaschenrechnerDlg::OnButtonGleich() { if( PlusFlag = 1 ){ GetDlgItemText(IDC_ERGEBNIS, addieren2); strAusgabe.Format("%d", atoi(addieren) + atoi(addieren2)); SetDlgItemText(IDC_ERGEBNIS, strAusgabe); PlusFlag = 0; } else if( MinusFlag = 1 ){ GetDlgItemText(IDC_ERGEBNIS, subtrahieren2); strAusgabe.Format("%d", atoi(subtrahieren) - atoi(subtrahieren2)); SetDlgItemText(IDC_ERGEBNIS, strAusgabe); MinusFlag = 0; } else if( MalFlag = 1 ){ GetDlgItemText(IDC_ERGEBNIS, multiplizieren2); strAusgabe.Format("%d", atoi(multiplizieren) * atoi(multiplizieren2)); SetDlgItemText(IDC_ERGEBNIS, strAusgabe); MalFlag = 0; } else if( GeteiltFlag = 1 ){ GetDlgItemText(IDC_ERGEBNIS, dividieren2); strAusgabe.Format("%d", atoi(dividieren) / atoi(dividieren2)); SetDlgItemText(IDC_ERGEBNIS, strAusgabe); GeteiltFlag = 0; } }
Auserdem kriege ich die 0 nicht weg, die bei der zweiten Zahl angezeigt wird, die ich eingebe nachdem ich einen Operanden gedrückt habe. Vielleicht hat das ja etwas damit zu tun?
So sind bei jeder Operation, auser bei der Addition, die Ergebnise gleich der zweiten eingegebenen Variablen.( Also 12 - 2 = 2 anstatt 10 oder 10 / 5 = 5 anstatt 2 )
MfG
Stay TunedGeändert von Stay Tuned (02.06.08 um 18:48 Uhr)
-
Prüfung auf Gleichheit immer mit doppelten Gleichheitszeichen:
GrußCode cpp:1 2 3 4 5 6 7
if( PlusFlag == 1 ) ... else if( MinusFlag == 1 ) ... else if( MalFlag == 1 ) ... else if( GeteiltFlag == 1 )
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
03.06.08 11:40 #14
- Registriert seit
- Feb 2008
- Beiträge
- 13
Hallo,
meine Güte, so ein dummer Fehler.
Auserdem ist standardmäsig alles auf 1 und somit wird, egal welchen operanden ich ausführe, immer "Plus" ausgeführt.
Jetzt habe ich erstmal alles entbuggt und das Programm funktioniert. Hab auch ein paar extras eingebaut und wollte jetzt die "Rücktaste" programmieren.
Rücktaste = letzte Zahl wird gelöscht ( also wenn man sich vertippt hat... anstatt 15 eine 155 eintippt und dann die letzte 5 löschen möchte )
Ich hab da ein paar Ideen, aber alles viel zu umständlich. Es gibt doch bestimmt einen Befehl, der die letzte eingabe rückgänig macht, oder?
Gruß
Stay Tuned
-
Mit einem einfachen Befehl ist es zwar nicht getan, aber der Aufwand hält sich in Grenzen:
GrußCode cpp:1 2 3 4 5 6 7
CString strAusgabe; GetDlgItemText(IDC_ERGEBNIS, strAusgabe); if( strAusgabe.GetLength() > 0 ) { SetDlgItemText(IDC_ERGEBNIS, strAusgabe.Left(strAusgabe.GetLength() - 1)); }
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
Ähnliche Themen
-
Zahlen einlesen - überwiegen positive oder negative Zahlen?
Von jenny1106 im Forum C/C++Antworten: 10Letzter Beitrag: 06.03.10, 20:51 -
Zahlen Darstellung
Von dejjan im Forum JavaAntworten: 1Letzter Beitrag: 21.06.07, 08:35 -
hp mit html und css=richtige darstellung hp mit php und css=falsche Darstellung
Von Briefkasten im Forum CSSAntworten: 2Letzter Beitrag: 29.07.05, 15:21 -
Darstellung extrem großer Zahlen in Pascal
Von barf im Forum Delphi, Kylix, PascalAntworten: 2Letzter Beitrag: 17.05.04, 09:35 -
Darstellung von Zahlen?
Von Maxe im Forum PHPAntworten: 3Letzter Beitrag: 05.09.02, 16:49





Zitieren

Login






