Autor Beitrag
Efrel
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 14.10.10 12:56 
Hallo liebes Forum,

ich arbeite grad an einem komplizierten Problem, aber irgendwie fehlt mir noch die zündende "Einstiegsidee".

Und zwar soll aus einem TStringgrid heraus eine mathematische Vollvariation aller denkbaren Kombinationen von Möglichkeiten erzielt werden.
Ich erkläre es am besten an einem Beispiel.
So sähe der Grid mit Einträgen aus:
grid

Jede Spalte kann immer nur den gleichen Wert eingetragen haben (bzw. überhaupt nur einen Buchstaben).
Jetzt sollen alle Kombinationen der Buchstabenreihen von oben nach unten errechnet werden (insgesamt sind es 12 --> leicht auszurechnen, da nur Multiplikation der Anzahl Einträge je Zeile, also 1*2*3*2).
Das Problem ist jetzt - welche Reihenkombinationen ganz genau gibt es? :?:

Die Berechnung hangelt sich dabei von Zeile zu Zeile im Grid und arbeitet sowohl mit den Werten, die darin stehen als auch der Anzahl der Werte je Spalte.
Grafisch skizziert sieht der Rechenvorgang so aus:
schema

1. Die Werte aus Zeile 1 werden nacheinander in eine Tabelle gesetzt (hier nur ein Wert "b").
2. Entsprechend der Anzahl der Werte aus Zeile 2 wird die erste Zeile vervielfacht und nebeneinandergeschrieben (in Beispiel zweimal, da Werte "b" und "c" - gelb markiert).
3. Darunter wird je Vervielfachung ein Wert der Zeile 2 geschrieben (im Beispiel "b" und "c").
4. Der gesamte jetzt existierende Block wird wieder entsprechend der Anzahl der Werte der nächsten Zeile (3) vervielfacht und nebeneinandergeschrieben (in Beispiel dreimal, da Werte "a", "b" und "c" - grün markiert).
5. Darunter jetzt wieder je Vervielfachung ein Wert der Zeile 3 gesetzt...
usw. bis zur letzten Zeile.
Wenn dann die letzte Zeile ausgerechnet wurde, müsste man alle Möglichkeiten ermittelt haben.
Blau ist übrigens immer das markiert, was nach der Multiplikation einer Zeile hinzukommt und was genau den Spalteninhalten je Zeile entspricht.

In obigen Beispiel ist´s natürlich noch einfach, da übersichtlich und nur 4 Zeilen. Die Reihenanzahl ändert sich aber drastisch nach oben, wenn es schon 10 oder 12 Zeilen im Stringgrid werden, wo Daten drin stehen.
Die Komplikation besteht imo u. a. darin, dass Delphi erstmal erkennen muss, wieviel/welche Einträge im Grid in einer Zeile belegt sind (leere Felder ignorieren). Dann immer den gesamten schon vorhandenen Block je dieser Anzahl kopieren und je Block wieder die neuen Werte unten anfügen usw.

Habt Ihr einen Vorschlag, wie man an das Problem herangehen könnte?

Herzliche Grüße
Efrel

Moderiert von user profile iconNarses: Bilder als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Efrel am Do 14.10.10 13:09, insgesamt 2-mal bearbeitet
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 14.10.10 14:58 
Hey,

iwie versteh ich das Problem nicht. Denn du berechnest ja hier nich ALLE möglichen Kombinationen. Normalerweiße müsstest du erstmal die Anzahl der Kombinationen ausrechnen: mit 4 Zeichen, bei 4 Zeilen wären das 4 hoch 4 = 256 mögliche Kombinationen.
Dann zählst du mit einer Schleife alle Möglichkeiten durch und berechnest dir daraus einen String, mit den Zeichen. Das ist auch relativ einfach. Die 1 Stelle berechnest du mit str[1] := chr(Value mod 4 + $30). Dann den Wert umrechnen, sodas du die nächste Stelle berechnen kannst: Value := Value div 4;. Dann kannst du die 2. Stelle in den String schreiben: str[2] := chr(Value mod 4 + $30); usw.

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^

Für diesen Beitrag haben gedankt: Efrel
Efrel Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 14.10.10 15:11 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Hey,

iwie versteh ich das Problem nicht. Denn du berechnest ja hier nich ALLE möglichen Kombinationen. Normalerweiße müsstest du erstmal die Anzahl der Kombinationen ausrechnen: mit 4 Zeichen, bei 4 Zeilen wären das 4 hoch 4 = 256 mögliche Kombinationen.


Ganz genau - wenn der Grid vollkommen ausgefüllt wäre, also so:
grid

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:

Dann zählst du mit einer Schleife alle Möglichkeiten durch und berechnest dir daraus einen String, mit den Zeichen. Das ist auch relativ einfach. Die 1 Stelle berechnest du mit str[1] := chr(Value mod 4 + $30). Dann den Wert umrechnen, sodas du die nächste Stelle berechnen kannst: Value := Value div 4;. Dann kannst du die 2. Stelle in den String schreiben: str[2] := chr(Value mod 4 + $30); usw.

MfG Bergmann.


Puhh...Das muss ich erstmal verarbeiten :oops: .
Blöd gefragt: Was passiert oder ist $30?

Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 14.10.10 16:37 
Hey,

$30 = 30hex = 48 ;)

Das was du jetz in der Tabelle hast sind doch aber alles sie gleichen Kombinationen. Wenn du alle haben willst würde das doch so aussehen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
_ _ a
_ _ b
_ _ c
_ a a
_ a b
_ a c
_ b a
...

Ich kann die heut abend mal was basteln, das lässt sich doof erklären. Zur Zeit bin ich aber noch auf Arbeit, ich meld mich dann nochma...

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^

Für diesen Beitrag haben gedankt: Efrel
Efrel Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 14.10.10 17:08 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:

Das was du jetz in der Tabelle hast sind doch aber alles sie gleichen Kombinationen. Wenn du alle haben willst würde das doch so aussehen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
_ _ a
_ _ b
_ _ c
_ a a
_ a b
_ a c
_ b a
...



Richtig, wenn die Tabelle so weiterggänge:

_ b b
_ b c
_ c a
_ c b
_ c c
Und dann wäre Zeile zwei des Grids durch.

Allerdings trifft das halt nur zu, wenn ALLE Felder im Grid ausgefüllt sind (mathem. Vollvariation).
Wenn nur nur einige (siehe Eingangspost) ausgefüllt sind, vermindern sich natürlihc die Möglichkeiten und Anzahl der Lösungen.
Dann müsste die Rechnungsformel erkennen: Aha - Zelle leer, ignorieren.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 14.10.10 17:54 
leere Zellen zu ignorieren ist zu kompliziert, betrachte leere Zellen als extra Zeichen, also hast du dann 5 mögliche Zeichen (a, b, c, d, _) und 4 Stellen: 5 hoch 4 = 625 Möglichkeiten
Hier der Code den ich dir versprochen hab:
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:
function IntToCharSet(int: Integer; const digits: Integer; const CharSet: String): String;
var
  i, len, strID: Integer;
begin
  result := '';
  len := Length(CharSet);
  for i := 0 to digits-1 do begin
    strID := int mod len;
    result := CharSet[strID+1] + result;
    int := int div len;
  end;
end;

procedure TForm1.GenerateBtClick(Sender: TObject);
var
  CharSet: String;
  CharCount, Count, i: Integer;
begin
  CharSet   := CharSetEd.Text;
  CharCount := StrToIntDef(CharCountEd.Text, 4);
  Count := Round(Power(Length(CharSet), CharCount));
  Memo1.Clear;
  for i := 0 to Count-1 do
    Memo1.Lines.Add(IntToCharSet(i, CharCount, CharSet));
end;

und als kleiner Bonus (:D) noch das Projekt im Anhang...

MfG Bergmann.
Einloggen, um Attachments anzusehen!
_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^

Für diesen Beitrag haben gedankt: Efrel