Vai al contenuto
Topos Uranos

Riepilogo

Questa lezione apre la quinta unità del corso, dedicata alle funzioni. Spiega a che cosa serve l’unità: insegnare a scomporre un problema in parti con un nome, ciascuna con un’interfaccia e un contratto, e a risolvere certi problemi riducendoli a un’istanza più piccola di sé stessi, per ricorsione; presenta le sue quattro lezioni e il filo che le unisce; ricorda ciò che l’unità dà per scontato, soprattutto i cicli e i loro invarianti dell’unità 4; formula il problema che l’unità risolve, quello di un programma che ripete lo stesso calcolo copiato e che, per una svista nella copia, risponde male senza che il compilatore dica nulla; anticipa il contratto (la precondizione e la postcondizione) come la forma con cui l’unità specificherà ogni parte; e mostra dove conduce, nelle unità successive e nel corso Programmazione in C++ II.

Obiettivi di apprendimento

  1. Descrivere la sequenza dei contenuti dell’unità e spiegare che cosa ogni lezione apporta alla successiva.
  2. Ricordare gli algoritmi dell’unità 4 (la traccia di un ciclo, il suo invariante e la sua variante) e ripassarli se occorre.
  3. Anticipare, con un esempio, l’idea di contratto: ciò che una parte del programma esige da chi la usa e ciò che gli garantisce in cambio.
  4. Riconoscere che cosa ci si aspetta di saper fare al termine dell’unità, e distinguerlo da ciò che si imparerà nelle unità successive.

Valutazione d’ingresso

Prima di percorrere l’unità conviene misurare il punto di partenza. Questa valutazione è un’autovalutazione: non ha voto, e il suo unico scopo è orientare lo studio. Le prime cinque domande verificano ciò che l’unità dà per scontato: la traccia di un ciclo, il suo invariante, la precondizione di una specifica, la copia di un valore nell’inizializzazione e la ricerca, dentro un programma dell’unità 4, di un calcolo con ingressi e uscite propri. Le cinque successive toccano, nell’ordine delle lezioni, le idee centrali dell’unità: lo stack delle chiamate, il passaggio di un argomento, la separazione tra il calcolo e la presentazione, la definizione ricorsiva del fattoriale e l’esecuzione di una funzione che chiama sé stessa. Nessuno è tenuto a indovinarle già, e in alcune di esse «non lo so ancora» è una risposta onesta: ogni risposta, giusta o no, spiega il punto e nomina la lezione che lo tratta. Le stesse abilità si misurano di nuovo alla fine, 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 scrive int n{305}; int c{1}; while (n >= 10) { n = n / 10; ++c; } std::println("{}", c);?

  2. Domanda 2Dalle unità precedentiNel ciclo int total{0}; int k{1}; while (k <= n) { total += k; ++k; }, con n≥0n \geq 0, quale relazione vale ogni volta che si valuta la condizione?

  3. Domanda 3Dalle unità precedentiLa specifica della divisione dice: «dati interi a≥0a \geq 0 e b>0b > 0, ottenere qq e rr con a=b⋅q+ra = b \cdot q + r e 0≤r<b0 \leq r < b». Qual è la sua precondizione?

  4. Domanda 4Dalle unità precedentiDopo int a{3}; int b{a}; b = 7;, quanto vale a?

  5. Domanda 5Dalle unità precedentiIl programma della lezione 4.4 che scrive i primi minori di 100 ha un ciclo che percorre i candidati e, al suo interno, un altro che prova i loro divisori. Quale parte è un calcolo con ingressi e uscite propri, che converrebbe nominare?

  6. Domanda 6Un programma comincia in main; main chiama una funzione g, e g chiama un’altra funzione h. Mentre h si esegue, quali chiamate sono in corso?

  7. Domanda 7Con la funzione int f(int x) { x = x + 1; return x; }, che cosa scrive int a{3}; int b{f(a)}; std::println("{} {}", a, b);?

  8. Domanda 8Un programma legge una data e deve scrivere il suo giorno della settimana. Quale scomposizione separa il calcolo dalla presentazione?

  9. Domanda 9Quale delle definizioni seguenti definisce n!n! per ogni naturale nn?

  10. Domanda 10Con int f(int n) { if (n == 0) { return 0; } return n + f(n - 1); }, che cosa scrive std::println("{}", f(3));?