Riepilogo
Questa lezione apre la quarta unità del corso, dedicata al controllo del flusso. Spiega a che cosa serve l’unità: insegnare a governare l’ordine in cui si eseguono le istruzioni di un programma, con decisioni e con cicli, e a ragionare sulla loro correttezza, cioè ad assicurare che ogni caso sia trattato, che ogni ciclo faccia ciò che deve e che termini; presenta le sue quattro lezioni e il filo che le unisce; ricorda ciò che l’unità dà per scontato, soprattutto le condizioni composte dell’unità 3; formula il problema che l’unità risolve, quello di un programma che calcola il massimo comune divisore con un numero fisso di passi e che, a seconda dei dati, risponde male o si ferma su una divisione per zero; anticipa l’invariante come lo strumento con cui l’unità giustificherà i suoi cicli; e mostra dove conduce, nelle unità successive e nel corso Programmazione in C++ II.
Obiettivi di apprendimento
- Descrivere la sequenza dei contenuti dell’unità e spiegare che cosa apporta ciascuna lezione alla successiva.
- Ricordare le condizioni composte dell’unità 3 (i connettivi, la valutazione a cortocircuito e la negazione mediante le leggi di De Morgan) e ripassarle se occorre.
- Anticipare, con un esempio, l’invariante come strumento di ragionamento: una relazione tra le variabili che una ripetizione conserva e che, al termine, dà il risultato.
- 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 quattro domande verificano ciò che l’unità dà per scontato: la negazione di una condizione composta, la valutazione a cortocircuito, la traccia di una ripetizione della lezione 1.1 e il limite di un int. Le sette successive toccano, nell’ordine delle lezioni, le idee centrali dell’unità, e varie di esse partono dalla matematica scolastica: il massimo comune divisore, la notazione di sommatoria, la terminazione di un procedimento. 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.
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.
Domanda 1Dalle unità precedentiQual è la negazione della condizione
1 <= n && n <= 10?Nega ciascuna parte, ma conserva la congiunzione: dimentica De Morgan. Inoltre, nessun numero è allo stesso tempo minore di 1 e maggiore di 10, sicché quella condizione è sempre falsa.Cambia bene il connettivo, ma nega male le relazioni: esclude di troppo i bordi 1 e 10, che soddisfano la condizione originale.Nega solo la prima parte.Per De Morgan, la negazione di una congiunzione è la disgiunzione delle negazioni, e la negazione di1 <= nèn < 1, nonn <= 1. L’unità ne ha bisogno in ogni decisione concatenata, perché il ramoelsetratta esattamente la negazione delle condizioni precedenti, e in ogni ciclo, perché all’uscita vale la negazione della sua condizione.Ripassare: Relazioni e logica
Domanda 2Dalle unità precedentiCon
int d{0};eint n{5};, che cosa succede valutandod != 0 && n / d > 2?Ignora il cortocircuito: la divisione non si calcola mai.Non c’è modo che una congiunzione con un operando falso sia vera.L’espressione è corretta; il compilatore non conosce il valore diddurante l’esecuzione.Il primo operando è falso, e la valutazione a cortocircuito non valuta il secondo: la guardia a sinistra protegge la divisione. L’unità trasforma questa guardia in decisioni esplicite e in condizioni di ciclo che proteggono il loro corpo.Ripassare: Relazioni e logica
Domanda 3Dalle unità precedentiLa divisione per sottrazioni successive della lezione 1.1 comincia con e , e ripete «finché , sottrarre da e sommare 1 a ». Con e , quante volte si esegue il corpo della ripetizione?
Conta le valutazioni della condizione, che sono una in più delle iterazioni.Ferma la ripetizione con : legge come .Confonde il numero di iterazioni con il valore iniziale di .La traccia dà : il corpo si esegue quattro volte, e la condizione si valuta cinque, perché l’ultima valutazione è quella che fallisce. La lezione 4.2 scrive questa ripetizione in C++ e trasforma la traccia in una tabella.Ripassare: Dal problema all’algoritmo
Domanda 4Dalle unità precedentiCon un
intdi 32 bit, che cosa garantisce lo standard sul valore di46341 * 46341?Ignora l’intervallo del tipo: quel numero non sta in unint.Crede che l’overflow si fermi al bordo; lo standard non promette nulla.Il tipo del risultato lo decidono gli operandi, che sonoint, non il valore del risultato.Il massimo è . L’unità incontra questo prodotto in un luogo dove non lo si cerca: la condizioned * d <= ndi un ciclo che prova divisori, che va in overflow proprio quando è vicino al massimo.Ripassare: Gli interi e la loro rappresentazione
Domanda 5Un programma contiene la catena di decisioni
if (score >= 50), che scrive «Superato»;else if (score >= 90), che scrive «Eccellente»; edelse, che scrive «Non superato». Che cosa scrive conscoreuguale a 95?Crede che vinca la condizione più esigente; vince la prima che si verifica.Crede che si eseguano tutti i rami veri; in una catena se ne esegue uno solo.È una risposta onesta: la lezione 4.1 lo spiega, e la valutazione d’uscita tornerà sui bordi di una catena.In una catena si esegue il primo ramo la cui condizione è vera, e . Il ramo «Eccellente» non si esegue mai: il suo caso reale è e , che è vuoto. La lezione 4.1 insegna a leggere il caso reale di ciascun ramo e a ordinare le condizioni.Ripassare: Decisioni
Domanda 6Quale delle espressioni seguenti denota la somma ?
Somma volte il numero , cioè : confonde il termine con il limite superiore.Somma : sposta i limiti e perde l’ultimo termine, l’errore di uno dei cicli.Il limite superiore non può essere l’indice stesso: l’espressione non ha significato.L’indice percorre gli interi da 1 a , e ogni termine è lo stesso . Un cicloforche accumula è la traduzione diretta di questa notazione: la variabile di controllo è l’indice, i suoi limiti sono quelli della sommatoria, e il corpo somma il termine.Ripassare: Cicli
Domanda 7Con
int total{0};, che cosa scrivestd::println("{}", total);dopofor (int i{0}; i < 5; ++i) { total += i; }?Crede cheiarrivi a 5: legge<come<=.Confonde l’accumulatore con il contatore: cinque è il numero di iterazioni, non la somma.È una risposta onesta: la lezione 4.2 insegna la forma delfore come contarne le iterazioni.La variabileiprende i valori 0, 1, 2, 3 e 4, e ; coniuguale a 5 la condizione fallisce e il corpo non si esegue. È la sommatoria della domanda precedente con i limiti 0 e 4.Ripassare: Cicli
Domanda 8Nella divisione per sottrazioni successive (, ; finché , passa a e a ), quale relazione tra le variabili vale ogni volta che si valuta la condizione?
Vale solo all’uscita: mentre si ripete, la condizione assicura il contrario.Vale solo al termine; prima, è minore del quoziente.È una risposta onesta: la lezione 4.3 insegna a trovare e a verificare questa relazione, e la valutazione d’uscita tornerà a chiederlo.Vale all’inizio, perché ; e se vale prima di un’iterazione, vale dopo, perché . All’uscita si aggiunge la negazione della condizione, , ed entrambe danno il risultato. Una relazione così si chiama invariante, e la lezione 4.3 ne fa il metodo per progettare cicli e giustificarli.Ripassare: Progettare cicli corretti
Domanda 9Un procedimento parte da un intero qualsiasi (positivo, nullo o negativo) e ripete «finché , sottrarre 2 da ». Termina per ogni ?
Questo accade con la condizione ; con , la ripetizione si ferma non appena vale 0 o .Con negativo la condizione è falsa fin dall’inizio, e il corpo non si esegue.La conclusione è corretta, ma la ragione no: essere intero non basta; occorre che la quantità sia naturale finché si ripete e che decresca.La quantità è un naturale finché si ripete (lo assicura la condizione) e decresce strettamente: è una variante, lo strumento della lezione 1.1 che la lezione 4.3 usa in ogni ciclo. Con «finché » la risposta cambierebbe: un dispari salta lo zero.Ripassare: Progettare cicli corretti
Domanda 10Qual è il massimo comune divisore di 84 e 36?
È un divisore comune, ma non il maggiore.È un divisore comune, ma non il maggiore: manca il fattore 3, che pure condividono.È il minimo comune multiplo, non il massimo comune divisore.I divisori comuni sono 1, 2, 3, 4, 6 e 12. L’algoritmo di Euclide lo ottiene senza cercare divisori: e , sicché . La lezione 4.4 lo scrive come ciclo e dimostra perché funziona.Ripassare: Algoritmi numerici
Domanda 11Per decidere se 101 è primo provando divisori, fino a quale divisore basta arrivare?
Usa la metà: è corretto, ma cinque volte più lungo del necessario.Prova tutti i candidati: è corretto, ma non sfrutta il fatto che i divisori vanno a coppie.È una risposta onesta: la lezione 4.4 lo dimostra.Se 101 avesse un divisore con , lo sarebbe anche , e uno dei due sarebbe al massimo . Basta provare da 2 a 10: nessuno divide 101, che è primo. La lezione 4.4 dimostra la regola e la scrive senza radici né prodotti che vadano in overflow.Ripassare: Algoritmi numerici
Caricamento del contenuto…