Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Taschenrechner (https://www.delphipraxis.net/176889-taschenrechner.html)

Dyami 2. Okt 2013 13:44

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

Klaus01 2. Okt 2013 13:49

AW: Taschenrechner
 
Hallo,

in der Regel werden die Rechenoperationen (+,-,*,/) auf Button gelegt
und nicht in einem Editfeld eingegeben.

Grüße
Klaus

Dyami 2. Okt 2013 14:05

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?

hathor 2. Okt 2013 14:08

AW: Taschenrechner
 
Sinnvoll ist dafür ein MATH-PARSER.
Gibt es auch hier im Forum:

http://www.delphipraxis.net/46536-ko...theparser.html

und mehr...

MrSpock 2. Okt 2013 14:20

AW: Taschenrechner
 
Case geht nicht, wenn man es mit einem String versucht. Du könntest aber mit einem Char arbeiten.

Blup 2. Okt 2013 14:21

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;

Dyami 2. Okt 2013 15:39

AW: Taschenrechner
 
Werde es heute Abend mal umschreiben :P
Bzw erst Freitag falls ich es nicht schaffe. Danke euch!

blondervolker 2. Okt 2013 18:30

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...:)

himitsu 2. Okt 2013 21:04

AW: Taschenrechner
 
Und um das nochmal an einem Beispiel zu zeigen.

Ein CASE-Statement entspricht praktisch vielen aneinanderhängenden IF-Statements.
Zitat:

Delphi-Quellcode:
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;

BEGIN+END braucht man praktisch nur, um "mehrere" Befehle zusammenzufassen.
Steht nur ein Befehl dazwischen, dann kann das auch weg.

Delphi-Quellcode:
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');
Nun noch etwas anders formatiert, womit es eher auffällt, daß die Befehle (r_erg := ...) alle in einer Ebene stehen.

Delphi-Quellcode:
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');
Tja, und nun wurden nur noch die "zusammenhängenden" IFs durch das CASE ersetzt.

Delphi-Quellcode:
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;
In deinem Fall hättest du also deine ganze Funktion durch 2 CASE ersetzen können. (jeweils die zusammengehörenden Rechenoperationen)

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.

sx2008 2. Okt 2013 22:24

AW: Taschenrechner
 
Ich greife hier mal ein Schnippsel raus:
Delphi-Quellcode:
      if (Edit1.Text = 'Pflichtfeld') or (Edit2.Text = 'Pflichtfeld') or
        (Edit3.Text = 'Pflichtfeld') then
      begin
        showmessage('Pflichtfelder ausfüllen');
Pflichtfeld, Pflichtfeld, Pflichtfeld ... das muss doch auffallen das hier was nicht stimmt.

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 04:30 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz