PACKET integer DEFINES sign, SIGN, abs, ABS, **, min, max, maxint, get, random, initialize random : INT PROC maxint : 32767 ENDPROC maxint ; INT PROC sign (INT CONST argument) : IF argument < 0 THEN -1 ELIF argument > 0 THEN 1 ELSE 0 FI ENDPROC sign ; INT OP SIGN (INT CONST argument) : sign (argument) ENDOP SIGN ; INT PROC abs (INT CONST argument) : IF argument > 0 THEN argument ELSE - argument FI ENDPROC abs ; INT OP ABS (INT CONST argument) : abs (argument) ENDOP ABS ; INT OP ** (INT CONST arg, exp) : INT VAR x := arg , z := 1 , counter := exp ; IF exp < 0 THEN errorstop ("INT OP ** : negative exponent") FI ; IF arg = 0 AND exp = 0 THEN errorstop (" 0 ** 0 is not defined") FI ; IF exp = 0 THEN x := 1 FI ; WHILE counter >= 2 REP calculate new x and z ; counter := counter DIV 2 ; ENDREP ; z * x . calculate new x and z : IF counter is not even THEN z := z * x FI ; x := x * x . counter is not even : counter MOD 2 = 1 . ENDOP ** ; INT PROC min (INT CONST first, second) : IF first < second THEN first ELSE second FI ENDPROC min ; INT PROC max (INT CONST first, second) : IF first > second THEN first ELSE second FI ENDPROC max ; PROC get (INT VAR number) : get (word) ; number := int (word) ENDPROC get ; TEXT VAR word := "" ; (************************************************) (*** ***) (*** generator 32 650 ***) (*** ***) (************************************************) (* INT-Zufallsgenerator mit Periode 32650 *) (*Autor: Bake *) (*Gymnasium Aspe *) INT VAR z1 :: 14, (* fuer den generator mit periode 25 *) z2 :: 345; (* fuer den generator mit periode 1306 *) INT PROCEDURE random (INT CONST ugrenze, ogrenze) : (*******************************************************) generator 25; generator 1306; (zufallszahl MOD intervallgroesse) + ugrenze. (* Durch MOD wird bei grosser 'intervallgroesse' der vordere Bereich doppelt ueberdeckt, also keine Gleichverteilung. heinrichs 24.04.81 *) generator 25 : z1 := (11 * z1 + 18) MOD 25 (* erster generator. liefert alle zahlen zwischen 0 und 24. *). generator 1306 : z2 := (24 * z2 + 23) MOD 1307 (* zweiter generator. liefert alle zahlen zwischen 0 und 1305. *). zufallszahl : z1 + z2 * 25 (* diese zahl liegt zwischen 0 und 32 649 *). intervallgroesse : ogrenze - ugrenze + 1 END PROC random ; PROCEDURE initialize random (INT CONST wert) : (**************************************************) z1 := wert MOD 25; z2 := wert MOD 1306 END PROC initialize random ; ENDPACKET integer ;