Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 6 aus 49 will nicht so richtig (https://www.delphipraxis.net/140545-6-aus-49-will-nicht-so-richtig.html)

funkuchn 20. Sep 2009 14:51


6 aus 49 will nicht so richtig
 
Hi Leute!!
Erstmal zur Erklärung, ich soll 6 aus 49 programmieren, mache das in 3 memos, im 1ten werden die zahlen eingegeben,
im 2ten lottozahlen erzeugt und im 3ten die übereinstimmungen angezeigt.
Funktionier soweit. Jetzt habe ich aber das Problem, dass ich beim Eingeben der Zahlen auch doppelte
Zahlen, wie 2,2,2 eingeben kann, keine Ahnung wie ich das Beheben soll :(
Manchmal gibt der mir dann bei den Übereinstimmungen auch doppelte Zahlen an, ich bin ziemlich verzweifelt,
habe das ganze Wochenende schon dran gebastelt und sehe nun gar nicht mehr durch.
Guckt bitte mal meinen Quelltxt durch, ob ihr den / die Fehler seht :(
Vielen Dank, LG Susi
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i,z,x,y,anz,o: integer;
{startet Zufallszahlen für Memo2}
begin
randomize;
For i:=1 TO 6 DO
 begin
 z:=random(49)+1;
 memo2.lines.add(IntToStr(z));
 end;
{zieht zufällige Superzahl}
begin
randomize;
 Superzahl:=random(10)+1;
 edit2.Text:=(IntToStr(Superzahl));
end;
{Vergleich der eingegebenen mit den gezogenen Zahlen}
anz:=0;
For x:=0 To memo1.Lines.Count-1 Do
 For y:=0 To memo2.Lines.Count-1 Do
  IF memo1.Lines[x]=memo2.Lines[y]
  then
   begin
   memo3.Lines.add(memo1.lines[x]);
   anz:=anz+1;
   label5.caption:=IntToStr(anz);
   end;
   
{Vergleich der Superzahlen}
If edit1.Text=edit2.Text
then
 begin
 edit3.Text:=edit1.Text;
 label8.Caption:='Superzahl stimmt überein!!'
 end
else
label8.caption:='leider nicht..';

{Elememinierung doppelter Zahlen}
for i:=0 To memo2.Lines.count-1 DO
 begin
 o:=i+1;
 while o<memo2.lines.count do
  begin
  IF memo2.lines[i]=memo2.Lines[o] then
  begin
  memo2.lines.Delete(i);
  dec(o);
  end;
  inc(o);
  end;
  end;

{Fehlerabfederung}
anz:=0;
if memo1.Lines.Count<>6 then
 begin
 ShowMessage('Bitte geben Sie genau 6 Zahlen als Tipp ein!');
 exit;
 end;
 try
  For x:=0 TO memo1.lines.count-1 DO begin
  if not ((strToInt(memo1.Lines[x])<50) and (strToInt(memo1.Lines[x])>0)) then begin
  Showmessage('Bitte geben Sie nur Zahlen zwischen 1 und 49 ein!');
  exit;
end;
end;
 except
 Showmessage('Fehler! Bitte geben Sie Zahlen ein!');
end;
 try
 if not ((strToInt(edit1.Text)<10))
 then
 begin
 showmessage('Bitte geben Sie nur Zahlen zwischen 0 und 9 ein!');
 exit;
end;
 except
 Showmessage('Fehler! Bitte geben Sie Zahlen ein!');
end;
end;
end.
[edit=Matze][delphi]-Tag geschlossen. MfG, Matze[/edit]

Wolfgang Mix 20. Sep 2009 15:08

Re: 6 aus 49 will nicht so richtig
 
Erstmal herzlich willkommen in der DP :dp:

Dieses Thema hatten wir hier schon öfter.
Gehe 'mal bitte ins Suchfeld und suche folgenden Thread:
Zitat:

Zufallszahl ziehen ohne wiederholung


Das dürfte Dir erstmal weiterhelfen

Gruß

Wolfgang

Klaus01 20. Sep 2009 15:11

Re: 6 aus 49 will nicht so richtig
 
Hallo,

dazu gibt es mehrere Ansätze.

In dem Memo mit den eingegebenen Zahlen Sortierung einschalten und doppelte Einträge unterdrücken.

Wenn Du das zu Fuss machen willst.
Schaue Dir mal Memo1.lines.indexOf() an.

Grüße
Klaus

funkuchn 20. Sep 2009 15:14

Re: 6 aus 49 will nicht so richtig
 
hey und danke

und wie stelle ich ersteres ein?

Klaus01 20. Sep 2009 15:25

Re: 6 aus 49 will nicht so richtig
 
.. nun. da habe ich mich etwas weit aus dem Fenster gelehnt.
TMemo.lines hat keine Sorted Eigenschaft.

Delphi-Quellcode:
var
  sl :TStringList;
begin
  sl := TStringList.Create;
  sl.assign(Memo1.lines);
  sl.Sorted := true;
  sl.Duplicates := dupIgnore;
  sl.add(Edit1.Text);
  Memo1.Lines.Assign(sl);
  sl.free;
end;
Grüße
Klaus

Wolfgang Mix 20. Sep 2009 15:26

Re: 6 aus 49 will nicht so richtig
 
Ein besserer Ansatz wäre:

1. Erzeuge eine Liste aller Zahlen im Interval [1;49] --> array
2. Ziehe eine beliebige Zahl aus der Liste, zeige sie an.
3. Lösche(!) nun dieses Element aus der Liste.
4. Führe die Schritte 2..4 insgesamt 6x aus
Fertig. Das ist genau das, was man beim Lotto (z.B.) macht.

Gruß

Wolfgang

funkuchn 20. Sep 2009 15:29

Re: 6 aus 49 will nicht so richtig
 
ich arbeite ja nun nicht so lange mit delphi...
iwie komme ich mit euren antworten gar nicht mehr klar :pale:
habt ihr nicht was ganz ganz einfaches oder n stücke quelltext? :pale:

Wolfgang Mix 20. Sep 2009 15:58

Re: 6 aus 49 will nicht so richtig
 
Folgendes legt im Array Lotto erst einmal alle 49 Zahlen von 1..49 ab.
Dann ziehst Du eine Zahl (z.B. 26) und setzt an der Stelle Lotto[26] eine 0;
Das ganze machst Du 6x und suchst am Ende nach den Nullen im Lotto-Array.
Ich hoffe, Du kommst jetzt weiter, wenn nicht, wieder melden.

Gruß

Wolfgang

Delphi-Quellcode:
var
  Form1: TForm1;
  lotto: array[1..49] of word;
  lotto2: array[1..6] of integer;
  sorted: array[1..6] of word;
  i,j:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i,zaehler,temp:integer;
begin
  //Listbox1.Clear;
  zaehler:=0;
  for i:=1 to 49 do lotto[i]:=i;
  //edit1.Text:=inttostr(lotto[34]);  //Nur Test
  while zaehler<6 do
  begin
     temp:=random(49)+1;
     while lotto[temp]=0 do
     begin
       temp:=random(49)+1;
     end;
        lotto[temp]:=0;
        inc(zaehler);
        Listbox1.Items.Add(Inttostr(temp));
        lotto2[zaehler]:=temp;
     //Edit1.Text:=Listbox1.items.text[1]+Listbox1.items.text[2]
  end;
  Edit1.Text:=IntToStr(lotto2[1]);
  Edit2.Text:=IntToStr(lotto2[2]);
  Edit3.Text:=IntToStr(lotto2[3]);
  Edit4.Text:=IntToStr(lotto2[4]);
  Edit5.Text:=IntToStr(lotto2[5]);
  Edit6.Text:=IntToStr(lotto2[6]);

end;

funkuchn 20. Sep 2009 16:06

Re: 6 aus 49 will nicht so richtig
 
okay...
aber unser lehrer möchte nicht, dass wir arrays verwenden u wir sollen mit memos arbeiten :(

Wolfgang Mix 20. Sep 2009 16:13

Re: 6 aus 49 will nicht so richtig
 
Löschen eines Memos funktioniert mit z.B. Memo1.Clear.
Ausgaben in Memos funktionieren mir z.B. Memo1.Lines.Add('Hallo Welt')

Hoffe, das hilft Dir weiter

Gruß

Wolfgang

funkuchn 20. Sep 2009 16:38

Re: 6 aus 49 will nicht so richtig
 
ja mit diesen Grundfunktionen komm ich auch klar :P
wir hatten jetzt noch was mit memo1.delete oder so, und dass muss i iwie reinbauen...

DeddyH 20. Sep 2009 16:41

Re: 6 aus 49 will nicht so richtig
 
Zunächst einmal sollte man Randomize nur einmalig im Programm aufrufen (z.B. im OnCreate). Und ob die gezogene Zahl bereits im Memo vorhanden ist, bekommst Du mit Memo.Lines.IndexOf heraus (dazu muss die Zahl aber erst in einen String gewandelt werden). Bei weiteren Fragen einfach fragen.

funkuchn 20. Sep 2009 16:45

Re: 6 aus 49 will nicht so richtig
 
wie genau baue ich das Memo.Lines.IndexOf ein? und wo?

DeddyH 20. Sep 2009 16:48

Re: 6 aus 49 will nicht so richtig
 
Aus dem Kopf:
Delphi-Quellcode:
Memo.Lines.Clear;
for i := 1 to 6 do
  begin
    repeat
      Zahl := Random(49) + 1;
    until Memo.Lines.IndexOf(IntToStr(Zahl)) < 0;
    Memo.Lines.Add(IntToStr(Zahl));
  end;

funkuchn 20. Sep 2009 16:52

Re: 6 aus 49 will nicht so richtig
 
und das vergleicht jetzt, ob in dem memo, wo die zahlen zufällig sind, ob da nun eine doppelt vorkommt
oder wie?
(Wenn ja, das Problem hatte ich doch schon gelöst :()

Wolfgang Mix 20. Sep 2009 16:53

Re: 6 aus 49 will nicht so richtig
 
@Opa Deddy
Bei meinem Vorgehen ist eine bereits gezogene Zahl im Lotto-Array mit 0 überschrieben.
Also brauchen keine weiteren Überprüfungen auf Doppelgänger erfolgen.
Es muß am am Ende nur da Lotto-Array auf Nullen überprüft werden.
Zusätzlich entfällt die lästige Sortiererei. ;-)

Gruß

Wolfgang

DeddyH 20. Sep 2009 16:54

Re: 6 aus 49 will nicht so richtig
 
Mein Code sollte doch nur die Ziehung simulieren, da hab ich wohl etwas falsch verstanden. Sortiert wird da übrigens nix ;)

[edit] Und die Inhalte zweier Memos kann man ja auch mit IndexOf vergleichen. Ist zwar nicht die schnellste Möglichkeit, sollte aber verständlich sein. [/edit]

Wolfgang Mix 20. Sep 2009 16:58

Re: 6 aus 49 will nicht so richtig
 
:-D

funkuchn 20. Sep 2009 17:01

Re: 6 aus 49 will nicht so richtig
 
könntet ihr jetzt meine frage von seite 1 beantworten? :? :wiejetzt:

DeddyH 20. Sep 2009 17:07

Re: 6 aus 49 will nicht so richtig
 
Noch einmal: Du kannst mit IndexOf bestimmen, ob der Eintrag bereits vorhanden ist und somit doppelte Eingaben vermeiden.
Delphi-Quellcode:
procedure TBla.Tippabgeben;
var Zahl: string;
begin
  //ohne Eingabeprüfung auf Zahl, das kannst Du selbst übernehmen
  Zahl := EditEingabe.Text;
  //Memo.Lines nach Zahl durchsuchen
  if MemoTipp.Lines.IndexOf(Zahl) >= 0 then
    begin
      //schon drin
      ShowMessage('Zahl wurde bereits getippt');
      EditEingabe.Clear;
    end
  //noch nicht drin -> eintragen
  else
    MemoTipp.Lines.Add(Zahl);
end;

funkuchn 20. Sep 2009 17:40

Re: 6 aus 49 will nicht so richtig
 
:coder2:
könntet ihr euch bei euren Antworten bitte mal auf meinen Quelltext beziehen? Ich will
das nicht alles umschreiben....Danke :|

DeddyH 20. Sep 2009 17:42

Re: 6 aus 49 will nicht so richtig
 
Sry, aber es geht hier um das Verständnis und nicht um C&P-Lösungen. Es kann ja nicht zuviel verlangt sein, fast fertigen Code geringfügig anzupassen.

funkuchn 20. Sep 2009 17:46

Re: 6 aus 49 will nicht so richtig
 
ich bin jetzt nicht das Infogenie, hab seit 2 Jahren nicht programmiert und versuche hier nur mal Hilfe zu bekommen
ich verstehe es halt nicht wenn man mir iwas theoretisch erklärt...

DeddyH 20. Sep 2009 17:48

Re: 6 aus 49 will nicht so richtig
 
Ich hab Dir da oben ausführlich kommentierten Quelltext hingeschrieben, von daher verstehe ich den Einwand von wegen "theoretisch" nicht.

haentschman 20. Sep 2009 17:48

Re: 6 aus 49 will nicht so richtig
 
nix für ungut...
Zitat:

könntet ihr euch bei euren Antworten bitte mal auf meinen Quelltext beziehen? Ich will
das nicht alles umschreiben....
...wenn ich Mod wäre, würde ich hier in der nächsten 10tel Sekunde den Stecker ziehen.
Die Jungs, die dir Vorschläge gemacht haben, haben ihre Zeit investiert um dir zu helfen und du bist nicht bereit deinerseits Zeit für das ausprobieren der Vorschläge einzuplanen ?

...ohne Worte :roll:

funkuchn 20. Sep 2009 17:50

Re: 6 aus 49 will nicht so richtig
 
ja aber wenn ich was von memos schreibe und in den antworten was von edits steht?!
ich weiß dass die hier ihre zeit investieren und ich habe nur nett gefragt, ob es möglich wäre, mir da mal im Quelltext zu helfen und nicht irgendwelche Einschübe, wo ich nichts mit anzufangen weiß.... :cry:

DeddyH 20. Sep 2009 17:53

Re: 6 aus 49 will nicht so richtig
 
Wie bekommst Du denn die getippten Zahlen ins Memo? Das konnte ich aus Deinem Quelltext auch nicht entnehmen, daher würde ich das über ein Edit namens EditEingabe machen.

funkuchn 20. Sep 2009 17:54

Re: 6 aus 49 will nicht so richtig
 
na ich gebe die zahlen einfach in das memo ein wenn ich das programm starte...
sollen wir so machen, die anderen Memos habe ich so eingestellt, dass man da manuell nix eingeben kann...
mehr ist das ja nicht...

DeddyH 20. Sep 2009 17:56

Re: 6 aus 49 will nicht so richtig
 
Wenn Ihr das so machen sollt, erhöht das aber den Aufwand enorm. Dann müsstest die Tastendrücke abfangen, schauen, ob es sich um Return handelt und die gerade eingegebene Zeile mit allen Vorgängerzeilen vergleichen. Extrem blöd, sowas.

funkuchn 20. Sep 2009 17:58

Re: 6 aus 49 will nicht so richtig
 
naja dann könnte ich doch beim start des programmes ne message zeigen, dass man keine zahlen doppelt eingeben soll, oder??

(wenn ja, hast n tipp wie, hab es schon probiert, bin aber wie gesagt völlig raus :( )

DeddyH 20. Sep 2009 18:00

Re: 6 aus 49 will nicht so richtig
 
Na, einfach im OnCreate des Forms mit ShowMessage oder so ausgeben.

sx2008 20. Sep 2009 18:02

Re: 6 aus 49 will nicht so richtig
 
Hat euer Lehrer auch verboten Unterfunktionen zu benützen?
Ich frage das, weil der Sourcecode im Betrag #1 ein einziger "Schluntz" in einer Riesenprozedur ist.
Zerlege dein Problem doch in kleine Teilaufgaben.

Wolfgang Mix 20. Sep 2009 18:03

Re: 6 aus 49 will nicht so richtig
 
Hatte ich schon gescchrieben.
Alles, was sich in Editfeldern ausgeben läßt,
kann mann natürlich mit Memo.Lines.Add natürlich auch in Memos ausgeben.
Die paar Zeilen umzuschreiben, kann doch wohl nicht zu schwer sein.
Ich glaube auch, daß du Post #2 noch gar nicht gelesen hast. Indem angegebenen Link ist schon
alles durchgekaut worden. Stell gezieltere Fragen, sage, was bisher geht und was nicht, wo was hakt.

Mit den biherigen Hilfen müßtest Du klarkommen.
Ne fertige Endlösung könnte ich Dir zwar auch geben,
aber das hilft Dir garnix.

Code schreiben ist wie Mathe. Ohne Übung geht garnix.

Gruß

Wolfgang

funkuchn 20. Sep 2009 18:05

Re: 6 aus 49 will nicht so richtig
 
erstmal zu dem oncreate....
wo ist das zu finden?

und Unterfunktionen, ja wie meinst das?

und an wolfgang:ja ich habs verstanden dass du unfreundlich bist...istja nun gut... :roll:

DeddyH 20. Sep 2009 18:08

Re: 6 aus 49 will nicht so richtig
 
Wenn Du in der Entwurfsansicht einen Doppelklick auf Dein Formular machst, landest Du direkt im Quellcode des OnCreate-Ereignisses. Und ich finde Wolfgang überhaupt nicht unfreundlich, es geht uns allen wie gesagt darum, Dich zur Lösung zu führen, aber nicht mit Code, den Du einfach kopieren könntest, sondern Du sollst selbst darauf kommen.

Wolfgang Mix 20. Sep 2009 18:09

Re: 6 aus 49 will nicht so richtig
 
Wenn Du irgendwo auf das Formular doppelklickst, öffnet sich 'ne vorbereitete Prozedur
OnCreate.

Gruß

Wolfgang
[wieder 'mal zu langsam :( ]

funkuchn 20. Sep 2009 18:11

Re: 6 aus 49 will nicht so richtig
 
ja das ist jetzt offen, wenn ich aber noch nie diese Prozedur behandelt habe, werde ich auch nicht selbst drauf kommen, ich sitz jetzt im 2ten Infojahr....

DeddyH 20. Sep 2009 18:12

Re: 6 aus 49 will nicht so richtig
 
Dann wirf doch einmal einen Blick dazu in die Delphi-Hilfe, die ist unter Delphi 6 ja noch brauchbar.

funkuchn 20. Sep 2009 18:13

Re: 6 aus 49 will nicht so richtig
 
hab aber delphi 7, so wie es oben steht und alles englisch...

DeddyH 20. Sep 2009 18:17

Re: 6 aus 49 will nicht so richtig
 
Ganz ohne Englisch wird es beim Programmieren ohnehin nicht gehen, aber erstmal egal. Seit wann macht Ihr denn Delphi? Ich kann mir nämlich nicht vorstellen, dass Euch in 2 Jahren niemand gesagt hat, dass Windows (und somit auch Delphi) ereignisorientiert ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr.
Seite 1 von 2  1 2      

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