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).