Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
(MCD)
HOMEWORK
Scrivere un programma che stampa la tabella pitagorica. Modificarlo per stampare solo la parte triangolare
alta, solo la parte triangolare bassa, oppure solo la diagonale 14
FOR
For(init_instr; expression; loop_instr)
Statement
SINTASSI
È un costrutto iterativo equivalente al while
− for è una keyword
− init_instr istruzione di inizializzazione
− expression espressione booleana
− loop_instr istruzione di loop
− statetment corpo del ciclo
ESECUZIONE
1. esegue init_instr
2. valuta expression
3. se vera, esegue statement, se falsa, termina il loop
4. al termine di statement esegue loop_instr
5. valuta expression 15
BREAK E CONTINUE (DA NON USARE ALL’ESAME)
Break
- termina l’esecuzione dei costrutti iterativi while, do-while, for e switch
Continue
- in un costrutto iterativo passa all’iterazione seguente interrompendo quella corrente
- può essere utilizzato solo nei cicli iterativi
ALTERNATIVE A BREAK E CONTINUE
- alternativa a break: utilizzo con variabili flag (o sentinella) per terminare anticipatamente
l’esecuzione del ciclo
- alternativa a continue: una variabile che assume un valore 0/1 a seconda che si verifichino o meno
alcune condizioni durante l’esecuzione 16
PRECISAZIONI
NOTA SUGLI IDENTIFICATORI
- Sono unici: non è possibile associare due identificatori diversi alla stessa variabile o lo stesso identificatore a
due variabili diverse
- In un programma, ogni riferimento alla variabile a rimanda alla stessa cella di memoria e non esistono altri
identificatori per quella cella
- Non si possono usare alcune espressioni come identificatori perché fanno riferimento a parole riservate, le
keywords tra cui:
• if, for, switch, while, main, printf, scanf, int, float, etc.
NOTA SULLA DICHIARAZIONE DI V ARIABILI
- Solo le variabili dichiarate possono essere utilizzate
- Il fatto che sia richiesta la dichiarazione delle variabili permette gli editor di riconoscere eventuali typos
- Ogni sequenza di caratteri in un codice di un programma C può essere:
• Un nome di variabile
• Un nome di funzione
• Una keyword
- Se provate ad usare una variabile a senza averla dichiarata, il compilatore risponde:
‘a’ undeclared (first use in this function)
- →Es.
Sintassi per la dichiarazione: nometipo nomevariabile; Int N;
- Le celle di memoria non sono «vuote», ma tipicamente contengono valori non sensati
- La dichiarazione non modifica tali valori iniziali, sarà il primo assegnamento a farlo
COSTANTI
- Dichiarando una costante viene associato stabilmente un valore ad un identificatore
→Es. const float PiGreco = 3.14;
- La differenza dalle variabili non costanti è che il compilatore segnala come errore ogni istruzione di
assegnamento a una costante nella parte eseguibile
- Usare le costanti è utile perché:
• l’identificatore suggerisce il significato di un valore
• permette di parametrizzare i programmi, e riutilizzare il codice al cambiare di circostanze esterne
ABBREVIAZIONI NELL’ASSEGNAMENTO
- Istruzioni della forma: variabile = variabile operatore espressione si possono scrivere come: variabile
operatore = espressione
→ ⟹
ES: b = b + 7; b += 7;
- Incrementare o decrementare una variabile di 1 è molto frequente, quindi c’è una notazione apposita
→ES: ⟹ ⟹
a = a + 1; a++; oppure b = b – 1; b--;
CARATTERI DI CONVERSIONE
- Nella stringaControllo di printf è possibile specificare la formattazione quando viene stampato un valore di
una variabile
→ES: "%5d" dedica 5 caratteri alla stampa del numero intero
→ES: "%.2f" dedica due cifre dopo la virgola per un float 17
COSTRUTTO SWITCH-CASE
SINTASSI
- switch, case, default keywords
- int_expr espressione a valori integral (char o int)
- constant-expr1 numero o carattere
- default istruzione opzionale
NB: constant-expr1 non può contenere una variabile
NB: int_expr può contenere variabili
NB: a differenza di if, while e for:
- int_expr non è un espressione booleana
- Non occorre delimitare gli statement tra {}, anche nel caso contengano più istruzioni
ESECUZIONE
1. Viene valutata int_expr (eventualmente convertita)
2. Si controlla se int_expr è uguale a constant-expr1
3. Se sono uguali eseguo statement1, e in cascata, tutti gli statement dei case seguenti (senza verifiche, incluso lo
statement di default)
4. Altrimenti controllo se expression è uguale a constant-expr2 e così via
5. Eseguo lo statement di default [se presente]
CHE COSA FA?
COME ESEGUIRE UN SOLO CASE
- Per evitare l’esecuzione in cascata alla prima corrispondenza trovata, occorre inserire nei differenti casi la
keyword break 18
ESERCIZIO
Scrivere un programma che opera come una calcolatrice: richiede due operandi ed un operatore + - * / % e restituisce
il risultato a schermo 19
GLI ERRORI COMUNI
GLI ERRORI POSSONO ESSERE DI DUE TIPI:
- Errori di sintassi rilevabili a compile-time
- Errori logici rilevabili a un-time
Gli errori rilevabili compile-time contengono istruzioni che il compilatore non è in grado di risolvere per questo manda
dei segnali di errore. Gli errori a run-time si manifestano durante l'esecuzione e possono causare l'interruzione del
programma o comportamenti inaspettati
Errori frequenti a compile-time
- →
Dimenticare un ; manda l'errore alla riga seguente error: expected ';' before ‘printf’
- →
Variabile non inizializzata error: ‘iniz_nome' undeclared (first use in this function)
- →
Typo? error: ‘prinf' undeclared (first use in this function)
Errori frequenti a run-time
- Dimenticare & nelle variabili della scanf
- Il compilatore non lo rileva! Errore rilevabile a run-time quando il valore viene scritto in una cella con
indirizzo sbagliato
- Confondere l'assegnamento con il confronto
- Sbagliare lo specificatore di formato in una scanf o printf
- Stampare l'indirizzo invece della variabile
- L'istruzione i++ corrisponde all'assegnamento i=i+1 quindi non ha senso i=i++
- Il ; termina un'istruzione e quindi non va messo dopo if, while, for e switch
Acquisizione di caratteri da tastiera
- Le acquisizioni di carattere consecutivi danno problemi, in particolare dopo uno scanf l'invio di conferma
rimane nel buffer di ingresso e viene acquisito dal primo scanf che segue
Soluzioni da mettere dopo il primo scanf:
1) fflush(stdin); pulisce il buffer stdin
2) scanf(“%c”); acquisisce un secondo carattere che viene buttato via
Confronto e assegnamento
- L'operatore di confronto == non va confuso con l'operatore di assegnamento = anche se le loro sintassi sono
simili
Cose da non fare
- Modificare la variabile di loop nel for a mano. La variabile del ciclo for deve essere modificata unicamente
dalla init_instr e dalla loop_instr, altrimenti il codice diventa dei difficile interpretazione ed è facile
commettere errori (piuttosto usare while) 20
TIPI DI DATO
Classificazione sulla base della struttura:
- Tipi semplici, informazione logicamente indivisibile, ad esempio int, char, float
- Tipi strutturati: aggregazione di variabili di tipi semplici
Classificazione sulla base di uno standard:
- built-in, tipi già presenti nel linguaggio base
- User-defined, nuovi tipi creati nei programmi «componendo» variabili di tipo built-in
TIPI SEMPLICI
- char: 1 Byte Qualificatori di tipo (per int e char): Quantificatori di tipo:
- int: 1 parola di memoria - -
signed (codifica con il segno) short (per int)
- float: (spesso 4 Byte) -
- long (per int e double)
unsigned prevede solo valori
- double: (il doppio del float) positivi (meglio evitarlo)
IL TIPO INT
- ℕ
Rappresentano un sottoinsieme di
- Fatti garantiti:
• spazio (short int) spazio (int) spazio (long int)
• spazio (signed int) = spazio (unsigned int)
- Come faccio a sapere i limiti per un intero?
• #include , e richiamo le costanti INT_MIN, INT_MAX (Quando il valore di int eccede INT_MAX si ha overflow)
I TIPI FLOAT E DOUBLE
- ℝ
Approssimazione di (che è un insieme denso), quindi i valori vengono approssimati per «magnitudine», e
limiti nella precisione della rappresentazione
-
Nella rappresentazione in virgola mobile (floating point) il numero si scrive come due parti separate da “E”:
∗
• mantissa, • esponente (rispetto alla base 10) tali che = 10^e
- Fatto garantito: spazio (float ) spazio (double) spazio (long double)
- Su architetture standard un float occupa 4 byte e un double 8 byte con
• accuratezza: 6 decimali per float 15 decimali per double
• valori tra 10–38 e 10+38 per float tra 10–308 e 10+308 per double
- Standard library math.h fornisce funzioni predefinite (sqrt, pow, exp, sin, cos, tan) applicate a valori double
- Operazioni con float ( ) sono le stesse degli int, ma divisione ‘/’ dà risultato reale.
anche a double e long double
Nella rappresentazione di un numero decimale possono esserci errori di approssimazione:
• non sempre: (x / y) * y == x
• per verificare l’uguaglianza tra float o double, definire delle tolleranze:
− if (x == y) ... è meglio
− if (x <= y + .000001 && x >= y - .000001) 21
IL TIPO CHAR
- La codifica ASCII prevede di allocare sempre 1 Byte per rappresentare caratteri
• alfanumerici
• di controllo (istruzioni legate alla visualizzazione)
- C’è una corrispondenza tra i char e 256 numeri interi
- Le operazioni sui char sono le stesse definite su int
• hanno senso gli op. aritmetici (+ - * / %)
• hanno senso gli op. di relazione (== , > , < , etc.)
- unsigned char coprono l’intervallo [0, 255].
- signed char coprono l’intervallo [−128, 127].
- I valori costanti di tipo char nel codice sorgente si
delimitano tra apici singoli ‘ ’
- Gli apici doppi " " vengono utilizzati per delimitare
stringhe, ovvero sequenze di caratteri
RIEPILOGANDO SUI TIPI BUILT-IN
- I tipi integral sono discreti, rappresentano valori numerabili
• sono char ed int con tutti i qualificatori e quantificatori (signed/unsigned char, short/long int,
signed/unsigned int)
- I tipi floating approssimano insiemi densi
• sono float e double, eventualmente con il quantificatore long
- I tipi integral e floating assieme compongono il tipo arithmetic 22
TIPI DI DATO STRUTTURALI
- Permettono di immagazzinare informazione ag