Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

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

safak67 3. Jun 2009 11:50

Re: taschenrechner (erweiterung)
 
ich hab mein Programm etwas erweitert.. ich weiß aber immer noch nicht wie das mit der berechnung geh, ich habe kein plan.. das ich das aufteilen muss ist mir klar, aber welche funktionen ich bei delphi benutzen muss weiß ich nicht

Delphi-Quellcode:
unit Calculator_Main;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Buttons, StdCtrls;

type
  TFormTR = class(TForm)
    Sp7: TSpeedButton;
    Sp8: TSpeedButton;
    Sp9: TSpeedButton;
    Sp4: TSpeedButton;
    Sp5: TSpeedButton;
    Sp6: TSpeedButton;
    Sp1: TSpeedButton;
    Sp2: TSpeedButton;
    Sp3: TSpeedButton;
    Sp0: TSpeedButton;
    DecimalSep: TSpeedButton;
    spResult: TSpeedButton;
    SpPlus: TSpeedButton;
    SpMinus: TSpeedButton;
    SpMal: TSpeedButton;
    SpDurch: TSpeedButton;
    LabelAnzeige: TLabel;
    SpeedButton1: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure SpZahlClick(Sender: TObject);
    procedure SpZeichenClick(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure spResultClick(Sender: TObject);
  private
    { Private-Deklarationen }
    op : char;
    SpArray : ARRAY[0..9] OF TSpeedButton;
  public
    { Public-Deklarationen }
  end;

var
  FormTR: TFormTR;

implementation

{$R *.DFM}

procedure TFormTR.FormCreate(Sender: TObject);
begin
   SpArray [0] := Sp0;
   SpArray [1] := Sp1;
   SpArray [2] := Sp2;
   SpArray [3] := Sp3;
   SpArray [4] := Sp4;
   SpArray [5] := Sp5;
   SpArray [6] := Sp6;
   SpArray [7] := Sp7;
   SpArray [8] := Sp8;
   SpArray [9] := Sp9;
end;

procedure TFormTR.SpeedButton1Click(Sender: TObject);
begin
LabelAnzeige.Caption := '0';
end;

procedure TFormTR.spResultClick(Sender: TObject);
  var Formular,Seg1,Seg2: string;
      index            : integer;
      Op               : string;
begin
  Formular := LabelAnzeige.Caption;
  for index := 0 to 3 do
  begin
    case index of
    0: Op := '*';
    1: Op := '/';
    2: Op := '+';
    3: Op := '-';
    end;
    if pos(Op,Formular) > 1 then
    begin
      Seg1 := copy(Formular,1,pos(Op,Formular) - 1);
      Seg2 := copy(Formular,pos(Op,Formular) + 1,length(Formular));
    end;

  end;

  //ShowMessage(Seg1+'+'+Seg2);

end;

procedure TFormTR.SpZahlClick(Sender: TObject);
begin
   if LabelAnzeige.caption='0' then LabelAnzeige.caption:='';
   if LabelAnzeige.caption='Error' then LabelAnzeige.caption:='';

   LabelAnzeige.caption := LabelAnzeige.caption + TSpeedButton(Sender).Caption;

end;

procedure TFormTR.SPZeichenClick(Sender: TObject);
begin

  if LabelAnzeige.caption='Error' then LabelAnzeige.caption:='0';
  if sender = spPlus then
    begin
      op:='+'
    end;
  if sender = spMinus then
    begin
      op:='-'
    end;
  if sender = spMal then
    begin
      op:='x'
    end;
  if sender = spDurch then
    begin
      op:='/'
    end;

  LabelAnzeige.caption := LabelAnzeige.caption + op;

end;

end.

jaenicke 3. Jun 2009 12:34

Re: taschenrechner (erweiterung)
 
Crossposts solltest du angeben... :roll:
Dann kann man dort auch schauen, ob es schon Antworten gibt...
http://www.delphi-forum.de/viewtopic.php?t=92686

messie 3. Jun 2009 12:56

Re: taschenrechner (erweiterung)
 
Zitat:

Zitat von jaenicke
Crossposts solltest du angeben... :roll:
Dann kann man dort auch schauen, ob es schon Antworten gibt...
http://www.delphi-forum.de/viewtopic.php?t=92686

Pfui, sowas macht man nicht :warn:

:mrgreen:

Zur Berechnung: Du musst wie beim Zerlegen mit dem Auge Zwischensummen bilden und die weiterverarbeiten. Fertige Funktionen gibt es da nicht.

1+2*3+4:nach * oder / suchen, benachbarte Operanden berechnen, Strichrechnung mit Zwischensumme durchführen. Dazu musst Du noch Klammern beachten.
Ich sagte oben schon, dass das etwas Arbeit ist. Die musst Du Dir antun für diese Lösung. Rekursives Zerlegen war ja schon vorgeschlagen.

Grüße, Messie

safak67 3. Jun 2009 13:51

Re: taschenrechner (erweiterung)
 
wenn ich wüsste wie da ran gehen soll, dann würde ich zehn stunden daran sitzten.. ich weiß nicht wie ich mit der berechnung anfangen soll

jaenicke 3. Jun 2009 13:57

Re: taschenrechner (erweiterung)
 
Kurz vor deinem letzten Post hier hab ich drüben ja die eine Zeile gepostet, die dafür nötig ist, dass erstmal was geht...

safak67 3. Jun 2009 14:16

Re: taschenrechner (erweiterung)
 
also einiges habe ich ja auch gefunden.. um alle operanden zu integrieren muss ich das ja parsen.. wie mache ich das aber in delphi?

jaenicke 3. Jun 2009 14:32

Re: taschenrechner (erweiterung)
 
Wenn es nur im die zwei Operanden geht, musst du da nichts parsen für die Operatoren, denn da hast du op bereits als Variable. Da reicht eine Unterscheidung mit case.

Und wenn du mehr willst, musst du sowieso ein wenig am Konzept basteln.

safak67 3. Jun 2009 14:49

Re: taschenrechner (erweiterung)
 
das mit den zwei operanden habe ich schon verstanden, aber das problem ist ja wenn ich da z.B 4+3*2-6 stehen habe.. Ich muss das so programmieren das das geht, aber ich habe keine ahnung von parsen.. habe mir auch über die suchfunktion was angeschaut aber leider keine ahnung

Blup 3. Jun 2009 14:57

Re: taschenrechner (erweiterung)
 
Du solltest dir erst einmal um das Prinzip gedanken machen, wie man eine solche Aufgabe löst.
Danach kommt die Umsetzung in eine Programmiersprache.

Du hast ja bereits als ersten Schritt den Term in zwei Teile zerlegt.
Allerdings muss dabei mit dem Operator der geringsten Priorität begonnen werden.
1 + 2 * 3 => (1) + (2 * 3)

Wie berechnet man nun aber jeden dieser Teilterme?
Solange ein Term einen Operator enthält, kann man diesen erneut in Teilterme zerlegen.
2 * 3 => (2) * (3)
Enthält ein Term aber nur noch eine Zahlenfolge, kann dieser direkt in eine Zahl umgewandelt werden.

Das lässt sich sehr schön mit einer rekursiven Funktion darstellen:
Delphi-Quellcode:
function BerechneTerm(ATerm: string): Double;
var
  Op: string;
  iPos: Integer;
  Value1, Value2: Double;
begin
  for i := 0 to 3 do
  begin
    case i of
      0: Op := '+';
      1: Op := '-';
      2: Op := '*';
      3: Op := '/';
    end;
    iPos := Pos(Op, ATerm);
    if iPos > 0 then
    begin
      Value1 := BerechneTerm(Copy(ATerm, 1, iPos - 1));
      Value2 := BerechneTerm(Copy(ATerm, iPos + 1, Length(ATerm)));
      case i of
        0: Result := Value1 + Value2;
        1: Result := Value1 - Value2;
        2: Result := Value1 * Value2;
        3: Result := Value1 / Value2;
      end;
      Exit;
    end;
  end;
  Result := StrToFloat(ATerm);
end;
Diese Funktion berücksichtigt noch nicht, dass Operatoren gleicher Priorität von links nach rechts ausgewertet werden.

safak67 3. Jun 2009 18:06

Re: taschenrechner (erweiterung)
 
wenn ich eine funktion in delphi schreieb, wie binde ich das da ein, weil wenn ich das programm starte gibt er mir ne fehlermeldung an..

[Warnung] Calculator_Main.PAS(77): Rückgabewert der Funktion 'spResult' könnte undefiniert sein
[Fehler] Calculator_Main.PAS(32): Ungenügende Forward- oder External-Deklaration: 'TFormTR.spResultClick'


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 Uhr.
Seite 2 von 6     12 34     Letzte »    

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