Riepilogo
Questa lezione apre la seconda unità del corso, dedicata ai dati e ai loro tipi. Spiega a che cosa serve l’unità: insegnare che ogni dato di un programma vive nella memoria con un tipo che stabilisce quali valori può assumere, quanto spazio occupa e quali operazioni ammette, e che questi limiti hanno conseguenze osservabili; presenta le sue quattro lezioni e il filo che le unisce, dalla variabile come cella con un nome e un valore fino alle conversioni tra tipi e alle costanti; ricorda ciò che l’unità dà per scontato della prima, cioè scrivere, compilare ed eseguire un programma che legge e scrive; formula il problema che l’unità risolve, quello di un programma corretto in apparenza i cui calcoli non coincidono con quelli della matematica, a cominciare dalla somma , che in un computer non dà esattamente ; 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 ciascuna lezione apporta alla successiva.
- Richiamare il necessario dell’unità 1 (il ciclo di compilare ed eseguire, l’output formattato, la lettura con
std::cine la lettura dei messaggi del compilatore) e ripassarlo se occorre. - Spiegare, con un esempio, perché un numero di un programma non è un numero della matematica, e anticipare perché non è esattamente in un computer.
- Riconoscere che cosa ci si aspetta di saper fare alla fine 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 della prima: seguire un procedimento passo per passo, scrivere un numero con due decimali, arrotondare e leggere un messaggio di errore. Le sei successive toccano, nell’ordine delle lezioni, le idee centrali dell’unità. Nessuno è tenuto a indovinarle già, e in una 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à precedentiUn procedimento dice: «1. assume il valore 17. 2. assume il valore . 3. assume il valore ». Quanto vale alla fine?
Suppone che ogni passo parta dal valore iniziale; il secondo parte dal valore lasciato dal primo.Legge «assume il valore» come un’uguaglianza matematica; è un ordine che sostituisce il valore di .Confonde una variabile con una costante: il valore di una variabile cambia ogni volta che le se ne assegna un altro.Ogni passo parte dal valore che ha in quel momento, non da quello iniziale. Seguire il procedimento a mano, con il valore di ogni variabile dopo ogni passo, è la tabella di traccia dell’unità 1, e la lezione 2.1 ne fa lo strumento per ragionare sullo stato di un programma.Ripassare: Dal problema all’algoritmo
Domanda 2Dalle unità precedentiChe cosa scrive l’istruzione
std::println("{:.2f}", 2.0 / 3);?Crede che la specifica di formato tronchi; arrotonda al decimale più vicino.Ignora la specifica di formato: quella è la scrittura senza.2f.Crede che la divisione sia intera; con2.0, che ha decimali, la divisione è reale.La specifica.2fscrive il numero con due decimali, arrotondando: si scrive0.67. Il valore conservato non cambia; cambia solo la sua scrittura.Ripassare: Input, output ed errori
Domanda 3Dalle unità precedentiSi vuole scrivere con due decimali, arrotondando. Che cosa si ottiene?
Tronca invece di arrotondare: scarta la terza cifra senza guardarla.Arrotonda a un decimale, non a due.Aumenta la seconda cifra decimale più del dovuto: sta tra e , e l’arrotondamento sceglie uno di questi due.Arrotondare a due decimali significa scegliere il numero con due decimali più vicino: è più vicino a che a . La lezione 2.3 mostrerà che il computer arrotonda allo stesso modo, ma in base 2, e che per questo quasi nessun numero con decimali si conserva esattamente.Ripassare: Input, output ed errori
Domanda 4Dalle unità precedentiUn programma ha alla riga 5
const int pages{12}e alla riga 6std::println("{}", pages);. Il compilatore scrive6:5: error: expected ',' or ';' before 'std'. Dov’è il difetto?La riga 6 è corretta; il compilatore la segnala perché è lì che si è accorto della mancanza.stdviene riconosciuto; il messaggio dice che si aspettava un punto e virgola prima di esso.Il messaggio diceerror, nonwarning: non c’è eseguibile.Il compilatore scopre la mancanza quando trova qualcosa che non può seguire la dichiarazione, all’inizio della riga 6, e segnala quel punto. Se la riga segnalata è corretta, il difetto di solito sta alla fine della precedente.Ripassare: Anatomia di un programma
Domanda 5Un programma dichiara
int a{2};eint b{7};, e poi eseguea = b;eb = 10;. Quanto valeaalla fine?Crede che l’assegnamento leghi le due variabili, come seafosse un altro nome dib; copia soltanto il valore.Leggea = bal contrario, come se copiasseainb; il valore va da destra a sinistra.Somma i due valori; l’assegnamento sostituisce, non accumula.L’assegnamentoa = bcopia inail valore chebha in quel momento; dopo,aebsono celle indipendenti, e cambiarebnon cambiaa.Ripassare: Variabili e memoria
Domanda 6Come si scrive il numero 13 in base 2?
È una risposta onesta: la lezione 2.2 insegna a scrivere un numero in base 2 e a leggerlo, e la valutazione d’uscita tornerà a chiederlo.Legge i resti delle divisioni successive nell’ordine in cui compaiono; si leggono dall’ultimo al primo.Somma male i pesi: .In base 2 ogni posizione pesa il doppio di quella alla sua destra, e le cifre sono soltanto 0 e 1. La lezione 2.2 lo insegna, perché ogni intero di un programma si conserva così.Ripassare: Gli interi e la loro rappresentazione
Domanda 7Un
intdi 4 byte contiene , il suo valore massimo, e il programma gli somma 1. Che cosa si può affermare?Ignora il limite della rappresentazione: quel numero non sta in unintdi 4 byte.Così si comportano gli interi senza segno, la cui aritmetica è modulare; per gli interi con segno, lo standard non lo garantisce.Il compilatore non conosce i valori che il programma avrà durante l’esecuzione, salvo che siano costanti; quasi sempre compila senza dire nulla.Un intero di un programma ha un numero fisso di bit e, con essi, un intervallo finito. Uscire dall’intervallo di un intero con segno viola la precondizione della somma; il sanitizer del corso ferma il programma, e senza di esso il programma può scrivere qualsiasi cosa. La lezione 2.2 lo studia.Ripassare: Gli interi e la loro rappresentazione
Domanda 8 ha uno sviluppo decimale finito?
è un’approssimazione: , non 1.Per quanti se ne scrivano, avanza sempre un resto; lo sviluppo è periodico, non finito.È una proprietà del numero e della base, non dello strumento; la calcolatrice mostra soltanto un’approssimazione.Una frazione irriducibile ha uno sviluppo decimale finito se e solo se il suo denominatore non ha fattori primi diversi da 2 e 5, quelli della base 10. In base 2 la condizione è più esigente: il denominatore deve essere una potenza di 2, e per questo non ha uno sviluppo binario finito. La lezione 2.3 ne trae le conseguenze.Ripassare: I numeri in virgola mobile
Domanda 9Che cosa scrive
std::println("{}", 0.1 + 0.2);?Suppone che il computer sommi decimali esatti; somma approssimazioni binarie.Confonde la scrittura predefinita con la specifica{:.2f}, che arrotonda a due decimali.La somma di duedoubleè legittima; ciò che sorprende è il suo risultato, non la sua scrittura.Né né si conservano esattamente in binario, e la somma delle loro approssimazioni non è l’approssimazione di .std::printlnscrive la rappresentazione decimale più corta che identifica il valore conservato, e quella rappresentazione rivela la differenza. La lezione 2.3 spiega cifra per cifra da dove viene.Ripassare: I numeri in virgola mobile
Domanda 10Un programma dichiara
const double ratio{7 / 2};e scriveratio. Che cosa compare?Crede che il tipo della variabile decida come si divide; lo decide il tipo degli operandi.Crede che la divisione intera arrotondi; scarta la parte decimale.Il valore 3 è costante e si rappresenta esattamente in undouble: non c’è perdita, e le graffe lo ammettono.La divisione7 / 2è tra interi, e dà il quoziente intero, 3; solo dopo quel 3 viene convertito indouble. Quale divisione si esegue si decide dentro l’operazione, secondo il tipo degli operandi, e non quando si conserva il risultato. La lezione 2.4 insegna dove mettere la conversione per ottenere 3.5.Ripassare: Caratteri, booleani, conversioni e costanti
Caricamento del contenuto…