Il giorno mercoledì 8 maggio 2013 02:34:43 UTC+2, Multivac85 ha scritto:
> Mi ricordo che quando ero bambino mio fratello maggiore possedeva nel
> > suo PC vari programmi "creativi" che in sostanza erano tutti
>....
> > ho trovato proprio un esempio di programma logo generatore di poesie
> > alla "Ungaretti", segno che programmi del genere erano relativamente
> > diffusi ai tempi in cui si tentava di insegnare la programmazione
> > anche ai bambini.
> > ....
> > Volevo perciò sapere se potete segnalarmi qualche vecchio manuale che
> > conteneva esempi di programmi didattici ...
>
Non conosco manuali scolastici che riportino programmi didattici del tipo che ti interessa.
Pero' ricordo che in un vecchio numero di "Byte" (Novembre 1984) apparve un articolo
che descriveva un breve programma, denominato "Travesty", (mi pare in Pascal) che consentiva
la generazione di testi con caratteristiche linguistiche che in qualche modo replicavano
quelle di altri testi forniti com "esempio".
Ricordo di avere (molto tempo fa) tradotto il programma originale in "Quick Basic",
di averlo applicato ad un esempio costituito da alcune poesie di un libro
di un autore italiano corrente, e di avergli inviato via mail il risultato,
suscitandone anche qualche interesse.
Ti riporto di seguito la mia breve versione in BASIC, che ho conservato, ma ti consiglio
di leggere l' articolo su Byte per avere una documentazione dettagliata sul programma.
Ciao, Andrea.
DEFINT F, I-N
DEFSTR O-Z
DIM LETTER(256)
ON ERROR GOTO 5000
LET
MAX.IN = 30000
LET MAX.PAT = 9
' LET STRNG = ""
RANDOMIZE
INPUT "Number of characters to be output : "; MAX.OUT
100 PRINT "Scan order (2 -"; MAX.PAT; ")";
INPUT N.PAT
IF N.PAT < 2 OR N.PAT > 9 THEN GOTO 100
LET N.PAT = N.PAT - 1
200 INPUT "Name of input file : "; SOURCE
OPEN SOURCE FOR INPUT AS #1
INPUT "Prose or verse : "; PASS
IF LEFT$(PASS, 1) = "V" OR LEFT$(PASS, 1) = "v" THEN LET FLAG.V = -1
PRINT
WHILE NOT EOF(1)
LET PASS = INPUT$(1, #1)
IF PASS <> CHR$(13) THEN PRINT PASS;
IF PASS = CHR$(13) THEN LET PASS = ""
IF PASS = CHR$(10) THEN LET PASS = " ": IF FLAG.V THEN LET PASS = "|"
IF PASS = CHR$(9) THEN LET PASS = " "
IF PASS <> " " AND PASS <> "" THEN LET FLAG.B = 0
IF NOT FLAG.B THEN LET STRNG = STRNG + PASS
IF (FLAG.V AND PASS = "|") OR (PASS = " ") THEN LET FLAG.B = -1
IF LEN(STRNG) >=
MAX.IN THEN GOTO 300
WEND
300 LET STRNG = STRNG + LEFT$(STRNG, N.PAT)
PRINT : PRINT
PRINT "Input string contains "; LEN(STRNG); " bytes"
PRINT "There are "; FRE(""); " bytes remaining in string space"
CLOSE #1
PRINT : PRINT
OPEN "TRAVESTY.TXT" FOR OUTPUT AS #2
LET PATTERN = LEFT$(STRNG, N.PAT)
PRINT PATTERN;
PRINT #2, PATTERN;
LET N.OUT = N.PAT
400
FOR K = 0 TO 256
LET LETTER(K) = 0
NEXT K
LET I = INSTR(STRNG, PATTERN)
WHILE I > 0 AND I <= LEN(STRNG) - N.PAT
LET PASS = MID$(STRNG, I + N.PAT, 1)
LET LETTER(0) = LETTER(0) + 1
LET K = ASC(PASS)
LET LETTER(K) = LETTER(K) + 1
LET I = INSTR(I + 1, STRNG, PATTERN)
WEND
LET L = INT(1 + LETTER(0) * RND)
FOR K = 32 TO 256
LET L = L - LETTER(K)
IF L <= 0 THEN LET OUT.CHAR = CHR$(K): GOTO 500
NEXT K
500
LET N.OUT = N.OUT + 1
IF N.OUT MOD 50 = 0 THEN LET FLAG.E = -1
LET PATTERN = MID$(PATTERN, 2) + OUT.CHAR
IF NOT (FLAG.V AND OUT.CHAR = "|") THEN PRINT OUT.CHAR; : PRINT #2, OUT.CHAR;
IF (FLAG.V AND OUT.CHAR = "|") OR (FLAG.E AND OUT.CHAR = " ") THEN PRINT : PRINT #2, : LET FLAG.E = 0: IF FLAG.V AND OUT.CHAR = " " THEN PRINT SPACE$(5); : PRINT #2, SPACE$(5);
IF INKEY$ = CHR$(3) THEN END
IF N.OUT < MAX.OUT OR OUT.CHAR <> " " THEN GOTO 400
CLOSE
SYSTEM
5000
IF ERR = 53 OR ERR = 64 THEN PRINT CHR$(34); SOURCE; CHR$(34); " does not exist. "; : PRINT "Try again": RESUME 200
ON ERROR GOTO 0