Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 676 zufällige Schlüssel zuweisen (https://www.delphipraxis.net/104517-676-zufaellige-schluessel-zuweisen.html)

Informatik-LK 5. Dez 2007 16:06


676 zufällige Schlüssel zuweisen
 
Hallo,

ich bins mal wieder, euer Delphi-Noob. In dieser Hausaufgabe muss ich einen Text aus einem Memofeld Buchstabenpaarweise verschlüsseln können.
Also: Es gibt 676 verschiedene Buchstabenpaare; 26² nämlich. Diesen Buchstabenpaaren soll jeweils ein Schlüssel zugewiesen werden, das heißt, aus AB wird meinetwegen HJ, aus GF wird ZU und so weiter.
Mein StringGrid ist im anhängten Bild dargestellt.

Könntet ihr mir nun sagen, wie es möglich ist, per Zufall (random) 676 Schlüssel zuzuweisen, sodass sie rechts von den Buchstabenpaaren im StringGrid stehen?

Gruß

Informatik-LK

mkinzler 5. Dez 2007 16:09

Re: 676 zufällige Schlüssel zuweisen
 
Erzeuge zwei Listen mit allen Kombinationen. Mach eine Schleife über die 1. Liste und weise per Zufall jedem Eintrag einen Eintrag der 2. Liste zu und markiere den dann als belegt.

RavenIV 5. Dez 2007 16:14

Re: 676 zufällige Schlüssel zuweisen
 
Zitat:

Zitat von Informatik-LK
...
Mein StringGrid ist im anhängten Bild dargestellt.
...

Das Bild ist nicht da.

himitsu 5. Dez 2007 16:16

Re: 676 zufällige Schlüssel zuweisen
 
Erstmal welches Bild?

Da ja bestimmte jedes Buchstabenpaar in deiner Liste nur einmal vorkommen darf, ist es am Einfachsten erstmal die Liste der Reihe nach zu füllen und danach vermischts du einfach per Zufall diese Liste.

z.B.:
Code:
Liste Füllen: AA=AA AB=AB ... ZZ=ZZ

10000 Mal machen (
  i1 = Random(676);
  i2 = Random(676);
  Liste[i1] und Liste[i2] vertauschen
)

Informatik-LK 5. Dez 2007 16:19

Re: 676 zufällige Schlüssel zuweisen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke schon einmal für eure Antworten.

Sorry wegen dem Bild. Ist jetzt da.

Informatik-LK 5. Dez 2007 16:33

Re: 676 zufällige Schlüssel zuweisen
 
Ähm, tja.
Ich kenne Delphi erst seit September dieses Jahres, von daher kann ich leider mit euren Ratschlägen so nicht viel anfangen, da ich zum Beispiel nicht weiß, wie ich die Listen mit den Buchstaben fülle usw.
Es ist zwar eine große Bitte, aber mir würde es viel mehr nützen, wenn ich den Quelltext [zur Lösung] sehen könnte, da ich es verstehe wenn ich ihn sehe, aber wenn ich ihn selber schreiben soll, habe ich enorme Probleme...

Es wäre toll, wenn ihr mir einen Ansatz dazu geben könntet.

himitsu 5. Dez 2007 16:34

Re: 676 zufällige Schlüssel zuweisen
 
sehr viele Zeilen niwa?

versuch's lieber etwa so (da Graue entspricht dem für was der Zelleninhalt steht und Schwarz sind die Überschriften)
Code:
[color=silver].[/color] Ax Bx Cx Dx ... Zx
xA [color=silver]AA BA CA ...[/color]
xB [color=silver]AB BB ...[/color]
xC [color=silver]AC ...[/color]
...
xZ [color=silver]AZ ...[/color]

Informatik-LK 5. Dez 2007 16:53

Re: 676 zufällige Schlüssel zuweisen
 
Wäre vielleicht eine Idee, aber ich weiß immmer noch nicht, wie ich die Schlüssel zuweise... :(

himitsu 5. Dez 2007 16:58

Re: 676 zufällige Schlüssel zuweisen
 
wie ist den deine Liste definiert?

rollstuhlfahrer 5. Dez 2007 17:00

Re: 676 zufällige Schlüssel zuweisen
 
versuchs mal so:

Delphi-Quellcode:
procedure Zuweisen;
var schluessel: array[0..675] of string[2];   // 675 + 1 (nullstelle) = 676
    x, y: Integer; {fuer die Schleife}
    zeichen1, zeichen2: integer; {zum zuweisen}
begin

Zeichen1 := ORD('A');


for x := 0 to 25 do
begin
  Zeichen2 := ORD('A');

  for y := 0 to 25 do
  begin
    schluessel[x*26+y] := Chr(Zeichen1) + Chr(Zeichen2);
    Zeichen2 := Zeichen2 + 1;
  end;
  Zeichen1 := Zeichen1 + 1;
end;

// Soviel zum Zuweisen
end;
Das Ergebnis ist dann:
[0]: AA
[1]: AB
...
[26]: AZ
[27]: BA
...

rollstuhlfahrer

[EDIT] Fehler im Quelltext behoben [/EDIT]

DeddyH 5. Dez 2007 17:02

Re: 676 zufällige Schlüssel zuweisen
 
Für zusammenhängende Buchstabenpaare bietet sich ein Record an in der Art
Delphi-Quellcode:
type TKeyPair = record
  plain,
  crypted: string[2];
end;
Wie man sich wohl denken kann, kommt das Ursprungspaar in das Feld plain und die verschlüsselte Variante in das Feld crypted.

Informatik-LK 5. Dez 2007 17:23

Re: 676 zufällige Schlüssel zuweisen
 
Hallo rollstuhlfahrer,

deine Idee ist zum Erstellen der Liste oder?

DeddyH, ich weiß nicht so recht, was ich mit deinem Beitrag anfangen soll... sorry.

himitsu 5. Dez 2007 17:28

Re: 676 zufällige Schlüssel zuweisen
 
@DeddyH: unnötiger Speicherverbrauch

Delphi-Quellcode:
Var Liste: Array['A'..'Z', 'A'..'Z'] of String[2];
// oder
Var Liste: Array['A'..'Z'] of Array['A'..'Z'] of String[2];
Zugriff dann per etwas davon
Delphi-Quellcode:
Liste['A', 'Z'] = Feld AZ = Liste['A']['Z']

oder auch
Delphi-Quellcode:
Var Liste: Array['A'..'Z'] of Array['A'..'Z'] of Array[0..2] of Char;

Var Liste: Array['A'..'Z'] of Array['A'..'Z'] of Record
  c1, c2: Char;
End;
oder
...

DeddyH 5. Dez 2007 17:44

Re: 676 zufällige Schlüssel zuweisen
 
Hab ich da was falsch verstanden? Ich dachte, jeder Buchstabenkombination soll eine andere zugewiesen werden (z.B. AA -> BG).

Informatik-LK 5. Dez 2007 17:55

Re: 676 zufällige Schlüssel zuweisen
 
Soll eigentlich auch so sein. Wenn ich rollstuhlfahrer's Idee nehme, dann wird AA anscheinend 91 zugewiesen...

Informatik-LK 5. Dez 2007 18:37

Re: 676 zufällige Schlüssel zuweisen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe gerade noch eine Idee: Schaut euch erstmal meine Form an (beachtet nur die StringGrids). Wenn das Programm gestartet wird, stehen ja bei den StringGrids jeweils in der nullten Spalte die 676 Buchstabenpaare.
Nun habe ich mir einfach gedacht, wenn ich den Button "Schlüssel" klicke, bekommen die Zellen aus der ersten Spalte des linken StringGrids (also die Spalte neben den Buchstabenpaaren) durch Zufall den Inhalt der nullten Spalte des rechten StringGrids.

Ich wollte es in etwa so umsetzen:

Delphi-Quellcode:
Procedure ButtonKeysClick(Sender: TObject);
var i: longint;
begin
  for i := 0 to 675 do
  StringGrid1.Cells[1,i] := {Inhalt der zufällig ausgewählten Zellen im rechten StringGrid der Spalte 0}
end;
Habt ihr eine Ahnung, was ich in die geschweiften Klammern schreiben müsste? Ich habe nämlich schon so einige Sachen ausprobiert, aber es hat alles nicht funktioniert.

Gruß

himitsu 5. Dez 2007 19:31

Re: 676 zufällige Schlüssel zuweisen
 
ich glaub Rollstuhlfahrers Code könnte Funktionieren (sieht jedenfalls für mich so aus).

Delphi-Quellcode:
Var C1, C2, C3, C4: Char;
  S: String[2];
  Liste: Array['A'..'Z', 'A'..'Z'] of String[2];
  i, i2, i3: Integer;

// Liste zuweisen
For C1 := 'A' to 'Z' do
  For C2 := 'A' to 'Z' do
    Liste[C1, C2] := C1 + C2;

// Liste mischen
For i := 0 to 10 do
  For C1 := 'A' to 'Z' do
    Liste[C1, Char(Ord('A') + Random(26))] :=
      Liste[Char(Ord('A') + Random(26)), Char(Ord('A') + Random(26))];

// oder Liste mischen
For i := 0 to 10000 do Begin
  C1 := Char(Ord('A') + Random(26));
  C2 := Char(Ord('A') + Random(26));
  C3 := Char(Ord('A') + Random(26));
  C4 := Char(Ord('A') + Random(26));
  S := Liste[C1, C2];
  Liste[C1, C2] := Liste[C3, C4];
  Liste[C3, C4] := S;
End;

Informatik-LK 5. Dez 2007 19:41

Re: 676 zufällige Schlüssel zuweisen
 
Vielen Dank. Ich werde es probieren. :)

Eine kurze Frage noch: Von welchem Typ ist die Variable S ?

himitsu 5. Dez 2007 19:56

Re: 676 zufällige Schlüssel zuweisen
 
nja, da du 2 Bchstaben hast ... also String

String,
String[2]
oder Array[0..1] of Char


hab die Variablendefinitionen oben nachgetragen

Informatik-LK 5. Dez 2007 20:39

Re: 676 zufällige Schlüssel zuweisen
 
Ok, und was genau ist jetzt zu tun, um die Ergebnisse ins StringGrid zu übertragen?

rollstuhlfahrer 7. Dez 2007 14:31

Re: 676 zufällige Schlüssel zuweisen
 
Zitat:

Zitat von Informatik-LK
Soll eigentlich auch so sein. Wenn ich rollstuhlfahrer's Idee nehme, dann wird AA anscheinend 91 zugewiesen...

Alao mal ehrlich:
In der ASCII-Code-Tabelle kommen alle Großbuchstaben hintereinaner und da sich die Schleifen nur 26 man ausführen, kann da nie eine Zahlenkombination rauskommen

Das fnktioniert dann etwa so:

Delphi-Quellcode:
type tschluessel= array[0..675] of string[2];

function Zuweisen: tschluessel
var schluessel: array[0..675] of string[2];   // 675 + 1 (nullstelle) = 676
    x, y: Integer; {fuer die Schleife}
    zeichen1, zeichen2: integer; {zum zuweisen}
begin

Zeichen1 := ORD('A');


for x := 0 to 25 do
begin
  Zeichen2 := ORD('A');

  for y := 0 to 25 do
  begin
    schluessel[x*26+y] := Chr(Zeichen1) + Chr(Zeichen2);
    Zeichen2 := Zeichen2 + 1;
  end;
  Zeichen1 := Zeichen1 + 1;
end;
Result := schluessel;
end;

procedure Anzeigen;
var schluessel: tschluessel;
    i,y: Integer;
begin
Randomize;
schluessel := Zuweisen;
i := Random(675) + 1; // dass i nicht 0 sein kann

for y := 0 to 675 do
begin
   if i > StringGrid1.RowCount - 1 then
     i := 1;

   StringGrid1.Cells[1,i] := schluessel[y];
   i := i + 1;
end;
end;
rollstuhlfahrer


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.

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-2025 by Thomas Breitkreuz