Introduzione a Scratch: 4, interagiamo

0

Nella terza parte abbiamo visto il funzionamento dei blocchi logici e di alcuni degli operatori a loro associati. Ora proseguiamo nella nostra esplorazione e vediamo come possiamo migliorare il livello di interazione del linguaggio. Questa volta Scratch Cat chiederà informazioni direttamente a noi, le memorizzerà e le utilizzerà per elaborare un risultato.

Riprendiamo un po’ lo schema che avevamo usato nella seconda parte per lo scambio di saluti fra Scratch Cat e Girl2, e diamo una occhiata a questo codice (potete aprirlo qui):

scratch-40
Quando clicchiamo sulla bandierina verde, il gattino comincerà presentandosi, poi chiederà ‘E tu chi sei?’ fermandosi in attesa di una risposta (comando chiedi… e attendi). Quando avremo digitato il nostro nome e premuto invio, il programma riprenderà al comando successivo, producendo un miagolio.
I tre comandi successivi, dire…per…secondi ci sono ben noti avendoli usati più volte. Nel secondo però troviamo una forma nuova, un rettangolo con i bordi verticali tondi, in questo caso azzurro. Questo tipo di blocco indica una variabile, un elemento fondamentale per ogni linguaggio di programmazione.
Se in matematica con variabile si intende un numero sconosciuto, da ricavare per mezzo di operazioni e calcoli, in informatica lo stesso termine è usato per qualcosa di totalmente differente: è una sorta di cassettino in cui andiamo a depositare qualcosa – numeri o lettere, vedremo poi – per poi poterla recuperare più avanti. Facciamo quindi attenzione a non fare confusione: in questo caso, nel cassettino chiamato risposta scratch andrà a conservare i caratteri che che abbiamo digitato quando il programma ci ha chiesto ‘E tu chi sei?’. In scratch possiamo avere tutti i cassettini che vogliamo, e ci converrà assegnare ad ognuno di essi un nome che ci ricordi in modo chiaro cosa ci sia dentro.

Facciamo una prova pratica con questo codice: Scratch Cat ci chiederà due numeri e ci dirà la somma di essi:

scratch-41
Per scriverlo a mano dobbiamo preventivamente creare due variabili, chiamate num1 e num2, in cui conserveremo i due numeri da sommare.  Notate che il colore delle due variabili che abbiamo creato non è azzurro, ma arancione. Il motivo è semplice, risposta è una variabile particolare, perché è definita direttamente nel linguaggio e che quindi non ha bisogno di essere creata. Quelle definite da noi devono invece essere create cliccando sul pulsante crea variabile dal gruppo variabili e liste: si aprirà una finestra

scratch-42
in cui potremo indicare il nome della variabile e anche se questa sarà attiva su tutti gli sprite oppure solo per l’attore selezionato al momento della creazione. Per i nostri scopi attuali la scelta è ininfluente, ma ci sono situazione in cui la differenza è molto utile, ma lo vedremo poi.
Dopo avere creato le due variabili, queste appariranno nel gruppo di comandi variabili e liste. Notate che sulla sinistra ogni variabile ha una casella di spunta: se la spuntiamo vedremo nel palcoscenico apparire un blocco che mostra il nome della variabile ed il valore contenuto. Scegliamo questa possibilità e selezioniamo la spunta: in questa fase avere visibilità della variabili ci consente di comprendere meglio il funzionamento del linguaggio.

Come funziona il programma? Scratch Cat chiede un primo numero, che viene scritto nella variabile risposta. Questo valore deve essere ora messo al sicuro. Se non lo facessimo e chiedessimo direttamente il secondo numero, la nuova risposta sostituirebbe la precedente, che andrebbe quindi persa!
Per conservare il valore nella casella di memoria che avevamo predisposto, dobbiamo trascriverlo in essa. Per farlo utilizziamo l’apposito comando porta num1 a risposta. Trovo che la traduzione italiana di questo comando (l’originale inglese è set) sia inadeguata e potrebbe portare ad una interpretazione errata. Non è superfluo precisare che il comando porta scrive nella variabile indicata a sinistra – num1, in questo caso – quello che è contenuto nella celletta di destra, che non viene in nessuna maniera alterata. Nella celletta di destra potremo avere sia una variabile, in questo caso risposta, che un numero o una sequenza di caratteri fissi, che proprio per questo sono chiamati costanti.

Una volta memorizzato il primo numero possiamo chiederne un secondo senza correre il rischio di perderlo accidentalmente. Salviamo anche questo nella variabile che avevamo predisposto allo scopo, in questo caso num2.
Per calcolare il valore della somma delle due variabili utilizziamo l’operatore +, inserendo nelle due cellette, che possiamo chiamare campi,  i nomi delle due variabili.
Quando andremo ad eseguire l’ultima istruzione, dire con l’operatore + al suo interno, scratch andrà a vedere quale è il valore contenuto nella casella num1, quale quella in num2, calcolerà la somma e la utilizzerà per il messaggio di risposta.

Per ribadire che non esiste una strada unica per raggiungere un risultato vi faccio notare che, volendo, avremmo potuto scrivere il programma anche in questo modo:

scratch-43
Utilizzando la sola variabile num1 è un po’ meno leggibile ed immediato dell’altro, ma funziona esattamente allo stesso modo.

Come possiamo migliorare questo semplice programma? Vediamo due aspetti.

Il primo è che la risposta di Scrach Cat in due tempi è fastidiosa ed innaturale: dovremmo rimediare facendogli comunicare il risultato con una unica frase.
Nell’elenco degli operatori ce ne è uno che è perfetto per il nostro scopo: unione di ci consente, infatti, di unire due frammenti di testo e di generarne uno solo. E’ un operatore utilissimo per costruire direttamente nel programma delle frasi elaborando altri elementi.
Facciamo una prova combinando i due comandi dire inserendo questo operatore, in questo modo:

scratch-44
abbiamo sostituito la risposta in due fasi con una comunicazioni unica e più naturale!

Ma c’è un altro punto di miglioramento. Abbiamo visto che se diamo a Scratch Cat delle cifre, questi ci risponderà correttamente con la somma di essi. Ma che succede se anziché numeri, scriviamo delle parole?
Se facciamo qualche prova, scopriremo che la somma di pippo con 5 dà come risultato proprio 5, mentre 7 con pluto ci restituità 7. In realtà, quando il linguaggio si trova a fare calcoli matematici con una sequenza di caratteri che non sono numeri validi, li considera uguali a zero. Questa non è una cosa buona, perché è un comportamento anomalo.
Come risolverlo?
La maniera più semplice è quella di verificare che la risposta data al comando chiedi sia proprio un numero corretto e non accettare valori errati.
Vediamo questo altro codice:

scratch-45
Con questo programma Scratch Cat non accetterà più qualsiasi cosa gli daremo in pasto, ma continuerà a chiedere un numero sino a quando non gli daremo delle cifre valide!
Vediamo che strategia abbiamo usato per ottenere questo risultato. Analiziamo il comportamento per uno dei due valori, visto che per il secondo è del tutto identico.

scratch-46
La prima operazione che facciamo è quella di inserire un valore non numerico, nel caso specifico uno spazio, nella variabile num1.
Subito dopo c’è un blocco ripeti fino a quando con una condizione che ci consente di discriminare se la variabile num1 contiene una sequenza di caratteri, che in informatica è chiamata stringa, oppure un numero utilizzabile per i calcoli. Se la variabile contiene una stringa eseguirà il codice contenuto nel blocco ripeti, altrimenti passerà al comando successivo ad esso.
Dato che abbiamo preventivamente inizializzato la variabile con una stringa, alla prima esecuzione il blocco sarà sempre eseguito, per cui Scratch Cat ci chiederà il primo numero e lo memorizzerà nella variabile num1.
A questo punto viene eseguito nuovamente il test per verificare la condizione. Se abbiamo risposto con un numero il ciclo terminerà, se invece abbiamo risposto con una stringa, il gattino – che abbiamo così reso preciso e puntiglioso – continuerà a chiederci di dargli il primo numero sino a quando non otterrà un numero valido!
Come funziona il test che verifica se num1 contiene un numero o una stringa? Abbiamo visto che il linguaggio considera i numeri non validi come uno zero. Il test sfrutta questo comportamento calcolando il risultato della moltiplicazione del contenuto di num1 per uno. Se num1 è numerico, ci sarà coincidenza fra il contenuto di num1 ed il risultato della moltiplicazione e quindi la condizione sarà vera. Se non è un numero, il confronto non sarà vero: se prendiamo ad esempio lo stato iniziale, num1 contiene uno spazio, mentre num1*1 conterrà uno zero: i valori sono diversi e quindi la condizione risulterà falsa.

Rimanendo in tema di variabili, il linguaggio scratch ne ha anche un altro tipo, chiamato lista. Sono caselle di memoria particolari, che possono contenere più valori, ognuno dei quali è conservato separatamente in un suo scomparto. Ogni scomparto è individuato da un numero, chiamato indice.
La cosa più immediata per comprenderne il comportamento è quella di creare un programma che ce le faccia vedere in pratica.
Apriamo un nuovo progetto, eliminiamo Scratch Cat dal palcoscenico, che in questo caso non ci serve, e creiamo una lista, dal gruppo variabili e liste, chiamandola spesa. Spuntiamo la casella per visualizzare la lista sul palcoscenico e allarghiamo la finestra della lista in modo che lo riempia tutto. Infine, scriviamo questo programma:

scratch-47
Cliccando sulla bandierina verde si aprirà una casella di testo dove potremo digitare una voce da inserire nella lista. Ogni volta che scriveremo qualcosa e premeremo invio verrà creata una voce nuova nella lista contenente quanto da noi digitato. Sulla sinistra della voce sarà visibile anche l’indice, il numero con cui è possibile accedere a quel singolo elemento specifico della lista. Digitando solo invio, senza scrivere nulla, il programma avrà termine.
Le liste sono elementi utilissimi nei programmi, in svariate situazioni.  Giusto per fare un esempio, è comune usare una lista per convertire il numero del mese nel nome corrispondente, come in questo programma in cui Scratch Cat ci rivelerà che giorno è oggi:

scratch-48
Per scriverlo a mano dobbiamo preventivamente creare una variabile, oggi, ed una lista mesi. Il programma popola la lista con i nomi dei vari mesi, dopo di che crea, con una serie di unioni successive, il messaggio dell’annuncio nella variabile oggi. La variabile di colore azzurro è un’altra di quelle predefinite direttamente nel linguaggio, e contiene i vari elementi della data, letta direttamente dall’orologio del computer: restituisce giorno, mese, anno, ora, minuti, secondi, giorno della settimana: tutti valori numerici. Per inserire nell’annuncio il nome del mese possiamo leggere il valore numero dalla variabile mese attuale ed utilizzarlo come indice alla casella della lista mesi, per recuperarne il nome corrispondente. Il gioco è fatto!

Se dovesse essere difficile intuire il comportamento del gruppo dei sei comandi porta possiamo mettere in atto una tecnica che ci tornerà utile quando scriveremo programmi che non si comportano come dovrebbero – cosa tutt’altro che rara. E’ un attività che si definisce debug, che letteramente significa eliminazione degli insetti, quando un errore di programmazione è definito appunto bug, cioè insetto. Il termine fu coniato nel 1947 da un mostro sacro della storia dell’informatica, Grace Hopper, che analizzando il malfunzionamento di un programma scoprì che era causato da una falena che si era incastrata in un relais, bloccandone l’operatività. Anche se oggi è alquanto improbabile che gli insetti possano causare errori, l’attività di bonifica del codice dalle anomalie è chiamata ancora debug.

Scratch non ha istruzioni specifiche per fare debug, ma è abbastanza semplice utilizzare i blocchi esistenti per ricavare tutte le informazioni che ci servono durante l’esecuzione del programma. Il trucco è quello di inserire nei punti critici qualche ritardo con il comando attendi, spuntare la casella di visualizzazione delle variabili che ci interessano, o aggiungere qualche comando dici o chiedi per capire se il programma segua effettivamente il flusso che avevamo pensato o se abbiamo commesso qualche errore di programmazione.
Su questo schema ho preparato una versione leggermente modificata del programma, che implementa alcune di queste tecniche: sul palcoscenico è visibile la variabile oggi, dopo ognuna delle istruzioni che creano l’annuncio ho inserito un ritardo di 0,5 secondi ed ho modificato lo spazio della costante in un trattino, in modo che sia visibile il risultato del comando, che altrimenti non sarebbe rilevabile.
Cliccando la bandierina verde sarà quindi possibile vedere l’annuncio comporsi nella finestra della variabile e capire come le singole istruzioni influenzino la creazione della stringa finale utilizzata nell’annuncio.

(Segue)

La foto del titolo è di ScracthEd Team
Scratch è sviluppato dal Lifelong Kindergarten Group dei Media Lab del MIT. Vedi http://scratch.mit.edu

Condividi:

L'autore

Consulente Informatico, blogger, problem solver, radioamatore. Ho iniziato la mia attività nel 1977 sviluppando sistemi di calcolo nell'area energie alternative e rinnovabili e da allora mi sono sempre interressato delle frontiere della tecnologia. Nel 1984 sono stato fra i pionieri delle BBS, i primi servizi telematici pubblici, e l'anno successivo ho portato in Italia Fidonet, la prima rete pubblica mondiale, che ho coordinato sino al 1994. Sono attivamente su Internet agli inizi degli anni 90, Nel 1998 sono stato fra i primi a credere nella convergenza digitale, arricchendo internet con materiale multimediale, come audio e video, anni prima del Web 2.0. Continuo da sempre ad occuparmi di informatica e di tecnologia con un occhio attento al futuro che ci attende. Continuo a lavorare come consulente informatico, con una specifica competenza in sicurezza, reti di comunicazione, sistemi operativi e tecnologie di virtualizzazione.

Lascia un commento