Classe terza · Percorso da zero

Prima si ragiona. Poi si programma.

Dalla comprensione del problema al diagramma di flusso, fino alla traduzione in C++. Un percorso progressivo per imparare e per preparare le lezioni.

Apri il laboratorio Studia la teoria

Laboratorio interattivo

Dal procedimento al codice.

Scegli un problema, modifica i dati e osserva lo stesso algoritmo come pseudocodice, C++ e traccia di esecuzione.

SIMULATORE

Media di tre voti

Sequenza: acquisisci tre voti, calcola la media e visualizzala.

Media = 8.00
  1. 1Leggo a = 7, b = 8, c = 9
  2. 2Somma: 7 + 8 + 9 = 24
  3. 3Divisione: 24 / 3 = 8.00
PSEUDOCODICE
LEGGI a, b, c
media ← (a + b + c) / 3
SCRIVI media
C++
double a, b, c;
cin >> a >> b >> c;
double media = (a + b + c) / 3;
cout << media;
PALESTRA DI VERIFICA

12 quesiti con correzione motivata

0/12corretti
FondamentiAlgoritmi

Quale proprietà garantisce che un algoritmo non continui per sempre?

Manuale operativo verificato

Il percorso della classe terza.

Ogni argomento introduce una sola difficoltà nuova. Prima si risolve il problema a parole, poi con simboli e infine con il linguaggio C++.

Affidabilità del materiale

Contenuti controllati su standard e riferimenti tecnici.

Definizioni e terminologia algoritmica sono confrontate con il NIST; i simboli dei diagrammi con lo standard internazionale ISO 5807; sintassi e semantica C++ con la Standard C++ Foundation e cppreference. Gli esempi sono ricontrollati mediante traccia manuale e casi limite.

“Verificato su fonti” non significa certificazione formale da parte degli enti citati.

UNITÀ 01

Analizzare il problema prima di scrivere codice

Programmare significa trasformare una richiesta in una sequenza di operazioni non ambigue. Prima di pensare alla sintassi bisogna riconoscere dati di ingresso, risultato atteso e procedimento.

Alla fine saprai:separare ciò che il programma riceve, ciò che deve calcolare e ciò che deve comunicare.
INPUTTre voti: 7, 8, 9
ELABORAZIONESomma e divisione per 3
OUTPUTMedia: 8

Metodo guidato: dalla consegna alla soluzione

  1. Sottolinea i dati forniti.“Leggi tre voti”: i tre voti sono gli input.
  2. Cerchia il risultato richiesto.“Calcola la media”: la media è l’output.
  3. Scrivi la formula a parole.Somma i voti e dividi il totale per il loro numero.
  4. Scegli nomi chiari.voto1, voto2, voto3, media.
  5. Prova a mano.Con 7, 8 e 9 ottieni (7 + 8 + 9) / 3 = 8.

UNITÀ 02

Progettare un algoritmo: dal problema alla soluzione

Un algoritmo è una sequenza finita, ordinata e non ambigua di istruzioni che risolve una classe di problemi. Deve terminare, produrre il risultato corretto e funzionare con tutti i dati ammessi, non soltanto con l’esempio.

Pseudocodice: area del rettangolo
INIZIO
  LEGGI base, altezza
  area ← base × altezza
  SCRIVI area
FINE

Lo pseudocodice non è un linguaggio eseguibile: serve a concentrarsi sulla logica. Nomi chiari e indentazione rendono visibile la struttura.

Alla fine saprai:scrivere una soluzione indipendente dal linguaggio e controllare se termina e produce il risultato giusto.

Traccia dell’algoritmo

Inputbase = 5, altezza = 3
Elaborazionearea ← 5 × 3, quindi area diventa 15.
Outputviene mostrato 15.

Prova anche base = 0 e altezza = 4: il risultato deve essere 0. Se la consegna vieta valori non positivi, l’algoritmo deve controllarli prima del calcolo.

Finitodeve arrivare a FINE dopo un numero limitato di passi
Non ambiguoogni istruzione deve avere un solo significato
Generaledeve funzionare per tutti i dati ammessi
Verificabileinput noto deve produrre un output controllabile

I tre mattoni di qualunque algoritmo

1
Sequenza

Le istruzioni vengono eseguite una dopo l’altra. Esempio: leggi base, leggi altezza, calcola area, mostra area.

A → B → C
2
Selezione

L’algoritmo sceglie un percorso in base a una condizione. Esempio: se il voto è almeno 6, scrivi “promosso”; altrimenti scrivi “non promosso”.

SE condizione ALLORA ... ALTRIMENTI ...
3
Iterazione

Un gruppo di istruzioni viene ripetuto finché una condizione lo richiede. Esempio: leggi e somma 10 voti.

PER i DA 1 A 10 ESEGUI ...

Come si progetta: la strategia in 7 passaggi

  1. Comprendi la consegna.Riscrivila con parole tue senza usare termini di programmazione.
  2. Definisci il dominio.Quali valori sono ammessi? Sono possibili zero, numeri negativi o dati mancanti?
  3. Individua input e output.Elenca separatamente ciò che conosci e ciò che devi ottenere.
  4. Scomponi il problema.Dividi la soluzione in piccoli sottoproblemi: leggere, controllare, calcolare, mostrare.
  5. Scegli le strutture.Usa sequenza, selezione o iterazione in base al comportamento richiesto.
  6. Scrivi lo pseudocodice.Una sola azione per riga, verbi precisi, nomi significativi e blocchi indentati.
  7. Verifica con una traccia.Simula l’algoritmo con un caso normale, un limite e un dato non valido.

Esempio completo: prezzo del biglietto

La consegna dice: “Leggi l’età di una persona. Il biglietto costa 10 euro; per chi ha meno di 14 anni costa 6 euro. Mostra il prezzo”.

Inputetà della persona
Outputprezzo del biglietto
Regolaetà < 14 → 6 €, altrimenti 10 €
Controllol’età non può essere negativa
Pseudocodice ragionato
INIZIO
  LEGGI eta
  SE eta < 0 ALLORA
    SCRIVI "Dato non valido"
  ALTRIMENTI
    SE eta < 14 ALLORA
      prezzo ← 6
    ALTRIMENTI
      prezzo ← 10
    FINE SE
    SCRIVI prezzo
  FINE SE
FINE

Verifica prima di programmare

eta = 1212 non è negativa; 12 < 14 è vero → prezzo = 6.
eta = 1414 < 14 è falso → prezzo = 10. Questo è il valore di confine.
eta = −2Il dato viene rifiutato e il prezzo non viene calcolato.

Le tre prove controllano il ramo vero, il confine e un input non valido.

Dalla soluzione semplice a quella più complessa

Somma e media di N voti
INIZIO
  LEGGI N
  SE N <= 0 ALLORA
    SCRIVI "Quantità non valida"
  ALTRIMENTI
    somma ← 0
    PER i DA 1 A N ESEGUI
      LEGGI voto
      somma ← somma + voto
    FINE PER
    media ← somma / N
    SCRIVI media
  FINE SE
FINE
Quali competenze stai usando?

Hai scomposto il problema, validato l’input, inizializzato un accumulatore, usato un ciclo controllato da contatore e calcolato il risultato soltanto quando la divisione è sicura.

Controllo di comprensione

RagionamentoPerché somma deve partire da 0?
Perché 0 è l’elemento neutro dell’addizione: non modifica il primo voto. Partire da un altro valore altererebbe la somma e quindi la media.
Caso limitePerché bisogna controllare N prima di calcolare la media?
Se N vale 0 si avrebbe una divisione per zero. Se N è negativo, la quantità di voti non ha significato nel dominio del problema.
SceltaQuale struttura serve per stabilire se un numero è pari?
Una selezione: si verifica la condizione n % 2 == 0. Non serve un ciclo, perché la decisione viene presa una sola volta.
ProgettazioneScrivi input, output e sottoproblemi per trovare il maggiore fra tre numeri.
Input: tre numeri. Output: il maggiore. Sottoproblemi: assumere il primo come massimo provvisorio; confrontare il secondo e aggiornare; confrontare il terzo e aggiornare; mostrare il massimo.

UNITÀ 03

Diagrammi di flusso: simboli e percorsi

Un diagramma di flusso è la mappa di un procedimento: si legge partendo da INIZIO e seguendo le frecce, un blocco alla volta. La forma del blocco dice allo studente che cosa deve accadere: acquisire un dato, eseguire un calcolo oppure prendere una decisione.

Alla fine saprai:scegliere il simbolo corretto, collegare i blocchi e trasformare il diagramma in un programma con if.
INIZIO / FINE
Terminatore. Indica soltanto dove il procedimento comincia o termina. Ogni diagramma deve avere un INIZIO e almeno una FINE.
LEGGI / SCRIVI
Input/output. Usalo quando un dato entra nel programma (LEGGI voto) o quando mostri un risultato (SCRIVI media).
calcolo ← valore
Elaborazione. Contiene un’operazione che modifica o calcola un valore, per esempio media ← somma / 3.
condizione?
Decisione. Contiene una domanda con risposta VERO/FALSO o SÌ/NO. Da qui devono uscire due frecce etichettate.

Come si costruisce: metodo in 5 passaggi

  1. Scrivi l’obiettivo.Stabilire se un numero è positivo.
  2. Trova l’input.Serve un numero, che chiameremo n.
  3. Formula la domanda.La condizione da verificare è n > 0?
  4. Prepara i due risultati.Se SÌ scrivi “positivo”; se NO scrivi “non positivo”.
  5. Collega e controlla.Ogni ramo deve arrivare a FINE e nessuna freccia deve restare sospesa.

Esempio svolto: verificare se un numero è positivo

INIZIO↓LEGGI n↓n > 0?
SÌ → SCRIVI “positivo”NO → SCRIVI “non positivo”
↓FINE

Leggiamolo con due dati di prova

Se n = 77 > 0 è VERO → si segue il ramo SÌ → appare “positivo”.
Se n = −3−3 > 0 è FALSO → si segue il ramo NO → appare “non positivo”.

Attenzione: con questo diagramma lo zero finisce nel ramo “non positivo”. Se la consegna chiede positivo, negativo oppure zero, servono due decisioni.

UNITÀ 04

Il primo programma in C++

Alla fine saprai:riconoscere la struttura di un programma, dichiarare variabili, leggere dati e mostrare risultati.
Struttura minima
#include <iostream>
using namespace std;

int main() {
  cout << "Ciao, mondo!" << endl;
  return 0;
}
Che cosa succede davvero?

Il computer entra in main, esegue cout e visualizza il messaggio. return 0 comunica al sistema che il programma è terminato correttamente. Prova a cambiare soltanto il testo tra virgolette, ricompila e osserva il risultato.

#include <iostream>

rende disponibili input e output

int main()

è il punto di partenza

{ }

delimitano un blocco

;

conclude un’istruzione

cout

scrive sullo schermo

cin

legge dalla tastiera

Variabili e tipi principali

intnumeri interiint eta = 16;
doublenumeri con decimalidouble media = 7.5;
charun caratterechar sezione = 'A';
boolvero o falsobool promosso = true;
stringtestostring nome = "Sara";

Costruiamo un programma completo

Area del rettangolo in C++
#include <iostream>
using namespace std;

int main() {
  double base, altezza, area;

  cout << "Inserisci base e altezza: ";
  cin >> base >> altezza;
  area = base * altezza;
  cout << "Area = " << area << endl;

  return 0;
}
  1. Dichiara.Le tre variabili sono double perché possono contenere decimali.
  2. Leggi.cin inserisce i due valori digitati nelle variabili.
  3. Calcola.L’espressione a destra viene calcolata e assegnata ad area.
  4. Mostra.cout unisce il testo al valore ottenuto.
  5. Verifica.Con base 5 e altezza 3 il programma deve visualizzare 15.

UNITÀ 05

Sequenza e selezione con if

La sequenza esegue le istruzioni nell’ordine. La selezione sceglie un ramo in base a una condizione.

Alla fine saprai:tradurre una domanda logica in una condizione e prevedere quale ramo verrà eseguito.
Promosso o non promosso
double voto;
cin >> voto;

if (voto >= 6) {
  cout << "Promosso";
} else {
  cout << "Non promosso";
}

Segui il programma

voto = 7.57.5 >= 6 è vero: viene eseguito soltanto il primo blocco.
voto = 5La condizione è falsa: il primo blocco viene saltato e si esegue else.

Il valore 6 è un caso limite: verifica sempre che produca “Promosso”.

Le condizioni possono usare && (AND), || (OR) e ! (NOT). Quando i casi sono più di due si possono concatenare blocchi else if.

&& — ANDvero soltanto se entrambe le condizioni sono vere
|| — ORvero se almeno una condizione è vera
! — NOTinverte vero e falso
else ifpermette di distinguere più di due casi
Positivo, negativo oppure zero
if (n > 0) {
  cout << "Positivo";
} else if (n < 0) {
  cout << "Negativo";
} else {
  cout << "Zero";
}

UNITÀ 06

Ripetere con while, do-while e for

Alla fine saprai:scegliere il ciclo adatto, riconoscere contatore e accumulatore e prevenire i cicli infiniti.
while

Controlla prima. Può eseguire zero volte.

do-while

Esegue prima. Almeno una volta.

for

Ideale quando conosci le ripetizioni.

Tabellina con for
int n;
cin >> n;

for (int i = 1; i <= 10; i++) {
  cout << n << " x " << i
       << " = " << n * i << endl;
}
Come leggere il for

i = 1 prepara il contatore; i <= 10 decide se continuare; i++ aumenta il contatore dopo ogni giro. Con n = 3, il primo giro stampa 3 × 1, il secondo 3 × 2 e l’ultimo 3 × 10.

Ogni ciclo deve avere un’inizializzazione, una condizione e un aggiornamento. Se la condizione non diventa mai falsa, si crea un ciclo infinito.

Metodo guidato per progettare un ciclo

  1. Che cosa si ripete?Individua le istruzioni da eseguire più volte.
  2. Quando deve fermarsi?Scrivi la condizione di continuazione prima del codice.
  3. Che cosa cambia?Aggiorna il contatore o il dato che rende falsa la condizione.
  4. Che cosa ricordi?Usa un accumulatore per una somma o un contatore per una quantità.
  5. Traccia tre giri.Annota i valori prima e dopo ogni iterazione.

Somma da 1 a 4

Partenzasomma = 0
i = 1 e i = 2somma diventa prima 1, poi 3.
i = 3 e i = 4somma diventa prima 6, poi 10.

Al valore i = 5 la condizione i <= 4 è falsa e il ciclo termina.

UNITÀ 07

Vettori e funzioni: il passo successivo

Un vettore raccoglie più valori dello stesso tipo; una funzione assegna un nome a un sottoproblema e può essere riutilizzata.

Alla fine saprai:scorrere una collezione senza uscire dai limiti e isolare un calcolo dentro una funzione riutilizzabile.
Media di un vettore
double media(const double voti[], int n) {
  double somma = 0;
  for (int i = 0; i < n; i++) {
    somma += voti[i];
  }
  return somma / n;
}

Esempio con voti = [6, 8, 7]

Indice 0somma = 0 + 6 = 6
Indice 1somma = 6 + 8 = 14
Indice 2somma = 14 + 7 = 21; quindi 21 / 3 = 7

Prima di dividere bisogna controllare che n > 0: non si può dividere per zero.

Gli indici partono da zero: in un vettore di 5 elementi gli indici validi vanno da 0 a 4. Accedere oltre il limite produce un comportamento non definito.

voti[0]primo elemento
voti[n - 1]ultimo elemento valido
i < ncondizione corretta per la scansione
returnrestituisce il risultato della funzione

UNITÀ 08

Come correggere un programma

Alla fine saprai:distinguere un errore di sintassi da un errore logico e cercarne la causa senza modificare tutto insieme.
Errore di sintassiil compilatore non riesce a tradurre il programma
Errore di esecuzioneil programma si interrompe durante il funzionamento
Errore logicoil programma termina ma il risultato è sbagliato
Dato limitecaso ai confini: 0, minimo o massimo ammesso
  • Leggi la prima riga dell’errore, non soltanto l’ultima.
  • Controlla parentesi graffe, tonde e punti e virgola.
  • Stampa temporaneamente le variabili per seguirne il valore.
  • Prova dati normali, valori limite, zero e numeri negativi.
  • Confronta la traccia reale con quella prevista.
  • Correggi un problema alla volta e ricompila.

UNITÀ 09

Esercizi in ordine di difficoltà

SequenzaLeggi base e altezza, calcola area e perimetro di un rettangolo.
Individua base e altezza come input. Calcola area = base × altezza e perimetro = 2 × (base + altezza), quindi mostra entrambi. Prova con base 5 e altezza 3: devi ottenere area 15 e perimetro 16.
SelezioneLeggi un numero e stabilisci se è positivo, negativo oppure zero.
Usa if (n > 0), else if (n < 0), else. Verifica almeno n = 4, n = −2 e n = 0: i tre dati devono attraversare tre rami diversi.
CicloLeggi N e calcola il fattoriale N! per N ≥ 0.
Parti da fattoriale = 1 e moltiplica per i da 1 a N. Per N = 4 la traccia produce 1, 2, 6, 24. Ricorda che 0! = 1 e rifiuta N negativi.
Ciclo + ifLeggi 10 numeri e conta quanti sono pari.
Inizializza contatore = 0. Ripeti 10 letture; se n % 2 == 0 incrementa il contatore. Prova includendo zero: è pari e deve essere contato.
VettoreLeggi 8 voti, calcola media, minimo e massimo.
Leggi gli 8 valori in un vettore. Inizializza somma a 0, ma minimo e massimo al primo voto; poi scorri gli altri elementi. Non inizializzare il massimo a 0: fallirebbe con dati tutti negativi.

UNITÀ 10

Programmazione imperativa: dare ordini e gestire lo stato

Nel paradigma imperativo il programma è una sequenza di comandi che modifica nel tempo lo stato della memoria. Una variabile rappresenta una porzione di quello stato: quando esegui somma = somma + voto, il vecchio valore viene letto, aggiornato e riscritto.

Alla fine saprai:descrivere come cambia lo stato di un programma, distinguere istruzioni e blocchi e progettare una soluzione strutturata senza salti disordinati.
Statoinsieme dei valori presenti nelle variabili in un preciso momento
Istruzionecomando che legge o modifica lo stato
Controlloordine con cui vengono eseguite le istruzioni
Bloccogruppo di istruzioni racchiuso tra parentesi graffe

Leggere il cambiamento di stato

Accumulo di tre valori
int somma = 0;
somma = somma + 4;
somma = somma + 7;
somma = somma + 2;
cout << somma;

Traccia della memoria

Iniziosomma = 0
Dopo +4il nuovo stato è somma = 4
Dopo +7 e +2lo stato passa a 11 e infine a 13

L’assegnazione non è un’uguaglianza matematica: il lato destro viene calcolato usando il valore attuale, poi il risultato sostituisce il contenuto della variabile.

Dallo “spaghetti code” alla programmazione strutturata

Un programma comprensibile combina soltanto sequenza, selezione e iterazione, organizzandole in blocchi. Ogni blocco dovrebbe svolgere un compito riconoscibile e avere un ingresso e un’uscita chiari.

  1. Definisci lo stato iniziale.Inizializza ogni variabile prima di usarla.
  2. Raggruppa le azioni.Metti nello stesso blocco le istruzioni che realizzano un unico compito.
  3. Limita le dipendenze.Evita che troppe parti del programma modifichino la stessa variabile.
  4. Controlla ogni percorso.Verifica sia il ramo vero sia quello falso e la terminazione dei cicli.

UNITÀ 11

Funzioni: scomporre, riutilizzare e verificare

Quando main cresce, leggere e correggere il programma diventa difficile. Una funzione assegna un nome a un sottoproblema: riceve dati attraverso i parametri, svolge un compito e, se previsto, restituisce un risultato.

Alla fine saprai:progettare il contratto di una funzione, distinguere parametri e argomenti, comprendere valore di ritorno e ambito locale.
Nomedescrive l’azione: calcolaMedia
Parametridati necessari per lavorare
Tipo restituitoforma del risultato, oppure void
Contrattoprecondizioni, risultato ed effetti
Una funzione con contratto chiaro
double areaRettangolo(double base, double altezza) {
  return base * altezza;
}

int main() {
  double area = areaRettangolo(5, 3);
  cout << area;  // 15
}
  1. Individua il sottoproblema.“Calcolare l’area” è un compito autonomo.
  2. Definisci gli ingressi.La funzione necessita di base e altezza.
  3. Definisci l’uscita.Restituisce un numero reale di tipo double.
  4. Evita compiti estranei.La funzione calcola; sarà main a leggere o stampare.
  5. Provala isolatamente.Controlla 5×3, 0×4 e valori decimali ammessi.

Parametri e argomenti

Nella definizionebase e altezza sono parametri: nomi locali usati dalla funzione.
Nella chiamata5 e 3 sono argomenti: valori concreti copiati nei parametri.
Dopo returnil valore 15 torna al punto della chiamata e viene assegnato ad area.

UNITÀ 12

Dati composti: dal gruppo di variabili a una struttura

Nome, cognome e media descrivono un unico studente, ma con variabili separate il loro legame esiste soltanto nella mente del programmatore. Una struct crea un nuovo tipo che raccoglie dati collegati.

Alla fine saprai:modellare un’entità semplice con una struttura, creare istanze e accedere ai campi con l’operatore punto.
Modellare uno studente
struct Studente {
  string nome;
  string cognome;
  double media;
};

Studente s;
s.nome = "Sara";
s.cognome = "Rossi";
s.media = 7.8;

Tipo e istanza non sono la stessa cosa

Studenteè il modello: stabilisce quali campi possiede ogni studente.
sè un’istanza concreta memorizzata nel programma.
s.mediaseleziona il campo media appartenente proprio all’istanza s.

Perché questo prepara agli oggetti

La struttura avvicina dati che appartengono allo stesso concetto. Il passo successivo consiste nell’avvicinare anche le operazioni valide su quei dati e nel proteggerli da modifiche scorrette: è il ruolo della classe.

ModellazioneProgetta una struct Libro con i dati essenziali.
Una possibile soluzione contiene titolo, autore, numeroPagine e disponibile. Prima di scegliere i campi chiediti quali operazioni dovrà svolgere il programma: per un prestito servono almeno identificazione e stato di disponibilità.

UNITÀ 13

Classi e oggetti: unire dati e comportamento

La programmazione a oggetti organizza il software intorno a entità che possiedono uno stato e offrono comportamenti. Una classe è il progetto; un oggetto è un’istanza concreta creata da quel progetto.

Alla fine saprai:progettare una classe semplice, proteggere lo stato con private, inizializzare un oggetto e invocarne i metodi.
Classedefinizione del tipo e delle sue regole
Oggettoistanza concreta con un proprio stato
Attributodato che descrive lo stato dell’oggetto
Metodooperazione che l’oggetto sa eseguire
Classe Conto: stato protetto
class Conto {
private:
  double saldo;

public:
  Conto(double saldoIniziale) {
    saldo = saldoIniziale >= 0 ? saldoIniziale : 0;
  }

  bool deposita(double importo) {
    if (importo <= 0) return false;
    saldo += importo;
    return true;
  }

  double leggiSaldo() const {
    return saldo;
  }
};

Come progettare una classe in 6 passaggi

  1. Trova l’entità.Nel problema esiste un “conto” con identità e durata nel tempo.
  2. Definisci lo stato.Il saldo descrive la situazione corrente.
  3. Proteggi gli invarianti.Il saldo non deve essere modificato direttamente dall’esterno.
  4. Definisci i comportamenti.Depositare e leggere il saldo sono operazioni offerte dalla classe.
  5. Costruisci oggetti validi.Il costruttore impedisce un saldo iniziale negativo.
  6. Prova le regole.Testa deposito positivo, zero e negativo.
Creare e usare un oggetto
Conto mioConto(100);
mioConto.deposita(25);
cout << mioConto.leggiSaldo();  // 125

Che cosa accade

CostruzionemioConto nasce con saldo 100.
MessaggioLa chiamata deposita(25) chiede all’oggetto di aggiornarsi secondo le proprie regole.
IncapsulamentoIl codice esterno non può assegnare direttamente un valore arbitrario a saldo.

UNITÀ 14

Relazioni tra oggetti, ereditarietà e polimorfismo

Nei programmi reali gli oggetti collaborano. Prima di usare l’ereditarietà bisogna scegliere la relazione corretta: “ha un” suggerisce composizione; “è un” può suggerire ereditarietà.

Alla fine saprai:distinguere composizione ed ereditarietà e comprendere perché un metodo virtuale permette comportamenti diversi attraverso un’interfaccia comune.
Composizioneun Corso ha un Docente
Ereditarietàun Docente è una Persona
Overridela classe derivata ridefinisce un comportamento
Polimorfismostessa chiamata, comportamento legato all’oggetto reale
Polimorfismo essenziale
class Forma {
public:
  virtual double area() const = 0;
  virtual ~Forma() = default;
};

class Rettangolo : public Forma {
  double base, altezza;
public:
  Rettangolo(double b, double h) : base(b), altezza(h) {}
  double area() const override { return base * altezza; }
};
Perché è utile?

Il resto del programma può chiedere area() a qualunque Forma senza conoscere in anticipo la formula specifica. L’oggetto concreto decide quale implementazione eseguire.

Verifica di competenza

ConfrontoQual è la differenza essenziale tra programmazione imperativa e a oggetti?
L’imperativa organizza soprattutto una sequenza di comandi che modifica lo stato. La OOP assegna stato e comportamenti a oggetti che collaborano. La OOP usa comunque istruzioni imperative dentro i metodi: non le sostituisce, le organizza.
ProgettazionePer una classe Studente, quali dati devono essere privati e quali metodi offriresti?
Dati come nome, voti e matricola dovrebbero essere protetti. Metodi possibili: aggiungiVoto con controllo 1–10, calcolaMedia, leggiNome. Le regole del dominio devono essere applicate dai metodi.
RelazioniAutomobile–Motore è ereditarietà o composizione?
Composizione: un’Automobile ha un Motore, ma non è un Motore. L’ereditarietà sarebbe semanticamente errata.

UNITÀ 15

Approfondimento verificato: logica, traccia e test

Una soluzione non è affidabile perché “sembra funzionare”: va controllata con una traccia e con casi di prova scelti intenzionalmente.

Tavola di verità degli operatori logici

ABA && BA || B
FFFF
FVFV
VFFV
VVVV

Tabella di traccia: somma da 1 a 3

isomma primasomma dopoi <= 3
101vero
213vero
336vero
466falso: fine

Matrice minima dei casi di prova

Caso normaleun valore comune previsto dalla consegna
Valori limiteminimo e massimo ammessi
Caso specialezero, negativi o insieme vuoto, se ammessi
Dato non validoverifica il controllo dell’input

Mappa del percorso

Capire → rappresentare → tradurre → provare → correggere.

Non imparare il codice a memoria: ricostruiscilo partendo dall’algoritmo. Il laboratorio in cima alla pagina mostra questo passaggio.

Torna al laboratorio

Bibliografia tecnica verificata

Ultimo controllo editoriale e tecnico: 8 settembre 2026.