Indovinelli con Scratch

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:

Algoritmi di selezione

Algoritmi di selezione

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:

Ellisse per 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;

Rettangolo per effettuare le operazioni;

Rombo per 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.

algoritmo di selezione


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:

Ellisse per 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;

Rombo per 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.

selezione temperatura

Ricordiamo che l’operatore di confronto si indica con il doppio uguale.

Alcuni link utili

Indice tutorial diagrammi a blocchi

1 – Diagramma a blocchi

2 – Primi esercizi con i diagrammi di flusso (perimetro triangolo; area di un trapezio)

3 – Altro semplice esercizio sui flow chart (calcolare uno sconto)

4 – Area del cerchio

5 – Precedente e successivo di un numero

6 – Introduzione agli algoritmi di selezione

7 – Minore tra due numeri

8 – Maggiore fra tre numeri

9 – Algoritmo di selezione sugli angoli


Numeri Perfetti

Numeri Perfetti

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.

algoritmi con i numeri perfetti

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

Alcuni link utili

Indice argomenti diagramma a blocchi

Numeri primi da 1 a 100

Array con algobuild

Divisori di un numero con algobuild

Algoritmi di selezione sugli angoli

Algoritmi di selezione

Triangoli con algobuild

Fibonacci con algobuild

Serie buffa con algobuild


Numeri amicabili con Algobuild

Numeri amicabili con Algobuild

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.

numeri amicabili con Algobuild

Alcuni link utili

Indice argomenti diagramma a blocchi

Numeri primi da 1 a 100

Array con algobuild

Divisori di un numero con algobuild

Algoritmi di selezione sugli angoli

Algoritmi di selezione

Triangoli con algobuild

Fibonacci con algobuild

Serie buffa con algobuild

Numeri amicabili con algobuild

Numeri perfetti con algobuild

Massimo fra tre numeri

Minore fra tre numeri

Triangoli con Algobuild

Triangoli con Algobuild

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==lato2 e lato2==lato3 per determinare se il triangolo è equilatero.

Dopo confrontiamo se lato1==lato2 o lato2==lato3 o lato1==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:

while triangoli

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

triangoli algobuild

La stessa soluzione si poteva implementare anche con gli if annidati.

lati triangoli
isoscele

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

Alcuni link utili

Indice argomenti diagramma a blocchi

Numeri primi da 1 a 100

Array con algobuild

Divisori di un numero con algobuild

Algoritmi di selezione sugli angoli

Algoritmi di selezione

Triangoli con algobuild

Fibonacci con algobuild

Serie buffa con algobuild

Numeri amicabili con algobuild

Numeri perfetti con algobuild

Massimo fra tre numeri

Minore fra tre numeri