home *** CD-ROM | disk | FTP | other *** search
-
- PROGRAM permutationsberechnungen;
- {-------------------------------------------------}
- { Permutationsberechnungen (Turbo Pascal 3.0) }
- { }
- { (C) 1989 TOOLBOX & Jörg Müller }
- {-------------------------------------------------}
-
- TYPE strng = STRING[80];
-
- VAR txt,tem : strng;
- ch : CHAR;
- nr : REAL;
- step_mode : BOOLEAN;
-
- {-------------------------------------------------}
- PROCEDURE wait_of_return; {wartet auf RETURN}
- BEGIN
- WRITE('RETURN drücken '); READLN; CLRSCR;
- END;
- {-------------------------------------------------}
- FUNCTION left(txt : strng; m : BYTE):strng;
- { liefert von links m Zeichen }
-
- BEGIN
- left:=COPY(txt,1,m);
- END;
- {-------------------------------------------------}
- FUNCTION right(txt : strng; m : BYTE):strng;
- { liefert von rechts m Chars }
- VAR pos : BYTE;
- BEGIN
- pos:=LENGTH(txt)-m+1;
- IF LENGTH(txt)-m+1<1 THEN right:=txt
- ELSE right:=COPY(txt,LENGTH(txt)-m+1,m);
- END;
- {-------------------------------------------------}
- FUNCTION fak(n : BYTE):REAL; { Fakultätsfunkton }
- VAR help : REAL; i : INTEGER;
- BEGIN
- help:=1.0; FOR i:=2 TO n DO help:=help*i;
- fak:=help;
- END;
- {-------------------------------------------------}
-
- {=================================================}
- PROCEDURE nte_permut(txt:strng; nr:REAL;
- step_mode:BOOLEAN; VAR tem:strng);
- {-----------------------------------------------}
- { Ermittlung des Wortes, das bei einer }
- { lexikographisch geordneten Permutation }
- { Eingabeparameter : }
- { txt: Zeichenkette, in der die Zeichen, die }
- { permutiert werden sollen, in sortierter }
- { Reihenfolge stehen müssen. }
- { nr: Enthält die Nummer des Permutationswortes,}
- { das ermittelt werden soll. }
- { step_mode: bei TRUE : Ausgabe von Zwischen- }
- { ergebnissen }
- { FALSE : keine Ausgabe von Zwischenergebnissen.}
- { Rückgabeparameter : }
- { tem: Das ermittelte Permutationswort. }
- {-------------------------------------------------}
- CONST eps = 1e-8;
- VAR n,i,j,k : BYTE;
- help : CHAR;
- alt,neu : REAL;
- BEGIN
- n:=LENGTH(txt);
- FOR i:=1 TO (n Div 2) DO BEGIN { umdrehen }
- help:=txt[i]; txt[i]:=txt[n-i+1];
- txt[n-i+1]:=help;
- END;
- alt:=0.0;
- neu:=0.0;
- i:=0;
- REPEAT
- i:=i+1;
- help:=txt[n];
- { rotieren: letzte --> i.te }
- FOR k:=n-1 DOWNTO i DO txt[k+1]:=txt[k];
- txt[i]:=help;
- j:=0;
- REPEAT
- j:=j+1;
- IF j>1 THEN BEGIN
- help:=txt[i]; txt[i]:=txt[n+2-j];
- txt[n+2-j]:=help;
- { tauschen }
- END;
- alt:=neu;
- neu:=neu+fak(n-i);
- IF step_mode THEN WRITELN(neu:5:0,' >',txt);
- UNTIL neu>=nr;
- IF Abs(neu-nr)<eps THEN alt:=neu;
- neu:=alt;
- UNTIL (Abs(alt-nr)<eps) OR (i=n);
- tem:=txt;
- END;
- {=================================================}
- FUNCTION num_permut(txt,tem:strng):REAL;
- {-----------------------------------------------}
- { Ermittlung der Nummer (Stelle) an der das Per-}
- { mutationswort "TXT" bei einer lexikographisch }
- { geordneten Permutation steht. }
- { Eingabeparameter : }
- { txt : Zeichenkette, die das Permutationswort }
- { enthält, dessen Nummer ermittelt wird. }
- { tem : Zeichenkette, die die Zeichen von "TXT" }
- { in sortierter Reihenfolge enthält. }
- { Rückgabeparameter : }
- { Funktionswert : Nummer der Permutation }
- {-----------------------------------------------}
- VAR n,i,j : BYTE;
- help : CHAR;
- nr : REAL;
- BEGIN
- n:=LENGTH(txt);
- nr:=0.0;
- FOR i:=1 TO n DO BEGIN
- help:=txt[i];
- j:=0;
- REPEAT
- j:=j+1;
- UNTIL tem[j]=help;
- tem:=left(tem,j-1)+right(tem,n-i-j+1);
- nr:=nr+(j-1)*fak(n-i);
- END; { for }
- num_permut:=nr+1.0;
- END;
- {=================================================}
-
- {-------------------------------------------------}
- PROCEDURE sort_strng(txt:strng; VAR tem:strng);
- {-----------------------------------------------}
- { Sortiert die Zeichen in "txt" mit aufsteigender }
- { Reihenfolge und gibt diese mit "tem" als }
- { Rückgabeparameter zurück. }
-
- {-------------------------------------------------}
- VAR n,i,j : BYTE;
- help : CHAR;
- f : BOOLEAN;
- BEGIN
- n:=LENGTH(txt);
- FOR i:=1 TO n DO BEGIN
- help:=txt[i];
- j:=0;
- IF i<2 THEN tem:=help
- ELSE BEGIN
- REPEAT
- j:=j+1;
- f:=tem[j]>help;
- UNTIL f OR (j>=i-1);
- IF f THEN tem:=left(tem,j-1)+help
- +right(tem,i-j)
- ELSE tem:=tem+help;
- END;
- END; { for }
- END;
- {-------------------------------------------------}
- PROCEDURE get_perm_strng(VAR txt,tem:strng);
- { Zeichen einlesen & sortieren }
- BEGIN
- CLRSCR;
- WRITELN('Geben Sie die Zeichen (hinter ">") an,
- die im Permutationswort ');
- WRITELN;
- WRITELN('enthalten sein sollen.'); WRITELN;
- WRITELN;
- WRITE('>'); READLN(txt);
- sort_strng(txt,tem);
- WRITELN; WRITELN; WRITELN;
- WRITELN('Da beide Routinen die Zeichen in');
- WRITELN('sortierter Folge benötigen, habe');
- WRITELN('ich Ihre Eingabe sortiert. Hier sind');
- WRITELN('Ihre Zeichen in sortierter');
- WRITELN('Reihenfolge !!!'); WRITELN; WRITELN;
- WRITE('>'); WRITELN(tem); WRITELN; WRITELN;
- wait_of_return;
- END;
- {-------------------------------------------------}
-
- BEGIN (* Hauptprogramm *)
- REPEAT
- CLRSCR;
- WRITELN('Permutationsberechnungen : (es geht,
- 'immer um lexikographisch ,
- '-------------------------- ,
- 'angeordnete Permutationen)'); WRITELN;
- WRITELN(' (1) Berechnen der Nummer einer,
- ' Permutation');
- WRITELN(' (2) Berechnen der Permutation,
- ' mit der Nummer NR');
- WRITELN;
- WRITELN(' (0) Programmende'); WRITELN;
- WRITELN;
- WRITE('Ihre Wahl >');
- REPEAT READ(kbd,ch); UNTIL ch IN ['0'..'2'];
- CASE ch OF
- '1' : BEGIN
- get_perm_strng(txt,tem);
- WRITELN('>',txt); WRITELN; WRITELN;
- WRITELN('Dies ist die,
- ',num_permut(txt,tem):7:0,
- '.te Permutation');
- WRITELN; WRITELN; wait_of_return;
- END;
- '2' : BEGIN
- get_perm_strng(txt,tem);
- WRITELN('>',tem); WRITELN; WRITELN;
- WRITE('Die wievielte Permutation,
- 'wollen Sie haben Nr : ');
- READLN(nr); WRITELN;
- WRITE('Schritt-Modus (J/N) : ');
- REPEAT READ(kbd,ch);
- UNTIL UPCASE(ch) IN ['J','N'];
- WRITELN(ch); WRITELN;
- step_mode:=(UPCASE(ch)='J');
- nte_permut(tem,nr,step_mode,txt);
- WRITELN; WRITELN; WRITELN;
- WRITELN('Ergebnis : '); WRITELN;
- WRITELN('>',txt);
- WRITELN; WRITELN; wait_of_return;
- END;
- END;
- UNTIL ch='0';
- CLRSCR;
- END.