PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : turbo pascal hilfäää! (klasse 11)


(del)
2004-04-27, 19:33:16
wir sollen ein programm schreiben, das lottozahlen ausgibt. mit arrays. und logischerweise darf jede zahl nur einmal vorkommen... also hab ich mir folgendes ausgedacht... aber der hängt sich ohne ersichtlichen grudn in zeile 15 auf, als wärs ne endlossschleife...


program lottozahlenzufall;
uses crt;
var lottozahl : array[1..9] of integer;

procedure zufall;
var i, c, test: integer;
begin
randomize;
i:=0;
repeat
i:=i+1;
repeat
test:=0;
lottozahl[i]:=round(random(48))+1;
c:=0;
repeat
c:=c+1;
if lottozahl[c]=lottozahl[i] then
begin
test:=1;
end;
until c=9;
until test=0;
writeln(lottozahl[i]);
until i=9;
end;


begin
clrscr;
zufall;
readln;
end.


warum funktioniert das nicht?

Gast
2004-04-27, 20:38:40
Der Fehler steckt imo hier:


repeat
test:=0;
lottozahl:=round(random(48))+1;
c:=0;
repeat
c:=c+1;
if lottozahl[c]=lottozahl[i] then
begin
test:=1;
end;
until c=9;
until test=0;


In diesem Fragment wird i nicht weitergezählt. Das heisst i ist immer 1. Also ist die Abfrage if lottozahl[c]=lottozahl[i] beim ersten Durchlauf immer wahr und test wird 1. Deshalb wird die Schleife nicht verlassen.

(del)
2004-04-27, 20:48:09
ääh nein. der fängt dann doch oben wieder an, sucht sich ne neue zahl aus (random...) setzt test wieder auf null und prüft ob die zufallszahl schon existiert, tut sie das fängt er wieder von vorne an...

Brillus
2004-04-27, 21:16:11
Was er meint ist das wenn du hochzähltst du irgendwann die Zahl mit sich selbst vergleichst was immer wahr isr du musst einen Zähler mitlaufen lassen wo angibt wieviel du schon hast

so zum beispiel ( nicht getestet)

repeat
test:=0;
lottozahl[i]:=round(random(48))+1;
for c=0 to i-1 do
begin
if lottozahl[c]=lottozahl[i] then
begin
test:=1;
end;
end;
until test=0;


Nachtrag falls du dich nicht so im Forum auskennen solltest(hab deinen Status nicht geschaut) oben auf der Raute kannst du einen Codtag einfügen und dann bleiben die einrücken zwischen dem Tag erhalten das macht den Cod weitaus lesbarer

(del)
2004-04-27, 21:29:15
ich glaub ich versteh jetzt, ich guxx mir nochmal an. danke für dne tip mim code, wusste ich noch nicht..

Gast
2004-04-27, 21:30:17
Okay. Zuerst habe ich mal i durch x ersetzt, da i in eckigen Klammern die Kursivschrift hier im Board einleitet.

Durchlauf:

x=1
wiederhole
test=0
lottozahl[x=1]=irgendwas
c=0
wiederhole
c=c+1
wenn lottozahl[c=1]=lottozahl[x=1] dann
test=1
(das trifft immer zu!)
bis c=9 (völlig egal, da test ja schon 1 ist)
bis test=0 (test ist aber 1 und wird an dieser Stelle nie 0 sein)

In der Abfrage lottozahl[c]=lottozahl[x] ist x immer 1 und c auch immer 1 beim ersten Durchlauf.
Beim nächsten Durchlaufen der Schleife hat sich an x nichts geändert. Es ist weiterhin 1. Und c setzt du ja zuerst auf 0 und zählst dann 1 dazu. Also sind x und c beide wieder 1. Also ist test auch immer 1.

Gast
2004-04-27, 21:47:39
Lösungsvorschlag (ungetestet):


begin
randomize;
i:=0;
repeat
i:=i+1;
lottozahl[i]:=round(random(48))+1;
...
writeln(lottozahl[i]);
until i=9;
end;

Das ist erstmal die Schleife, die 9(?) Lottozahlen ausgibt. An die Stelle mit den Punkten muss jetzt die Abfrage, ob die Lottozahl schon mal gezogen wurde.


c:=0;
repeat
c:=c+1;
{Wenn c und i gleich sind, brauchen wir keinen Test!}
if c<>i then
begin
if lottozahl[c]=lottozahl[i] then
{Lottozahl gibt es schon!}
begin
{Nochmal ziehen}
lottozahl[i]:=round(random(48))+1;
{Prüfung erneut starten}
c:=0;
end;
end;
until c=9;

(del)
2004-04-27, 23:09:36
juhuuu, eben hats klick gemacht, ich habs geschafft !!!1111 :D

program lottozahlenzufall;
uses crt;
var lottozahl : array[1..9] of integer;
lottoeingabe : array[1..9] of integer;
i : integer;
procedure zufall;
var i, c, test: integer;
begin
randomize;
i:=0;
repeat
i:=i+1;
repeat
test:=0;
lottozahl[i]:=round(random(48))+1;
c:=0;

repeat

c:=c+1;
if c=i then c:=c+1;
if lottozahl[c]=lottozahl[i] then
begin
test:=1;
end;
until c>=9;
until test=0;
until i=9;

end;


begin
i:=0;
clrscr;
writeln('zahlen der reihe nach eingeben');
repeat
i:=i+1;
readln(lottoeingabe[i]);
until i=9;

zufall;
readln;
end.

Marcel
2004-04-29, 18:02:33
Und wenn Du richtig Eindruck schinden willst, dann machst Du folgendes:

1. Füll eine verkettete Liste mit 49 Elementen, nämlich den Zahlen 1 bis 49.
2. Mach folgendes 9 mal:
a) zieh eine Zufallszahl x aus dem Bereich 1 bis (50 - <Nummer der gezogenen Zahl>)
b) Spring zu dem Element Nr. x in der Liste
c) gib die gezogene Zahl aus oder pack sie in Dein 9er Array
d) lösch das Element aus der Liste

(del)
2004-04-29, 19:02:44
thanks... :)