Autor |
Beitrag |
Mario Elßner
Hält's aus hier
Beiträge: 10
Win XP, Windows 7 64bit,
RAD Studio XE2
|
Verfasst: 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 Narses: Topic aus Sonstiges (Delphi) verschoben am So 08.12.2013 um 17:21
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Sa 07.12.13 17:17
|
|
Mario Elßner 
Hält's aus hier
Beiträge: 10
Win XP, Windows 7 64bit,
RAD Studio XE2
|
Verfasst: 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:
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; Randomize; pool := 'WASD'; Listbox1.Clear;
repeat zahl := ''; zahl := pool[Random(Length(pool))+1]; exists := false; for i := 0 to ListBox1.Count - 1 do begin If zahl = ListBox1.Items.Strings[i] then exists := true; end; If not exists then ListBox1.Items.Add(zahl); until ListBox1.Count = sLen;
end; |
Danke für die Hilfe...
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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
Delphi-Quelltext 1: 2: 3: 4:
| const KombLaenge =3 ; KL_1 = KombLaenge-1; n = KombLaenge+1; |
und in Init
Delphi-Quelltext
Nun ja, nicht wirklich hilfreich...
Gruß Horst
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: So 08.12.13 18:47
Hallo,
hathor hat folgendes geschrieben : | 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!
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!):
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]; end; end; end; end; |
Werden die Wörter länger, wird man wohl anders herangehen müssen.
Sucht Mario 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
|
Verfasst: 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
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 if Length(B) = SLen - R then begin Writeln(' {' + 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 := ' '; Writeln(''); Writeln(''); Write('P(N,R) N=? : '); S:= 'WASD'; SLen := Length(S); Write('P(N,R) R=? : '); S2:='3'; R := StrToInt(S2); Writeln(''); Q := ''; P(Q, S); Readln; end. |
Alternativ:
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 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...
|
|
|