Autor Beitrag
wayne123
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: So 06.11.11 15:28 
Also, ich hab das Problem, dass, wenn bei dem Term, den man eingibt, beim minusrechnen was negatives rauskommt. Es sind auch noch einige andere Fehler drin, aber bisher geht es, dass man mit positiven Zahlen alles mit +,-,*,/ rechnen, wobei aber * immer einen höheren Stellenwert hat als / und + immer als -. Nur wenn ich an der Stelle, in der procedure Sub wo ich Stringreplace benutze, in der Klammer wo Ersatz steht, mal minus 1 rechne, geht es. Bisher geht es auch nur mit Klammern, da ich die normalen Rechnungen danach machen wollte, weil Klammern ja immer zuerst ausgerechnet werden müssen.
ausblenden volle Höhe Delphi-Quelltext
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:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Multi(Zahl1,Zahl2:integer; var Term:string);
    procedure Add(Zahl1,Zahl2:integer; var Term:string);
    procedure Sub(Zahl1,Zahl2:integer; var Term:string);
    procedure Divi(Zahl1,Zahl2:integer; var Term:string);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.text := '';
end;

procedure TForm1.Button1Click(Sender: TObject);
var Eingabe,Klammer,Klammer2:string; PosKlammerauf,PosKlammerzu,i,zahl1,zahl2:integer;
begin
  Eingabe:=Edit1.Text;
  repeat
  begin
  posklammerzu := 0;
  Posklammerauf:=0;
  i:=0;
  repeat
  begin
    if eingabe[i] ='(' then
    begin
      posklammerauf := i ;
    end;
    if eingabe[i] =')' then
    begin
      posklammerzu  := i ;
    end;
    i:=i+1;
    end
    until
    (posklammerzu <> 0or (i=length(eingabe)+1);
    Klammer:= Copy(Eingabe,Posklammerauf,posklammerzu-posklammerauf+1);
    Klammer2:=Klammer;
    Memo1.Text:=Klammer;

if pos('*',Klammer)>0 then                                               //hier müsste es doch mit einer repeat schleife möglich sein, mal und geteilt immer in der
begin                                                                    //richtigen Reihenfolge zu rechnen, oder nicht?  
  Multi(Zahl1,Zahl2,Klammer);
end;
if pos('/',Klammer)>0 then
begin
  Divi(Zahl1,Zahl2,Klammer);
end;



if pos('+',Klammer)>0 then
begin
  Add(Zahl1,Zahl2,Klammer);
end;
if pos('-',Klammer)>0 then
begin
  Sub(Zahl1,Zahl2,Klammer);
end;
Eingabe:=Stringreplace(Eingabe,Klammer2,copy(Klammer,2,length(Klammer)-2),[rfreplaceall]);
Memo1.Text:=Memo1.Text + Klammer+ Eingabe;
end
until
pos('(',Eingabe)=0;
end;

procedure Tform1.Multi(zahl1,zahl2:integer ;var Term:string);
var s,t,Ersatz:extended;
begin
    repeat
    s:=1;
    t:=1;
    if pos('*',Term)>0 then
    begin
      zahl1:= pos('*',Term) ;
      repeat
      begin
        zahl1:= zahl1-1 ;
        if (Term[zahl1] = '('or (Term[zahl1] = '+')
        or (Term[zahl1] = '-'or (Term[zahl1] = '*')
        or (Term[zahl1] = '/'then
        s:=0;
      end
      until
      s= 0 ;
      zahl2:= pos('*',Term) ;
      repeat
      begin
        zahl2:= zahl2+1 ;
        if (Term[zahl2] = ')'or (Term[zahl2] = '+')
        or (Term[zahl2] = '-'or (Term[zahl2] = '*')
        or (Term[zahl2] = '/'then
        t:=0;
      end
      until
      t= 0 ;

     Ersatz:=StrToFloat(Copy(Term,Zahl1+1,pos('*',Term)-Zahl1-1))*
     StrToFloat(Copy(Term,pos('*',Term)+1,Zahl2-pos('*',Term)-1));
     Term:=Stringreplace(Term,Copy(Term,Zahl1+1,Zahl2-1-Zahl1),
     FloatToStr(Ersatz),[rfreplaceall]);
     end;
   until pos('*',Term)=0;
end;

procedure Tform1.Add(zahl1,zahl2:integer ;var Term:string);
var s,t,Ersatz:extended;
begin
    repeat
    s:=1;
    t:=1;
    if pos('+',Term)>0 then
    begin
      zahl1:= pos('+',Term) ;
      repeat
      begin
        zahl1:= zahl1-1 ;
        if (Term[zahl1] = '('or (Term[zahl1] = '+')
        or (Term[zahl1] = '-'or (Term[zahl1] = '*')
        or (Term[zahl1] = '/'then
        s:=0;
      end
      until
      s= 0 ;
      zahl2:= pos('+',Term) ;
      repeat
      begin
        zahl2:= zahl2+1 ;
        if (Term[zahl2] = ')'or (Term[zahl2] = '+')
        or (Term[zahl2] = '-'or (Term[zahl2] = '*')
        or (Term[zahl2] = '/'then
        t:=0;
      end
      until
      t= 0 ;

     Ersatz:=StrToFloat(Copy(Term,Zahl1+1,pos('+',Term)-Zahl1-1))+
     StrToFloat(Copy(Term,pos('+',Term)+1,Zahl2-pos('+',Term)-1));
     Term:=Stringreplace(Term,Copy(Term,Zahl1+1,Zahl2-1-Zahl1),
     FloatToStr(Ersatz),[rfreplaceall]);
    end
   until pos('+',Term)=0;
end;
procedure Tform1.Sub(Zahl1,Zahl2:integer; var Term:string);
var s,t,Ersatz:extended;
begin
    repeat
    s:=1;
    t:=1;
    if pos('-',Term)>0 then
    begin
      zahl1:= pos('-',Term) ;
      repeat
      begin
        zahl1:= zahl1-1 ;
        if (Term[zahl1] = '('or (Term[zahl1] = '+')
        or (Term[zahl1] = '-'or (Term[zahl1] = '*')
        or (Term[zahl1] = '/'then
        s:=0;
      end
      until
      s= 0 ;
      zahl2:= pos('-',Term) ;
      repeat
      begin
        zahl2:= zahl2+1 ;
        if (Term[zahl2] = ')'or (Term[zahl2] = '+')
        or (Term[zahl2] = '-'or (Term[zahl2] = '*')
        or (Term[zahl2] = '/'then
        t:=0;
      end
      until
      t= 0 ;

     Ersatz:=StrToFloat(Copy(Term,Zahl1+1,pos('-',Term)-Zahl1-1))-
     StrToFloat(Copy(Term,pos('-',Term)+1,Zahl2-pos('-',Term)-1));
     Term:=Stringreplace(Term,Copy(Term,Zahl1+1,Zahl2-1-Zahl1),
     FloatToStr(Ersatz),[rfreplaceall]);                                       // FloatToStr(Ersatz*-1) funktioniert, dann werden halt nur keine negativen Zahlen gezeigt
     end;
   until pos('-',Term)=0;
end;

procedure Tform1.Divi(Zahl1,Zahl2:integer; var Term:string);
var s,t,Ersatz:extended;
begin
    repeat
    s:=1;
    t:=1;
    if pos('/',Term)>0 then
      zahl1:= pos('/',Term) ;
      repeat
      begin
        zahl1:= zahl1-1 ;
        if (Term[zahl1] = '('or (Term[zahl1] = '+')
        or (Term[zahl1] = '-'or (Term[zahl1] = '*')
        or (Term[zahl1] = '/'then
        s:=0;
      end
      until
      s= 0 ;
      zahl2:= pos('/',Term) ;
      repeat
      begin
        zahl2:= zahl2+1 ;
        if (Term[zahl2] = ')'or (Term[zahl2] = '+')
        or (Term[zahl2] = '-'or (Term[zahl2] = '*')
        or (Term[zahl2] = '/'then
        t:=0;
      end
      until
      t= 0 ;

     Ersatz:=StrToFloat(Copy(Term,Zahl1+1,pos('/',Term)-Zahl1-1))/
     StrToFloat(Copy(Term,pos('/',Term)+1,Zahl2-pos('/',Term)-1));
     Term:=Stringreplace(Term,Copy(Term,Zahl1+1,Zahl2-1-Zahl1),
     FloatToStr(Ersatz),[rfreplaceall]);                                          

   until
   pos('/',Term)=0;
end;
end.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 06.11.11 15:55 
Hier liegt Deine Fehler, Ende von Sub
ausblenden Delphi-Quelltext
1:
2:
   until pos('-',Term)=0;
end;


Such mal im Web nach Parser9, ist Free und als Source vorhanden, dort gib es reichlich Anregungen wie man os etwas richtig umsetzt.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS