Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Bruchrechnen verursacht Absturz


Leftout - Mo 08.05.06 09:12
Titel: Bruchrechnen verursacht Absturz
HI

ich hab den Quellcode von einen Bruchrechen Programm im Netz gefunden und wollte den jetzt ein bisschen umbauen. Zum Beispiel stürzt das Programm ab wenn zwei edit Felder (da werden sonst die Lösungen von Aufgaben rein geschrieben) leer sind. Jetzt wollte ich diesen Fehler beheben indem ich schreib :
Wenn Edit.text leer dann tu nichts ansonsten Rechne :wink:


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:
   unit uBruchrechnen;

interface

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

type
TfrmBruchrechnen = class(TForm)
lblZ1: TLabel;
lblN1: TLabel;
lblN2: TLabel;
lblZ2: TLabel;
Label5: TLabel;
Label6: TLabel;
edtZ: TEdit;
edtN: TEdit;
btnAufgabe: TButton;
btnPruefen: TButton;
btnAnzeige: TButton;
    Label1: TLabel;
    Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure btnAufgabeClick(Sender: TObject);
procedure btnPruefenClick(Sender: TObject);
procedure btnAnzeigeClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
private
procedure SummeBerechnen(z1,n1,z2,n2: Integer; var zerg,nerg,q: integer);
function ggT(a,b: integer):integer;
function Maximum(z1,z2: integer):integer;
function Minimum(z1,z2: integer):integer;
public
{ Public-Deklarationen }
end;

var
frmBruchrechnen: TfrmBruchrechnen;
z1,z2,zerg,n1,n2,nerg,q,gg: integer;
implementation

{$R *.DFM}

procedure TfrmBruchrechnen.FormCreate(Sender: TObject);
begin
randomize;
end;

procedure TfrmBruchrechnen.btnAufgabeClick(Sender: TObject);
begin
z1:=random(10)+1;
z2:=random(10)+1;
n1:=random(10)+1;
n2:=random(10)+1;

lblZ1.caption:=IntToStr(z1);
lblZ2.caption:=IntToStr(z2);
lblN1.caption:=IntToStr(n1);
lblN2.caption:=IntToStr(n2);
end;

procedure TfrmBruchrechnen.SummeBerechnen(z1,n1,z2,n2: Integer; var zerg,nerg,q: integer);
begin
If NOT (edtN.Text = '')and  (edtz.Text = ''then
zerg:=z1*n2+z2*n1;
nerg:=n1*n2;
q:=ggT(zerg,nerg);
 zerg:=zerg div q;
 nerg:=nerg div q;
end;

function TfrmBruchrechnen.Maximum(z1,z2: integer):integer;
begin
if z1>z2 then result:=z1 else result:=z2;
end;

function TfrmBruchrechnen.Minimum(z1,z2: integer):integer;
begin
if z1<z2 then result:=z1 else result:=z2;
end;

function TfrmBruchrechnen.ggT(a,b: integer):integer;
var
c,max,min: integer;
begin
if a<=b then begin
c:=a;
a:=b;
b:=c;
end;
while b<>0 do begin
max:=Maximum(a,b);
min:=Minimum(a,b);
a:=max - min;
b:=min;
end;
result:=a;
//gg := result;
end;



procedure TfrmBruchrechnen.btnPruefenClick(Sender: TObject);
var
zu, nu: integer;
begin
zerg:=0;
nerg:=0;
q:=0;
SummeBerechnen(z1,n1,z2,n2,zerg,nerg,q);
zu:=StrtoInt(edtZ.text);
nu:=StrtoInt(edtN.text);
if (zerg=zu) and (nerg=nu) then Showmessage('Ergebnis richtig!')
else if (zerg <> zu) and (nerg  <> nu) then Showmessage ('Leider falsch') ;
//else showmessage ('Bitte Ergebnis eintragen');
end;

procedure TfrmBruchrechnen.btnAnzeigeClick(Sender: TObject);
begin
zerg:=0;
nerg:=0;
q:=0;
SummeBerechnen(z1,n1,z2,n2,zerg,nerg,q);
edtZ.text:=IntToStr(zerg);
edtN.text:=IntToStr(nerg);
end;

procedure TfrmBruchrechnen.Button1Click(Sender: TObject);
begin
label1.Caption := InttOSTR(ggT(zerg,nerg));//IntToStr(gg); //ggt(zerg,erg
end;

end.



Der genau Bereich um den es geht ist:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TfrmBruchrechnen.SummeBerechnen(z1,n1,z2,n2: Integer; var zerg,nerg,q: integer);
begin
If NOT (edtN.Text = '')and  (edtz.Text = ''then
zerg:=z1*n2+z2*n1;
nerg:=n1*n2;
q:=ggT(zerg,nerg);
 zerg:=zerg div q;
 nerg:=nerg div q;
end;


Woran kann das liegen das das Programm trozdem abstürzt?

Danke schon mal im vorraus


jasocul - Mo 08.05.06 09:25


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TfrmBruchrechnen.SummeBerechnen(z1,n1,z2,n2: Integer; var zerg,nerg,q: integer);
begin
  If NOT ((edtN.Text = ''or (edtz.Text = '')) then
  begin
    zerg:=z1*n2+z2*n1;
    nerg:=n1*n2;
    q:=ggT(zerg,nerg);
    zerg:=zerg div q;
    nerg:=nerg div q;
  end;
end;


Jetstream - Mo 08.05.06 10:31

jasucul hat recht.
so wie du est geschrieben hattest, bezieht sich das 'NOT' nur auf die erste Klammer.


jasocul - Mo 08.05.06 10:43

Wenn wir dann schon Erläuterungen geben:
Das "and" war auch falsch und der Bedingungsblock hatte kein "begin..end".
Außerdem ist nicht klar, was mit den Rückgabewerten passieren soll, wenn die Bedingung nicht erfüllt ist. Es fehlt theoretisch das "else".

Und überhaupt werde ich in der Mitte mit einem "o" geschrieben. :motz: :zwinker:


Leftout - Mo 08.05.06 17:36

danke

läuft prima... ich hab wohl noch was geändert weil sonst wenn man zwei mal klickt q gleich null ist und man bekanntlich nicht durch Null teilen darf.