Entwickler-Ecke

Sonstiges (Delphi) - Lorem ipsum - Berechnung von Teilwerten aus einem Integer


trm - Fr 13.04.12 22:53
Titel: Lorem ipsum - Berechnung von Teilwerten aus einem Integer
Hallo,

gibt es eine Delphieigene Lösung für folgendes Konstrukt?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
const
 a=50;
 b=5;
var
 x,y,z:integer;
begin
 y:=a div b;
 for x:= 1 to a do
  begin
   if (x)=(y*z)then
    begin
     ShowMessage('x ist jetzt eine Potenz von b');
    end;
  end;
end;



Edit1: Threadtitel angepasst, in einem der folgenden Beiträge gibt es einen Anhang.
Edit2: Ein zweiter Anhang ist etwas weiter unter dem ersten zu finden.


bummi - Sa 14.04.12 00:02

und was soll in Z stehen, derzeit irgendein zufälliger Wert vom Stack ....


trm - Sa 14.04.12 00:23

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
und was soll in Z stehen, derzeit irgendein zufälliger Wert vom Stack ....


Huch, das passiert, wenn ich es hier direkt reinschreibe ^^


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
const
 a=50;
 b=5;
var
 x,y,z:integer;
begin
z:=1;
 y:=a div b;
 for x:= 1 to a do
  begin
   if (x)=(y*z)then
    begin
     ShowMessage('x ist jetzt eine Potenz von b');
inc(z,1);
    end;
  end;
end;


bummi - Sa 14.04.12 00:30

ich fürchte der Sinn erschließt sich mir weiterhin nicht ....


jaenicke - Sa 14.04.12 00:31

Mir ist nicht ganz klar was du mathematisch meinst. :gruebel:

Teilbarkeit prüfen? Modulo?

Delphi-Quelltext
1:
2:
if a mod b = 0 then
  // a ist durch b ohne Rest teilbar
Kleinstes gemeinsames Vielfaches? Primfaktorzerlegung?


trm - Sa 14.04.12 01:08

Nein, ich versuche ein "Array" zu erkennen, ob die Inhalte des "Arrays" in einer Gesamtmenge enthalten ist.

Der Hintergrund ist, dass ich einen Text habe, welchen ich in gleichmäßige Absätze teilen möchte.
A ist die Menge der Worte, b ist die Anzahl der Absätze.

Z.B. in diesem Fall gäbe es 10 Absätze (50 div 5).
Mod glaube ich, kann ich nicht direkt nutzen, da ich die Absätze und die Gesamtmenge per Function als Parameter übergebe, nur im Bsp. sind das Konstanten.


mandras - Sa 14.04.12 10:39

Wenn ich das richtig verstanden habe weißt Du eigentlich nur die Anzahl der Wörter und möchtest diese dann möglichst "schön" auf (falls möglich) gleich lange Absätze aufteilen, wofür Du die Anzahl der Wörter pro Absatz und somit die Anzahl Absätze ermitteln mußt?


trm - Sa 14.04.12 14:46

user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich das richtig verstanden habe weißt Du eigentlich nur die Anzahl der Wörter und möchtest diese dann möglichst "schön" auf (falls möglich) gleich lange Absätze aufteilen, wofür Du die Anzahl der Wörter pro Absatz und somit die Anzahl Absätze ermitteln mußt?


Ja.
Schön muss es dabei nicht sein, ich habe mal ein Beispiel angehängt.


mandras - Sa 14.04.12 18:12

Du möchtest N Wörter in M Absätze aufteilen.

Das bedeutet L=N/M Wörter pro Absatz. Da L nur ganzzahlig sein kein bietet sich an:

LS=N div M.
LS ist nun a)= L oder b) L-1.
falls A werden alle Absätze gleich lang, falls B gibt es einen letzten Absatz mit weniger Wörtern. Falls b) muß pro Absatz noch ein Wort mehr gewählt werden damit die Gesamtzahl Absätze eingehalten wird.

Lösung:
Du iterierst über 1 .. N und fügst jeweils ein Wort hinzu. Nach jeweils LS Wörtern ein Linebreak einfügen. Also Wenn i=LS bzw. 2*LS bzw 3*LS usw.
Das geht einfach:
if (i mod LS)=0 then …

als fertiger Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  x, y: Integer;
begin
  Randomize;
  y := 0;
  if Absatz > 1 then begin
    y := Anzahl div Absatz;
    // ggf. Korrektur damit nicht mehr Absätze entstehen wie gewünscht
    if (y*Absatz)<>Anzahl then y:=y+1;
  end;
  for x := 1 to Anzahl do begin
    Result := Result + LoremIspum[Random(High(LoremIspum))] + #32;
    if (y > 0then if (x mod y)=0 then begin
        Result := Result + DRB;
    end;
  end;
end;


trm - Sa 14.04.12 18:53

Hallo mandras,

Danke für Deine Antwort.
Ja, dies ist auch eine lösung, jedoch war meine Frage, ob es für dieses Vorgehen eine vorgefertigte Delphilösung gibt.
Das, was Du gemacht hast, ist ja "nur" meine zweite Schleife zu verkürzen (per modulo) und eine Variable wegzulassen.

Schönes WE, liebe Grüße :)


mandras - Sa 14.04.12 18:59

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:

> jedoch war meine Frage, ob es für dieses Vorgehen eine vorgefertigte Delphilösung gibt.

ist mir nicht bekannt.

LG

Andreas


trm - Mo 16.04.12 11:01

Im Anhang mein Lorem ipsum, ähnlich, wie es auf diversen Webseiten zu finden ist.

Neu ist, dass Zufällig Kommata, Satzpunktzeichen mit anschließender Großschreibung des nächsten Wortes sowie zufälligerweise Großschreibung im Satz.
Außerdem können doppelte Absätze bei Bedarf selbst eingestellt werden.

Wenn jemand eine bessere Lösung als meine findet (oder auch ab jetzt: schöneren Code erzeugt), wäre ich sehr verbunden, wenn ich die sehen dürfte :)

Viele Grüße
Mathias