Autor Beitrag
Mario Elßner
Hält's aus hier
Beiträge: 10

Win XP, Windows 7 64bit,
RAD Studio XE2
BeitragVerfasst: Sa 07.12.13 15:37 
Hallöle,

Zufallsgeneratoren gibt es ja viele aber wie kann ich aus den Buchstaben W,A,S,D mit einer zeichenlänge von 3 alle möglichen kombinationen ausgeben ohne sie doppelt zu haben?
Bin noch recht frisch und noch am lernen und wäre über Hilfe dankbar.

Danke im voraus


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 08.12.2013 um 17:21
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Sa 07.12.13 17:17 
Mario Elßner Threadstarter
Hält's aus hier
Beiträge: 10

Win XP, Windows 7 64bit,
RAD Studio XE2
BeitragVerfasst: Sa 07.12.13 18:27 
So, habe mal etwas rumgebastelt soweit funzt das auch mit nur einem kleinen problemchen.

Die Ausgabe erfolgt über eine Listbox allerdings wird in jede nur 1 buchstabe gesetzt.

Folgendes ich habe nur die Buchstaben WASD zur Verfügung un daraus sollen mögliche kombinationen erzeugt werden mit einer länge von 3zeichen doppelte sollten in der listbox nicht eingetragen werden.
Jetzt erstellt allerdings mein script immer nur 1 zeichen in jede zeile und ist daher nach 3 zeilen fertig..

Man wo habsch da was vergessen??? kann mir d einer helfen....

Hier der Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.Button2Click(Sender: TObject);
var sLen: Integer;
    i: Integer;
    zahl: String;
    exists: Boolean;
    pool : String;

begin

sLen := 3//durchlaufangabe
Randomize; //nie vergessen, wenn man ein random benutzt
pool := 'WASD';
Listbox1.Clear;

repeat
 zahl := '';
 zahl := pool[Random(Length(pool))+1]; //zahl erzeugen
 exists := false; //prüfvariable zurücksetzen

 for i := 0 to ListBox1.Count - 1 do //schleife zum überprüfen: vorhanden oder nicht
 begin
 If zahl = ListBox1.Items.Strings[i] then exists := true; //wenn zahl bereits vorhanden, prüfvariable setzen
 end;
 If not exists then ListBox1.Items.Add(zahl); //wenn keine prüfvariable: hinzufügen
until ListBox1.Count = sLen;

end;


Danke für die Hilfe...
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 07.12.13 19:19 
Die erste Aufgabe beim Programmieren besteht darin, das Problem sorgfältig zu analysieren. Die Betonung liegt dabei auf sorgfältig, wie du an der Fettschreibung vielleicht schon vermutet hast. Okay, dann mal los:

Du hast also einen String mit den vier Zeichen WASD. Okay. Daraus möchtest du alle möglichen dreistelligen Kombinationen ermitteln und anzeigen lassen. Da es sich dabei nicht um die Resultate irgend eines Zufalls handelt, wird auch kein Random benötigt, sondern solide Rechenarbeit. Im Folgenden werde ich die Zeichenposition im Pool-String, wie du ihn nennst, mit 1,2,3 und 4 bezeichnen.

1. Kombination: 1,1,1
2. Kombination: 1,1,2
3. Kombination: 1,1,3
4. Kombination: 1,1,4
5. Kombination: 2,1,1
6. Kombination: 2,1,2
7. Kombination: 2,1,3
8. Kombination: 2,1,4
9. Kombination: 3,1,1
...

So würde die Reihe beginnen, ohne die Bedingung, doppelte Zeichen im Zielstring zu vermeiden. Jetzt versuche erst einmal, das programmtechnisch umzusetzen. Wenn du das erledigt hast, überlegst du, wie du es anstellen mußt, daß keine doppelten Zeichen erscheinen.

Übrigens funzt dein Code eben nicht soweit, denn er macht nicht annähernd das, was du damit beabsichtigt hattest. Ach ja, hätte ich fast vergessen: Lerne Grundlagen, am besten mit einem guten Delphi-Einsteiger-Tutorial.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: So 08.12.13 17:10 
Hallo,

Zitat:
1. Kombination: 1,1,1
2. Kombination: 1,1,2
3. Kombination: 1,1,3
4. Kombination: 1,1,4

5. Kombination: 2,1,1
6. Kombination: 2,1,2

Halte ich für nicht für logisch, eher:
Zitat:
1. Kombination: 1,1,1
2. Kombination: 1,1,2
3. Kombination: 1,1,3
4. Kombination: 1,1,4

5. Kombination: 1,2,1
6. Kombination: 1,2,2


Was gesucht wird ist in etwa:
www.entwickler-ecke....der=asc&start=40
mit
ausblenden Delphi-Quelltext
1:
2:
3:
4:
const
  KombLaenge =3 ;//k
  KL_1 = KombLaenge-1;
  n = KombLaenge+1;// 3 aus 4

und in Init
ausblenden Delphi-Quelltext
1:
FeldAnzahl[i] := 1;					


Nun ja, nicht wirklich hilfreich...

Gruß Horst
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 08.12.13 18:29 
Ist unser Mathematiker nicht da?

Dann übernehme ich kurzfristig die Rolle:

siehe Anhang: statt 4 Studenten : nur 3
statt Gruppe von 15: nur 4

...und nun rechnet mal schön...

Das !-Zeichen nennt man Fakultät.

www.mathwords.com/c/...bination_formula.htm
.
de.wikipedia.org/wik...ion_mit_Wiederholung

Zitat:
Im Alter von sieben Jahren sei Gauß in die Volksschule gekommen. Dort habe sein Lehrer Büttner den Schülern zur längeren Beschäftigung die Aufgabe gestellt, die Zahlen von 1 bis 100 zu addieren. Gauß habe sie allerdings nach kürzester Zeit gelöst, indem er 50 Paare mit der Summe 101 gebildet (1 + 100, 2 + 99, …, 50 + 51) und 5050 als Ergebnis erhalten habe. Er legte die Antwort mit den Worten in Braunschweiger Plattdeutsch „Ligget se“ (svw: „Hier liegt sie“) dem Lehrer auf den Tisch.
de.wikipedia.org/wik..._Friedrich_Gau%C3%9F
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von hathor am So 08.12.13 19:16, insgesamt 2-mal bearbeitet
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: So 08.12.13 18:47 
Hallo,
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Ist unser Mathematiker nicht da?

Doch, ich bin schon da, nur ständig gebe ich komische Geräusche von mir: nies, hust, hatschi, krrrr ... Blöde Erkältung! :evil:

Wenn er aus 4 verschiedenen Buchstaben alle Zusammenstellungen von 3 Elementen sucht, die Buchstaben mehrfach auftreten können und die Reihenfolge wichtig ist, so sind es Variationen mit Wiederholungen. Bei n Elementen und k Ausgewählten gibt es dann n hoch k mögliche. An jeder der k Stellen können n verschiedene Buchstaben stehen.

Bei einer Länge von 3; die vier Buchstaben stehen im Feld Buchstabe: Array[1..4] of char; geht es wohl noch mit 3 Schleifen (ungetestet!):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure Variation;
var i,j,k  : integer;
    s : string;
begin
    for i:=1 to 4 do
    begin
      for j:=1 to 4 do
      begin
        for k:=1 to 4 do
        begin
          s:=buchstabe[i]+buchstabe[i]+buchstabe[k];
          // Wort verarbeiten
        end
      end;
    end;  
end;

Werden die Wörter länger, wird man wohl anders herangehen müssen.
Sucht user profile iconMario Elßner tatsächlich Kombinationen, d.h. die Reihenfolge ist uninteressant, dann geht es so nicht.

Beste Grüße und Hatschi!!!!!
Mathematiker
Hoffentlich erzähle ich, hatschi, keinen Unsinn, nies.

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 08.12.13 18:56 
Ja, die Infektionsgefahr kann man auch berechnen - vielleicht so: Anzahl Kontakt-Personen * Anzahl Kontakt-Personen...

Auch hier gilt die Regel: Von NICHTS kommt NICHTS.

GUTE BESSERUNG!

Übrigens:
Hier gibt es die Lösung in DELPHI...
www.swissdelphicente...showcode.php?id=1032

Definition: Permutation

A permutation is an arrangement of n objects, arranged in groups of size r
without repetition where order is important.

P(n,r) = n! / (n-r)!

Example: Find all 3-letter permutations of the letters "WASD"

n = WASD
r = 3


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
program Tip1032;
{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  R, Slen: Integer;

procedure P(var A: string; B: string);
var 
  J: Word;
  C, D: string;
begin
  { P(N,N) >>  R=Slen  }
  if Length(B) = SLen - R then 
  begin
    Writeln(' {' + A + '} '); {Per++}
  end 
  else
    for J := 1 to Length(B) do
    begin
      C := B;
      D := A + C[J];
      Delete(C, J, 1);
      P(D, C);
    end;
end;

var 
  Q, S, S2: string;
begin
  S  := ' ';
  S2 := ' ';
//  while (S <> '') and (S2 <> '') do
//  begin
    Writeln('');
    Writeln('');
    Write('P(N,R)  N=? : ');
   S:= 'WASD';// ReadLn(S);
    SLen := Length(S);
    Write('P(N,R)  R=? : ');
   S2:='3'// ReadLn(S2);
//    if s2 <> '' then
    R := StrToInt(S2);
    Writeln('');
    Q := '';
    P(Q, S);
//  end;
Readln;
end.


Alternativ:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
procedure TForm1.Button1Click(Sender: TObject);
var
  R, Slen: Integer;

procedure P(var A: string; B: string);
var
  J: Word;
  C, D: string;
begin
  { P(N,N) >>  R=Slen  }
  if Length(B) = SLen - R then
  begin
      Memo1.lines.add(A);
  end
  else
    for J := 1 to Length(B) do
    begin
      C := B;
      D := A + C[J];
      Delete(C, J, 1);
      P(D, C);
    end;
end;

var
  Q, S, S2: string;
begin
  S  := ' ';
  S2 := ' ';
   S:= 'WASD';
    SLen := Length(S);
   S2:='3';
    R := StrToInt(S2);
    Q := '';
    P(Q, S);
end;


Ergebnis:
WAS
WAD
WSA
WSD
WDA
WDS
AWS
AWD
ASW
ASD
ADW
ADS
SWA
SWD
SAW
SAD
SDW
SDA
DWA
DWS
DAW
DAS
DSW
DSA

Falls z.B. SDA und DSA als doppelt gelten, müsste man sie noch heraus filtern...