Vai al contenuto
Topos Uranos

Riepilogo

Questa lezione apre l’ottava e ultima unità del corso, dedicata ai programmi più grandi. Ne spiega lo scopo: organizzare, verificare e fare il debug di programmi che non stanno più in un file né nella testa; presenta le sue tre lezioni e il filo che le unisce, che chiude il cerchio aperto nella prima lezione del corso (specificare, costruire, verificare); ricorda ciò che l’unità dà per scontato, cioè il corso intero; formula il problema che l’unità risolve, quello di un programma di un solo file che funziona con i dati con cui è stato testato e tace un difetto al bordo della sua specifica; anticipa la differenza tra testare e dimostrare; e mostra dove conduce, nel progetto finale e in Programmazione in C++ II.

Obiettivi di apprendimento

  1. Descrivere la sequenza dei contenuti dell’unità e spiegare che cosa ciascuna lezione apporta alla successiva.
  2. Ricordare, con un esempio, la differenza tra dichiarare e definire una funzione, il contratto che la specifica e le fasi (compilazione e collegamento) che trasformano più file in un programma.
  3. Anticipare, con un esempio, la differenza tra testare un programma con alcuni casi e dimostrare che è corretto per tutti quelli ammissibili.
  4. Riconoscere che cosa ci si aspetta di saper fare alla fine dell’unità e del corso, e distinguerlo da ciò che si imparerà in Programmazione in C++ II.

Valutazione d’ingresso

Prima di percorrere l’unità conviene misurare il punto di partenza. Questa valutazione non ha voto: orienta lo studio. Le prime sette domande verificano ciò che l’unità dà per scontato (dichiarare e definire, la precondizione, il contratto di una funzione dell’unità 6, i messaggi del linker, i casi di una ricerca binaria, la tabella di traccia e la lettura fuori da un vettore); le tre successive toccano, nell’ordine delle lezioni, le idee centrali dell’unità, e in esse «non lo so ancora» è una risposta onesta. Ogni risposta spiega il punto e nomina la lezione che lo tratta; le stesse abilità si misurano di nuovo nella lezione di sintesi.

Valutazione d’ingresso

Prima di iniziare l’unità, misura il tuo punto di partenza. È un’autovalutazione breve: non riceve voto e il risultato resta solo nel tuo browser.

  1. Domanda 1Dalle unità precedentiChe cosa fa la riga int gcd(int a, int b); scritta prima di main?

  2. Domanda 2Dalle unità precedentiLa funzione toBase(n, base) ha la precondizione «n >= 0 e 2 <= base <= 10». Chi deve garantirla?

  3. Domanda 3Dalle unità precedentiLa funzione binarySearch(values, target) della lezione 6.4 restituisce una posizione di target, o values.size() se non c’è. Qual è la sua precondizione?

  4. Domanda 4Dalle unità precedentiUn programma compila senza errori e, nel costruire l’eseguibile, compare undefined reference to `tetrahedral(int)'. Quale fase è fallita?

  5. Domanda 5Dalle unità precedentiQuale di questi insiemi di casi mette meglio alla prova una ricerca binaria?

  6. Domanda 6Dalle unità precedentiQuanto valgono a e b dopo int a{0}; int b{1}; for (int i{0}; i < 4; ++i) { const int t{a + b}; a = b; b = t; }?

  7. Domanda 7Dalle unità precedentiPerché std::vector<int> v{1, 2}; std::println("{}", v[2]); si ferma con le opzioni del corso e, compilato solo con -O2, senza i sanitizer, può scrivere un numero qualsiasi?

  8. Domanda 8Un header con guardie di inclusione definisce (non solo dichiara) double scale(double x), senza inline, e lo includono main.cpp e report.cpp. Che cosa succede nel costruire il programma?

  9. Domanda 9Una funzione supera cinquecento test automatici scelti con cura. Che cosa si può affermare?

  10. Domanda 10Un punto di interruzione si trova sulla riga total += k;, dentro un ciclo, e il programma vi si ferma per la terza volta. Che cosa indica la riga evidenziata?