Programma di esempio SIMPREMI.PRT |
; SIMPREMI
;
; Programma per Proteus
;
; (C) 2003 Simone Zanella Productions
;
; Questo programma simula un generatore di premi, assumendo i seguenti parametri di default:
; 3 operatori che, indipendentemente, attribuiscono premi ai clienti in modo casuale
; 57 premi/ora da erogare
; 450 clienti
#!proteus -z
DefClienti = 450
DefPremi = 57
DefTerm = 3
IF STREQ(ARGV(5), "?")
CONSOLELN "Sintassi: " ARGV(1) " " ARGV(2) " terminali premi_ora clienti_ora"
ABORT 0
FI
IF GE(ARGC, 5)
N = ARGV(5)
IF GE(ARGC, 6)
W = ARGV(6)
IF GE(ARGC, 7)
G = ARGV(7)
ELSE
; Numero di clienti da servire in un'ora
G = DefClienti
FI
ELSE
; Totale premi da assegnare in un'ora
W = DefPremi
; Numero di clienti da servire in un'ora
G = DefClienti
FI
ELSE
; Numero di terminali
N = DefTerm
; Totale premi da assegnare in un'ora
W = DefPremi
; Numero di clienti da servire in un'ora
G = DefClienti
FI
; Premi da assegnare in un'ora per ogni terminale
WT = FDIV(W, N)
; Percentuale equa iniziale, per ogni terminale
P = SUB(MUL(FDIV(W, G), 100), 2)
; Variazione di probabilità (positiva o negativa) indotta dal fenomeno Vincita
Delta = 0.01
MaxDelta = 0.1
Term = VECNEW(N)
R = MyInitRand()
FOR X = 1 TO N
V = VECNEW(4)
VECSET(Term, X, V)
VECSET(V, 1, R)
VECSET(V, 2, 0)
VECSET(V, 3, QUEUENEW())
VECSET(V, 4, P)
ADD(@R, 7)
NEXT
X = 0
WHILE LE(X, G)
FOR Y = 1 TO N
Vincita(Y)
NEXT
ADD(@X, N)
LOOP
CONSOLELN "Elenco vincite:"
S = ""
FOR X = 1 TO N
S = LTRIM(S " " PADR("-- Terminale " X " --", 20, " "), " ")
NEXT
CONSOLELN S
V = VECGET(Term, 1)
Q = VECGET(V, 3)
M = QUEUELEN(Q)
FOR Y = 1 TO M
S = ""
FOR X = 1 TO N
V = VECGET(Term, X)
Q = VECGET(V, 3)
S = LTRIM(S " " PADR(DEQUEUE(Q), 20, " "), " ")
NEXT
CONSOLELN S
NEXT
S = ""
FOR X = 1 TO N
V = VECGET(Term, X)
H = VECGET(V, 2)
S = LTRIM(S " " PADR("Totale vincite: " H, 20, " "), " ")
NEXT
CONSOLELN S
ABORT 0
FUNCTION Vincita(nterm)
V = VECGET(_Term, nterm)
H = VECGET(V, 2)
P = VECGET(V, 4)
IF GE(H, PUB(WT))
vinto = 0
ELSE
K = MyRandom()
IF LE(K, P)
vinto = 1
ELSE
vinto = 0
FI
VARIAZIONE = PUB(Delta)
IF vinto
IF GT(P, 0)
SUB(@P, VARIAZIONE)
FI
ELSE
IF LT(P, 100)
ADD(@P, VARIAZIONE)
FI
FI
IF vinto
INC(@H)
FI
FI
; Aggiorno H e P per il terminale
VECSET(V, 2, H)
VECSET(V, 4, P)
ENQUEUE(VECGET(V, 3), vinto)
RETURN
FUNCTION MyInitRand()
; Inizializza il seme, in base all'ora
RETURN ADD(CLOCK(), TIMETOSEC(TIME()))
FUNCTION MyRandom()
; Restituisce un numero tra 1 e 100
RETURN INC(MOD(RANDOM(-1), 100))