![]() |
Delphi-Version: 5
Taschenrechner
Hallo,
ich habe ein Anliegen. Ich habe einen kleinen Taschenrechner programmiert. Nichts dolles und wollte wissen, ob man auch diese ganzen IF-Abfragen verkürzen kann. Es sind nicht allzu viele, aber ich würde gerne noch etwas im Taschenrechner programmieren.
Delphi-Quellcode:
begin
r_erg := 0; try begin if (Edit1.Text = 'Pflichtfeld') or (Edit2.Text = 'Pflichtfeld') or (Edit3.Text = 'Pflichtfeld') then begin showmessage('Pflichtfelder ausfüllen'); end else begin r_Zahl1 := strtofloat(Edit1.Text); r_Zahl2 := strtofloat(Edit3.Text); S_zeichen := Edit2.Text; if Edit4.Text = '' then begin if S_zeichen = '+' then begin r_erg := (r_Zahl1 + r_Zahl2); end else begin if S_zeichen = '-' then begin r_erg := (r_Zahl1 - r_Zahl2); end else begin if S_zeichen = '*' then begin r_erg := (r_Zahl1 * r_Zahl2); end else begin if S_zeichen = '/' then begin r_erg := (r_Zahl1 / r_Zahl2); end else showmessage('Falsches Rechenzeichen'); end; end; end; end else begin r_zahl3 := strtofloat(Edit4.Text); if S_zeichen = '+' then begin r_erg := (r_Zahl1 + r_Zahl2 + r_zahl3); end else begin if S_zeichen = '-' then begin r_erg := (r_Zahl1 - r_Zahl2 - r_zahl3); end else begin if S_zeichen = '*' then begin r_erg := (r_Zahl1 * r_Zahl2 * r_zahl3); end else begin if S_zeichen = '/' then begin r_erg := (r_Zahl1 / r_Zahl2 / r_zahl3); end else showmessage('Falsches Rechenzeichen'); end; end; end; end; end; end; except showmessage('Ungültige zahlen'); end; Label1.Caption := 'Ergenbis: ' + Floattostr(r_erg); Oder muss ich das so lassen? Ich habe es mit Case versucht, aber das funktioniert leider nicht. Also bitte ich um eure Hilfe :) Danke im Vorraus :) Gruß Philipp |
AW: Taschenrechner
Hallo,
in der Regel werden die Rechenoperationen (+,-,*,/) auf Button gelegt und nicht in einem Editfeld eingegeben. Grüße Klaus |
AW: Taschenrechner
Das hatte ich zu Anfang, aber ich wollte nur einen Button haben und nicht 4 :/
Also gibt es dafür keine Kürzmöglichkeiten oder? |
AW: Taschenrechner
Sinnvoll ist dafür ein MATH-PARSER.
Gibt es auch hier im Forum: ![]() und mehr... |
AW: Taschenrechner
Case geht nicht, wenn man es mit einem String versucht. Du könntest aber mit einem Char arbeiten.
|
AW: Taschenrechner
Klar geht das auch kürzer, zumindest übersichtlicher und Funktion von der Oberfläche getrennt:
Delphi-Quellcode:
function Berechne(A, B: Float; Op: Char): Float;
begin case Op of '+': Result := (A + B); '-': Result := (A - B); '*': Result := (A * B); '/': Result := (A / B); else raise Exception.Create('Falsches Rechenzeichen'); end; end; var Op: Char; begin try if (Edit1.Text = 'Pflichtfeld') or (Edit2.Text = 'Pflichtfeld') or (Edit3.Text = 'Pflichtfeld') then raise Exception.Create('Pflichtfelder ausfüllen'); r_Zahl1 := strtofloat(Edit1.Text); r_Zahl2 := strtofloat(Edit3.Text); S_zeichen := Trim(Edit2.Text); if Length(S_zeichen) = 0 then Op := #0 else Op := S_zeichen[1]; r_erg := Berechne(r_Zahl1, rZahl2, Op); if Edit4.Text <> '' then begin r_Zahl3 := strtofloat(Edit4.Text); r_erg := Berechne(r_erg, r_Zahl3, Op); end; Label1.Caption := 'Ergebnis: ' + Floattostr(r_erg); except on E: Exception do begin Label1.Caption := 'Ergebnis: '; showmessage(E.Message); end; end; end; |
AW: Taschenrechner
Werde es heute Abend mal umschreiben :P
Bzw erst Freitag falls ich es nicht schaffe. Danke euch! |
AW: Taschenrechner
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
willst noch lernen? Oder reicht ein fertiger? Sieht besser aus und hast keine Arbeit...:mrgreen: Von TMS ist nicht übel...Ja es gibt auch andere...:) |
AW: Taschenrechner
Und um das nochmal an einem Beispiel zu zeigen.
Ein CASE-Statement entspricht praktisch vielen aneinanderhängenden IF-Statements. Zitat:
Steht nur ein Befehl dazwischen, dann kann das auch weg.
Delphi-Quellcode:
Nun noch etwas anders formatiert, womit es eher auffällt, daß die Befehle (r_erg := ...) alle in einer Ebene stehen.
if S_zeichen = '+' then
r_erg := (r_Zahl1 + r_Zahl2 + r_zahl3) else if S_zeichen = '-' then r_erg := (r_Zahl1 - r_Zahl2 - r_zahl3) else if S_zeichen = '*' then r_erg := (r_Zahl1 * r_Zahl2 * r_zahl3) else if S_zeichen = '/' then r_erg := (r_Zahl1 / r_Zahl2 / r_zahl3) else showmessage('Falsches Rechenzeichen');
Delphi-Quellcode:
Tja, und nun wurden nur noch die "zusammenhängenden" IFs durch das CASE ersetzt.
if S_zeichen = '+' then
r_erg := r_Zahl1 + r_Zahl2 + r_zahl3 else if S_zeichen = '-' then r_erg := r_Zahl1 - r_Zahl2 - r_zahl3 else if S_zeichen = '*' then r_erg := r_Zahl1 * r_Zahl2 * r_zahl3 else if S_zeichen = '/' then r_erg := r_Zahl1 / r_Zahl2 / r_zahl3 else showmessage('Falsches Rechenzeichen');
Delphi-Quellcode:
In deinem Fall hättest du also deine ganze Funktion durch 2 CASE ersetzen können. (jeweils die zusammengehörenden Rechenoperationen)
case S_zeichen of
'+': r_erg := r_Zahl1 + r_Zahl2 + r_zahl3; '-': r_erg := r_Zahl1 - r_Zahl2 - r_zahl3; '*': r_erg := r_Zahl1 * r_Zahl2 * r_zahl3; '/': r_erg := r_Zahl1 / r_Zahl2 / r_zahl3; else ShowMessage('Falsches Rechenzeichen'); end; Und dann noch ein IF (oder CASE, falls es noch mehr Variablen werden ... nicht nur "2" oder "3"). Wobei du natürlich auch die Variante mit 3 Variablen auch für die mit 2 Variablen nutzen könntest. (dabei muß nur r_zahl3 bei +|- mit 0 und bei *|/ mit 1 gefüllt werden, damit sie mathematisch nicht auffällt) PS: S_zeichen muß hier natürlich ein Char sein, denn CASE versteht nur ordinale Typen. |
AW: Taschenrechner
Ich greife hier mal ein Schnippsel raus:
Delphi-Quellcode:
Pflichtfeld, Pflichtfeld, Pflichtfeld ... das muss doch auffallen das hier was nicht stimmt.
if (Edit1.Text = 'Pflichtfeld') or (Edit2.Text = 'Pflichtfeld') or
(Edit3.Text = 'Pflichtfeld') then begin showmessage('Pflichtfelder ausfüllen'); Wenn das Edit1-Feld z.B. leer wäre dann wäre der Inhalt auch nicht korrekt. Also müsste man auch noch prüfen, ob die Felder leer sind. Und da gibt es etwas ganz Geniales - Funktionen. Einmal programmiert kann man Funktionen so oft verwenden wie man will.
Delphi-Quellcode:
function EditFeldOk(const Text:string):Boolean;
begin Result := (Text <> 'Pflichtfeld') and (Text <>); end; ... if not (EditFeldOk(Edit1.Text) and EditFeldOk(Edit2.Text) and EditFeldOk(Edit3.Text)) then begin showmessage('Pflichtfelder ausfüllen'); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz