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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
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 ;
|