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.
Laboratorio interattivo
Dal procedimento al codice.
Scegli un problema, modifica i dati e osserva lo stesso algoritmo come pseudocodice, C++ e traccia di esecuzione.
Media di tre voti
Sequenza: acquisisci tre voti, calcola la media e visualizzala.
- 1Leggo a = 7, b = 8, c = 9
- 2Somma: 7 + 8 + 9 = 24
- 3Divisione: 24 / 3 = 8.00
LEGGI a, b, c media ← (a + b + c) / 3 SCRIVI media
double a, b, c; cin >> a >> b >> c; double media = (a + b + c) / 3; cout << media;
12 quesiti con correzione motivata
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.
Metodo guidato: dalla consegna alla soluzione
- Sottolinea i dati forniti.“Leggi tre voti”: i tre voti sono gli input.
- Cerchia il risultato richiesto.“Calcola la media”: la media è l’output.
- Scrivi la formula a parole.Somma i voti e dividi il totale per il loro numero.
- Scegli nomi chiari.
voto1,voto2,voto3,media. - 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.
INIZIO
LEGGI base, altezza
area ← base × altezza
SCRIVI area
FINELo pseudocodice non è un linguaggio eseguibile: serve a concentrarsi sulla logica. Nomi chiari e indentazione rendono visibile la struttura.
Traccia dell’algoritmo
area ← 5 × 3, quindi area diventa 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.
I tre mattoni di qualunque algoritmo
Le istruzioni vengono eseguite una dopo l’altra. Esempio: leggi base, leggi altezza, calcola area, mostra area.
A → B → CL’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 ...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
- Comprendi la consegna.Riscrivila con parole tue senza usare termini di programmazione.
- Definisci il dominio.Quali valori sono ammessi? Sono possibili zero, numeri negativi o dati mancanti?
- Individua input e output.Elenca separatamente ciò che conosci e ciò che devi ottenere.
- Scomponi il problema.Dividi la soluzione in piccoli sottoproblemi: leggere, controllare, calcolare, mostrare.
- Scegli le strutture.Usa sequenza, selezione o iterazione in base al comportamento richiesto.
- Scrivi lo pseudocodice.Una sola azione per riga, verbi precisi, nomi significativi e blocchi indentati.
- 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”.
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
FINEVerifica prima di programmare
Le tre prove controllano il ramo vero, il confine e un input non valido.
Dalla soluzione semplice a quella più complessa
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
FINEHai 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?
Caso limitePerché bisogna controllare N prima di calcolare la media?
SceltaQuale struttura serve per stabilire se un numero è pari?
ProgettazioneScrivi input, output e sottoproblemi per trovare il maggiore fra tre numeri.
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.
if.Come si costruisce: metodo in 5 passaggi
- Scrivi l’obiettivo.Stabilire se un numero è positivo.
- Trova l’input.Serve un numero, che chiameremo
n. - Formula la domanda.La condizione da verificare è
n > 0? - Prepara i due risultati.Se SÌ scrivi “positivo”; se NO scrivi “non positivo”.
- Collega e controlla.Ogni ramo deve arrivare a FINE e nessuna freccia deve restare sospesa.
Esempio svolto: verificare se un numero è positivo
Leggiamolo con due dati di prova
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++
#include <iostream>
using namespace std;
int main() {
cout << "Ciao, mondo!" << endl;
return 0;
}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
coutscrive sullo schermo
cinlegge dalla tastiera
Variabili e tipi principali
int eta = 16;double media = 7.5;char sezione = 'A';bool promosso = true;string nome = "Sara";Costruiamo un programma completo
#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;
}- Dichiara.Le tre variabili sono
doubleperché possono contenere decimali. - Leggi.
cininserisce i due valori digitati nelle variabili. - Calcola.L’espressione a destra viene calcolata e assegnata ad
area. - Mostra.
coutunisce il testo al valore ottenuto. - 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.
double voto;
cin >> voto;
if (voto >= 6) {
cout << "Promosso";
} else {
cout << "Non promosso";
}Segui il programma
7.5 >= 6 è vero: viene eseguito soltanto il primo blocco.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.
if (n > 0) {
cout << "Positivo";
} else if (n < 0) {
cout << "Negativo";
} else {
cout << "Zero";
}UNITÀ 06
Ripetere con while, do-while e for
Controlla prima. Può eseguire zero volte.
Esegue prima. Almeno una volta.
Ideale quando conosci le ripetizioni.
int n;
cin >> n;
for (int i = 1; i <= 10; i++) {
cout << n << " x " << i
<< " = " << n * i << endl;
}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
- Che cosa si ripete?Individua le istruzioni da eseguire più volte.
- Quando deve fermarsi?Scrivi la condizione di continuazione prima del codice.
- Che cosa cambia?Aggiorna il contatore o il dato che rende falsa la condizione.
- Che cosa ricordi?Usa un accumulatore per una somma o un contatore per una quantità.
- Traccia tre giri.Annota i valori prima e dopo ogni iterazione.
Somma da 1 a 4
somma = 0Al 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.
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]
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.
UNITÀ 08
Come correggere un programma
- 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.
SelezioneLeggi un numero e stabilisci se è positivo, negativo oppure zero.
CicloLeggi N e calcola il fattoriale N! per N ≥ 0.
Ciclo + ifLeggi 10 numeri e conta quanti sono pari.
VettoreLeggi 8 voti, calcola media, minimo e massimo.
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.
Leggere il cambiamento di stato
int somma = 0;
somma = somma + 4;
somma = somma + 7;
somma = somma + 2;
cout << somma;Traccia della memoria
somma = 0somma = 4L’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.
- Definisci lo stato iniziale.Inizializza ogni variabile prima di usarla.
- Raggruppa le azioni.Metti nello stesso blocco le istruzioni che realizzano un unico compito.
- Limita le dipendenze.Evita che troppe parti del programma modifichino la stessa variabile.
- 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.
calcolaMediavoiddouble areaRettangolo(double base, double altezza) {
return base * altezza;
}
int main() {
double area = areaRettangolo(5, 3);
cout << area; // 15
}- Individua il sottoproblema.“Calcolare l’area” è un compito autonomo.
- Definisci gli ingressi.La funzione necessita di base e altezza.
- Definisci l’uscita.Restituisce un numero reale di tipo
double. - Evita compiti estranei.La funzione calcola; sarà
maina leggere o stampare. - Provala isolatamente.Controlla 5×3, 0×4 e valori decimali ammessi.
Parametri e argomenti
base e altezza sono parametri: nomi locali usati dalla funzione.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.
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
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.
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.
private, inizializzare un oggetto e invocarne i metodi.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
- Trova l’entità.Nel problema esiste un “conto” con identità e durata nel tempo.
- Definisci lo stato.Il saldo descrive la situazione corrente.
- Proteggi gli invarianti.Il saldo non deve essere modificato direttamente dall’esterno.
- Definisci i comportamenti.Depositare e leggere il saldo sono operazioni offerte dalla classe.
- Costruisci oggetti validi.Il costruttore impedisce un saldo iniziale negativo.
- Prova le regole.Testa deposito positivo, zero e negativo.
Conto mioConto(100);
mioConto.deposita(25);
cout << mioConto.leggiSaldo(); // 125Che cosa accade
mioConto nasce con saldo 100.deposita(25) chiede all’oggetto di aggiornarsi secondo le proprie regole.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à.
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; }
};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?
ProgettazionePer una classe Studente, quali dati devono essere privati e quali metodi offriresti?
RelazioniAutomobile–Motore è ereditarietà o composizione?
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
Tabella di traccia: somma da 1 a 3
Matrice minima dei casi di prova
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 laboratorioBibliografia tecnica verificata
- NIST CSRC Glossary — Algorithm: definizione istituzionale.
- NISTIR 8318 — Dictionary of Algorithms and Data Structures: terminologia algoritmica e strutture dati.
- ISO 5807:1985: simboli e convenzioni dei diagrammi di flusso; standard confermato nel 2019.
- Standard C++ Foundation — Get Started: strumenti e riferimenti ufficiali della comunità ISO C++.
- cppreference — Statements: blocchi, selezione, iterazione e salti.
Ultimo controllo editoriale e tecnico: 8 settembre 2026.
