tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
15
ZUGRIFFE
1231
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Stay Tuned Stay Tuned ist offline Mitglied
    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 Tuned
    Geändert von Stay Tuned (30.05.08 um 11:15 Uhr)
     

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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.
    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);
    }
    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  3. #3
    Stay Tuned Stay Tuned ist offline Mitglied
    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
     

  4. #4
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  5. #5
    Stay Tuned Stay Tuned ist offline Mitglied
    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
     

  6. #6
    langer1801 langer1801 ist offline Mitglied Platin
    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
     

  7. #7
    Stay Tuned Stay Tuned ist offline Mitglied
    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
     

  8. #8
    langer1801 langer1801 ist offline Mitglied Platin
    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
     

  9. #9
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von Stay Tuned Beitrag anzeigen
    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
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  10. #10
    Stay Tuned Stay Tuned ist offline Mitglied
    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 Tuned
    Geändert von Stay Tuned (02.06.08 um 13:15 Uhr)
     

  11. #11
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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:
    Code cpp:
    1
    
    strAusgabe.Format("%d", atoi(addieren) + atoi(addieren2));
    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  12. #12
    Stay Tuned Stay Tuned ist offline Mitglied
    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 Tuned
    Geändert von Stay Tuned (02.06.08 um 18:48 Uhr)
     

  13. #13
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Prüfung auf Gleichheit immer mit doppelten Gleichheitszeichen:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    
    if( PlusFlag == 1 )
    ...
    else if( MinusFlag == 1 )
    ...
    else if( MalFlag == 1 )
    ...
    else if( GeteiltFlag == 1 )
    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  14. #14
    Stay Tuned Stay Tuned ist offline Mitglied
    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
     

  15. #15
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Mit einem einfachen Befehl ist es zwar nicht getan, aber der Aufwand hält sich in Grenzen:
    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)); 
    }
    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 06.03.10, 20:51
  2. Zahlen Darstellung
    Von dejjan im Forum Java
    Antworten: 1
    Letzter Beitrag: 21.06.07, 08:35
  3. Antworten: 2
    Letzter Beitrag: 29.07.05, 15:21
  4. Darstellung extrem großer Zahlen in Pascal
    Von barf im Forum Delphi, Kylix, Pascal
    Antworten: 2
    Letzter Beitrag: 17.05.04, 09:35
  5. Darstellung von Zahlen?
    Von Maxe im Forum PHP
    Antworten: 3
    Letzter Beitrag: 05.09.02, 16:49