Forum: PC-Programmierung C++ Calculator (MFC)


von Cedric (Gast)


Lesenswert?

Hallo

Hab ne Frage. Möchte ein kleiner Rechner mit C++-Programmieren (MFC).
Hab noch nicht grosse Ahnung von C++, gibt es Tutorials, etc... die ihr 
mir Vorschlagen könnt?

Besten Dank für die Mithilfe

Cedric

von Hudiny (Gast)


Lesenswert?


von Cedric (Gast)


Lesenswert?

Sehe da kein Taschenrechner

Gruss Cerdic

von Cedric (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Als int?

von Cedric (Gast)


Lesenswert?

int Ergebnis = 0;
oder
int Ergebnis;

Dann gibt es bei mir keine Zahl aus auf dem Taschenrechner

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tja, Du musst natürlich Ergebnis schon mit dem Inhalt des Textfeldes 
verknüpfen, das zur Anzeige verwendet wird.

von Cedric (Gast)


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

von Karl H. (kbuchegg)


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.

von Cedric (Gast)


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

von Cedric (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

Cedric wrote:
>   m_dValue += .;

Das tut ja in den Augen weh!

von Cedric (Gast)


Lesenswert?

Wie kann ich es dann anders lösen?
Gibt sicher andere Lösungsvorschläge

von Karl H. (kbuchegg)


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.

von Cedric (Gast)


Lesenswert?

Wollte mir schon lange ein Buch über c++ kaufen, hast du gute Ratschläge 
welches das richtige wäre?

von Karl H. (kbuchegg)


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.

von Cedric (Gast)


Lesenswert?

Okay

Besten Dank

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.