Autor |
Beitrag |
safak67
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 03.06.09 12:11
hi,
ich hab ein taschenrechner programmiert aber weiß nicht wie ich das mit der berrechnung mache.. ich hoffe ihr könnt mir helfen. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130:
| 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 op : char; SpArray : ARRAY[0..9] OF TSpeedButton; public 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; begin Formular := LabelAnzeige.Caption; if pos('+',Formular) > 1 then begin Seg1 := copy(Formular,1,pos('+',Formular) - 1); Seg2 := copy(Formular,pos('+',Formular) + 1,length(Formular)); 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. |
Moderiert von Narses: Quote- durch Delphi-Tags ersetzt
Einloggen, um Attachments anzusehen!
|
|
thepaine91
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mi 03.06.09 12:19
Sag doch mal genau was deine Frage ist. Erklär es mal in ein paar Sätzen aber so ist das ziemlich undurchschaubar.
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 03.06.09 13:02
Wofür erstellst du das Array mit den Buttons? Das verwendest du doch gar nicht.
Kann es sein, dass du da Code von irgendwo kopiert hast? Denn einerseits hast du im (auskommentierten) Quelltexte Ansätze eines direkten Abarbeitens drin, andererseits versuchst du bei einem Klick auf den Ergebnisbutton die vorherigen Eingaben zu parsen.
Grundsätzlich musst du dir erst einmal darüber klar werden was du eigentlich machen willst. Entweder du speicherst beim Klick auf einen Operator die aktuelle Zahl, dann den Operator und hast direkt die einzelnen Teile der Rechnung (so sieht es in dem auskommentierten Quelltext aus), oder du schreibst alles inkl. Operator in die Anzeige und wertest das hinterher aus.
Im Moment musst du doch nur das ShowMessage(Seg1+'+'+Seg2); durch die tatsächliche Berechnung ersetzen und das für alle Operatoren machen. Damit ist dann nur eine Berechnung mit zwei Operanden möglich.
Vielleicht fehlt dir an der Stelle StrToFloat / FloatToStr. Damit kannst du den String in Seg1 und Seg2 in eine /Zahl umwandeln und nach der Rechnung zurück.
Dann noch der Hinweis:
Zum Thema Taschenrechner gibts schon relativ viele Fragen im Forum, da findest du vermutlich auch noch einiges interessantes.
// EDIT:
Crosspost:
www.delphipraxis.net/post1044070.html
|
|
safak67
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 03.06.09 13:55
ersten wusste ich nicht das ich crosspos gemacht habe sorry..
das programm habe ich jetzt umgeändert, wie gesagt nur die berechnung fehlt.. ich weiß aber nicht wie ich auf die einzelnen abschnitte zugreife bei der berechnung.. wenn ich z.B jetzt 24+13*5-4 mache dann habe ich ja 24 als seg1 und der rest ist seg2.. wie teile ich die und wie mache ich die rechnung
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 03.06.09 14:05
Da bist du dann schon bei einem Parser, das ist relativ kompliziert...
Vielleicht solltest du es erst einmal bei zwei Operatoren belassen und das hinbekommen.
|
|
safak67
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 03.06.09 14:42
wie geht das mit den wei operatoren..? kannst du mir ein beispiel zeigen bitte
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 03.06.09 14:49
|
|
safak67
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 03.06.09 14:57
Und jetzt mit einer schleife auf alle operanden machen, oder wie?
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 03.06.09 15:03
else mit weiteren if-Abfragen reicht ja. Wenn kein + vorkommt, musst du es eben mit anderen versuchen.
Oder du benutzt einfach die Variable op und machst die Unterscheidung via case wie es im auskommentierten Teil auch schon da stand.
|
|
safak67
Hält's aus hier
Beiträge: 8
|
Verfasst: Do 04.06.09 08:55
also ich habe probleme mit der berrechnung des taschenrechners und der ausgabe.. vllt könnt ihr mir helfen.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119:
| 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; Clear: TSpeedButton; procedure SpZahlClick(Sender: TObject); procedure SpZeichenClick(Sender: TObject); procedure ClearClick(Sender: TObject); function BerechneTerm(ATerm: string): Double; private op : char; public end;
var FormTR: TFormTR;
implementation
{$R *.DFM}
procedure TFormTR.ClearClick(Sender: TObject); begin LabelAnzeige.Caption := '0'; end;
function TFormTR.BerechneTerm(ATerm: string): Double; var Op: string; iPos, i: Integer; Seg1, Seg2: 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 Seg1 := BerechneTerm(Copy(ATerm, 1, iPos - 1)); Seg2 := BerechneTerm(Copy(ATerm, iPos + 1, Length(ATerm))); case i of 0: Result := Seg1 + Seg2; 1: Result := Seg1 - Seg2; 2: Result := Seg1 * Seg2; 3: Result := Seg1 / Seg2; end; Exit; end; end;
Result := StrToFloat(ATerm); 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. |
--- Moderiert von Narses: Beiträge zusammengefasst---
keiner ne idee oder ein vorschlag?
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 04.06.09 12:42
Erstens ist pushen hier erst nach 24 Stunden erlaubt...
Zweitens musst du BerechneTerm auch irgendwo benutzen, es nur hinzuschreiben nutzt eben nichts. Und den Rückgabewert kannst du z.B. mit FloatToStr in einen String umwandeln und in ein Label oder in eine ShowMessage packen.
Und ansonsten kann ich nur noch sagen:
Einen sehr guten Crashkurs findest du hier:
crashkurs.christian-stelzmann.de
und die neue Version speziell ab Turbo Delphi:
www.christian-stelzm...shkurs_reloaded.html
Ein weiteres gutes Online-Buch:
de.wikibooks.org/wik...grammierkurs:_Delphi
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 04.06.09 13:16
Und Du solltest auf den Crosspost hinweisen, damit man nicht in beiden Foren antworten muss.
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 04.06.09 13:18
Das habe ich weiter oben schon geschrieben.
Besser wäre das natürlich immer im ersten Beitrag, dann kann man es nicht so leicht übersehen...
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 04.06.09 13:19
|
|
|