Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wieder mal Kombinationen (https://www.delphipraxis.net/173858-wieder-mal-kombinationen.html)

BlackViper73 21. Mär 2013 08:41

Wieder mal Kombinationen
 
Guten morgen, jetzt habe ich schon hin und her im Forum gesucht, aber so richtig lässt sich keine der Lösungen hier mit meinen Fall vergleichen, oder ich seh den Wald vor lauter Bäumen nicht.:)

Also es geht darum, ich habe 8 Variablen vom typ String welche wiederum genau 5 Werte annehmen können. Diese sind:

0000
1000
0100
1010
0101

Was ich nun benötige sind sämtliche Kombinationen aus diesen Werten. Rein theoretisch wären das ja 8^5 also 32768 Möglichkeiten, soweit richtig? Am Ende sollten also 32768 32stellige Strings herauskommen.


Kann mir einer von euch auf die Sprünge helfen?

VG Jarno

sx2008 21. Mär 2013 09:03

AW: Wieder mal Kombinationen
 
Es sind 5*5*5*5*5*5*5*5 = 5 ^ 8 = 390625 mögliche Kombinationen.

Furtbichler 21. Mär 2013 09:13

AW: Wieder mal Kombinationen
 
Na, ganz einfach: 8 Variablen und jede kann 5 Werte annehmen. Dann nimm ein Array mit 8 Elementen. Jedes Element kann einen der 5 Werte annehmen. Anfangen tust Du mit (0,0,0,0,0,0,0,0). Dann (1,0,0,0,0,0,0,0)... nach (4,0,0,0,0,0,0,0) wird es interessant: (0,1,0,0,0,0,0,0)

So kann man das in Delphi machen.
Delphi-Quellcode:
Type TDigitArray = Array [0..7] Of Byte;

Function AddOne(Var Digits : TDigitArray) : Boolean;
Var
  i : Integer;

Begin
  for i := 0 to 7 do
    if Digits[i] = 4 then
      Digits[i] = 0
    else begin
      inc (Digits[i]);
      Result := True;
      exit;
    end;
  Result := False;
end;

Procedure ShowData (Digits :TDigitArray);
Const
  Values : Array [0..4] Of String = ('0000', '1000', '0100', '1010', '0101');

Var
  i : Integer;

Begin
  For i:=0 to 7 do Write(Values[Digits[i]], ' ');
  Writeln;
End;

Procedure CountThemAll;
Var
  a : TDigitArray;

Begin
  FillChar(a, SizeOf(a), 0);
  Repeat
    ShowData(a);
  Until Not AddOne(a);
End;

BlackViper73 21. Mär 2013 09:24

AW: Wieder mal Kombinationen
 
Ich danke euch beiden :thumb:
Zitat:

Zitat von sx2008 (Beitrag 1208160)
Es sind 5*5*5*5*5*5*5*5 = 5 ^ 8 = 390625 mögliche Kombinationen.

Stimmt, das genau war mein Denkfehler, also kann ich das ganze mit 8 Schleifen und einem kleinen Array für die Werte lösen.

VG Jarno

jfheins 21. Mär 2013 09:25

AW: Wieder mal Kombinationen
 
Hat das einen besonderen Grund dass du das mit Strings machst und nicht mit Bitmustern? Zumal man 32 bits ja auch gerade noch bequem in einen Cardinal reinbekommt...

mentaltec 21. Mär 2013 09:31

AW: Wieder mal Kombinationen
 
ungefähr so

Code:
var
  ziffer : Array[0..8] of char o.ä. = ('0','0','0','0','0','0','0','0','0'); // bei char #30..#34 kannste gleich writln(leftstr(Ziffer[0])) glaub ich

proc incThis(stelle : Int);
begin
  inc(ziffer[stelle]);
  if (Ziffer[stelle] = '5') then
  begin //uebertrag
    incThis(succ(stelle));
    Ziffer[stelle]:='0';
  end;
end;

begin
while ziffer[8] = '0' do // Ziffer[8] stellt hier das Carry-bit dar
  incThis(0);  // inc lowest digit
end;

BlackViper73 21. Mär 2013 09:41

AW: Wieder mal Kombinationen
 
Zitat:

Zitat von jfheins (Beitrag 1208166)
Hat das einen besonderen Grund dass su das mit Strings machst und nicht mit Bitmustern? Zumal man 32 bits ja auch gerade noch bequem in einen Cardinal reinbekommt...

Wie du richtig feststellst, handelt es sich um ein normales 32Bit Binärsystem. Also hintergrund dazu:
Ich mache ein Programm in welchem 8 Sensoren abgefragt werden. Je nach Wert kann ich 5 verschiedene Ereignisse haben.
Als gesamtes Ereignis brauche ich also dann das Ergebnis aller 8 Sensoren mit den einzelnen Werten.
Anhand dieses Gesamtwertes werden dann Relais an einer Platine geschaltet.

Letztendlich Rechne ich schon diesen 32Bit Binärwert in einen Dezimalwert um, um ihn letztendlich schneller zu finden. Als String brauche ich den Wert nur, um ihn in eine Log Datei zu schreiben.

Der Binärwert der Messung 01000101010110000000000000000000 ist halt leichter zu Lesen (wenn man weis welche Stelle, welcher Sensor ist) als die Zahl 6818 :wink:

VG Jarno

jfheins 21. Mär 2013 09:56

AW: Wieder mal Kombinationen
 
Du kannst es auch hexadezimal in die Logdatei schrieben, dann brauchst du für jeden Sensor nur eine Ziffer :wink:

BlackViper73 21. Mär 2013 10:37

AW: Wieder mal Kombinationen
 
Ich werde es eh wahrscheinich anders machen müssen :?
Das ganze ist für alle Möglichen Kombinationen viel zu unübersichtlich. Also werde ich es wohl doch pro Sensor speichern müssen. Da muss ich aber erstmal ein wenig grübeln, ob das so überhaupt praktikabel ist :|

VG Jarno

BlackViper73 21. Mär 2013 15:33

AW: Wieder mal Kombinationen
 
So kleines Update. Ich habe nun alles dahingehend geändert, dass die Ergebnisse der Sensoren einzeln gespeichert werden. Den benötigten 32Bit Wert setze ich dann zur Laufzeit zusammen.
Vorher hätte man eigentlich 390625 Sachen konfigurieren müssen und die Datei in der alles gespeichert wurde lag letztendlich bei 30mb.
Tja jetzt konfiguriert man 40 Ereignisse und die Konfig ist gerade mal knapp 6kb gross :-D

Aber vielen Dank für den Denkanstoss :thumb:

VG Jarno


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 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