Autor Beitrag
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Mi 20.10.04 17:10 
Hallo.
Ich habe ein Problem, und zwar funktioniert das Programm nicht so, wie ich es gerne hätte.
Das Programm soll Zufallszahlen erzeugen, und zwar zwischen 0 und 4. Also mit dem Befehl random(5).
Dann soll es Fünfmal eine Zufallszahl erzeugen, und dann soll noch kontrolliert werden, ob diese Zahl bereits vorher einmal erzeugt worden ist. Wenn ja, soll nochmal eine Zufallszahl erzeugt werden, solange bis ich fünf verschieden Zufallszahlen habe. In diesem Fall konkret wäre es also ein Programm, dass mir die Ziffen 0-4 in einer zufälligen Reihenfolge anzeigt.
Folgenden Programmcode habe ich mir dafür Entwickelt:
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:
var i,z,u:integer;
    zahl:array [1..5] of integer;//Speichert die Zufallszahlen
    gleich:boolean;
    eingabe:string;
begin
randomize;
i:=0;
gleich:=false;
repeat
  begin
  i:=i+1;
  zahl[i]:=random(5);//i. ZUfallszahl abspeichern
  if (i>=2) then//Ab der Zweiten Zahl die Kontrolle
     begin
     z:=0;
     repeat
       begin
       z:=z+1;
       if (zahl[i]=zahl[z]) then//Wenn erzeugte Zahl = vorherige Zufallszahl
          begin
          i:=i-1;//Um wieder auf die Alte position zu kommen, um die schon Vorhandene Zahl zu "überschreiebn"
          gleich:=true;
          end;
       end;
     until (((z>=i-1) and (gleich=false)) or (gleich=true));
     end;
  end;
until (i>=5);//Bis die fünte Zahl erzeug tist

for u:=1 to 5 do//Ausgabe der Zahlen
    begin
    eingabe:=eingabe+inttostr(zahl[u]);
    end;
edit1.text:=eingabe;
end;

Das Programm soll dann nämlich eine Zufallszahl erzeugen.
Dann, ab der Zweiten Zahl, sollen alle Zahlen davor überprüft werdne, ob sie gleich der neuen Zufallszahl sind. Wenn ja, soll an der Selben Position eine neue Zufallszahl erzeugt werden. Ich hoffe, ihr könnt etwas durch den Code durchblicken. Ich kann den Fehler nicht finden, weil das Programm nicht das macht, wie oben beschrieben. Oder habe ich einfach nur einen Denkfehler?
Danke schonmal für Antworten.
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Mi 20.10.04 17:32 
Hallo,

folgendes sollte Dein Problem lösen:
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:
type
  TZufallArr=array[0..4] of Integer;

function MakeZufallArray:TZufallArr;
var MerkArr:TZufallArr;
    i, step:Integer;
begin
  // Rückgabearray der Funktion mit -1 vorbelegen
  FillChar(Result, SizeOf(TZufallArr), -1);

  // Merkarray vorbelegen (0 - 4)
  for i:=0 to High(MerkArr) do MerkArr[i]:=i;
  
  // Anzahl der Durchläufe initialisieren
  step:=0;
  // Schleife solange ausführen, bis 5 Durchläufe erreicht sind
  while (step<=4) do
  begin
    // Zufallszahl erzeugen
    i:=Random(5);
    // nachschauen, ob die Zahl schon vergeben wurde
    // -1 die Zahl wurde vergeben, alle anderen Zahlen stehen noch zur Verfügung
    if (MerkArr[i]<>-1) then
    begin
      // gefundene Zahl merken
      Result[step]:=MerkArr[i];
      // als gefunden markieren
      MerkArr[i]:=-1;
      // nächster Durchlauf
      Inc(step);
    end; // if
  end; // while
end; // MakeZufallArray

...
...
var zahl:TZufallArr;
  ...
  zahl:=MakeZufallArray;
  for u:=0 to High(zahl) do eingabe:=eingabe+inttostr(zahl[u]);  
  edit1.text:=eingabe;  
...
...

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)


Zuletzt bearbeitet von smiegel am Mi 20.10.04 18:09, insgesamt 2-mal bearbeitet
Kroni Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Mi 20.10.04 17:45 
ich habe mir den code mal angeschaut, kanns tdu dazu noch eine kleine erklärung schreiben, wie das funktioniert? das wäre nett.
Kroni
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Mi 20.10.04 18:03 
Hallo,

was soll ich erklären? Die Funktion?

[edit]Ich habe mein Beispiel mit Kommentaren versehen. Sind sie ausreichend?[/edit]

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Kroni Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Mi 20.10.04 22:46 
ok,ich werde mir nun mal den Code in ruhe anschauen, und mal versuchen ihn zu verstehen.
Aber mal eine frage, kannst du dich mal mit meinem Code auseinandersetzten und versuchen den zu verstehen und dann nach nem Fehler zu finden?
Das wäre super.
Danke
Kroni
Kroni Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Do 21.10.04 08:24 
ok....hab mal ne nacht drüber geschlafen, deinen code angeschaut, ihn weggelegt und mal nachprogrammiert mit nem boolschen Array zur Kontrolle usw.....
Funktioniert. Danke sehr!
Nun habe ich den Code auch verstanden.
Dann kann ich mich mal um das gesamte Problem kümmern.
Danke!