C++ Calculator (MFC)

Gast #667335
Lesenswert?

Guten Tag bekomme immer einen Fehler: Ergebnis undeclared identifier.

Mein Code:

void CCalculatorDlg::OnEight()
{
UpdateData(true);
Ergebnis=Ergebnis*10+8;
UpdateFata(false);
}

Wie soll ich Ergebnis deklarieren?

Griss Cedric
Gast #667790
Lesenswert?

Guten Tag ich bins wieder

Hab alle zahlen gemacht funktioniert auch toll, nun möchte ich wissen 
wie man das Display (Anzeige) wieder löscht kann man das einfach mit 
delete Machen? geht bei mir nicht.

Kann jemand mit helfen?

Gruss Cedric
#667795
Lesenswert?

Irgendwie scheinst du noch nicht verstanden zu haben, wie
in der MFC Dialoge und Dialogelemente funktionieren.

Mit dem Wizard verknüpfst du dein Anzeigeelement (in diesem
Fall wohl eine Textbox) mit einer normalen Variablen.
UpdateData macht den Transfer von der Variablen in die
Textbox und umgekehrt. In deinem Fall ist die Variable
eine normale int Variable.

D.h. wenn du in deiner Anzeige (der Textbox) eine 0
drinnen stehen haben willst, dann weist du die 0 deiner
Variablen zu und rufst UpdateData auf. Willst du in
deiner Textbox die Anzeige 123 haben, dann weist du
deiner Variablen 123 zu und rufst UpdateData auf.

Da du deine Textbox mit dem Wizard mit einer int Variablen
verknüpft hast, ist es auch nicht möglich die Textbox leer
zu lassen. Eine int Variable enthält immer eine Zahl auch
wenn die Zahl 0 ist. Daher enthält auch das Anzeigeelement
(also die Textbox) immer eine Textdarstellung einer Zahl
und kann nicht 'leer' sein.
Gast #667799
Lesenswert?

Bin eben ein Anfänger auf diesem Gebiet.
Hab es nicht mit UpdateData usw. gemacht.
Aber beim Initialisieren habe ich mein Display auf null gesetzt und beim 
Button Clear soll es ja dasselbe machen.

Also hat sich meine Frage gelöst. Danke
Gast #667812
Lesenswert?

Hab noch ne andere Frage:

Die Zahlen hab ich so geschrieben:

void CCalculatorDlg::OnOne()
{
  m_dValue *= 10;
  m_dValue += 1;

  CString strTemp;
  strTemp.Format("%f", m_dValue);
  m_txtDisplay.SetWindowText(strTemp);
}


Nun hab ich gedacht, der Punkt ginge auch so:

void CCalculatorDlg::OnPoint()
{
  m_dValue *= 10;
  m_dValue += .;

  CString strTemp;
  strTemp.Format("%f", m_dValue);
  m_txtDisplay.SetWindowText(strTemp);
}

Geht aber leider nicht, kann mir jemand sagen warum, oder bessere 
Lösungsvorschläge geben?

Gruss Cedric
#667860
Lesenswert?

Cedric wrote:
> Wie kann ich es dann anders lösen?

Wie kannst du WAS anders lösen.

Diese Zeile ergibt absolut keinen Sinn. Da kann man
noch nicht mal raten, was du denn eigentlich erreichen
möchtest.
. ist nun mal keine Zahl.

> Gibt sicher andere Lösungsvorschläge

Ne Menge.
Die erste davon ist: Kauf dir ein Einsteigerbuch für MFC.
Klar kann man einen Update einer Textbox so machen, wie du
das gemacht hast. In Ausnahmefällen wird man das sogar so
machen. Aber im Regelfall wird man das so nicht machen, sondern
sich eine Value-Variable vom Wizard auf die Textbox mappen lassen.
#667869
Lesenswert?

Für C++ ist immer noch der Klassiker zu empfehlen:
Stroustroup "The C++ Programming Language"
Keine Ahnung ob es davon eine deutsche Ausgabe gibt.

Für MFC hab ich jetzt nichts in petto. Aber in der nächstgelegenen
Buchhandlung deiner Wahl wird sich sicher was im Regal finden.


Zu deinem Problem: Bleib drann, ich glaube ich habe jetzt
verstanden, was du erreichen möchtest. In 10 bis 15 Minuten
wirst du dazu einen Beitrag vorfinden.
#667879
Lesenswert?

Zu deinem Problem.

Du möchtest Kommazahlen über 10 Buttons eingeben.
Gleichzeitig mit dem Drücken einer Taste baust du
auch die Zahl zusammen.

Wie machst du das?

Nun, du benutzt den Zusammenhang, dass um an eine Zahl x eine
neue Dezimalstelle y anzuhängen, du das ganze als 10 * x + y
rechnen kannst.

Bsp.  aus 12 und der nächsten Ziffer 3 wird so
      12 * 10  -> 120
und dazu noch 3 dazu   120 + 3  -> 123

Aber: geht das auch bei Nachkommastellen?
Nein. Das geht so nicht! Aber wie geht das bei Nachkommastellen?

um an die Zahl 12 eine 3 als erste Nachkommastelle anzuhängen,
musst du rechnen:

    12 + 0.3

du musst also aus den 3 zuerst mal 0.3 machen. Warum 0.3?
Weil wir über die erste Nachkommastelle reden.

   12 + 0.3  ->  12.3

Was ist, wenn da jetzt noch eine Stelle drankommt, sagen wir 5

   12.3 + 0.05  ->  12.35

Aus den 5 mussten also 0.05 werden.
Da ist aber ein Muster drinnen.
Für die erste Nachkommastelle musste die einzelne Ziffer durch
10 dividiert werden, für die nächste durch 100, für die nächste
werden es dann 1000 sein, etc.

D.h. du musst bei der Behandlung der Ziffern-Tastendrücke unter-
scheiden, ob diese Ziffer in den Vorkomma-Anteil wandert oder
ob es sich um eine Nachkommastelle handelt. Woher weist du,
ob du vor dem Komma bist oder dahinter?
Wenn die Eingabe einer Zahl beginnt, dann gibt der Benutzer
immer Vorkommastellen ein. Durch Drücken der Punkt-Taste teilt
der Benutzer dem Programm mit: Vorkommaanteil beendet, ab hier
beginnt der Nachkommaanteil.

Die Punkt Taste ist also nichts weiter als ein Umschalter (den du
dir als bool Variable in deinem Dialog anlegst), der entscheidet
was mit einem Ziffern-Tastendruck zu geschehen hat:
  Vorkomma:   Neue Zahl = Alte Zahl * 10 + Ziffer

  Nochkomma:  Neue Zahl = Alte Zahl + ( Ziffer / StellenFaktor )
              StellenFaktor = 10 * StellenFaktor

  Punkt:      Umschalten Vorkomma -> Nachkomma
              StellenFaktor = 10


Übrigens denke ich nicht, dass es so elegant ist, die Zahl direkt
bei der Eingabe zusammenzubauen.
Ich würde das eher so machen, das bei den Ziffern und Punkt Tasten
einfach nur ein Zeichen an einen String angehängt wird. Wenn dann
die tatsächliche Zahl gebraucht wird, dann hol ich mir diesen Text
von der Anzeige und wandle ihn erst dann in einem Rutsch in eine
double Zahl um. Das vermeidet dann auch eine Menge Probleme, die
zwischendurch durch Rundunsfehler bei der Zahl-Berechnung und
zwischenzeitlichen Anzeige auftreten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren