Creare le prime procedure

In questa pagina ci sono circa 2538 parole e 9 immagini. Con una media di 100 parole al minuto, c'è bisogno di circa 25 minuti per leggere questa pagina.

Nella pagina precedente hai visto i primi comandi in LOGO e in particolare quali comandi dare alla tartaruga per disegnare un quadrato. Rivediamolo:

Animazione quadrato con ripetizione

Ma dobbiamo per forza scrivere tutto questo ogni volta che vogliamo disegnare un quadrato? Certo che no.

Non possiamo semplicemente dirgli che vogliamo un quadrato? Certo che sì. E come si fa?

Si crea una procedura.

Una procedura è un insieme di comandi con un nome. Tutte le volte che viene chiamato quel nome vengono eseguiti quei comandi. Si tratta di una delle idee più importanti della programmazione: dividere un programma in piccole parti che fanno un lavoro ben preciso, in modo da poter utilizzare quelle parti più volte e in modi diversi in altri punti del programma. La divisione in piccole parti non solo aiuta a costruire meglio i programmi e a risolvere meglio i problemi, aiuta anche a capire meglio sia i problemi, sia i programmi che li risolvono.

Nel nostro caso il nome della procedura potrebbe essere , mentre i comandi da eseguire ogni volta che questa procedura viene chiamata sono . Puoi scegliere i nomi che vuoi per le tue procedure.

Per definire (creare) una procedura si usano due parole speciali. La prima è , e la seconda è , e mettendo tutto assieme otteniamo una definizione di procedura:

Un'altra cosa da sapere, per fare in modo di capirsi tra programmatori, è che tutto quello che si trova tra la prima riga (che inizia con ) e l'ultima riga (quella con ), si chiama corpo della procedura.

Bene, dove va scritta tutta questa roba? Va scritta in un'altra finestra che si chiama Editor (significa editore in inglese). Per aprire l'Editor premi sul pulsante EdTutto (che è una abbreviazione di Edita Tutto), dovresti vedere una schermata come questa:

Schermata dell'editor di FMSLogo

A questo punto copia la definizione della procedura nella finestra, dovresti vedere una cosa come questa:

Schermata dell'editor di FMSLogo con la procedura "quadrato"

Infine, clicca sul menu File e scegli la voce Salva ed esci.

Adesso che abbiamo creato la procedura la dobbiamo provare e vedere se fa bene il suo lavoro.

Nella finestra principale di FMSLogo clicca nella riga di comando, scrivi il comando e premi Invio, dovresti vedere un risultato come questo:

Schermata di FMSLogo dopo avere eseguito la procedura "quadrato"

Da questo vediamo che la procedura è stata scritta correttamente e fa il suo lavoro.

Prima di continuare con il codice voglio farti notare due cose sul comportamento di queste due finestre, la finestra principale di FMSLogo e la finestra dell'Editor. Di queste due cose, una è molto importante e l'altra è molto comoda, almeno per me:

  • La cosa molto importante è che la voce di menu Salva ed esci prende quello che hai scritto nella finestra dell'Editor e lo salva nel tuo spazio di lavoro, ma il tuo spazio di lavoro si trova solo nella memoria del programma FMSLogo, e dura solo fino a quando non lo chiudi. Per salvare il tuo spazio di lavoro in un file, per poterlo riaprire anche dopo che hai chiuso FMSLogo, devi usare la voce di menu Salva oppure quella Salva con nome... nella finestra principale di FMSLogo. Sono due salvataggi diversi: la finestra dell'Editor salva quello che scrivi nello spazio di lavoro, la finestra di FMSLogo salva lo spazio di lavoro sul disco rigido o su una chiavetta per poterlo ritrovare anche dopo che avrai chiuso il programma e spento il computer.
  • La cosa molto comoda è che nel menu dell'Editor la voce Salva ed esci mostra anche la scritta Ctrl+D. Questa scritta vuole dire che invece di fare clic con il mouse sul menu puoi usare una scorciatoia; questa scorciatoia si usa tenendo premuto il tasto Ctrl e poi premendo il tasto D. Questa scorciatoia funziona anche al contrario: ti permette di aprire la finestra dell'Editor dalla finestra principale di FMSLogo senza dover premere il pulsante EdTutto. Questa regola delle scorciatoie vale per tutti i menu che hanno una scritta aggiuntiva. Ad esempio, nella finestra dell'Editor c'è il menu Modifica, e tra tutte le voci trovi anche Copia (che si può fare anche con Ctrl + C) e Incolla (che si può fare anche con Ctrl + V). Fai attenzione a questa regola e memorizza tutte le scorciatoie che ti sembrano importanti da ricordare, diventerai molto più veloce nella scrittura del codice se non dovrai allungare la mano dalla tastiera al mouse ogni volta che vuoi copiare o incollare del testo, oppure quando vuoi passare dalla finestra di FMSLogo alla finestra dell'Editor e vice versa..

Ma ritorniamo alla nostra procedura :

Avresti potuto scrivere quella procedura anche in questo modo:

Oppure in quest'altro modo:

Il risultato sarebbe stato lo stesso.

Io l'ho scritta su diverse righe e ho anche aggiunto degli spazi all'inizio di alcune righe, per fare in modo che tutta la definizione della procedura sia più facile da leggere. Gli spazi aggiunti all'inizio delle righe si chiamano rientro. Continuando il tuo studio della programmazione ti capiterà di leggere il codice di programmi scritti da altre persone, e troverai che i rientri vengono usati molto spesso, anche quando servono soltanto a migliorare la lettura del codice.

Continuando il tuo studio della programmazione ti capiterà anche di notare che molto spesso, se non sempre, è possibile ottenere lo stesso risultato in modi diversi. Credo che questa cosa sia molto bella perché lascia spazio alla creatività. Puoi avere bisogno di questa cosa per riuscire a fare quello che ti serve anche quando gli strumenti "normali" o "giusti" non funzionano come dovrebbero: ad esempio, per entrare in una stanza normalmente si passa dalla porta, ma se la porta si blocca e non si apre più è molto comodo il fatto di poter passare da una finestra, in caso di bisogno. Questa cosa molto spesso funziona anche dentro un computer.

Migliorare una procedura

Quando vogliamo disegnare un quadrato non è detto che vogliamo sempre un quadrato con il lato da 100. Magari ne vogliamo uno con il lato da 50 e un altro con il lato da 200.

Come ho scritto sopra, nella programmazione di solito esiste più di un modo per ottenere lo stesso risultato. Alcuni modi possono essere più veloci, altri più comodi, altri ancora più intelligenti. Esistono ovviamente anche i modi "al contrario": quelli più lenti, quelli più scomodi e quelli più stupidi. Non sempre esistono delle regole fisse e se chiedi ad un programmatore il modo migliore per fare qualcosa potrebbe risponderti con un metodo non troppo veloce, magari anche abbastanza semplice e comodo, mentre un altro programmatore potrebbe risponderti con un metodo molto più veloce, ma anche più complesso e scomodo da scrivere... quindi come facciamo a scegliere un metodo rispetto ad un altro? Si tratta di una questione di gusto personale e di buon senso. Ad esempio, se un metodo è veramente stupido e scomodo da scrivere, forse è meglio cercarne uno più intelligente e più comodo da scrivere. Vale anche il contrario. Se un metodo sembra veramente veloce da scrivere, ma è anche un po' troppo "furbo" e diventa difficile da capire, forse è meglio trovare un metodo un po' più facile da capire, anche se sembra più lento da scrivere o più "stupido".

Facciamo un esempio pratico. Abbiamo un problema e questo problema lo possiamo scrivere come "Trova un modo per disegnare quadrati di diverse misure". Una soluzione veramente stupida e scomoda potrebbe essere questa:

Anche se non credo ci sia bisogno di spiegare perché questa soluzione sia stupida e scomoda, vediamolo lo stesso:

  • è stupida e scomoda perché le misure dei lati sono scritte direttamente nel codice e tutte le volte che vogliamo un quadrato con un lato diverso dobbiamo creare una nuova procedura;
  • è stupida e scomoda perché abbiamo dei pezzi di codice molto simili tra loro che fanno più o meno lo stesso lavoro e se decidiamo di cambiare qualche parte di quel pezzo di codice dobbiamo fare le stesse modifiche in tutte le procedure che lo usano. Pensa ad esempio se vuoi cambiare il comando con il comando , lo dovresti fare come minimo tre volte in tre punti diversi, se avessi usato questa soluzione.

Nota: i nomi nel LOGO possono essere scritti in maiuscolo o minuscolo, non fa nessuna differenza. Puoi anche mischiare l'uso delle maiuscole e delle minuscole. Se crei una procedura e le dai il nome , la puoi usare in altri punti come oppure come , funzionerà lo stesso.

Molto bene, troviamo una soluzione più comoda e più intelligente. Sappiamo già che possiamo dire alla tartaruga di avanzare di 10, 50 o 100 passi semplicemente cambiando il numero dopo il comando , non possiamo fare in modo che anche la procedura  accetti un numero da usare per la misura del lato? Ovviamente sì: bisogna aggiungere dei parametri alla procedura.

I parametri sono delle variabili che vengono scritte subito dopo il nome della procedura. Dovresti avere letto, in una delle pagine precedenti, che le variabili sono come delle scatole che hanno un nome e che possono contenere un valore. Anche i parametri hanno un nome, e il valore che si mette dentro un parametro si chiama argomento.

Vediamolo nel dettaglio. Riapri la finestra dell'Editor con Ctrl + D, cancella tutto quello che ci trovi dentro e scrivi solo questo:

Abbiamo sostituito la misura del lato del quadrato con la variabile . Sappiamo che è una variabile perché nel linguaggio LOGO tutte le variabili iniziano con il carattere dei due punti : e sappiamo che è un parametro perché si trova dopo il nome della procedura, nella prima riga della sua definizione. Come per i nomi delle procedure, puoi scegliere i nomi che vuoi per le tue variabili.

Adesso che abbiamo modificato questa procedura la dobbiamo provare. Usa la scorciatoia Ctrl + D per salvare la procedura nello spazio di lavoro e ritornare alla finestra di FMSLogo, quindi entra nella riga di comando ed esegui questi comandi uno dopo l'altro:

(il primo comando, ps, è l'abbreviazione di , come abbiamo visto in una delle pagine precedenti).

I numeri 50, 100 e 150 sono gli argomenti che vengono passati di volta in volta alla procedura . Ad esempio, chiamando l'argomento viene messo dentro il parametro per essere usato nel corpo della procedura. Nel nostro caso viene usato nella riga che si comporta come se fosse .

Usando i comandi scritti qui sopra dovresti ottenere un risultato simile a questo:

Tre quadrati con un vertice in comune

Bene, adesso che abbiamo questa nuova procedura possiamo usarla assieme ad altri comandi per ottenere dei disegni più complessi.

Ad esempio, possiamo eseguire il comando :

Ventaglio di quadrati con etichetta e senza tartaruga

No, per essere più precisi, il risultato che dovresti ottenere è questo:

Ventaglio di quadrati senza etichetta e con tartaruga

La cosa più evidente è che sotto la seconda immagine manca l'etichetta, e questo dovresti averlo notato senza problemi. La cosa meno evidente è che nella seconda immagine, che è quella che dovresti avere ottenuto tu, si vede ancora la tartaruga, mentre nella prima immagine la tartaruga non si vede. Come facciamo a nascondere la tartaruga? Basta usare il comando , che è l'abbreviazione di nascondi tartaruga. Per mostrare di nuovo la tartaruga devi usare il comando (mostra tartaruga). Quando la tartaruga è nascosta i disegni vengono fatti molto più in fretta, ma c'è lo svantaggio di non vedere dove si trova la tartaruga. Questo non è un problema perché puoi comunque nascondere o mostrare la tartaruga a piacere tutte le volte che vuoi.

Rivediamo il comando e capiamo cosa è successo esattamente. Ad ogni ripetizione viene eseguito seguito da , e dato che abbiamo passato il numero 8 al comando , abbiamo ottenuto otto quadrati.

Quando hai eseguito tu il comando hai però visto direttamente il risultato, non hai visto nessuna animazione. Esiste un modo per dire al programma di fermarsi per un attimo e farci vedere il lavoro che ha fatto, prima di continuare. Il comando è , che prende un argomento in sessantesimi di secondo. Questo significa che se scrivi , la pausa sarà di un secondo, se scrivi la pausa sarà di dieci secondi, se scrivi la pausa sarà di mezzo secondo e così via.

Come possiamo usare questo nuovo comando? Prova questo comando dopo avere ripulito l'area di disegno: , dovresti vedere una animazione simile a questa:

Animazione del ventaglio di quadrati, quadrato per quadrato

E se invece vogliamo fargli disegnare un lato alla volta per ogni quadrato? In base al codice che abbiamo scritto fino ad adesso non lo possiamo fare senza modificare la definizione della procedura .

A questo punto possiamo anche approfittarne per creare una nuova procedura che crea dei quadrati a rotazione.

Apri l'Editor e fai in modo che contenga queste due procedure:

Nota che la procedura adesso contiene due comandi , servono a fermare per un po' il programma dopo avere disegnato un lato o dopo avere fatto girare la tartaruga per puntare in direzione del prossimo lato, per darti il tempo di vedere l'esatto ordine di tutte le operazioni che vengono eseguite.

Dopo avere creato le due procedure come indicato qui sopra chiudi l'Editor e scrivi nella riga di comando, dovresti vedere una animazione come quella qui sotto. La pausa tra un pezzo del disegno e un'altra è di mezzo secondo perché abbiamo usato il comando .

Animazione del ventaglio di quadrati, lato per lato

Il fatto di aggiungere delle pause con il comando è comodo per vedere meglio come si comporta una procedura, ma continuando a creare altre procedure che si usano a vicenda (come , che usa ) i disegni vengono fatti più lentamente. Quando hai finito di controllare una procedura togli tutti i comandi che non ti servono più.

Bene, per questa pagina può anche bastare. Prima di lasciarti voglio però farti una domanda: come possiamo far disegnare alla tartaruga anche altre figure, come ad esempio il triangolo?

Usando le informazioni di questa pagina assieme alle informazioni della pagina precedente potresti essere in grado di trovare una soluzione intelligente, hai bisogno di sapere solo due cose in più: puoi eseguire delle operazioni sui numeri e sulle variabili e puoi aggiungere tutti i parametri che vuoi alla definizione di una procedura.

Somma:

Sottrazione:

Moltiplicazione: (si usa l'asterisco *, non il simbolo di moltiplicazione ×)

Divisione: (si usa la barra inclinata a destra /, non il simbolo di divisione ÷)

Lo so, non ti ho spiegato cosa vogliono dire i comandi e , prova a capirlo senza il mio aiuto e non ti preoccupare se non riesci a trovare il modo per disegnare le altre figure, tanto lo vedremo nella prossima pagina. Ti consiglio comunque di provare a farlo da solo, perché riuscire a trovare da soli la soluzione ad un problema è forse una delle soddisfazioni più grandi della programmazione.

Grazie per la tua attenzione!