Taschenrechner mit MFC - Darstellung der Zahlen...

Stay Tuned

Grünschnabel
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:
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 Tuned
 
Zuletzt bearbeitet:
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.
C++:
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);
}
Gruß
MCoder
 
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
 
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
 
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
 
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
 
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
 
die Theorie ist mir bekannt. Ich denke ich weiß wie ich alles funktionieren soll...
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
 
Hallo,

Dies sind die drei grundlegenen Codeblöcke die ich bis jetzt habe.
Code:
void CTaschenrechnerDlg::AddZahl(CString strZahl){

	strAusgabe += strZahl;
	SetDlgItemText(IDC_ERGEBNIS, strAusgabe);
}
Code:
void CTaschenrechnerDlg::OnButtonPlus() 
{
	GetDlgItemText(IDC_ERGEBNIS, addieren);
 
        strAusgabe = "0";

	PlusFlag = TRUE;
}
Code:
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 Tuned
 
Zuletzt bearbeitet:
Zurück