Ergebnis 1 bis 16 von 16

Thema: Taschenrechner mit Delphi

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Und ihr habt das einfach so aufbekommen, ohne Erklärungen?
    Egal. ^^

    Also, bisher hast du ja nur mit Strings (also Texten) gearbeitet. (Eben dem Displaytext noch eine Zahl (als Text) hinzugefügt.)
    Wenn du nun jedoch mit Zahlen rechnen möchtest, musst das dem Computer ja auch sagen. Logisch, oder? ^^
    Variable_1 := Variable_2 + Variable_3;
    Mit diesem Code könntest du, wie bei deinem bisherigen Quellcode, einer Stringvariable (hier Display.Text) einen neuen Wert zuweisen, der auch aus Texten besteht, oder du könntest wirklich 'rechnen' - der einzige Unterschied liegt im Typ der Variablen.
    '5' + '7' ist also, da es durch die Hochkommatas Zeichen sind, und als Text behandelt wird, am Ende '57'.
    5 + 7 jedoch ist, da es ohne Hochkommatas als Zahlen behandelt wird (genauer: Integer-Zahlen), 12.

    Um nun deinem Delphi zu sagen, dass es mit den Zahlen doch bitte rechnen soll, musst du irgendwo deine Zahlen hernehmen.
    In deinem Fall würdest du die Zahlen aus deiner Display-Komponente nehmen, denn da hast du sie ja vorher bereits durch die Buttonklicks reingeschrieben.
    (Ich würde dir hierfür übrigens empfehlen, am Anfang mit mehreren Edit-Komponenten zu arbeiten, damit du einen ersten Summanden und einen zweiten Summanden klar unterteilt in zwei verschiedenen Feldern hast. Man kann auch alles aus einem Feld auslesen (also Zahlen, Rechenzeichen etc.), aber das wäre recht umständlich (und ich bin da grad zu faul, dir das alles vorzubeten ^^). *g*)

    Sagen wir also mal, du hast jetzt in Display1 deinen ersten Summanden, und in Display2 deinen zweiten.
    Du musst nun zunächst dir überlegen, wo du das Ergebnis der Rechnung ausgeben möchtest. (Beispielsweise nehme ich mal eine Label-Komponente.)
    Bei dem Label musst du in die Eigenschaft Caption schreiben, anstatt in die Eigenschaft Text...
    Also:
    Code:
    Label.Caption := irgendwas;
    So, dieses irgendwas wird jetzt bestimmt. ^^
    Code:
    Label.Caption := Display1.Text + Display2.Text;
    Das funktioniert zwar ohne Fehlermeldung, aber es ist nicht das, was wir wollen: Aus 5 und 7 würde hierbei nur wieder 57 werden, da Delphi ja merkt, dass man nur Strings, also Texte, zusammenfügt - und nicht Zahlen.
    Die Strings müssen also zunächst in Zahlen umgewandelt werden - mit deiner tollen StrtoFloat-Funktion. ^^
    Code:
    Label.Caption := StrtoFloat(Display1.Text) + StrtoFloat(Display2.Text);
    Dieser Code ist schon fast fertig, aber leider gibt Delphi nun eine Fehlermeldung aus. Wieso?
    Rechts hast nun die Texte in Zahlen umgewandelt, und Delphi also gesagt, dass es wirklich mit richtigen echten Zahlen rechnen soll (5 + 7 = 12 \o/ ).
    Aber links steht immernoch eine String-Variable (Eben das Label.Caption.), und deswegen kommt es zu einem Typfehler - es muss links und rechts einer Zuweisung ( := ) immer der gleiche Variablentyp stehen.

    Doch komm jetzt nicht auf die geniale Idee, einfach
    Code:
    StrtoFloat(Label.Caption) := StrtoFloat(Display1.Text) + StrtoFloat(Display2.Text);
    zu schreiben. ^^
    Auf der linken Seite einer Zuweisung darf niemals eine Typumwandlung durchgeführt werden, sondern nur auf der Rechten Seite. (Kannst es ja ausprobieren, also zumindest mein Delphi liefert da eine saftige Fehlermeldung. ^^'' )
    Um also den Post noch halbwegs kurz zu halten, hier die (nun endlich) richtige Quellcodezeile:
    Code:
    Label.Caption := FloattoStr(StrtoFloat(Display1.Text) + StrtoFloat(Display2.Text));
    Du hast also zwei Textwerte (Strings eben) zunächst in Zahlen umgewandelt, dann addiert, und dann wieder zurück in Texte umgewandelt. Diese werden dann über Label.Caption ausgegeben. \o/
    Die fertige procedure wäre dann also beispielsweise:
    Code:
    procedure TTaschenrechner.BtnplusClick(Sender: TObject);
    begin 
    Label.Caption := FloattoStr(StrtoFloat(Display1.Text) + StrtoFloat(Display2.Text)); 
    end;
    So.
    Wie du das ganze nun für die anderen Rechenarten machen kannst, müsstest du selbst herausfinden können. *g*
    Wenn es Fragen, Korrekturen oder sonstewas gibt, frag ruhig, ich tue alles, um mich von meinen Hausaufgaben abzulenken. xD

    Edit an den da unter mir:
    Ja klar geht das, 'türlich.
    Aber ich glaube nicht, dass juli.an von deinem Code etwas verstanden hat. (Nichts gegen dich, wenn doch, dann hab ich dich einfach falsch eingeschätzt. ^^'')
    Und deswegen habe ich ihm halt die einfachste Methode erklärt, und zwar so, wie ich zumindest es auch wirklich verstehen würde...
    Wenn man sich bereits mit Delphi auskennt, ist dein Code sicherlich toll, aber für einen Anfänger eher nicht hilfreich. *g*
    (Außerdem - wenn du es schon 'richtig' machen willst, dann fehlt mir aber definitiv noch eine Überprüfung, ob die Zahl im String überhaupt eine vernünftige Zahl ist, oder ob da nich wild und wahllos Buchstaben mit reingeworfen wurden. (Und sag nicht, dass das bei StrtoFloat schon integriert ist, da würde eine Welt für mich zusammenbrechen. ))

    Geändert von Moyaccercchi (13.11.2006 um 18:49 Uhr)

  2. #2
    Nicht euer ernst oder? Wenn schon, dann gleich richtig. Also als Parser implentiert, wie etwa hier: http://delphi.zsg-rottenburg.de/parser.html

    Vor allem das erste Beispiel könnte dir einfach aufschluss geben wie sowas gehen sollte.

    Code:
    function anfang(s:string;c:char):string;
    begin
      anfang:=copy(s,1,pos(c,s)-1);
    end;
    
    function copyab(const s:string; const i:integer):string;
      begin result:=copy(s,i,length(s)-i+1) end;
    
    function ende(s:string; c:char):string;
    begin
      ende:=copyab(s,pos(c,s)+1)
    end;
    
    function TermToReal(s:string):real;
    begin
      if pos('+',s)>0  then
        result:=TermToReal(anfang(s,'+'))+TermToReal(ende(s,'+')) 
      else if pos('*',s))>0 then
        result:=TermToReal(anfang(s,'*'))*TermToReal(ende(s,'*'))
      else
        result:=StrToFloat(s);
    end;
    Solte klar und gut verständlich sein.

  3. #3
    Hallo ich bin der totale blutige Anfänger und bin gerade dabei meinen ersten Taschenrechner zu proggn.
    So und ich sitze jetzt schon ein paar stunden nur an einer kleinen Sache xD
    Also es ist warscheinlich nur ne kleinigkeit darum findet man darüber auch einfach nichts.

    Code:
    result := StrToFloat (alt2) + 'rechenart' + StrToFloat (edit1.text);
    erklärung dazu,
    ich habe ebend die zahlen und einen = Button.
    Das Ergebnis soll erst ausgegeben werden wenn ich auf = drücke.
    Dazu habe ich "rechenart" als string und immer wenn ich zb auf + drücke rechenart = + oder -

    Der das Problem is in dem Code das ich nicht weis wie ich das in die Zeile einfügen soll?Also das "rechenart" ersetzt in der zeile jetzt praktisch einfach nur das + oder - je nachdem wo ich drauf klicke.

    Bitte helft mir xD

  4. #4
    Erstmal willkommen im Forum

    Zweitens: Das Programmieren eines Taschenrechners ist lang nicht so einfach, wie immer gedacht wird und ich bin der Meinung, dass es für einen Anfänger zu schwer ist, auch wenn man immer was anderes liest.
    Aber ein Taschenrechner funktioniert Zustandsorientiert (Punkt vor Strich Rechnung oder Klammersetzung) und da kommen dann die deterministischen Automaten ins Spiel.

    drittens: Dass, was du vor hast, kannst du mit einer Case-Anweisung realisieren.

    Code (delphi):
     
    case (rechenart) of 
      '+' : StrToFloat (alt2) + StrToFloat (edit1.text);
      '-' : StrToFloat (alt2) - StrToFloat (edit1.text);
      '*' : StrToFloat (alt2) * StrToFloat (edit1.text);
      '/' : StrToFloat (alt2) / StrToFloat (edit1.text);
    end;

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •