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. |
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 |
Re: taschenrechner (erweiterung)
Zitat:
: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 |
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
|
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...
|
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?
|
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. |
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
|
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:
Diese Funktion berücksichtigt noch nicht, dass Operatoren gleicher Priorität von links nach rechts ausgewertet werden.
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; |
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. |
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