Vai al contenuto
Topos Uranos

Riepilogo

Un programma trasforma input in output, e questa lezione studia i due estremi di tale trasformazione e ciò che può andare storto fra l’uno e l’altro. Insegna a scrivere con std::print e std::println, con segnaposto e specifiche di formato che fissano la larghezza, l’allineamento e i decimali; a leggere numeri con std::cin; a prevedere che cosa accade quando l’utente digita qualcosa di diverso da quanto richiesto, cosa che, con un sistema di input come quello di C++, non produce un avviso, ma uno stream in stato di errore e una variabile con uno zero; e a classificare gli errori di un programma in quattro tipi, secondo il momento in cui si manifestano: di compilazione, di collegamento, di esecuzione e di logica. Termina con la lettura metodica dei messaggi del compilatore.

Obiettivi di apprendimento

  1. Scrivere programmi che leggano dati con std::cin e scrivano risultati con std::println, usando specifiche di formato per la larghezza e i decimali.
  2. Prevedere l’output esatto di un programma con varie chiamate a std::print e std::println, a capo inclusi.
  3. Descrivere che cosa accade quando l’input non ha la forma attesa (lettere invece di un numero) e controllare lo stato della lettura.
  4. Classificare un errore come di compilazione, di collegamento, di esecuzione o di logica, e localizzarlo a partire dalla sua manifestazione.

Il programma e il suo confine

Nella lezione Dal problema all’algoritmo ogni problema è stato specificato in base a ciò che entra e a ciò che esce. Un programma realizza questa specifica: riceve dati, li trasforma e consegna risultati. Ora, i dati non nascono dentro il programma, ma fuori di esso, sulla tastiera di chi lo usa, in un file o in un altro programma; e nemmeno i risultati restano dentro, ma vanno a uno schermo, a un file o a un altro programma. La comunicazione con questo esterno avviene attraverso due canali che il sistema operativo apre per ogni programma al momento di avviarlo: lo standard input, che in un terminale è ciò che si digita sulla tastiera, e lo standard output, che è ciò che il terminale mostra. C++ li rappresenta come stream: sequenze di caratteri che si consumano o si producono in ordine, uno dopo l’altro.

I due estremi non sono simmetrici. L’output lo decide il programma, e perciò può essere scritto con esattezza: ogni carattere che compare sullo schermo è quello che il programma ha fatto scrivere. L’input, invece, lo decide un altro: il programma chiede un numero, ma chi sta davanti alla tastiera può digitare una parola, un numero con la virgola decimale, un numero troppo grande o niente. Se le cose stanno così, l’input è un confine non affidabile, e ogni programma che legge dati deve prevedere che cosa farà quando ciò che riceve non ha la forma attesa. Questa lezione insegna prima a scrivere, poi a leggere, poi che cosa accade quando la lettura fallisce, e infine a riconoscere gli errori, quelli del programma e non quelli dell’utente, secondo il momento in cui si manifestano.