PROGRAMMAZIONE


Per un certo periodo di tempo mi sono dedicato alla programmazione, cosi, per passatempo, per provarmi, ed ho realizzato alcuni programmi in VB e VC.

 

VISUAL BASIC

1) In visual basic ho realizzato un semplice linguaggio logo, che ho chiamato Minilogo, partendo da un programma free che girava in una finestra di debug di visual basic detto virtlogo. Tutto quello che riguarda le routine non è quindi mio. E' invece mia l'implementazione di tutto il resto. Per un giovane aspirante  programmatore potrebbe essere istruttiva l'implementazione dell'istruzione repeat n cosi come l'uso del visual basic per l'implementazione di un editor di testo. Minilogo accetta alcuni comandi come: fd n, bk n, rt angolo in gradi, lt angolo in gradi, cs (sta per clear screen), circler raggio, circlel raggio, repeat n, endrep, ed altri che potete visionare studiando il listato o il semplicissimo file di help. Il programma conserva i listati di minilogo con l'estensione .mlo. Minilogo può stampare sia il listato sia la figura che abbiamo disegnato. Io l'ho usato per introdurre i ragazzi alla programmazione in qualche I e II classe di scuola media inferiore. Per esempio i ragazzi dovevano inventare l'algoritmo per disegnare un triangolo equilatero etc, e codificarlo in minilogo. Potete trovare tutto il sorgente in VB 6.0 qui. Potete usarlo come vi pare ma mi piacerebbe sapere se qualcuno avrà la voglia di migliorarlo ed estenderlo per es. introducendo comandi riguardanti il suono o implementando istruzioni per  chiamate di sottoprogrammi cosi da potere poi costruire una libreria di sottoprogrammi da richiamare in un normale listato. Questo era il mio progetto iniziale che poi per diversi motivi ho dovuto abbandonare. Se qualcuno si muoverà in questa direzione mi piacerebbe ricevere i nuovi listati.

2) Un altro programma interessante, secondo me, è una implementazione della macchina di Turing. Dopo tanti pensamenti e ripensamenti ci sono riuscito, funziona, e secondo me è anche gradevole nell'aspetto esteriore. Lo so che se ne trovano molte in internet, ma non facilmente in visual basic. In ogni caso  vuoi mettere il gusto che si prova a programmarla da se? Assieme al listato troverete alcuni programmi .tur per eseguire alcune operazioni con i numeri scritti nella notazione unaria come per es. l'addizione e la moltiplicazione. La mia macchina di Turing riconosce moltissimi simboli ma io ne ho usato soltando sei: 1,0,#,*,d,s. Il cancelletto come delimitatore dei numeri scritti in forma unaria. Per esempio se sul nastro (che può contenere attualmente 10.000 caratteri) ho: #11111#11# ed eseguo l'addizione troverò sul nastro il risultato #111111# subito dopo il secondo operando. L'asterisco come marcatore di posizione. All'inizio tutto il nastro è riempito con il carattere cancelletto. Ogni istruzione della macchina è costituita da una quintupla di simboli separati da virgola, come: s00,1,*,s01,d . il primo simbolo dice che la testina della macchina si trova nello stato 0 (codificato con s00 per motivi legati alla implementazione), legge sul nastro il simbolo 1, scrive sul nastro il simbolo *, si porta nello stato 1 (codificato come s01 per motivi tecnici legati alla programmazione), si sposta a destra. In realtà nell'implementare la macchina risulta più semplice tenere ferma la testina (io l'ho posizionata a metà nastro cioè sulla cella 5000) e spostare a destra o sinistra il nastro a seconda che la testina si doveva muovere verso sinistra o destra. Moto relativo, insomma. Il programma della macchina si conserva con estensione .tur. Il mio programma per eseguire la somma di due numeri in notazione unaria è questo:

s00,1,*,s01,d
s00,#,#,s04,d
s01,1,1,s01,d
s01,#,#,s02,d
s02,1,1,s02,d
s02,#,#,s08,d
s03,1,1,s03,s
s03,#,#,s03,s
s03,*,1,s00,d
s04,1,*,s05,d
s04,#,#,shh,-
s05,1,1,s05,d
s05,#,#,s06,d
s06,1,1,s06,d
s06,#,1,s07,s
s07,1,1,s07,s
s07,#,#,s07,s
s07,*,1,s04,d
s08,1,1,s08,d
s08,#,1,s03,s
Come si vede la macchina ha 9 stati da s00 a s08, ed shh indica lo stato di alt. Il trattino - dopo shh serve a costruire una riga lunga come le altre visto che dopo l'alt la testina non si muove. Questo ha reso più semplice la codifica del parser (per i neofiti, neofiti: parser=parte di codice che interpreta le istruzioni scritte in ogni riga). Forse qualcuno , magari, riuscirà a scrivere un programma usando meno di nove stati, io non ci sono riuscito. Mi piacerebbe sapere se qualcuno di voi (che siete arrivati a leggere fin qui) ci riuscirà e come. Si capisce facilmente osservando il codice di sopra che questa macchina può lavorare con al massimo cento stati, da s00 ad s99. Sono davvero tanti! Io stavo per fondere il cervello per seguire il diagramma a frecce e cerchi con nove stati. Il codice del programma lo trovate qui, ma mi piacerebbe se voi lasciaste il mio nome cosi come appare sulla finestra del programma.

  

 Ho qualche altro programma, che per ora non riesco a trovare, che riguarda gli automi cellulari, etc. Appena potrò li metterò a disposizione della comunità.

27/01/03

Durante le vacanze di Natale ho avuto del tempo libero e per giocare ancora un po' col VB, questa volta col VB6, ho programmato un sistema di Lindenmayer (mi pare che si scrive cosi) cioè un programma che:

- accetta in ingresso una stringa di caratteri detta assioma

- riscrive la stringa assioma applicando una o più regole di riscrittura

- visualizza la stringa nella interpretazione del logo

I simboli sono: "F"  avanti un passo scrivendo, "f" avanti un passo senza scrivere, "+" ruota a destra di alfa," -" ruota a sinistra di alfa," [" push dello stato attuale(X, Y, direzione della turtle),  "]" pop dell'ultimo stato immesso, "H" torna a home, "c" cambia colore in modo random, "q" e "Q" disegna un fiore, "s" ed "S" spessore linee, "p" curva le linee,"g" e "G" foglia piccola e foglia grande .Inoltre è possibile ridurre a metà, ad un terzo, ad un quarto la lunghezza base con le cifre 2, 3, 4.La lettera "b" riporta alla lunghezza iniziale. Le regole di riscrittura del mio Lsys sono tre ma non è necessario usarle tutte. La prima si chiama A la seconda B la terza C e quindi nella stringa assioma oltre ai simboli di cui si è detto si possono usare anche A, B e C. "Alfa" è l'angolo scelto e può essere cambiato cosi come il segmento unitario chiamato "base" e che corrisponde ad F ed f. Qui potete trovare il programma compilato con VB6 ed il sorgente. Se lo migliorate mi piacerebbe  avere i miglioramenti. Si può fare no? 

 

 

VISUAL C

Ho scritto qualche programma in visual c, spesso ho provato a scrivere lo stesso programma nei due linguaggi VC e VB.

1) Ho cosi provato a scrivere in VC il programma MiniLogo già visto parlando di VB. E qui è caduto      l'asino! L'impresa è molto più complessa di prima. Intanto ho dovuto scrivere tutte le routine dei comandi del linguaggio, poi era necessario implementare un programma tipo textpad  in cui immettere le istruzioni e infine scrivere il parser. Ho trovato dei listati in un libro di programmazione, (Petzold), che ho usato senza pietà per risolvere il secondo problema citato. In definitiva il programma gira però...... Il però è che non sono riuscito ad implementare in modo decente alcune parti! Per esempio, non riesco ad aprire un file .mlo senza errore, ecc. Se qualcuno vuole cimentarsi, ha una base da cui partire. Io non ho più né tempo, né voglia, né testa per continuare. Mi chiama maggiomente il ? del Quasi_Zen(?). Ad ogni modo per nuovi, eventuali, esploratori della programmazione e dello ? ecco qui il codice. Fatemi sapere.

2) Qui trovate un caos di programmini  legati agli automi cellulari, life, etc scritti parecchio tempo fa! Nulla di particolare, ma certamente utili per chi inizia a programmare! Quel poco che so io l'ho imparato cercando di capire programmi scritti da altri. E' una bella e istruttiva palestra per la mente cercare di seguire il pensiero nascosto di un'altra persona. Arriva come una liberazione l'attimo della comprensione! Ma quanta meditazione, spesso notturna, è a volte necessaria!

 

30/08/2005

 

Ho modificato il mio programma sulla macchina di Turing in modo che facesse girare anche la macchina universale di Turing. Per fare ciò al precedente programma ho aggiunto altre funzionalità che ora vi illustro.

 

Quella che vedete è l'immagine che vi mostra il programma dopo aver fatto girare la macchina UTM su un programmino scritto da me, addP.tur, cioè un programma che addiziona due numeri naturali scritti in forma unaria. 

001 1 001 1 R
001 0 002 1 R
002 1 002 1 R
002 - 003 - L
003 1 004 - H

Dove leggete "immetti istruzioni macchina qui" vedete lo stesso programma preparato come ingresso per la macchina universale; ciò è fatto dal menu opzioni, ConvertiP. Alla fine di questa stringa vanno aggiunti manualmente i due numeri separati da uno zero, ad esempio 110111N. Il tutto va terminato con N che è il simbolo per il bank della macchina UTM. Dai pulsanti sulla destra si sceglie il simbolo per il blank, lo stato iniziale e quello finale. Per questa macchina basta premere il tasto "Default U". Si carica quindi, se non lo abbiamo già fatto, il programma per la UTM.Quindi si parte con "start prog" ed è una meraviglia vedere questa UTM che interpreta T(il programma di sopra). Questa UTM non l'ho inventata io, ma ho adattato al mio programma una versione presente sul sito di informatica dell'Università di Pisa (al quale vi suggerisco di andare se volete saperne di più), ecco perchè tutto quello che è legato a questa UTM lo indico finendolo con la P. Naturalmente ho dovuto modificare diverse cose perchè potesse girare sul mio programma, prima fra tutte la numerazione degli stati. Il mio programma vuole, adesso, che gli stati siano indicati con solo tre simboli, da 000 a 999. L'output di UTM è compreso tra la lettera I, inizio dei dati, e la lettera T, che rappresenta la testina di UTM. I simboli dopo T non hanno alcun valore e sono conseguenza del calcolo. Non ho qui intenzione di fare lezioni sulla UTM etc.. , ma sono sicuro che chi sa di queste cose riuscirà a farla funzionare. Mi affascina però la macchina universale che usa solo i simboli "0" e "1" cioè la UTM binaria. Girovagando per internet ne ho trovata una su un sito di una università americana, dovuta ad un certo Boozer, che ho adattato perche girasse sul mio programma. C'è però qualche problema che non sono riuscito a risolvere, a volte non funziona. Non so perchè, visto che il mio algoritmo di conversione (tool, convertib) sull'esempio del programma incremento funziona.

Il programma incremento incrementa un numero naturale scritto in forma unaria e delimitato dal simbolo"0", il blank di questa UTMBinary. Questa macchina parte dallo stato 001 e termina nello stato 000, ed il suo blank è 0. Tutto ciò si aggiusta manualmente nelle caselle di input sulla destra.

001 0 001 0 R
001 1 002 1 R
002 0 000 1 R
002 1 002 1 R

Questo è incrb. tur prima della conversione in modo che diventi input della UTMBinary, come la chiamo io.Al solito, dopo aver convertito la macchina l'input si scrive manualmente alla fine della stringa ottenuta si batte return e poi Load type.

Non so se i problemi per questa UTM sono proprio in essa, ad ogni modo il sito del (Sig., Prof. ?) Boozer non esiste più e quindi chi vuole si cerca gli errori da se.Per ora basta cosi su TURING. (Qui).

 

 

                                                                            home

 


Costruito da Salvatore Crisafulli E-mail salvcrisafulli@libero.it