mikrocontroller.net

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


Autor: Cedric (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hudiny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Cedric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehe da kein Taschenrechner

Gruss Cerdic

Autor: Cedric (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als int?

Autor: Cedric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int Ergebnis = 0;
oder
int Ergebnis;

Dann gibt es bei mir keine Zahl aus auf dem Taschenrechner

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Cedric (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Cedric (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Cedric (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cedric wrote:
>   m_dValue += .;

Das tut ja in den Augen weh!

Autor: Cedric (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Cedric (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Cedric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay

Besten Dank

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.