Programma di esempio ASCSTAT.PRT |
; ASCSTAT
;
; Programma per Proteus
;
; (C) 1998-2003 Simone Zanella Productions
;
; Questo programma mostra un istogramma di LARGHEZZA colonne che rappresenta
; la frequenza relativa dei caratteri nel primo file specificato;
; l'uscita č inviata a console.
; Parametri impliciti: input e output predefiniti nulli
;!proteus -z
Width = 53
IF ISEMPTY(ARGV(5))
CONSOLELN "Sintassi: " ARGV(1) " " ARGV(2) " [nomefile [larghezza]]"
CONSOLELN ""
CONSOLELN "Scopo: mostra a console la frequenza relativa dei caratteri in"
CONSOLELN "nomefile; \"larghezza\" imposta la dimensione in colonne"
CONSOLELN "dell'istogramma visualizzato (default= " Width ")"
ABORT 0
FI
FileName = ARGV(5)
IF ISNOTEMPTY(ARGV(6))
Width = ARGV(6)
FI
; Apre il file
FH = FOPEN(FileName, 1)
IF EQ(FH, -1)
CONSOLELN "File " FileName " non trovato."
ABORT 0
FI
; Crea un vettore per contare le occorrenze di ciascun carattere
VH = VECNEW(256)
FOR X = 1 TO 256
VECSET(VH, X, 0)
NEXT
FS = FSIZE(FH)
; Processa il file
WHILE NOT(FEOF(FH))
S = FREAD(FH, 2048)
STRTRAVERSE(S, UpdateTable)
LOOP
FCLOSE(FH)
; Determina il pių alto numero di ripetizioni
Max = 0
FOR X = 1 TO 256
IF LT(Max, VECGET(VH, X))
Max = VECGET(VH, X)
FI
NEXT
IF EQ(Max, 0)
CONSOLELN "Il file e' vuoto."
ABORT 0
FI
; Computa la dimensione di un segmento di istogramma
IF GT(Max, Width)
Increment = FDIV(Max, Width)
ELSE
Increment = 1
FI
CONSOLELN "Frequenze dei caratteri per " FileName \
" (" DATE() ", " RTRIM(TIME(), " ") "):"
CONSOLELN "CHR ASC NUMERO FREQ"
FS = FDIV(FS, 100)
FOR X = 1 TO 256
IF ISET(N, VECGET(VH, X))
CONSOLELN PrintChar(DEC(X)) " " PADL(X, 3, "0") " " \
PADR(N, 8, " ") PADR(PFORMAT("04.2lf", FDIV(N, FS)) \
"%", 8, " ") REPLICATE("+", FDIV(N, Increment))
FI
NEXT
ABORT 0
FUNCTION UpdateTable(car, dummy)
i = ASC(car)
VECSET(_VH, i, INC(VECGET(_VH, i)))
RETURN 0
FUNCTION PrintChar(x)
IF GE(x, 32)
RETURN CHR(x) " "
FI
RETURN "0x" PFORMAT("02X", x)