In questa lezione realizzemo un gioco con gli indovinelli con Scratch. Proporremo 4 semplici indovinelli: 1) Giro curioso nel bosco fitto e frondoso. Mi arrotolo in palla, sono piccolo e gioioso. 2) Mi nutro di insetti nell’oscurità, Un piccolo mammifero nella mia verità. 3) Nella notte mi senti cantare, Con occhi grandi posso guardare. 4) Faccio il sonnellino durante la lunga stagione. Amo miele e pesce, sono un buon pescatore!
Per individuare la risposta corretta, occorre trascinare ciascun animale sulla macchina. Se la macchina parte con l’animale vuol dire che la risposta è corretta, altrimenti la macchina cambia colore e l’animale ritorna in posizione.
Ecco una possibile implementazione del gioco indovinelli con Scratch:
Vediamo una serie di esempi con gli algoritmi di selezione, cioè di algoritmi che utilizzano le istruzioni condizionali come la funzione if … else.
Esempio 1 di algoritmo di selezione
In un supermercato c’è la promozione 3×2. Se si acquistano 3 pezzi se ne pagano solo 2. La promozione è cumulativa, ovvero se si acquistano 6 pezzi se ne pagano 4 e così via. Per quantità inferiori a 3 il prezzo rimane invariato.
Per realizzare questo algoritmo di selezione servono quindi le seguenti forme:
Ellisseper l’inizio e per la fine;
Parallelogramma per inserire l’input, ovvero in questo caso il prezzo e la quantità (q) e per visualizzare in output il prezzo finale da pagare;
Rettangoloper effettuare le operazioni;
Romboper effettuare un test che può essere vero o falso. In questo caso si chiede: q è maggiore o uguale a 3? Se il test è vero si applica lo sconto, altrimenti si pagano i prodotti a prezzo intero.
Quindi chiedo in input il prezzo e la quantità che per brevità chiamo q.
Dopo controllo se q è maggiore o uguale a 3 (in alternativa avrei anche potuto mettere q>2). Se è falso allora calcolo il totale da pagare senza sconto memorizzandolo nella variabile T; se invece è vero calcolo la divisione arrotondata per difetto di q/3 ovvero utilizzo la funzione floor() di Algobuild, che è comune a molti linguaggi di programmazione. Il risultato di questa operazione non è altro che la quantità che devo sottrarre alla quantità richiesta in input.
Ecco il diagramma di flusso completo dell’algoritmo di selezione, che utilizza l’istruzione condizionale if…else, realizzato con Algobuild.
Facciamo altri esempi di algoritmi di selezione con le istruzioni condizionali.
Esempio 2 di algoritmo di selezione
Data una temperatura T, visualizzare se si tratta di una temperatura: “sotto lo zero”, “uguale a zero” o “sopra lo zero”. Visualizzare il messaggio in output.
Per realizzare questo algoritmo servono dunque le seguenti forme:
Ellisseper l’inizio e per la fine;
Parallelogramma per inserire l’input, ovvero in questo caso la temperatura (T) e per visualizzare in output il messaggio;
Romboper effettuare un test che può essere vero o falso. In questo caso si chiede: T è maggiore di 0? Se il test è vero si visualizza “La temperatura è sopra lo zero“; altrimenti si effettua un ulteriore controllo chiedendo: T è uguale a 0? Se vero si visualizza il messaggio “La temperatura è uguale a zero“; altrimenti si visualizza il messaggio; “La temperatura è sotto lo zero“.
Ecco quindi l’esempio di algoritmo che utilizza più istruzioni condizionali.
Ricordiamo che l’operatore di confronto si indica con il doppio uguale.
Realizziamo un algoritmo sui numeri perfetti utilizzando Algobuild e quindi rappresentandolo con il diagramma di flusso e con la pseudo-codifica.
Definizione di numeri perfetti
In matematica un numero si dice perfetto quando è uguale alla somma dei divisori propri (tutti i divisori tranne il numero stesso).
Ad esempio il numero 6 è perfetto perché è divisibile per 1, 2, 3 e la somma dei suoi divisori è proprio 6.
Il numero 28 è un altro numero perfetto, infatti i suoi divisori sono 1, 2, 4, 7, 14. Altri numeri perfetti sono dunque 496, 8128, ecc…
Abbiamo già visto in precedenza l’algoritmo sui numeri amicabili, se vuoi consultarlo vai al link.
Algoritmo in Algobuild per trovare i numeri perfetti
Proviamo adesso a realizzare un diagramma a blocchi, utilizzando Algobuild, per calcolare se un numero preso in input è perfetto oppure no.
Per prima cosa chiediamo in input il nostro numero n. Dopo controlliamo che n sia positivo perché i numeri perfetti sono solo numeri positivi.
Se non è positivo allora si richiede di inserirlo nuovamente tramite il ciclo do-while, facciamo così un controllo dell’input.
Se invece é positivo andiamo avanti nel nostro algoritmo e impostiamo una variabile div uguale a 2, in quanto so già che ogni numero è divisibile per 1.
Poi creiamo un’altra variabile che contiene la somma di tutti i divisori.
Chiamiamo la variabile somma e la inizializziamo ad 1 per il discorso che abbiamo fatto prima, ovvero che ciascun numero è divisibile per uno.
Adesso iniziamo il ciclo che consentirà di dividere il numero preso in input n per il divisore div. Se il numero n è divisibile per div lo aggiunge alla somma dei divisori e quindi alla variabile somma, altrimenti va avanti.
In ogni caso si incrementa la variabile div di uno e si continua a dividere così per il nuovo numero.
Il ciclo terminerà quando il div raggiungerà la metà del numero n.
Alla fine controllerà se la somma dei divisori coincide con il numero stesso e dirà quindi se il numero n è perfetto oppure no.
Ecco dunque l’algoritmo sui numeri perfetti realizzato con i diagrammi di flusso.
Pseudo-codifica
Inserisco lo pseudo-codice dell’algoritmo sui numeri perfetti che abbiamo realizzato prima.
PROG main
DO_WHILE //n<=0
IN n
END DO_WHILE n<=0
ASSIGN div=2
ASSIGN somma=1
WHILE div<=n/2
IF n%div==0
ASSIGN somma=somma+div
ELSE //if n%div==0
END IF //n%div==0
ASSIGN div=div+1
END WHILE //div<=n/2
IF somma==n
OUT "perfetto"
ELSE //if somma==n
OUT "non perfetto"
END IF //somma==n
END PROG //main
Sviluppiamo un algoritmo con Algobuild che calcoli se due numeri sono amicabili.
Definizione di numeri amicabili
Due numeri in matematica si dicono amicabili o amicali o amici se la somma dei divisori propri di uno (escluso il numero stesso) è uguale all’altro numero e viceversa.
Facciamo un esempio:
La coppia di numeri 220 e 284 sono amicabili.
Infatti i divisori di 220 sono: 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 e 110. Se li sommiamo otteniamo il numero 284
Allo stesso modo i divisori di 284 sono: 1, 2, 4, 71, 142. La somma di tutti i divisori fa 220.
Quindi si dice che i numeri sono amicabili.
Ci sono altri esempi di numeri amicabili, ad esempio 1184 e 1210 oppure 2620 e 2924, ecc…
Algoritmo che calcola se due numeri sono amicabili con Algobuild
Per realizzare l’algoritmo prendiamo in input A e B, che rappresentano i due numeri presi in input su cui fare il controllo per vedere se sono amicabili.
Impostiamo una variabile div, che rappresenta i divisori, e la facciamo partire da 2.
Facciamo partire div da 2 poiché è scontato che qualsiasi numero si possa dividere per 1, pertanto faccio senza a farlo, risparmio operazioni.
Facciamo poi partire la somma dei due divisori direttamente da 1 anziché da zero.
Quindi poniamo sommaA=1 e sommaB=1.
Successivamente finché il divisore non raggiunge A/2, continuiamo a dividere A per il divisore.
Se il resto della divisione di A diviso div (A%div) è uguale a zero allora div sarà sicuramente divisore, e lo sommiamo alla sommaA; altrimenti lo ignoriamo e andiamo avanti.
In ogni caso si incrementerà il contatore div di uno.
Perché ci fermiamo ad A/2?
Perché è scontato che se dividiamo un numero per un numero superiore alla sua metà avremo sempre resto diverso da zero; ovvero sarà sempre un numero con la virgola. Quindi risparmieremo tante operazioni se ci fermiamo ad A/2.
Lo stesso procedimento possiamo ripeterlo per B, avendo cura di portare il div nuovamente a due una volta che terminiamo con A.
Alla fine confrontiamo la sommaA con B e la sommaB con A. Se entrambi i risultati sono veri allora i numeri sono amicabili, altrimenti no.
Realizziamo degli algoritmi sui triangoli con Algobuild.
Dati in input i lati di un triangolo verificare se è isoscele, equilatero o scaleno.
Per verificare se un triangolo è isoscele, equilatero o scaleno dobbiamo confrontare i lati tra di loro.
Ricordiamo che su Algobuild, come nei linguaggi di programmazione, l’operatore di confronto per l’uguaglianza è il doppio uguale: ==
Algoritmo sui triangoli con Algobuild
Come procediamo per verificare se un triangolo è isoscele, equilatero o scaleno?
Procediamo in questo modo:
Prima confrontiamo lato1==lato2elato2==lato3 per determinare se il triangolo è equilatero.
Dopo confrontiamo se lato1==lato2olato2==lato3olato1==lato3 per determinare se il triangolo è isoscele.
Se nessuna delle condizioni sopra si verifica allora il triangolo è scaleno.
Prima però occorre controllare che il triangolo soddisfa questa proprietà fondamentale: In un triangolo ogni lato è minore della somma degli altri due!’
Quindi impostiamo un ciclo do-while con questa condizione: while !(lato1<lato2+lato3 && lato2<lato3+lato1 && lato3<lato1+lato2)
Se questa condizione è vera quindi richiediamo i lati per far si che rispettino la proprietà.
Come da figura sotto:
Se la proprietà dei triangoli è verificata allora continuiamo.
Ricordiamo che gli operatore logici in Algobuild, così come nei linguaggi di programmazione si indicano in questo modo:
per l’and si usa il simbolo &&
per l’or si usa il simbolo ||
per il not si usa il simbolo !
Allego lo script completo
La stessa soluzione si poteva implementare anche con gli if annidati.
Ecco lo pseudocodice:
PROG main
DO_WHILE //! (lato1<lato2+lato3 && lato2<lato3+lato1 && lato3<lato1+lato2)
IN lato1
IN lato2
IN lato3
END DO_WHILE ! (lato1<lato2+lato3 && lato2<lato3+lato1 && lato3<lato1+lato2)
IF lato1==lato2 &&lato2==lato3
OUT "il triangolo è equilatero"
ELSE //if lato1==lato2 &&lato2==lato3
IF lato2==lato3 || lato1==lato2 || lato1==lato3
OUT "il triangolo è isoscele"
ELSE //if lato2==lato3 || lato1==lato2 || lato1==lato3
OUT "il triangolo è scaleno"
END IF //lato2==lato3 || lato1==lato2 || lato1==lato3
END IF //lato1==lato2 &&lato2==lato3
END PROG //main
Commenti recenti