Inviato da entuland il
Dopo avere spiegato cosa sono le procedure e come si creano, vediamo come possiamo fare in modo che queste procedure siano anche intelligenti e flessibili.
Prima di tutto vediamo cosa significano le parole intelligente e flessibile. Si tratta di due idee che ovviamente non si usano solo nella programmazione e anche nella programmazione sono solo delle idee che non seguono delle regole fisse.
Possiamo pensare ad una procedura intelligente come una procedura che sa valutare le cose con le quali deve lavorare e prendere delle decisioni. Immagina ad esempio di dare il comando "grida in silenzio" ad una persona. Se quella persona è intelligente sa che il comando non ha senso e invece di fare una cosa stupida come spalancare la bocca facendo finta di gridare ti risponde che non è possibile "gridare in silenzio".
Lo stesso vale per una procedura. Prendiamo nuovamente la procedura quadrato:
per quadrato :misura
ripeti 4 [
avanti :misura
destra 90
]
fine
Se esegui il comando quadrato 0 forse ti aspetti che la tartaruga non faccia nulla, perché non ha senso pensare ad un quadrato con il lato da zero. E invece il comando quadrato 0 disegna un puntino! Ha in effetti disegnato un quadrato di lato 1. Se poi provi a eseguire il comando quadrato 2 e ingrandisci l'area di disegno con il menu > un paio di volte, vedrai che in effetti ha disegnato un quadrato di lato 3! Anche se non hai fatto queste prove o non hai notato questi problemi non ti preoccupare, faremo questa prova assieme, in questa pagina o nella prossima. Per il momento ci basta sapere che la procedura quadrato, per come l'abbiamo creata, forse non fa esattamente quello che ci aspettavamo.
Possiamo pensare ad una procedura flessibile come una procedura che è in grado di svolgere lavori diversi che usano tutti uno stesso sistema; questa procedura produce risultati diversi in base alle informazioni che riceve. Un esempio di come rendere una procedura più flessibile l'abbiamo già visto: avevamo una procedura che era in grado di disegnare solo dei quadrati da 100 e l'abbiamo modificata per fare in modo che potesse disegnare dei quadrati di qualsiasi dimensione. Ma possiamo accontentarci di questo? Se quella procedura fosse una persona, ci basterebbe che sapesse disegnare solo dei quadrati e non altre figure, come ad esempio dei triangoli o dei cerchi?
I computer sono molto potenti ma anche molto, molto poco intelligenti e poco flessibili, a meno che noi non gli diciamo come essere più intelligenti o più flessibili. In effetti, quando stai scrivendo un programma, tu stai insegnando al computer a fare qualcosa. Tu hai molte più capacità di un computer, sei molto più intelligente e flessibile di un computer. Se questa cosa ti sembra strana, pensa a questo: non solo tu sei in grado di imparare qualcosa con l'aiuto di qualcuno (anche quando questo aiuto non è molto preciso o molto buono), sei anche in grado di imparare qualcosa senza nessun aiuto, semplicemente provando, riprovando e capendo nuove cose in base ai tuoi stessi errori, mentre un computer ha sempre bisogno di ricevere istruzioni ben precise da una persona, soprattutto quando incontra degli errori e non sa più come comportarsi. Anche quando un computer è in grado di imparare qualcosa da solo, il sistema che usa per farlo gli è stato insegnato da una persona, e la sua capacità di imparare è limitata al sistema che gli è stato insegnato.
Bene, vediamo come possiamo rendere questi computer un po' più intelligenti e più flessibili, ma prima di farlo vediamo cosa sono i poligoni regolari. Se sai già cosa sono i poligoni regolari e non ti interessa la mia spiegazione, puoi passare direttamente alla sezione sulla creazione di una procedura per il disegno dei poligoni regolari.
I poligoni regolari
Poligoni regolari è una parolona, o meglio, sono due parolone. Per usare parole semplici, possiamo dire che i poligoni regolari sono le varie figure come i triangoli, i quadrati e così via. Ma queste "parolone" devono diventare delle parole normali per te, se vuoi davvero imparare a programmare. Quindi vediamo cosa sono i poligoni regolari e perché ne stiamo parlando proprio adesso.
Poligono è una parola che viene dalla lingua greca, la possiamo dividere in poli, che vuol dire molti, e gono, che vuol dire angolo (le parole originali in greco in realtà sono un po' diverse ma qui ci interessa solo il loro significato). Poligono ha quindi il significato di figura con molti angoli. Un quadrato ha quattro angoli, un triangolo ne ha tre, un pentagono ne ha cinque (anche la parola pentagono arriva dal greco, ed è composta penta, che vuol dire cinque, e nuovamente gono, che vuol dire angolo: pentagono vuol dire appunto cinque angoli) un esagono ne ha se (esa in greco vuol dire sei) e così via.
Prese tutte assieme, queste figure con molti angoli si chiamano poligoni.
Regolare vuol dire che segue una regola. Esistono molti tipi di poligono e non tutti sono regolari: i poligoni regolari sono solo quelli che hanno tutti i lati uguali tra loro e tutti gli angoli uguali tra loro, ma questa regola da sola non basta per dire se un poligono è regolare oppure no; la parte mancante di questa regola la vedremo tra poco.
Stiamo parlando dei poligoni proprio in questo momento per diversi motivi: il primo motivo, il più importante, è quello di capire la relazione tra una idea generale e i suoi casi particolari, e dopo avere capito quella relazione, vedere come creare un programma che funziona in base a quella relazione. Il secondo motivo è che i poligoni e le varie idee collegate ai poligoni sono molto importanti per la creazione della parte visibile dei programmi, anche quando questi programmi non si occupano direttamente di disegno o di geometria.
Geometria è un'altra parola che arriva dalla lingua greca, dove geo significa terra e metria significa misura, quindi geometria significa, alla lettera, misurazione della terra, ma il suo significato corrente è quello di studio delle forme, come ad esempio lo studio dei poligoni.
Vediamo alcuni poligoni:
Nelle immagini qui sopra non è importante che alcune figure abbiano i lati da 90 o da 100, oppure che abbiano gli angoli da 60° o da 120°, la cosa importante è che in ogni figura tutti i lati sono uguali tra loro e tutti gli angoli sono uguali tra loro. Le figure qui sopra sono tutte dei poligoni regolari.
Vediamo un rettangolo:
Il rettangolo non è un poligono regolare perché non ha tutti i lati uguali tra loro.
Vediamo un rombo:
Il rombo non è un poligono regolare perché non ha tutti gli angoli uguali tra loro.
Vediamo anche un trapezio:
Non ci sarebbe nemmeno bisogno di dirlo, ma il trapezio non è un poligono regolare perché ha lati diversi tra loro e ha anche angoli diversi tra loro.
Come ho scritto sopra, non è importante il valore degli angoli oppure dei lati (esistono tanti tipi diversi di rettangoli, rombi e trapezi) la cosa che ci interessa qui è vedere se gli angoli e i lati sono uguali tra loro.
Adesso vediamo un poligono un po' diverso, una stella. Una stella a cinque punte si disegna così:
Queste sono invece le misure dei lati e degli angoli di una stella a cinque punte:
Vediamo, la stella qui sopra ha tutti gli angoli uguali tra loro e ha anche tutti i lati uguali tra loro... possiamo dire che la stella è un poligono regolare? No, non possiamo, perché la stella è un poligono concavo.
Cosa sono i poligoni concavi? Detto in un modo semplice, i poligoni concavi sono tutti quei poligoni che hanno dei "buchi", di qualsiasi forma e dimensione. Guarda questa animazione:
Quello che vedi qui sopra è un poligono concavo. Si dice che un poligono è concavo quando è possibile disegnare una linea che unisce due punti all'interno del poligono (nella figura i due punti si chiamano A e B) e la linea passa all'esterno del poligono (nella figura la linea diventa rossa quando passa fuori dal poligono).
Facciamo questa prova con la stella, guarda l'animazione e nota dove passa la linea che unisce i punti A e B:
Come puoi vedere qui sopra, ho trovato due punti all'interno della stella che posso unire con una linea che esce dalla stella quindi la stella è un poligono concavo.
Il contrario di concavo è convesso. Basta andare per esclusione: se un poligono non è concavo, allora è convesso, tutto qui.
Completiamo quindi la nostra regola: un poligono regolare è un poligono convesso che ha tutti gli angoli uguali tra loro e tutti i lati uguali tra loro.
Esistono molte altre cose da sapere sui poligoni e su tutte le altre forme usate nella geometria ma per il momento ci possiamo fermare.
Creare una procedura per disegnare dei poligoni regolari
A questo punto potrei farti vedere direttamente quali comandi dare alla tartaruga per disegnare un poligono regolare qualsiasi, ma voglio arrivarci passo per passo a partire dalla procedura quadrato.
Mentre andiamo avanti prova a fermarti e ragionare con la tua testa su questo problema, per vedere se riesci a trovare una soluzione per conto tuo. Alla fine di questa sezione troverai la procedura completa che serve a disegnare qualsiasi poligono regolare, con qualsiasi numero di lati e con la misura dei lati a piacere.
Ripartiamo dalla prima procedura quadrato, quella che sapeva disegnare solo quadrati da 100:
per quadrato
ripeti 4 [
avanti 100
destra 90
]
fine
Abbiamo visto che potevamo togliere il numero 100 e sostituirlo con un parametro, al quale abbiamo dato il nome :misura:
per quadrato :misura
ripeti 4 [
avanti :misura
destra 90
]
fine
L'operazione che abbiamo fatto qui sopra si chiama generalizzazione. Abbiamo preso una idea ben precisa, l'idea di un quadrato da 100, e l'abbiamo resa più generale: l'idea di un quadrato di qualsiasi dimensione.
Adesso, oltre alla misura del lato, vogliamo generalizzare anche il numero dei lati. Vogliamo dunque passare dalla idea di un poligono regolare con quattro lati (il quadrato) all'idea di un poligono regolare qualsiasi.
Prima di tutto proviamo a disegnare un altro poligono regolare, come ad esempio un triangolo.
Guarda di nuovo le figure del triangolo e del quadrato e prova a creare la procedura triangolo senza altri suggerimenti:
per triangolo :misura
; cosa dobbiamo scrivere nel corpo della procedura?
fine
Se non hai trovato la soluzione non ti preoccupare. Ogni persona impara con il suo passo, non è veramente importante quanto vai in fretta, è molto più importante che capisci bene quello che stai facendo e come funzionano esattamente i comandi che dai alla tartaruga. La velocità arriva da sola, basta continuare ad esercitarsi e cercare sempre di imparare qualcosa di nuovo.
Potresti avere scritto la procedura triangolo in questo modo:
per triangolo :misura
ripeti 3 [
avanti :misura
destra 60 ; sbagliato!!!
]
fine
Se hai scritto una procedura come questa qui sopra potresti avere ottenuto un risultato come questo qui sotto:
Dove sta l'errore? L'errore sta nel fatto che l'angolo da 60° si trova all'interno del triangolo, mentre la tartaruga disegna sempre degli angoli esterni.
Quando abbiamo disegnato il quadrato non ci siamo accorti della differenza perché in un quadrato gli angoli interni e gli angoli esterni sono uguali. Nelle figure qui sotto puoi vedere la relazione tra gli angoli esterni e gli angoli interni dei primi quattro poligoni regolari:
Bene, se la procedura triangolo non funziona usando gli angoli interni, allora dovrà funzionare usando gli angoli esterni, giusto?
Se hai fatto la prova per conto tuo sai già che questa procedura...
per triangolo :misura
ripeti 3 [
avanti :misura
destra 120 ; gli angoli esterni del nostro triangolo misurano 120°
]
fine
...produce questo risultato:
Bene. Guardiamo le due procedure assieme:
per triangolo :misura
ripeti 3 [
avanti :misura
destra 120
]
fine
per quadrato :misura
ripeti 4 [
avanti :misura
destra 90
]
fine
La procedura quadrato e la procedura triangolo sono quasi uguali, l'unica cosa che cambia (a parte il nome) sono i numeri.
Hai già scoperto quale relazione esiste tra il numero dei lati e la misura degli angoli esterni? Hai trovato un modo per creare una procedura che disegna poligoni regolari di qualsiasi dimensione e qualsiasi numero di lati?
Se non ce l'hai fatta, queste altre animazioni potrebbero esserti d'aiuto:
Dalle animazioni qui sopra si vede che mettendo uno affianco all'altro tutti gli angoli esterni di un poligono regolare otteniamo un cerchio, e se anche non sappiamo quanto misura un cerchio lo possiamo calcolare.
Per il triangolo abbiamo 3 angoli da 120°. 3 x 120 = 360.
Per il quadrato abbiamo 4 angoli da 90°. 4 x 90 = 360.
Per il pentagono abbiamo 5 angoli da 72°. 5 x 72 = 360.
Per l'esagono abbiamo 6 angoli da 60°. 6 x 60 = 360.
Un cerchio infatti ha sempre la misura di 360°.
Ora troviamo la formula che dobbiamo usare per calcolare il valore dell'angolo in base al numero di angoli, e visto che stiamo lavorando con il linguaggio LOGO, scriviamo la formula con i simboli del LOGO. Una formula, in matematica, è semplicemente una serie di operazioni che ti permettono di calcolare una cosa che non sai in base a qualcosa che sai già.
I numeri 3, 4, 5 e 6 rappresentano il numero degli angoli. Togliamo questi numeri e sostituiamoli con la variabile :angoli.
I numeri 120, 90, 72 e 60 rappresentano il valore in gradi di ogni singolo angolo. Togliamo questi numeri e sostituiamoli con la variabile :gradi.
In LOGO possiamo scrivere così: :angoli * :gradi = 360 (ricordati che in LOGO il simbolo di moltiplicazione è l'asterisco *).
Quando vogliamo disegnare un poligono noi sappiamo già quanti angoli ci servono, quello che non sappiamo è il valore in gradi di ogni singolo angolo. Trasformiamo dunque la nostra formula per fare in modo che la variabile :gradi si trovi da sola alla sinistra del simbolo di uguale: :gradi = 360 / :angoli (ricordati che in LOGO il simbolo di divisione è la barra inclinata a destra /)
Aspetta un attimo: perché è sparito il simbolo di moltiplicazione ed è comparso il simbolo di divisione? Si tratta di una regola matematica.
Nella formula :gradi = 360 / :angoli ci sono cinque elementi, di questi cinque elementi tre sono degli operandi (in questo caso gli operandi sono :gradi, 360 e :angoli) mentre gli altri due sono degli operatori (in questo caso gli operatori sono il simbolo dell'uguale = e il simbolo della divisione / ). Gli operatori sono quelli che eseguono l'operazione, gli operandi sono quelli che vengono usati dall'operazione.
Quando si porta un operando da una parte all'altra del simbolo dell'uguale bisogna invertire l'operazione che stava affianco a quell'operando, quindi bisogna cambiare l'operatore.
La moltiplicazione diventa una divisione e la divisione diventa una moltiplicazione, perché la moltiplicazione e la divisione sono inverse l'una rispetto all'altra.
Allo stesso modo, la sottrazione diventa una addizione e l'addizione diventa una sottrazione, perché l'addizione e la sottrazione sono operazioni inverse l'una rispetto all'altra.
Facciamo un esempio. Questo è il primo problema: ci sono due bambini, il primo bambino ha due caramelle, il secondo bambino ha tre caramelle. Quante caramelle hanno i due bambini assieme? L'operazione è 2 + 3 = 5.
Adesso guardiamo il problema al contrario e chiamiamolo secondo problema: due bambini hanno cinque caramelle in tutto, il primo bambino ha tre caramelle. Quante caramelle ha il secondo bambino? L'operazione da fare è 5 - 3 = 2.
Non si tratta di due problemi diversi. Si tratta dello stesso problema visto da punti di vista diversi. Per essere più precisi, si tratta dello stesso problema dove le cose che non sappiamo e le cose che sappiamo sono diverse.
L'uguaglianza 5 - 3 = 2, che stiamo prendendo dal secondo problema, la possiamo scrivere anche come 2 = 5 - 3 , il significato non cambia. Se spostiamo il numero 3 da una parte all'altra del simbolo dell'uguale dobbiamo anche invertire l'operazione, quindi la sottrazione diventa una addizione: 2 + 3 = 5, che è la stessa uguaglianza del primo problema.
La regola che ho spiegato qui sopra è solo una tra le tante regole della matematica. La matematica è un linguaggio, un linguaggio molto importante se vuoi diventare un programmatore. Se non ti piace la matematica o se hai dei problemi con la matematica ti consiglio di cercare e trovare il significato di ogni parola, di ogni simbolo e di ogni idea che non ti sono perfettamente chiari. Se hai bisogno di aiuto, chiedi aiuto, non te ne vergognare, e se hai bisogno di fare molti esercizi per avere più sicurezza con tutte queste cose, fai molti esercizi, non esiste nessuna scorciatoia.
Se hai problemi con la matematica c'è il pericolo che avrai problemi anche con la programmazione.
Ritorniamo alla nostra formula per calcolare la misura degli angoli esterni di un poligono in base al numero degli angoli. Abbiamo visto che la formula che ci interessa è :gradi = 360 / :angoli.
Hai già trovato il modo di mettere tutto assieme in una unica procedura?
Io farei così: prima di tutto sceglierei un nome per la nuova procedura. Credo che la chiamerei poligono. Poi copierei il corpo di una procedura che disegna un poligono in particolare, come ad esempio il corpo della procedura triangolo, e scriverei dunque questo:
per poligono :misura
ripeti 3 [
avanti :misura
destra 120
]
fine
Bene, poi cambierei il nome della variabile :misura in :lato perché mi sembra più adatto, così non c'è il pericolo di fare confusione: quando in futuro leggerò questa procedura, se lascio :misura potrei chiedermi "Si parla della misura del lato o della misura dell'angolo?", mentre se scrivo :lato e lo scrivo al singolare, è più facile ricordarmi che si parla della misura del lato:
per poligono :lato
ripeti 3 [
avanti :lato
destra 120
]
fine
Poi aggiungerei un nuovo parametro :angoli nella prima riga della definizione della procedura e lo metterei per primo perché quando disegno un poligono il numero di angoli è più importante della misura del lato. Chiamerei questo nuovo parametro :angoli, al plurale, per ricordarmi che si tratta del numero di angoli:
per poligono :angoli :lato
ripeti 3 [
avanti :lato
destra 120
]
fine
Visto che il numero 3 è semplicemente il numero di angoli di un triangolo, mentre a me interessa disegnare poligoni con numeri di angoli diversi, sostituirei il numero 3 con la variabile :angoli:
per poligono :angoli :lato
ripeti :angoli [
avanti :lato
destra 120
]
fine
E adesso il tocco finale. Il numero 120 è il valore in gradi degli angoli esterni di un triangolo, ma a me interessa il valore degli angoli esterni di un poligono qualsiasi. Ho già trovato la formula per calcolare questo valore e la formula è :gradi = 360 / :angoli. Di questa formula mi interessa solo la parte alla destra dell'uguale, quindi la sostituirei al numero 120 in questo modo:
per poligono :angoli :lato
ripeti :angoli [
avanti :lato
destra 360 / :angoli
]
fine
Molto bene, per quello che vedo la procedura poligono è pronta, non mi resta che provarla, quindi salverei il lavoro che ho fatto nell'editor e ritornerei alla finestra principale di FMSLogo, dove eseguirei questi comandi in sequenza:
ps
poligono 3 100
ps
poligono 4 100
ps
poligono 5 100
ps
poligono 6 100
All'inizio di questa pagina, se ricordi, ti ho fatto notare che la vecchia procedura quadrato se chiamata con quadrato 0 disegnava un puntino e se chiamata con quadrato 2 disegnava un quadrato di lato 3.
Adesso prova questi comandi con la nuova procedura poligono e vedi cosa succede (non dimenticare di usare il comando puliscischermo o il comando "ps" per svuotare tutta l'area di disegno ogni volta, e non dimenticare di ingrandire l'area di disegno con il menu per vedere se la tartaruga ha disegnato qualcosa anche quando sembra che non abbia fatto nulla):
poligono 4 -100
poligono 3 0
poligono 2 100
poligono 1 -100
poligono 0 0
Dopo che avrai provato questi comandi, chiediti il motivo del loro comportamento e chiediti anche se pensi che sia importante modificare la procedura poligono perché si rifiuti di disegnare un poligono con il lato zero o perché si rifiuti di disegnare un poligono con meno di tre angoli.
Alla prossima puntata!