Gli algoritmi

Introduzione agli algoritmi

Quando deleghiamo un compito a un esecutore (persona o macchina), abbiamo bisogno di una sequenza di istruzioni
chiara, realizzabile e finita. Nel quotidiano sembriamo non averne bisogno (diciamo: “vado al ristorante e mangio una pastasciutta”),
ma per un esecutore non umano, ogni passaggio va reso esplicito: dimensione della pentola, riempimento, ebollizione, sale, tempi, scolatura e condimento.

Definizione – Algoritmo.
Una sequenza finita di istruzioni non ambigue, ciascuna eseguibile dall’esecutore
previsto, che porta al completamento del compito.

Partiremo da esempi fenomenologici semplici (media dei voti, area del cerchio, sconti e IVA) e poi introdurremo gradualmente
le strutture di controllo (sequenza, selezione, iterazione) con i relativi diagrammi di flusso.

Esempio guida: calcolare la media dei voti

Obiettivo: leggere una sequenza di voti e calcolarne la media. A ogni voto letto aggiorniamo il totale e il conteggio; quando
i voti sono finiti, eseguiamo la divisione finale.

leggi un voto
aggiorna totale
aggiorna conteggio
ci sono ancora voti?
sì → torna a “leggi un voto”
no → media = totale / conteggio; stampa media
Diagramma di flusso per il calcolo della media dei voti
Diagramma di flusso: media dei voti.

Simboli del diagramma di flusso

  • Rettangolo: istruzione/operazione.
  • Parallelogramma: ingresso/uscita (lettura/stampa).
  • Ovale: inizio/fine.
  • Rombo: decisione (proposizione logica vera/falsa).
Nota sull’assegnamento.
L’istruzione numerovoti = numerovoti + 1 significa:
“prendi il valore attuale di numerovoti, aggiungi 1 e memorizza il risultato in numerovoti”.
Non è un’uguaglianza algebrica, è un aggiornamento di variabile.

La Sequenza

La struttura più semplice: eseguire le istruzioni una dopo l’altra. Ad esempio, dati i raggio del cerchio, calcoliamo area
e circonferenza.

Schema di base della sequenza di istruzioni
Schema: una sequenza di istruzioni eseguite in ordine.
Inizio
Leggi raggio
Area = raggio * raggio * 3.14
Circonferenza = 2 * raggio * 3.14
Stampa Area
Stampa Circonferenza
Fine
Variabili. Sono contenitori simbolici per valori usati nei calcoli (input, risultati intermedi, output).

La Selezione a due vie

Dopo la sequenza, introduciamo la capacità di scegliere tra due percorsi in base a una condizione.

Esempio: nello stesso programma calcoliamo l’area di un rettangolo oppure di un triangolo rettangolo, in base all’input.

Diagramma di flusso selezione a due vie: rettangolo vs triangolo rettangolo
Selezione a due vie: percorso alternativo in base alla condizione.
inizio
se è_rettangolo allora
leggi lato1
leggi lato2
area = lato1 * lato2
stampa area
altrimenti
leggi cateto1
leggi cateto2
area = (cateto1 * cateto2) / 2
stampa area
fine se
fine
Sintassi generale (pseudocodice).
se <condizione> allora
<sequenza1>
altrimenti
<sequenza2>
fine se
Esempio “sconti e IVA”.
Calcolo del totale con sconto al 10% oltre una soglia e IVA 20% fino a €200, 15% sopra.

inizio
leggi numeroprodotti
leggi prezzo
leggi valorelimite
parziale = prezzo * numeroprodotti
se parziale >= valorelimite allora
parziale = parziale – parziale * 0.10
fine se
se parziale <= 200 allora
totale = parziale + parziale * 0.20
altrimenti
totale = parziale + parziale * 0.15
fine se
stampa totale
fine

Le Iterazioni: Ripeti/Finché, Mentre/Fai e Per

Molti compiti richiedono di ripetere azioni finché non succede qualcosa (evento o soglia), oppure per un numero noto di volte.
Ecco tre control-flow classici, con agganci fenomenologici.

Ripeti … Finché (controllo in coda)

Prima esegui, poi verifichi la condizione: ripeti finché non è soddisfatta. Fenomeno: “Tiro il dado finché esce 6”.

Diagramma di flusso iterazione con controllo in coda (ripeti finché)
Iterazione con controllo in coda.
Esempio – Prodotto più caro (numero di voci ignoto).

inizio
prezzomassimo = 0
ripeti
leggi prodotto
leggi prezzoprodotto
se prezzoprodotto > prezzomassimo allora
prezzomassimo = prezzoprodotto
prodottopiucaro = prodotto
fine se
stampa “Vuoi continuare? (si/no)”
leggi risposta
finché risposta = “no”
stampa prodottopiucaro
stampa prezzomassimo
fine

Mentre … Fai (controllo in testa)

Verifichi la condizione all’inizio: se è falsa, il corpo può non eseguire neppure una volta.
Fenomeno: “Continuo a camminare mentre il semaforo è verde”.

Diagramma di flusso iterazione con controllo in testa (mentre)
Iterazione con controllo in testa.
Esempio – Somma dei primi n numeri.

inizio
leggi n
totale = 0
contatore = 0
mentre contatore < n fai
contatore = contatore + 1
totale = totale + contatore
fine mentre
stampa totale
fine

Per (numero di iterazioni noto)

Usiamo per quando sappiamo a priori quante ripetizioni servono. Fenomeno: “Faccio 10 flessioni”.

Diagramma di flusso per iterazione con contatore fisso (per)
Iterazione con contatore.
Esempio – Tabellina del 4.

inizio
per contatore = 1 fino a 10
risultato = contatore * 4
stampa risultato
fine per
fine
Esempio – Tavola pitagorica (cicli annidati).

inizio
per i = 1 fino a 10
per j = 1 fino a 10
risultato = i * j
stampa risultato
fine per
fine per
fine

Equivalenze: le strutture sono trasformabili l’una nell’altra (Teorema di Böhm–Jacopini).
Tuttavia è buona pratica usare la forma più naturale (leggibilità prima di tutto).

Selezione a più vie

Quando le alternative sono molte e dipendono dal valore di un’unica variabile, la forma “se … altrimenti” annidata diventa poco leggibile.
La selezione a più vie (switch/case) compatta e chiarisce.

Esempio – Ore lavorate per giorno.

inizio
leggi giorno
seleziona giorno
caso lunedì: ore = 4
caso venerdì: ore = 5
caso sabato: ore = 7
caso domenica: ore = 0
caso altri_valori: ore = 8
fine seleziona
stampa ore
fine
Diagramma di flusso della selezione a più vie (switch/case)
Scelta multipla su un’unica variabile.

Dalla tabella al codice: l’ascensore (automa di Mealy)

Colleghiamo ora le strutture viste con un esempio classico: l’ascensore, la cui logica è stata specificata da una tabella
(automa di Mealy). Possiamo implementarla con seleziona annidati.

Ingressi
Stato attuale 1 2 3 T
1 1/F 2/S 2/S T/G
2 1/G 2/F 3/S 1/G
3 2/G 2/G 3/F 2/G
T 1/S 1/S 1/S T/F
inizio
leggi statoattuale
mentre vero fai
leggi ingresso
seleziona statoattuale
caso 1:
seleziona ingresso
caso 1: statofuturo = 1; uscita = F
caso 2: statofuturo = 2; uscita = S
caso 3: statofuturo = 2; uscita = S
caso T: statofuturo = T; uscita = G
fine seleziona
caso 2:
seleziona ingresso
caso 1: statofuturo = 1; uscita = G
caso 2: statofuturo = 2; uscita = F
caso 3: statofuturo = 3; uscita = S
caso T: statofuturo = 1; uscita = G
fine seleziona
caso 3:
seleziona ingresso
caso 1: statofuturo = 2; uscita = G
caso 2: statofuturo = 2; uscita = G
caso 3: statofuturo = 3; uscita = F
caso T: statofuturo = 2; uscita = G
fine seleziona
caso T:
seleziona ingresso
caso 1: statofuturo = 1; uscita = S
caso 2: statofuturo = 1; uscita = S
caso 3: statofuturo = 1; uscita = S
caso T: statofuturo = T; uscita = F
fine seleziona
fine seleziona
statoattuale = statofuturo
se uscita = F allora esci dal ciclo
fine mentre
fine

Riepilogo strutture di controllo

  • Sequenza: istruzioni una dopo l’altra.
  • Selezione a due vie: biforcazione su condizione (vero/falso).
  • Selezione a più vie: scelta tra casi multipli su una variabile.
  • Ripeti/Finché: almeno una esecuzione; test in coda.
  • Mentre/Fai: può eseguire zero volte; test in testa.
  • Per: numero di iterazioni noto a priori.

Esercizi

1) Sequenze e selezioni

  1. Scrivi un algoritmo che legge un intero e stampa: “pari” se è divisibile per 2, “dispari” altrimenti (diagramma + pseudocodice).
  2. Amplia l’esempio “sconti e IVA” introducendo una seconda soglia con sconto del 15% oltre € 500.

2) Iterazioni

  1. Media, massimo e minimo di una sequenza di voti terminata da un valore negativo (usa ripeti o mentre).
  2. Numeri primi: per ciascuno dei 20 numeri letti, verifica se è primo usando il resto (Mod).
    primo = vero
    valore = 2
    ripeti
    se (n Mod valore) = 0 allora
    primo = falso
    altrimenti
    valore = valore + 1
    finché (valore > n/2) oppure (primo = falso)
  3. Somma dei primi n numeri (usa mentre); poi riscrivilo con ripeti e con per.

3) Dalla grafica al codice

  1. Traduci in pseudocodice il seguente diagramma di flusso e spiega cosa calcola:
    Diagramma di flusso esercizio di traduzione in pseudocodice

4) Comprensione concettuale

  1. Definisci “algoritmo”.
  2. Qual è la differenza tra ciclo mentre e ciclo ripeti? E tra mentre e per?
  3. Mostra come simulare un mentre con un ripeti e viceversa (usa piccoli esempi).
  4. Simula un ciclo per con mentre e con ripeti.
  5. Che differenza c’è tra selezione a due vie e a più vie? Quando preferire l’una o l’altra?

5) Quiz veloci

  1. Un ciclo ripeti:
    • a) ha termine quando la condizione logica è vera ✅
    • b) è un’iterazione a due vie ❌
    • c) è un ciclo con controllo in testa ❌
    • d) è una selezione iterativa ❌
  2. Il ciclo per:
    • a) serve per effettuare selezioni ❌
    • b) non può essere simulato con altri cicli ❌
    • c) può simulare un ciclo ripeti ✅ (con contatore e condizione opportuna)
    • d) teoricamente può non essere compreso in un linguaggio di programmazione ✅
  3. Il ciclo mentre:
    • a) ha termine quando la condizione logica è vera ❌ (di solito si esce quando diventa falsa)
    • b) è un ciclo con controllo in testa ✅
    • c) si può simulare con un ciclo for ✅ (se noto il numero di iterazioni)
    • d) esegue il corpo un numero fisso di volte ❌
  4. La struttura se:
    • a) è un ciclo ❌
    • b) è una selezione ✅
    • c) è un’iterazione ❌
    • d) è una sequenza ❌
Consiglio per la classe. Per evitare ambiguità numeriche, nei calcoli usa il punto come separatore decimale (3.14).
In stampa per il lettore italiano puoi formattare con la virgola (3,14).

Articoli simili