Problem in Pascal

H

Holodoc

Guest
Ich habe ein Programm zum üben der Grundrechenarten in Pascal geschrieben. Die Fehleranalyse bei der Division und bei gemischten Aufgaben am Ende spinnt aber ein biscchen.

Danke schon mal im voraus!

===================================================


program Grundrechenarten;
uses crt,dos;
var sg,p,i,ra,hm : integer;
t,t1,t2 : real;
x,y,erg1,erg2,gzw1,gzw2,rest1,rest2,op : array[1..10] of integer;
fa : char;
h,m,s,cs : word;

procedure zufallszahlen;
begin
randomize;
case sg of
1 : begin x[p] := random(10)+1; y[p] := random(10)+1; end;
2 : begin x[p] := random(100)+1; y[p] := random(100)+1; end;
3 : begin x[p] := random(1000)+1; y[p] := random(1000)+1; end;
end;
end;

procedure time1;
begin
gettime(h,m,s,cs);
t1 := h*3600+m*60+s+cs/100;
end;

procedure time2;
begin
gettime(h,m,s,cs);
t2 := h*3600+m*60+s+cs/100;
end;

procedure operator;
begin
randomize;
op[p] := random(4)+1;
end;

procedure addition;
begin
time1;
clrscr;
while (p < 10) do begin
p := p+1;
zufallszahlen;
write(x[p],' + ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]+y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
time2;
end;

procedure subtraktion;
begin
time1;
clrscr;
while (p < 10) do begin
p := p+1;
zufallszahlen;
write(x[p],' - ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]-y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
time2;
end;

procedure multiplikation;
begin
time1;
clrscr;
while (p < 10) do begin
p := p+1;
zufallszahlen;
write(x[p],' * ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]*y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
time2;
end;

procedure division;
begin
time1;
while (p < 10) do begin
p := p+1;
clrscr;
zufallszahlen;
writeln(x[p],' / ',y[p],' = ');
writeln;
write('Ganzzahliger Wert: '); readln(gzw1[p]);
write('Rest: '); readln(rest1[p]);
gzw2[p] := x[p] div y[p];
rest2[p] := x[p] mod y[p];
if (gzw1[p] = gzw2[p]) and (rest1[p] = rest2[p]) then begin i := i+1; end;
writeln;
end;
time2;
end;

procedure gemischt;
begin
time1;
while (p < 10) do begin
p := p+1;
clrscr;
zufallszahlen;
operator;
case op[p] of
1 : begin
write(x[p],' + ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]+y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
2 : begin
write(x[p],' - ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]-y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
3 : begin
write(x[p],' * ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]*y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
4 : begin
writeln(x[p],' / ',y[p],' = ');
writeln;
write('Ganzzahliger Wert: '); readln(gzw1[p]);
write('Rest: '); readln(rest1[p]);
gzw2[p] := x[p] div y[p];
rest2[p] := x[p] mod y[p];
if (gzw1[p] = gzw2[p]) and (rest1[p] = rest2[p]) then begin i := i+1; end;
end;
end;
writeln;
end;
time2;
end;

procedure rechenartwahl;
begin
clrscr;
textcolor(white);
writeln('Wahl einer Rechenart');
textcolor(lightgray);
writeln;
writeln;
writeln('Addition',1:11);
writeln('Subtraktion',2:8);
writeln('Multiplikation',3:5);
writeln('Division',4:11);
writeln('Gemischt',5:11);
writeln;
repeat write('Auswahl: '); readln(ra); until (ra > 0) and (ra < 6);
end;

procedure schwierigkeitsgrad;
begin
clrscr;
textcolor(white);
writeln('Schwierigkeitsgrad');
textcolor(lightgray);
writeln;
writeln;
writeln('Einfach',1:12);
writeln('Mittel',2:13);
writeln('Schwer',3:13);
writeln;
repeat write('Auswahl: '); readln(sg); until (sg > 0) and (sg < 4);
end;

procedure rechnung;
begin
p := 0;
i := 0;
case ra of
1 : addition;
2 : subtraktion;
3 : multiplikation;
4 : division;
5 : gemischt;
end;
end;

procedure bewertung;
begin
clrscr;
writeln('Richtige Antworten: ',i);
writeln('Falsche Antworten: ',10-i);
t := t2-t1;
writeln('Benoetigte Zeit: ',t:0:2,' Sekunden');
writeln;
writeln;
textcolor(white);
write('Bewertung: ');
case i of
0..2 : write('0 Punkte');
3 : write('1 Punkt');
4 : write('3 Punkte');
5 : write('5 Punkte');
6 : write('7 Punkte');
7 : write('9 Punkte');
8 : write('11 Punkte');
9 : write('13 Punkte');
10 : write('15 Punkte');
end;
textcolor(lightgray);
if (i < 10) then begin
writeln;
writeln;
writeln;
writeln;
writeln;
write('Fehleranalyse erstellen (J/N)? '); repeat fa := readkey until fa in ['J','j','N','n'];
end
else begin readln; end;
end;

procedure fehleranalyse;
begin
clrscr;
textcolor(white);
writeln('Fehleranalyse');
textcolor(lightgray);
writeln;
writeln;
for p := 1 to 10 do begin
if (erg1[p] <> erg2[p]) or (gzw1[p] <> gzw2[p]) or (rest1[p] <> rest2[p]) then begin
case ra of
1 : begin writeln(x[p],' + ',y[p],' ist nicht ',erg1[p],' sondern ',erg2[p]); end;
2 : begin writeln(x[p],' - ',y[p],' ist nicht ',erg1[p],' sondern ',erg2[p]); end;
3 : begin writeln(x[p],' * ',y[p],' ist nicht ',erg1[p],' sondern ',erg2[p]); end;
4 : begin writeln(x[p],' / ',y[p],' ist nicht ',gzw1[p],' Rest ',rest1[p],' sondern ',gzw2[p],' Rest ',rest2[p]); end;
5 : begin
case op[p] of
1 : begin writeln(x[p],' + ',y[p],' ist nicht ',erg1[p],' sondern ',erg2[p]); end;
2 : begin writeln(x[p],' - ',y[p],' ist nicht ',erg1[p],' sondern ',erg2[p]); end;
3 : begin writeln(x[p],' * ',y[p],' ist nicht ',erg1[p],' sondern ',erg2[p]); end;
4 : begin writeln(x[p],' / ',y[p],' ist nicht ',gzw1[p],' Rest ',rest1[p],' sondern ',gzw2[p],' Rest ',rest2[p]); end;
end;
end;
end;
end;
end;
readln;
end;

procedure hauptmenue;
begin
clrscr;
textcolor(white);
writeln('Hauptmenue');
textcolor(lightgray);
writeln;
writeln;
writeln('Programmstart',1:6);
writeln('Programmende',2:7);
writeln;
repeat write('Auswahl: '); readln(hm); until (hm > 0) and (hm < 3);
end;

begin
repeat
hauptmenue;
if (hm = 1) then begin
rechenartwahl;
schwierigkeitsgrad;
rechnung;
bewertung;
if (fa = 'J') or (fa = 'j') then begin fehleranalyse; end;
end;
until (hm = 2);
end.
 
Die Fehleranalyse bei Addition Subtraktion und Multiplikation funtzen perfekt. Bei der Analyse von gemischten Aufgaben behauptet das Programm beispielsweise richtige Aufgaben wären falsch und schreibt sowas wie "3 + 3 ist nicht 6 sondern 6" hin. Das komische ist, dass bei der Analyse von gemischten Aufgaben auch Additionsaufgaben usw. falsch analysiert werden und nicht nur Divisionsaufgaben.

Danke schon mal!
 
Bei der Division könntest du evtl
erg[p] := x[p] / y[p];
ergb1[p] := int(erg[p]);
ergb2[p] := Frac(erg[p]);

4,6666666666...[p] := 85[p] / 56[p];
4.0[p] := int(4,6666666666...[p]);
0.6666666666...[p] := frac(4,6666666666...[p]);

dann hast du da die werte genau allerdings mußt du die Genauigkeit irgendwie einstellen . Wegen dem anderen Fehler bin ich noch am schauen!

Man is das wieder ne eingewöhnung in Pascal !!
;)
 
Danke für die Hilfe, aber das war doch garnicht mein Problem. Es geht nur um die Fehleranalyse. Ich wollte das bei der Division nicht so genau haben, weil es ein Programm für Grundschüler sein soll...
 
Mußte warten bis das Netzteil abgekühlt ist *Hat nich zufälliger weise noch einer nen Notebook Netzteil ;)*

So ich schau mir ma die Analyse an... sowie es da steht sollte bzw muß es laufen was es bei mir auch tut!
 
Hab das Problem gefunden. :)
Hier das richtige Programm:


program Grundrechenarten;
uses crt,dos;

var sg,p,i,ra,hm : integer;
x,y,op,erg1,erg2,gzw1,gzw2,rest1,rest2 : array[1..10] of integer;
h,m,s,cs : word;
t1,t2 : real;
fa : char;

procedure zufallszahlen;
begin
randomize;
case sg of
1 : begin x[p] := random(10)+1; y[p] := random(10)+1; end;
2 : begin x[p] := random(100)+1; y[p] := random(100)+1; end;
3 : begin x[p] := random(1000)+1; y[p] := random(1000)+1; end;
end;
end;

procedure time1;
begin
gettime(h,m,s,cs);
t1 := h*3600+m*60+s+cs/100;
end;

procedure time2;
begin
gettime(h,m,s,cs);
t2 := h*3600+m*60+s+cs/100;
end;

procedure operator;
begin
randomize;
op[p] := random(4)+1;
end;

procedure addition;
begin
time1;
clrscr;
for p := 1 to 10 do begin
zufallszahlen;
op[p] := 1;
write(x[p],' + ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]+y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
time2;
end;

procedure subtraktion;
begin
time1;
clrscr;
for p := 1 to 10 do begin
zufallszahlen;
op[p] := 2;
write(x[p],' - ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]-y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
time2;
end;

procedure multiplikation;
begin
time1;
clrscr;
for p := 1 to 10 do begin
zufallszahlen;
op[p] := 3;
write(x[p],' * ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]*y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
time2;
end;

procedure division;
begin
time1;
for p := 1 to 10 do begin
clrscr;
zufallszahlen;
op[p] := 4;
writeln(x[p],' / ',y[p],' = ');
writeln;
write('Ganzzahliger Wert: '); readln(gzw1[p]);
write('Rest: '); readln(rest1[p]);
gzw2[p] := x[p] div y[p];
rest2[p] := x[p] mod y[p];
if (gzw1[p] = gzw2[p]) and (rest1[p] = rest2[p]) then begin i := i+1; end;
writeln;
end;
time2;
end;

procedure gemischt;
begin
time1;
for p := 1 to 10 do begin
clrscr;
zufallszahlen;
operator;
case op[p] of
1 : begin
write(x[p],' + ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]+y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
2 : begin
write(x[p],' - ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]-y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
3 : begin
write(x[p],' * ',y[p],' = '); readln(erg1[p]);
erg2[p] := x[p]*y[p];
if (erg1[p] = erg2[p]) then begin i := i+1; end;
end;
4 : begin
writeln(x[p],' / ',y[p],' = ');
writeln;
write('Ganzzahliger Wert: '); readln(gzw1[p]);
write('Rest: '); readln(rest1[p]);
gzw2[p] := x[p] div y[p];
rest2[p] := x[p] mod y[p];
if (gzw1[p] = gzw2[p]) and (rest1[p] = rest2[p]) then begin i := i+1; end;
end;
end;
writeln;
end;
time2;
end;

procedure rechenartwahl;
begin
clrscr;
textcolor(white);
writeln('Wahl einer Rechenart');
textcolor(lightgray);
writeln;
writeln;
writeln('Addition',1:11);
writeln('Subtraktion',2:8);
writeln('Multiplikation',3:5);
writeln('Division',4:11);
writeln('Gemischt',5:11);
writeln;
repeat write('Auswahl: '); readln(ra); until (ra > 0) and (ra < 6);
end;

procedure schwierigkeitsgrad;
begin
clrscr;
textcolor(white);
writeln('Schwierigkeitsgrad');
textcolor(lightgray);
writeln;
writeln;
writeln('Einfach',1:12);
writeln('Mittel',2:13);
writeln('Schwer',3:13);
writeln;
repeat write('Auswahl: '); readln(sg); until (sg > 0) and (sg < 4);
end;

procedure rechnung;
begin
for p := 1 to 10 do begin
erg1[p] := 0;
erg2[p] := 0;
gzw1[p] := 0;
gzw2[p] := 0;
rest1[p] := 0;
rest2[p] := 0;
end;
p := 0;
i := 0;
case ra of
1 : addition;
2 : subtraktion;
3 : multiplikation;
4 : division;
5 : gemischt;
end;
end;

procedure bewertung;
begin
clrscr;
writeln('Richtige Antworten: ',i);
writeln('Falsche Antworten: ',10-i);
writeln('Benoetigte Zeit: ',t2-t1:0:2,' Sekunden');
writeln;
writeln;
textcolor(white);
write('Bewertung: ');
case i of
0..2 : write('0 Punkte');
3 : write('1 Punkt');
4 : write('3 Punkte');
5 : write('5 Punkte');
6 : write('7 Punkte');
7 : write('9 Punkte');
8 : write('11 Punkte');
9 : write('13 Punkte');
10 : write('15 Punkte');
end;
textcolor(lightgray);
if (i < 10) then begin
writeln;
writeln;
writeln;
writeln;
writeln;
write('Fehleranalyse erstellen (J/N)? ');
repeat fa := readkey until fa in ['J','j','N','n'];
end
else begin
fa := 'n';
readln;
end;
end;

procedure fehleranalyse;
begin
clrscr;
textcolor(white);
writeln('Fehleranalyse');
textcolor(lightgray);
writeln;
writeln;
for p := 1 to 10 do begin
if (erg1[p] <> erg2[p]) or (gzw1[p]+rest1[p] <> gzw2[p]+rest2[p]) then begin
case op[p] of
1 : begin writeln(x[p],' + ',y[p],' ist nicht ',erg1[p],' sondern ',erg2[p]); end;
2 : begin writeln(x[p],' - ',y[p],' ist nicht ',erg1[p],' sondern ',erg2[p]); end;
3 : begin writeln(x[p],' * ',y[p],' ist nicht ',erg1[p],' sondern ',erg2[p]); end;
4 : begin
write(x[p],' / ',y[p],' ist nicht ',gzw1[p],' Rest ',rest1[p]);
writeln(' sondern ',gzw2[p],' Rest ',rest2[p]);
end;
end;
end;
end;
readln;
end;

procedure hauptmenue;
begin
clrscr;
textcolor(white);
writeln('Hauptmenue');
textcolor(lightgray);
writeln;
writeln;
writeln('Programmstart',1:6);
writeln('Programmende',2:7);
writeln;
repeat write('Auswahl: '); readln(hm); until (hm > 0) and (hm < 3);
end;

begin
repeat
hauptmenue;
if (hm = 1) then begin
rechenartwahl;
schwierigkeitsgrad;
rechnung;
bewertung;
if (fa = 'J') or (fa = 'j') then begin fehleranalyse; end;
end;
until (hm = 2);
end.
 
Mist jetzt wollte ich in alter Pascal-Nostalgie schwelgen und der findet den Fehler von allein :D
Waren Pascal noch Zeiten *zurückerinner*, würd ich auch gern mal wieder machen... ist auf jedenfall besser als den scheiß den ich jetzt in der Schule machen muss, Assambler Programieren :kotz:
 
Zurück
Oben