Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi arrays vergleichen (https://www.delphipraxis.net/10541-arrays-vergleichen.html)

dinu_ch 20. Okt 2003 21:26


arrays vergleichen
 
hallo

ich bastle da newbie-mässig ein lotto-programm zusammen und möchte arrys verwenden, der anfang sieht so aus :

Delphi-Quellcode:
program lotto;

{$APPTYPE CONSOLE}

uses
  SysUtils;

// Prozedru zum Check ob Text oder Zahl

  procedure readint(var x:integer);

var
  str          : string;      //Eingabevariable
  inp,code     : integer;     // Umwandlungsvariable

begin
   repeat
     readln(str);
     val(str,x,code);
     if (code <> 0) then Write(' Keine Zahl eingegeben - nochmals : ')
     until (code = 0);
end;

var
arr:array[1..7 ] of integer;
arrz:array[1..6 ] of integer;
i,j:integer;

begin

// Zahlen ziehen

  randomize;
  repeat
  for i:=1 to 7 do
  arr[i]:=random(49)+1;
  until (arr[1] <> arr[2]) and (arr[1] <> arr[3]) and
        (arr[1] <> arr[4]) and (arr[1] <> arr[5]) and
        (arr[1] <> arr[6]) and (arr[2] <> arr[3]) and
        (arr[2] <> arr[4]) and (arr[2] <> arr[5]) and
        (arr[2] <> arr[6]) and (arr[3] <> arr[4]) and
        (arr[3] <> arr[5]) and (arr[3] <> arr[6]) and
        (arr[4] <> arr[5]) and (arr[4] <> arr[6]) and
        (arr[5] <> arr[6]) and (arr[1] <> arr[7]) and
        (arr[2] <> arr[7]) and (arr[3] <> arr[7]) and
        (arr[4] <> arr[7]) and (arr[5] <> arr[7]) and
        (arr[6] <> arr[7]);
  writeln;
  writeln(' Lottozahlen : ',arr[1],' ',arr[2],' ',arr[3],' ',arr[4],' ',arr[5],' ',arr[6]);
  writeln(' Zusatzzahl  : ',arr[7]);
  readln;


// Tippen

begin
for j := 1 to 6 do
begin
write(' Geben Sie die ' +IntToStr(j)+ '.Zahl ein : ');
readint(arrz[j]);                                //Eingabe des i-Wertes in Array
end;

// Ausgabe Tips

writeln(arrz[1],' ',arrz[2],' ',arrz[3],' ',arrz[4],' ',arrz[5],' ',arrz[6]);
end;
readln;
end.
- Dass ich die arr[i] vergleiche sieht ziemlich hässlich aus, gibt es da eine Alternative ?
- Und wie kann ich beim arrz[j] verhindern, dass 2x das gleiche eingegeben wird ?

Grüsse

dinu_ch

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

Chewie 20. Okt 2003 21:46

Re: arrays vergleichen
 
Statt die einzelnen Indizes zu vergleichen kannst du auch den gesamten Speicherbereich, den das Array einnimmt, vergleichen:

Delphi-Quellcode:
CompareMem(@Array1, Array2, Array-Length)

trialfreak 20. Okt 2003 21:49

Re: arrays vergleichen
 
Hallo,
es gab schonmal ein Thema indem es u.a. um Lotto-Algorithmen ging.

Denn einfach immer eine Zufallszahl aus 49 auswählen entspricht nicht der wahren Wahrscheinlichkeit des Lotto-Spiels, da hier die Wahrscheinlichkeit für eine Kugel mit jedem Durchgang größer wird, also zuerst 1/49, dann 1/48, ...
[Beim Ziehen der Lotto-Zahlen werden die Kugeln ja nicht zurückgelegt]

Am besten liest du dir mal den Thread durch, dort sind auch sehr sehr interessante Lösungsalgorithmen zu finden:

http://www.delphipraxis.net/internal...to+algorithmus

BrunoT 20. Okt 2003 22:00

Re: arrays vergleichen
 
Hallo dinu_ch!

am besten ist es, beim Ziehen der Lottozahlen gleich zu testen, ob die selbe Zahl

schon gezogen worden ist

Delphi-Quellcode:
Procedure ziehe;
Var
  Test:Boolean;
  i,j,Zahl:integer;
  arr:array[1..7 ] of integer;

Begin
  randomize;
  For i:=1 to 7 Do
  Begin
    Test:=True;
    Repeat
      zahl:=random(49)+1;
      For j:=1 To 7 Do
      if arr[j] = zahl Then
         Test:=False;       {Schon mal gezogen}
    Until Test=True;
    arr[i]:=Zahl;
  end;
writeln;
writeln(' Lottozahlen : ',arr[1],' ',arr[2],' ',arr[3],' ',arr[4],' ',arr[5],' ',arr[6]);
writeln(' Zusatzzahl : ',arr[7]);
readln;
end;
Die Eingabe kann ebenfalls so gestaltet werden:



Delphi-Quellcode:
For i:=1 to 6 Do
  Begin
    Test:=True;
    Repeat
      Readln(Zahl);
      For j:=1 To 7 Do
      if arrz[j] = zahl Then
         Test:=False;       {Schon mal gezogen}
    Until Test=True;
    arrz[i]:=Zahl;
  end;
Gruss

BrunoT

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

negaH 20. Okt 2003 23:30

Re: arrays vergleichen
 
@BrunoT, lese dir den Link von Trialfreak mal genauer durch und du wirst sehen das dein Vorschlag nicht korrekt ist.

http://www.delphipraxis.net/internal...ct.php?t=10946

@dinu_ch, wenn dir ein schon fertiger Algo. nichts ausmacht dann findest du mehrere Source unter obigen Link.

Hagen

dinu_ch 21. Okt 2003 11:50

Re: arrays vergleichen
 
besten dank für eure tips, der fertige code macht mir nichts aus, im gegenteil. so sehe ich als anfänger
gerade die zusammenhänge.

maximov 21. Okt 2003 16:47

Re: arrays vergleichen
 
:? immer diese cross poster: http://www.delphi-forum.de/viewtopic...=103479#103479 :twisted:

Bei dem speziellen problem sind mengen IMHO viel geeigneter :wink:

BrunoT 21. Okt 2003 19:02

Re: arrays vergleichen
 
Hallöchen Ihr!

das mit dem Set of .. ist ja wirklich genial, manchmal sieht man den Wald vor Bäumen nicht.
Aber wie ist das mit dem Laufzeitverhalten, wenn es mehr als 5 Zahlen sind? :gruebel:

mfg

Holger

übrigens war mein Code nur ein Denkanstoss.

maximov 22. Okt 2003 14:42

Re: arrays vergleichen
 
hmm... was soll denn mit dem Laufzeitverhalten von sets sein? ...es geht doch immer um laufzeit (ausser bei compos)! Jeder wert in einem set ist genau ein bit gross, dh. bei 49 (?) möglichen lotto zahlen haben wir nur 49 bits (wegen alignment etc vermutlich 64) :wink: also tausendmal kleiner als ein array of integer.

cu, maximov.

negaH 23. Okt 2003 01:38

Re: arrays vergleichen
 
Zitat:

hmm... was soll denn mit dem Laufzeitverhalten von sets sein? ...es geht doch immer um laufzeit (ausser bei compos)! Jeder wert in einem set ist genau ein bit gross, dh. bei 49 (?) möglichen lotto zahlen haben wir nur 49 bits (wegen alignment etc vermutlich 64) also tausendmal kleiner als ein array of integer.
Falsch, wenn wir 5 aus 8 Milliarden ziehen wollen so benötigen wir nur 5 Integer mit Sets aber 1 Mb. Selbst das ermitteln der schon gezogenen Zahlen wäre mit Sets um vielfaches langsammer als mit 5 Integern.

Zudem lest euch den von mir angegebenen Link genauer durch, denn Sets können das Lotto Problem als solches nicht lösen. Einfach mal ein par Zahlen per Zufall aus 49 Set Elementen zu ziehen
ist schlicht weg falsch und simuliert nicht die Lotto Realität.

Der von mir dort aufgezeigte Algorithmus ist 1. universell, 2. korrekt und 3. am effizientesten.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz