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/)
-   -   Delphi "Schlossknack"-Algorithmus (https://www.delphipraxis.net/90569-schlossknack-algorithmus.html)

fLaSh11 19. Apr 2007 16:35


"Schlossknack"-Algorithmus
 
Hallo DPler,

ich weiß nicht mehr weiter. :)
Ich möchte sozusagen den "Schlossknack"-Algorithmus anwenden, d.h. eine Variable von 1 bis 9 hochählen, wenn 9, dann die nächste auf 1,... Nun hat mein "Schloss" aber x Stellen.

Die einzige möglichkeit, die mir einfiel, war ein dyn. Array of Integer zu erstellen, ihm die Länge zu geben und dann die einzelnen Integer-Zahlen hochzuzählen. Will der Compiler aber nicht :evil: ...

Gibts noch ne andere Möglichkeit?

MfG
Steffen

//Edit: besserer Titel

Neutral General 19. Apr 2007 16:43

Re: for-Schleife x-Mal
 
Hi,

Verschachtelte for-schleifen?
Oder versteh ich was falsch?

Delphi-Quellcode:
var Schloss: Array[1..Stellen] of Integer;
for i:= 1 to Stellen do
begin
  for j:= 1 to 9 do
    inc(Schloss[i]);
end;
Gruß
Neutral General

Apollonius 19. Apr 2007 16:46

Re: for-Schleife x-Mal
 
Das Problem hatte ich auch mal. Die Lösung ist Rekursion. Du setzt eine globale Variable auf x. Dann erstellst du eine Funktion:
Delphi-Quellcode:
procedure schlossknack(laenge:integer);
begin
//mach irgendwas mit globalen Variablen
if laenge>1 then
 schlossknack(laenge-1);
end;
Edit: Neutral Generals Lösung scheint aber besser zu sein.

fLaSh11 19. Apr 2007 16:57

Re: for-Schleife x-Mal
 
@Neutral General:
Soweit ich sehe, zählt dieser Algorithmus einfach alle Variablen von 1 bis 9 hoch. Aber wenn die nächste eins hochgesetzt wird, sollte erst die ganz erste wieder von 1 bis 9 gezählt werden, so als wölltest du ein Schloss knachen.

du versuchst es folgendermaßen (bei einem Schloss mit 3 Stellen:
Code:
1 1 1
2 1 1
3 1 1
...
9 1 1
1 2 1
2 2 1
3 2 1
...
8 9 3
9 9 3
1 1 4
2 1 4
...

Apollonius 19. Apr 2007 17:02

Re: "Schlossknack"-Algorithmus
 
Nun, du musst eben bei jedem Aufruf der ersten for-Schleife die aktuelle Schlossvariable auf 0 setzen: Schloss[i]:=0;
Und der Stackbedarf ist deutlich besser als bei der Rekusrion, ich versuche mal, mein Prog, indem ich das durch Rekursion gelöst habe, zu beschleunigen.
DANKE, NEUTRAL GENERAL!!!

Torpedo 19. Apr 2007 17:03

Re: for-Schleife x-Mal
 
Zitat:

Zitat von fLaSh11
du versuchst es folgendermaßen (bei einem Schloss mit 3 Stellen:
Code:
1 1 1
2 1 1
3 1 1
...
9 1 1
1 2 1
2 2 1
3 2 1
...
8 9 3
9 9 3
1 1 4
2 1 4
...

Also ich würde es anders versuchen. Und zwar so:
111
112
113
...

Wieso einfach, wenns auch schwierig geht? ;)

fLaSh11 19. Apr 2007 17:13

Re: "Schlossknack"-Algorithmus
 
@Torpedo: klaro, aber Start und Ende bei jeder Stelle sind dort, wo ich das Ganze brauche auch variabel :mrgreen:
@Apollonius: Werd mal überlegen :)

Torpedo 19. Apr 2007 17:21

Re: "Schlossknack"-Algorithmus
 
Zitat:

Zitat von fLaSh11
@Torpedo: klaro, aber Start und Ende bei jeder Stelle sind dort, wo ich das Ganze brauche auch variabel :mrgreen:

Vielleicht versteh ich ja was nicht richtig, aber wenn man will, dass er bei z.B. 246 beginnt und bei 500 aufhört, dann kan man ja auch nur diese Zahlen durchzählen.
Oder ist das Problem wie man aus den einzelnen Stellen eine ganze Zahl macht?
Ziffer1 = 2
Ziffer2 = 4
Ziffer3 = 6

Zahl = Ziffer1*100+Ziffer2*10+Ziffer3

Meflin 19. Apr 2007 17:48

Re: "Schlossknack"-Algorithmus
 
Du könntest auch einfach meine Komponente verwenden :mrgreen:

http://www.delphipraxis.net/internal...ct.php?t=62161


Apollonius 19. Apr 2007 17:54

Re: "Schlossknack"-Algorithmus
 
Ich nehme alles zurück!!! Neutral Generals Lösung funktioniert nicht, es sei denn, ich habe was falsch implementiert. Man muss ja sozusagen x ineinanderverschachtelte for-schleifen haben. Da fällt mir nichts anderes ein als die Rekursion, also:
Delphi-Quellcode:
var schloss:array[1..stellen] of integer;

procedure angriff(laenge:integer);
var i:integer;
begin
if laenge=1 then
 begin
  for i:=0 to 9 do
   begin
    schloss[laenge]:=i;
    knackdasschloss(schloss);
   end;
 end
else
 begin
  for i:=0 to 9 do
   begin
    schloss[laenge]:=i;
    angriff(laenge-1);
   end;
 end;

end;

//Aufruf
angriff(stellen);
Im Prinzip ist das eine Simulation von laenge ineineanderverschlachtelten for-Schleifen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 Uhr.
Seite 1 von 2  1 2      

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