AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

LottoTippErstellen

Ein Thema von YXCVBNM1 · begonnen am 1. Sep 2011 · letzter Beitrag vom 2. Sep 2011
Antwort Antwort
Seite 1 von 2  1 2      
YXCVBNM1

Registriert seit: 4. Dez 2010
12 Beiträge
 
#1

LottoTippErstellen

  Alt 1. Sep 2011, 23:45
Hallo,

ich hab mal in der Suchfunktion geguckt, aber immer nur Threads gefunden in denen Lottozahlen erstellt werden sollen. Ich will aber einen LottoTippZettel erstellen. Man soll die Anzahl an Tipps angeben können die man abgibt und daraufhin sollen einem genau so viele 6er Lotto Tipps erstellt werden. Dazu habe ich folgendes geschrieben:

Delphi-Quellcode:
unit ULotto;

interface
type TLotto=class
private
Tipp:array of array of word;
public
procedure LottoTippErstellen(Anzahl:integer);
procedure SetTipp(x,y,Wert:integer);
end;

implementation

procedure TLotto.SetTipp(x,y,Wert:integer);
begin
Tipp[x,y]:=Wert;
end;

procedure TLotto.LottoTippErstellen(Anzahl: Integer);
VAR n,m,o:integer;
korekt:boolean;
begin
korekt:=false;
SetLength(Tipp,0,0);
SetLength(Tipp,Anzahl,6);
  For n:=1 to Anzahl do
  begin
    For m:=1 to 6 do
    begin
    Repeat
    korekt:=true;
    SetTipp(n,m,(random(49)+1));
      For o:=0 to m-1 do
      begin
      IF Tipp[n,m]=Tipp[n,o] then korekt:=false;
      end;
    Until korekt=true;
    end;
  end;
end;

end.
Das komische ist nur: Wenn ich diese Prozedur mit Anzahl=1 aufrufe funktioniert sie. Rufe ich sie mit Anzahl=2 auf funktioniert sie nicht mehr. Dann kommt die Fehlermeldung "Zugriffsverletzung bei Adresse 0045845A5". Leider finde ich den Fehler nicht.

Ich wäre euch sehr dankbar wenn mir jemande helfen könnte
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: LottoTippErstellen

  Alt 2. Sep 2011, 00:03
Dynamische Arrays sind nullbasierend. Kontrolliere deinen Quellcode daraufhin noch mal.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
YXCVBNM1

Registriert seit: 4. Dez 2010
12 Beiträge
 
#3

AW: LottoTippErstellen

  Alt 2. Sep 2011, 00:17
Achja genau. Das war der Fehler. Vielen Danke Jetzt funktioniert es
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: LottoTippErstellen

  Alt 2. Sep 2011, 00:19
Tipp: Projektoptionen > Bereichsprüfung aktivieren (prüft z.B. die Indize von Arrayzugriffen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: LottoTippErstellen

  Alt 2. Sep 2011, 00:24
Zudem bietet es sich ja bei OOP an hier etwas feiner zu gliedern:

Delphi-Quellcode:
type

  TLottoTipp = array [1..49] of Boolean;

  TLottoFeld = class
  private
    FTipp : TLottoTipp;
  public
    constructor Create;
    procedure Reset; // alle Felder zurücksetzen
    procedure FillUp;
  end;
 
procedure TLottoFeld.Reset;
var
  idx : integer;
begin
  for idx := Low( FTipp ) to High( FTipp ) do
    FTipp[ idx ] := False;
end;

constructor Create;
begin
  inherited;
  Reset;
end;

procedure TLottoFeld.FillUp;
var
  idx, Value : integer;
begin
  Reset;
  for idx := 1 to 6 do
    begin
      repeat
        Value := Random( High( FTipp ) - Low( FTipp ) - 1 ) + Low( FTipp ); // Falls das mal nicht bei 1 anfängt =;0)
      until not FTipp[ Value ];
      FTipp[ Value ] := True;
    end;
end;
Jetzt nur noch eine "Sammelklasse" drüberziehen und einen Zugriff auf die Tippfelder gelegt und schon ist die gesamte Klasse fertig
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 2. Sep 2011 um 00:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: LottoTippErstellen

  Alt 2. Sep 2011, 00:31
oder TLottoTipp = array[1..6] of 1..49; aka TLottoTipp = array[1..6] of Byte; (andersrum gespeichert, mit fast 'nem 8-tel an Speicher)
  • Vorteil: einfach auf bestimmte Zahl zu prüfen, da Direktzugriff über Index
  • Nachteil: Auflisten der Zahlen unpraktischer, da alle 49 Werte durchlaufen werden muß

oder TLottoTipp = set of 1..49; (das Gleiche, wie array of Boolean, nur mit einem Achtel an Speicherverbrauch)
  • Vorteil: einfacher Aufzulisten, da alle gesetzen/gezogenen Zahlen direkt ausgelesen werden können (6 Zugriffe per Index)
  • Nachteil: Prüfen auf eine Zahl ist schwerer, da alle 0 bis 6 schon gesetzen Werte verglichen werden müssen

(wer es ganz schnell/einfach braucht, nimmt einfach Beides gleichzeitig, also array[1..49] of Boolean und array[1..6] of Byte )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Sep 2011 um 00:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: LottoTippErstellen

  Alt 2. Sep 2011, 00:34
oder TLottoTipp = array[1..6] of 1..49; aka TLottoTipp = array[1..6] of Byte;
Ei jo, aber das Prüfen auf Doppelte geht da nicht so schön
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: LottoTippErstellen

  Alt 2. Sep 2011, 00:42
oder TLottoTipp = set of 1..49; (das Gleiche, wie array of Boolean, nur mit einem Achtel an Speicherverbrauch)
Und trotzdem ist das Bool-Array hierbei schicker, da durch einfache Änderung des Arrays auf TLottoTipp = array [1..64] of Boolean; die Klasse immer noch funktioniert.

Und um es ganz flexibel zu gestalten könnte man ein dynamisches Array benutzen und dem Create als Parameter die Anzahl der Tippfelder und Tipps mitgeben

Delphi-Quellcode:
type

  TLottoFeld = class
  private
    FTipp : array of Boolean;
    FMarks : integer;
  public
    constructor Create( AFieldCount, AMarks : integer );
    destructor Destroy; override;
    procedure Reset; // alle Felder zurücksetzen
    procedure FillUp;
  end;
 
procedure TLottoFeld.Reset;
var
  idx : integer;
begin
  for idx := Low( FTipp ) to High( FTipp ) do
    FTipp[ idx ] := False;
end;

constructor TLottoFeld.Create( AFieldCount, AMarks : integer );
begin
  inherited;
  SetLength( FTipp, AFieldCount + 1 );
  FMarks := AMarks;
  Reset;
end;

destructor TLottoFeld.Destroy;
begin
  SetLength( FTipp, 0 );
  inherited;
end;

procedure TLottoFeld.FillUp;
var
  idx, Value : integer;
begin
  Reset;
  for idx := 1 to FMarks do
    begin
      repeat
        Value := Random( High( FTipp ) + 1 );
      until not FTipp[ Value ];
      FTipp[ Value ] := True;
    end;
end;
Jetzt sind die Tipp-Felder allerdings 0 basierend jedoch auch für die Zukunft gerüstet, falls sich beim Lotto mal was ändert
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 2. Sep 2011 um 00:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

AW: LottoTippErstellen

  Alt 2. Sep 2011, 00:49
Zitat:
Ei jo, aber das Prüfen auf Doppelte geht da nicht so schön
Jupp, hatte inzwischen noch was dazueditiert

Hat Beides also seine Vor-/Nachteile

versuch bei dem array of bool mal die gesetzten Zahlen aufzulisten ... muß man erstmal suchen
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: LottoTippErstellen

  Alt 2. Sep 2011, 00:53
versuch bei dem array of bool mal die gesetzten Zahlen aufzulisten ... muß man erstmal suchen
Dann machen wir ein Kombi aus beiden Vorschlägen, das Bool-Array zum Tipp erstellen und das Byte-Array zum ausgeben
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.
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