AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

taschenrechner (erweiterung)

Ein Thema von safak67 · begonnen am 3. Jun 2009 · letzter Beitrag vom 4. Jun 2009
Thema geschlossen
Seite 2 von 6     12 34     Letzte »    
safak67

Registriert seit: 22. Mär 2009
87 Beiträge
 
#11

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 11:50
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='0then LabelAnzeige.caption:='';
   if LabelAnzeige.caption='Errorthen LabelAnzeige.caption:='';

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

end;

procedure TFormTR.SPZeichenClick(Sender: TObject);
begin

  if LabelAnzeige.caption='Errorthen 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.
 
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.350 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 12:34
Crossposts solltest du angeben...
Dann kann man dort auch schauen, ob es schon Antworten gibt...
http://www.delphi-forum.de/viewtopic.php?t=92686
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
 
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#13

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 12:56
Zitat von jaenicke:
Crossposts solltest du angeben...
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



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

Registriert seit: 22. Mär 2009
87 Beiträge
 
#14

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 13:51
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
 
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.350 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 13:57
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...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
 
safak67

Registriert seit: 22. Mär 2009
87 Beiträge
 
#16

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 14:16
also einiges habe ich ja auch gefunden.. um alle operanden zu integrieren muss ich das ja parsen.. wie mache ich das aber in delphi?
 
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.350 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 14:32
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
 
safak67

Registriert seit: 22. Mär 2009
87 Beiträge
 
#18

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 14:49
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

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#19

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 14:57
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

Registriert seit: 22. Mär 2009
87 Beiträge
 
#20

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 18:06
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'
 
Thema geschlossen
Seite 2 von 6     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr.
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