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/)
-   -   Zufallszahlen generieren und in Memo feld ausgeben funktioniert nicht (https://www.delphipraxis.net/173212-zufallszahlen-generieren-und-memo-feld-ausgeben-funktioniert-nicht.html)

fox67 12. Feb 2013 20:38

Delphi-Version: 5

Zufallszahlen generieren und in Memo feld ausgeben funktioniert nicht
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i,merke : integer;
begin
merke := 1;
memo1.Lines.Clear;
max := strtoint(edit1.Text);
setlength(zahlen, max);

for i := 1 to max do
begin
  zahlen[i] := random(strtoint(edit2.Text));
  if i > merke*10 then merke := merke+1;

  memo1.Lines.Insert(merke-1,(memo1.Lines.Strings[merke-1] + ' ' + inttostr(Zahlen[i]) + ',')) ;

end;
showmessage(inttostr(memo1.Lines.Count));

end;
Hallo ich wollte ein Prgramm schreiben das eine bestimmte Anzahl an Zufallszahlen generiert und diese dann anschließend ein einem Memofeld ausgibt. Bei 10 Zahlen soll es in einer Zeile ausgegeben werden. Anschließend sollen die Zahlen nach dem Bubble Sort Verfahren sortiert(dazu bin ich aber noch ncht gekommen da der erste Teil ja schon Probleme macht). Allerdings macht das Programm jetzt genau so viele Zeilen wie es Zahlen generieren soll und füllt diese mit den ersten 10 Zahlen immer abnehmen so das es wie eine halbe Pyramide ausschaut

Bjoerk 12. Feb 2013 21:24

AW: Zufallszaheln generieren und in Memo feld ausgeben funktioniert nicht
 
Eine Reihe von Zufallszahlen kann man eigentlich ganz nett mit einer TList machen.
Delphi-Quellcode:
procedure GetRandomNumbers(Strings: TStrings; AFrom, ATo: integer);
var
  I, J: integer;
  List: TList;
begin
  List := TList.Create;
  Strings.Clear;
  try
    for I := AFrom to ATo do
      List.Add(Pointer(I));
    while List.Count > 0 do
    begin
      I := Random(List.Count);
      J := Integer(List[I]);
      Strings.Add(IntToStr(J));
      List.Delete(I);
    end;
  finally
    List.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetRandomNumbers(Memo1.Lines, 1, 12);
end;
Die Zahlen im Memo anders unterzubringen solltest du schaffen. :)

Jumpy 13. Feb 2013 08:54

AW: Zufallszaheln generieren und in Memo feld ausgeben funktioniert nicht
 
Mit insert machst du eine neue Zeile und verschiebst die bisherige nach unten. Dadurch entsteht die Pyramide. Du must einfach ...Lines[i] = Lines[i]+...+Zahl[i]
oder entsprechend ändern.

Generell wäre es aber sicher einfacher erstmal in einer ersten Schleife die Zahlen zu generieren und in dem Array zu speichern. Anschließend dann die Zahlen aus dem Array ausgeben in einer neuen Schleife, wo man dann einfach erstmal bis zu 10 Zahlen in einen String hängt und den dann nach und nach ausgibt.

Oder man macht es direkt so wie bjoerk es vorschlägt.

Bjoerk 13. Feb 2013 12:01

AW: Zufallszaheln generieren und in Memo feld ausgeben funktioniert nicht
 
Oder man baut sich gleich eine Klasse, die die entsprechende Funktionalität zur Verfügung stellt (braucht man eh öfter). Wenn XE bereits eine TIntegerList hat, dann kann man die Klasse ja auch davon ableiten und entsprechend erweitern.

Delphi-Quellcode:
procedure TIntegerList.Exchange(Index1, Index2: integer);
var
  T: integer;
begin
end;

procedure TIntegerList.Sort;
var
  I, J: integer;
begin
end;

procedure TIntegerList.Assign(List: TIntegerList);
var
  I: integer;
begin
  Clear;
  for I := 0 to List.Count - 1 do
    Add(List[I]);
end;

procedure TIntegerList.Mix;
var
  MixList: TIntegerList;
  I: integer;
begin
  MixList := TIntegerList.Create;
  try
    while FCount > 0 do
    begin
      I := Random(FCount);
      MixList.Add(FItems[I]);
      Del(I);
    end;
    Assign(MixList);
  finally
    MixList.Free;
  end;
end;

procedure TIntegerList.SetStrings(Strings: TStrings; ColCount: integer);
var
  I, J, K, RowCount: integer;
  S: string;
begin
  Strings.BeginUpdate;
  Strings.Clear;
  try
    if FCount mod ColCount = 0 then
      RowCount := FCount div ColCount
    else
      RowCount := FCount div ColCount + 1;
    for I := 0 to RowCount - 1 do
    begin
      S := '';
      for J := 0 to ColCount - 1 do
      begin
        K := I * ColCount + J;
        if K < FCount then
          S := S + IntToStr(FItems[K]) + FSeparator;
      end;
      Strings.Add(S);
    end;
  finally
    Strings.EndUpdate;
  end;
end;

fox67 13. Feb 2013 14:49

AW: Zufallszaheln generieren und in Memo feld ausgeben funktioniert nicht
 
Zitat:

Zitat von Jumpy (Beitrag 1203226)
Mit insert machst du eine neue Zeile und verschiebst die bisherige nach unten. Dadurch entsteht die Pyramide. Du must einfach ...Lines[i] = Lines[i]+...+Zahl[i]
oder entsprechend ändern.

Generell wäre es aber sicher einfacher erstmal in einer ersten Schleife die Zahlen zu generieren und in dem Array zu speichern. Anschließend dann die Zahlen aus dem Array ausgeben in einer neuen Schleife, wo man dann einfach erstmal bis zu 10 Zahlen in einen String hängt und den dann nach und nach ausgibt.

Oder man macht es direkt so wie bjoerk es vorschlägt.

Dann wird aber nur eine Zeile angezeigt

p80286 13. Feb 2013 15:02

AW: Zufallszaheln generieren und in Memo feld ausgeben funktioniert nicht
 
Zitat:

Zitat von fox67 (Beitrag 1203346)
Zitat:

Zitat von Jumpy (Beitrag 1203226)
....
Oder man macht es direkt so wie bjoerk es vorschlägt.

Dann wird aber nur eine Zeile angezeigt

Dann Zeig doch mal was Du wirklich in Deinem Programm hast.

Gruß
K-H

Jumpy 13. Feb 2013 15:03

AW: Zufallszaheln generieren und in Memo feld ausgeben funktioniert nicht
 
Zitat:

Zitat von fox67 (Beitrag 1203346)
Zitat:

Zitat von Jumpy (Beitrag 1203226)
Mit insert machst du eine neue Zeile und verschiebst die bisherige nach unten. Dadurch entsteht die Pyramide. Du must einfach ...Lines[i] = Lines[i]+...+Zahl[i]
oder entsprechend ändern.

Generell wäre es aber sicher einfacher erstmal in einer ersten Schleife die Zahlen zu generieren und in dem Array zu speichern. Anschließend dann die Zahlen aus dem Array ausgeben in einer neuen Schleife, wo man dann einfach erstmal bis zu 10 Zahlen in einen String hängt und den dann nach und nach ausgibt.

Oder man macht es direkt so wie bjoerk es vorschlägt.

Dann wird aber nur eine Zeile angezeigt

Ich zitier mich mal selber:
Zitat:

Anschließend dann die Zahlen aus dem Array ausgeben in einer neuen Schleife, wo man dann einfach erstmal bis zu 10 Zahlen in einen String hängt und den dann nach und nach ausgibt.
Delphi-Quellcode:
s:='';
for i:=Low(Array) to High(Array) do
  begin
  s = s+Array[i];
  if (i mod 10 = 0) or i=High(Array) then
    beginn
    Memo1.Lines.Add(s);
    s:='';
    end
  else
    begin
    s=s+',';
    end;
  end;

Bjoerk 13. Feb 2013 15:25

AW: Zufallszaheln generieren und in Memo feld ausgeben funktioniert nicht
 
Nee nee Ralph, das wird so nicht funzen (für i = 0 ist die mod Bedigung ebenfalls erfüllt).

p80286 13. Feb 2013 15:29

AW: Zufallszaheln generieren und in Memo feld ausgeben funktioniert nicht
 
Na und? dann eben eine Zeile mehr, dieses "nur eine Zeile" stört mich viel mehr.

Gruß
K-H

Bjoerk 13. Feb 2013 15:43

AW: Zufallszaheln generieren und in Memo feld ausgeben funktioniert nicht
 
Aha, na dann..

Warum nicht einfach so?
Delphi-Quellcode:
  if ((I + 1) mod 10 = 0) or (I = High(Array)) then


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 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