AGB  ·  Datenschutz  ·  Impressum  







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

Zufällige Eingabe erstellen

Ein Thema von STS301 · begonnen am 19. Okt 2008 · letzter Beitrag vom 20. Okt 2008
Antwort Antwort
Benutzerbild von STS301
STS301

Registriert seit: 6. Nov 2007
668 Beiträge
 
Delphi 7 Personal
 
#1

Zufällige Eingabe erstellen

  Alt 19. Okt 2008, 17:40
hi

ich will eine zufällig erstellten Text ausgeben.
Ich habe 4 Char Arrays (1..26: Großbuchstaben, 1..26 Kleinbuchstaben, 1..26 Sonderzeichen, 1..10 Zahlen). Ich habe es mit einer For-Schleife versucht, hat aber nicht gut funktioniert. Er hat immer nur einen Buchstaben ausgegeben. Mein Hauptproblem ist, dass ich 4 Checkboxen habe und er vor dem Erstellen schauen soll, ob sie aktiviert sind oder nicht.

Ich weiß, der Code ist nicht besonders einfallsreich, ich habe es so versucht wie ich gedacht habe, dass es funktionieren sollte, das tut es aber nicht.

hier der Code

big, small, extra(sonderzeichen) und number sind die Checkboxen.
Delphi-Quellcode:
procedure TForm1.codegenClick(Sender: TObject);
var
  bgross: Array[1..26] of Char;
  bklein: Array[1..26] of Char;
  sonder: Array[1..26] of Char;
  zahlen: Array[1..10] of Char;
  anzahl: Integer;
  i, b: Integer;
  select: Integer;
  defini: Integer;
  unterd: Integer;
  zdef : Integer;
  zunter: Integer;
begin

bgross[1]:= 'A';
bgross[2]:= 'B';
bgross[3]:= 'C';
bgross[4]:= 'D';
bgross[5]:= 'E';
bgross[6]:= 'F';
bgross[7]:= 'G';
bgross[8]:= 'H';
bgross[9]:= 'I';
bgross[10]:= 'J';
bgross[11]:= 'K';
bgross[12]:= 'L';
bgross[13]:= 'M';
bgross[14]:= 'N';
bgross[15]:= 'O';
bgross[16]:= 'P';
bgross[17]:= 'Q';
bgross[18]:= 'R';
bgross[19]:= 'S';
bgross[20]:= 'T';
bgross[21]:= 'U';
bgross[22]:= 'V';
bgross[23]:= 'W';
bgross[24]:= 'X';
bgross[25]:= 'Y';
bgross[26]:= 'Z';

bklein[1]:= 'a';
bklein[2]:= 'b';
bklein[3]:= 'c';
bklein[4]:= 'd';
bklein[5]:= 'e';
bklein[6]:= 'f';
bklein[7]:= 'g';
bklein[8]:= 'h';
bklein[9]:= 'i';
bklein[10]:= 'j';
bklein[11]:= 'k';
bklein[12]:= 'l';
bklein[13]:= 'm';
bklein[14]:= 'n';
bklein[15]:= 'o';
bklein[16]:= 'p';
bklein[17]:= 'q';
bklein[18]:= 'r';
bklein[19]:= 's';
bklein[20]:= 't';
bklein[21]:= 'u';
bklein[22]:= 'v';
bklein[23]:= 'w';
bklein[24]:= 'x';
bklein[25]:= 'y';
bklein[26]:= 'z';

sonder[1]:= '^';
sonder[2]:= '!';
sonder[3]:= '"';
sonder[4]:= '%';
sonder[5]:= '&';
sonder[6]:= '/';
sonder[7]:= '{';
sonder[8]:= '(';
sonder[9]:= '[';
sonder[10]:= ')';
sonder[11]:= ']';
sonder[12]:= '=';
sonder[13]:= '}';
sonder[14]:= '?';
sonder[15]:= '+';
sonder[16]:= '*';
sonder[17]:= '#';
sonder[18]:= ' '; //Leertaste
sonder[19]:= '-';
sonder[20]:= '_';
sonder[21]:= '.';
sonder[22]:= ':';
sonder[23]:= ',';
sonder[24]:= ';';
sonder[25]:= '<';
sonder[26]:= '>';

zahlen[1]:= '1';
zahlen[2]:= '2';
zahlen[3]:= '3';
zahlen[4]:= '4';
zahlen[5]:= '5';
zahlen[6]:= '6';
zahlen[7]:= '7';
zahlen[8]:= '8';
zahlen[9]:= '9';
zahlen[10]:= '0';

if (big.Checked = false) and (small.Checked = false) and (extra.Checked = false)
and (number.Checked = false) then
    begin
    ShowMessage('Please select the wanted properties!');
    exit
end;

anzahl:= 0;
defini:= 26;
zdef := 10;

If big.Checked then
   inc(anzahl);

If small.Checked then
   inc(anzahl);

If extra.Checked then
   inc(anzahl);
   
If number.Checked then
   inc(anzahl);

randomize;

for i:= 1 to StrToInt(repeat1.Text) do //anzahl

    select:= random(anzahl);
    unterd:= random(defini);
    zunter:= random(zdef);
    
    if select = 1 then
    begin
         if big.Checked then
         begin
              edit1.Text:= edit1.Text + bgross[unterd];
         end
         
         else if small.Checked then
         begin
              edit1.Text:= edit1.Text + bklein[unterd];
         end
         
         else if extra.Checked then
         begin
              edit1.Text:= edit1.Text + sonder[unterd];
         end
         
         else if number.Checked then
         begin
              edit1.Text:= edit1.Text + zahlen[zunter];
         end;
    end;
    
    if select = 2 then
    begin
         if small.Checked then
         begin
              edit1.Text:= edit1.Text + bklein[unterd];
         end

         else if extra.Checked then
         begin
              edit1.Text:= edit1.Text + sonder[unterd];
         end

         else if number.Checked then
         begin
              edit1.Text:= edit1.Text + zahlen[zunter];
         end;
    end;
    
    if select = 3 then
    begin
         if extra.Checked then
         begin
              edit1.Text:= edit1.Text + sonder[unterd];
         end

         else if number.Checked then
         begin
              edit1.Text:= edit1.Text + zahlen[zunter];
         end;
    end;
    
    if select = 4 then
    begin
         if number.Checked then
         begin
              edit1.Text:= edit1.Text + zahlen[zunter];
         end;
    end;
end;
Wäre für Hilfe dankbar
Sebastian

ölpölp

Linux will rule the universe!!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

Re: Zufällige Eingabe erstellen

  Alt 19. Okt 2008, 17:58
Was mir als erstes auffällt, ist:

- in der for-schleife fehlt das begin/end (so wird nur x-mal select aber kein Text gesetzt!)
- anzahl kann einen Wert von 1..4 annehmen
- select := random(anzahl) hat somit einen Wert von 0..(anzahl-1)
- du fragst allerdings select auf 1..4 ab
- select = 4 wird nie vorkommen
- select = 0 ignorierst du

Da du ja selbst zugestehst, daß der Code "sub-optimal" ist, hier eine Anregung:

statt 4 separater Arrays würde ich einen einzelnen String nehmen und die selektierten CharSets einfach als Strings anfügen:

Delphi-Quellcode:
SourceChars := '';
if big.Checked then
  SourceChars := SourceChars + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
if small.Checked then
  SourceChars := SourceChars + 'abcdefghijklmnopqrstuvwxyz';
...

if SourceChars = 'then begin
  ShowMessage('Please select the wanted properties!');
  exit;
end;

randomize;
resultString := '';
anzahl := StrToInt(repeat1.Text);
for i := 1 to anzahl do begin // !!!
  select := random(length(SourceChars)) + 1;
  resultString := resultString + SourceChars[select]; // besser als ständig in das Edit-Feld zu schreiben
end;
edit1.Text := resultString;
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von STS301
STS301

Registriert seit: 6. Nov 2007
668 Beiträge
 
Delphi 7 Personal
 
#3

Re: Zufällige Eingabe erstellen

  Alt 19. Okt 2008, 18:58
danke, so funktioniert es.

Es benötigt aber etwas lange um die funktion zu wiederholen. wenn ich auf den Button klicke, muss ich eine Sekunde warten, bis ich erneut einen Code generieren kann.
Sebastian

ölpölp

Linux will rule the universe!!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

Re: Zufällige Eingabe erstellen

  Alt 19. Okt 2008, 19:40
Zitat von STS301:
Es benötigt aber etwas lange um die funktion zu wiederholen. wenn ich auf den Button klicke, muss ich eine Sekunde warten, bis ich erneut einen Code generieren kann.
Das kann eigentlich nicht sein. Kannst du mal die komplette Funktion als Source posten? Da geht bestimmt was anderes schief.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von STS301
STS301

Registriert seit: 6. Nov 2007
668 Beiträge
 
Delphi 7 Personal
 
#5

Re: Zufällige Eingabe erstellen

  Alt 19. Okt 2008, 19:45
es kann auch sein, dass es an Lazarus liegt
Delphi-Quellcode:
var
   SourceChars: String;
   resultString: String;
   anzahl: Integer;
   select: Integer;
   i: Integer;
   test: Integer;
begin
try
   test:= StrToInt(repeat1.text);
except
   exit;
end;

SourceChars := '';
if big.Checked then
  SourceChars := SourceChars + gross;
  
if small.Checked then
  SourceChars := SourceChars + klein;

If extra.Checked then
  SourceChars := SourceChars + sonder;
   
If number.Checked then
  SourceChars := SourceChars + zahlen;

if SourceChars = 'then begin
  ShowMessage('Please select the wanted properties!');
  exit;
end;

randomize;

resultString := '';
anzahl := StrToInt(repeat1.Text);
for i := 1 to anzahl do begin // !!!
  select := random(length(SourceChars)) + 1;
  resultString := resultString + SourceChars[select]; // besser als ständig in das Edit-Feld zu schreiben
end;
edit1.Text := resultString;
Sebastian

ölpölp

Linux will rule the universe!!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

Re: Zufällige Eingabe erstellen

  Alt 19. Okt 2008, 19:51
Hier unter Delphi 2009 kann ich gar nicht so schnell klicken, wie der Code ausgeführt wird. Wenn es wirklich an Lazarus liegt, dann hat Lazarus wirklich ein echtes Problem...
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

Re: Zufällige Eingabe erstellen

  Alt 19. Okt 2008, 19:55
Es genügt, die Länge von SourceChars einmal vor der Schleife zu berechnen. length(SourceChars)
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#8

Re: Zufällige Eingabe erstellen

  Alt 19. Okt 2008, 20:02
Zitat von toms:
Es genügt, die Länge von SourceChars einmal vor der Schleife zu berechnen. length(SourceChars)
Wenn es das ist, dann hat Lazarus aber den Zug vor geraumer Zeit bereits verpasst. Ich hätte jetzt eher auf das Randomize bzw. Random getippt. Wie gesagt, unter Delphi ist das blitzschnell.
Uwe Raabe
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Zufällige Eingabe erstellen

  Alt 19. Okt 2008, 20:15
Eigentlich sollte der Code nicht zu lange brauchen. Ich hab ihn trotzdem mal etwas angepasst:
Delphi-Quellcode:
var
  SourceChars: String;
  resultString: String;
  count: Integer;
// select: Integer; // wird die variable irgendwo genutzt?
  lenSourceChars: integer;
  i: Integer;
begin
  if not TryStrToInt(count, repeat1.text) then // wenn es die funktion in lazarus nicht gibt, nimm nen try-except-block
    exit;

  SourceChars := '';

  if big.Checked then
    SourceChars := SourceChars + gross;
  if small.Checked then
    SourceChars := SourceChars + klein;
  If extra.Checked then
    SourceChars := SourceChars + sonder;
  If number.Checked then
    SourceChars := SourceChars + zahlen;

  if SourceChars = 'then
  begin
    ShowMessage('Please select the wanted properties!');
    exit;
  end;

  lenSourceChars := length(SourceChars);

// randomize; // Bitte nur einmal beim Programmstart aufrufen

  SetLength(resultString,count);
  for i := 1 to anzahl do
    resultString[i] := SourceChars[random(lenSourceChars) + 1];

  edit1.Text := resultString;
  Mit Zitat antworten Zitat
Benutzerbild von STS301
STS301

Registriert seit: 6. Nov 2007
668 Beiträge
 
Delphi 7 Personal
 
#10

Re: Zufällige Eingabe erstellen

  Alt 20. Okt 2008, 08:06
@namenloozer: das funktioniert nicht wirklich. Ich habe randomize jetzt ins OnCreate gestellt und jetzt funktioniert es einwandfrei.

danke
Sebastian

ölpölp

Linux will rule the universe!!
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:48 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