Presentazione di PowerPointbloisi/didattica/ingegneriaClinica1314/lezioni/2... · Side-effect (1/2)...
Transcript of Presentazione di PowerPointbloisi/didattica/ingegneriaClinica1314/lezioni/2... · Side-effect (1/2)...
Corso di Laboratorio di InformaticaIngegneria Clinica – BCLR
Unità 2
Tipi di dato
Domenico Daniele Bloisi
Docente
Ing. Domenico Daniele Bloisi, PhDRicercatore
Dipartimento di Ingegneria Informatica, Automaticae Gestionale “Antonio Ruberti”Via Ariosto 25(adiacente Piazza Dante,
fermate Manzoni, Vittorio Emanuele,
Tram 3 fermata via Labicana)
Email: [email protected]
Home page: http://www.dis.uniroma1.it/~bloisi2013/2014Tipi di dato
Unità 2Pagina 22013/2014Tipi di dato
Unità 2Pagina 2
Ricevimento
In aula, subito dopo le lezioni Su appuntamento (tramite invio di una email) presso: Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti, via Ariosto 25 - II piano, stanza A209
Si invitano gli studenti a controllare regolarmente la bacheca degli avvisihttp://www.dis.uniroma1.it/~bloisi/didattica/labinf1314.html#Avvisi
2013/2014Tipi di datoUnità 2
Pagina 3
Orari
Lunedì 12.00 – 13.30 Aula 15, via Scarpa 14
Lunedì 14.00 – 17.15Aula 15, Laboratorio Didattico via Tiburtina 205
Martedì 14.00 – 15.30 Aula 16, via Scarpa 14
Mercoledì 12.00 – 13.30 Aula 15, via Scarpa 14
2013/2014Tipi di datoUnità 2
Pagina 4
Sommario – Unità 2
• Variabili• Assegnazione• Tipi di dato interi• Lettura e scrittura di interi• Tipi di dato reali• Precisione nelle rappresentazioni• Conversioni di tipo• Tipo di dato primitivo caratteri: char• Insieme dei valori rappresentabili e la clausola unsigned
2013/2014Tipi di datoUnità 2
Pagina 5
Tipo di dato (1/2)
Per descrivere efficacemente la natura dei dati rappresentabili in un programma e le operazioni per manipolarli si usa il concetto ditipo di dato.
Un tipo di dato è caratterizzato da:
• Dominio. Insieme dei possibili valori Esempi: numeri interi, numeri razionali, etc.
• Operazioni. Funzioni che operano sugli elementi del dominio Esempi: somma, moltiplicazione, etc.
• Letterali. costanti matematiche Esempio: 23, 576, etc.
2013/2014Tipi di datoUnità 2
Pagina 6
Tipo di dato (2/2)
Le funzioni agiscono su uno o più valori del dominio per produrre un valore (eventualmente non appartenente ad esso)
L’associazione tipo-dato limita gli errori perché protegge il programmatore da associazioni tra dati e operatori non compatibili
2013/2014Tipi di datoUnità 2
Pagina 7
f(i1, i
2, …, i
n) o
Tipi di dato
Tipi scalari (è definito un ordinamento)Tipi aggregati (si ottengono dagli scalari)
2013/2014Tipi di datoUnità 2
Pagina 8
Tipi aritmetici
2013/2014Tipi di datoUnità 2
Pagina 9
Tipi Interi
2013/2014Tipi di datoUnità 2
Pagina 10
Tipo int
{generalmente}
2013/2014Tipi di datoUnità 2
Pagina 11
Esempio int
int a,b,c; // Dichiarazione di variabile di tipo inta = 1; // Uso di letteralib = 2;c = a + b; // Espressione aritmetica che coinvolge // operatori del linguaggio
Nota: il risultato di x/y e x%y può dipendere dal compilatore quando x e y sono di segno opposto.In ogni caso vale sempre (x/y)*y + x%y = x.
Nota: i valori limite del tipo int sono definiti nelle costantiINT_MIN e INT_MAXall’interno del file di sistema limits.h
2013/2014Tipi di datoUnità 2
Pagina 12
Lettura e scrittura di interi
#include <stdio.h>
int main (){
int num1, num2, somma; /* dichiarazioni */printf("Primo intero\n"); /* prompt */scanf("%d", &num1); /* lettura intero */printf("Secondo intero\n"); /* prompt */scanf("%d", &num2); /* lettura intero */somma = num1 + num2; /* somma e assegnamento */printf("Somma: %d\n", somma); /* stampa somma */
return 0; /* programma terminato con successo */}
2013/2014Tipi di datoUnità 2
Pagina 13
Lettura e scrittura di interi: esecuzione
2013/2014Tipi di datoUnità 2
Pagina 14
Lettura e scrittura di interi:variabili
Lettura e scrittura di interi:printf
Lettura e scrittura di interi:scanf
La funzione scanf
La funzione che permette l'input di un elenco di variabili è:
int scanf(const char *format, ... )
scanf legge dallo standard input (tastiera) e assegna all'elenco di variabili i valori letti.
Restituisce, in caso di successo, il numero di caratteri letti.
Nota. E' richiesto l'indirizzo della variabile.
2013/2014Tipi di datoUnità 2
Pagina 18
Argomenti di scanf
Alcuni formati possibili sono:%c per il singolo carattere%d per numeri decimali%o per numeri ottali%x per numeri esadecimali%u per unsigned int%f per float%lf per double%s per stringhe%e per formato scientifico
ATTENZIONE!!!
2013/2014Tipi di datoUnità 2
Pagina 19
Esempio scanf
#include <stdio.h>
int main(){
int x;printf("Inserisci un intero:\n");
ATTENZIONE alla &scanf("%d", &x);printf("Ho letto %d\n", x);return 0;
}
2013/2014Tipi di datoUnità 2
Pagina 20
Esempio scanf: esecuzione
2013/2014Tipi di datoUnità 2
Pagina 21
Esempio scanf: senza la &
scanf("%d", x);
2013/2014Tipi di datoUnità 2
Pagina 22
Esercizi
Esercizio 2.4Scrivere, compilare ed eseguire l’esempio precedente. Cosa succede se si inserisce una lettera invece che un intero?
Esercizio 2.5Si scriva una funzione in linguaggio C che richieda all’utente due interi e li stampi in ordine inverso rispetto all’inserimento. Esempio:> Immetti primo numero: 5Immetti secondo numero: 1616 5
2013/2014Tipi di datoUnità 2
Pagina 23
Errori tipici – printf VS scanf
scanf può essere utilizzata per chiedere all’utente un dato. Gli argomenti di scanf differiscono da quelli di printf.
scanf ("%d %c %f", &numero, &car, &nu); CORRETTO scanf ("d %d %c \n ciao %f", &numero, &car, &nu);
NON CORRETTO
printf riceve come argomenti tanti %tipodato (%d, %f, %s, …) quante sono le variabili che voglio stampare. Vanno poi, alla fine della printf, inseriti tanti nomi di variabile quanti sono i %tipodato indicati
2013/2014Tipi di datoUnità 2
Pagina 24
Errori tipici – scanf
2013/2014Tipi di datoUnità 2
Pagina 25
#include <stdio.h>
int main (){
int num1, num2, somma; printf("Primo intero\n"); scanf("%d \n", &num1); printf("Secondo intero\n"); scanf("%d", &num2); somma = num1 + num2; printf("Somma: %d\n", somma); return 0;
} Qual è l'output del compilatore?Cosa avviene in esecuzione?
Espressioni di interi
Il seguente frammento di programma mostra espressioni con operatori sui numeri interi:
int a, b, c;a = 10/3+10%3;b = 2*-3+4;c = 2*(a+b);
2013/2014Tipi di datoUnità 2
Pagina 26
Precedenza degli operatori
In assenza di parentesi valgono le seguenti regole di precedenza degli operatori
1. + - unari (es. -x)
2. * / %3. + - binari (es. 3+4)
Esempio: a+b*-c
è equivalente aa+(b*(-c))
2013/2014Tipi di datoUnità 2
Pagina 27
Overflow numerico
L'overflow (trabocco) si verifica quando il risultato dell'operazione non può essere rappresentato mediante il tipo di dato scelto.
int x = 2147483647; // massimo valore rappresentabile mediante intint y = x + 1; // operazione affetta da overflow, poichè il // risultato 2147483648 non è rappresentabile // mediante intprintf("%d", y); // stampa -2147483648, invece di 2147483648 // che è quello che ci aspetteremmo
Esercizio 2.6Verificare il comportamento del frammento di codice presentato
2013/2014Tipi di datoUnità 2
Pagina 28
Operatori di assegnazione composta
somma = somma + addendo;salario = salario * aumento;
si può abbreviare in:
somma += addendo;salario *= aumento;
Per ciascun operatore +, -, *, /, % esiste ilcorrispondente +=, -=, *=, /=, %=.
2013/2014Tipi di datoUnità 2
Pagina 29
Operatori di incremento e decremento
Per incrementare di 1 una variabile intera si puòusare una qualunque delle seguenti tre istruzioniequivalenti:x = x + 1;x += 1;x++;
Analogamente per decrementare di 1x = x - 1;x -= 1;x--;
la forma più concisa è quella che usa l’operatore di post-incremento: ++.
la forma più concisa è quella che usa l’operatore di post-decremento: --.
2013/2014Tipi di datoUnità 2
Pagina 30
Side-effect (1/2)
Il C usa il termine espressione per indicare due diverse nozioni:
1. Le espressioni che hanno come effetto solamente il calcolo di un valore, come ad esempio le espressioni del tipo int, che si possono comporre secondo le regole delle espressioni matematiche;
2. Le espressioni che, oltre a calcolare un valore, corrispondono ad una operazione sulla memoria, come ad esempio un'assegnazione (semplice o composta) oppure un post-incremento. Per queste espressioni useremo il termine espressioni-con-side-effect: il termine side-effect si usa, infatti, per indicare una modifica della memoria del programma.
2013/2014Tipi di datoUnità 2
Pagina 31
Side-effect (2/2)
Espressioni-con-side-effect possono essere trasformate in istruzioni se terminate da “;”.È ciò che avviene nell'assegnazione di variabili.
Esempi:• 23*x+5 è una espressione matematica;• x = 7 è una espressione-con-side-effect il cui valore è 7 (il lato destro dell’assegnazione). Terminandola con “;” si ottiene l’istruzione valida x = 7;• y = x = 7 è anch’essa una espressione valida avente due side-effect: il primo assegna 7 a x, mentre il secondo assegna il valore dell’espressione x = 7 (che vale 7) a y.
2013/2014Tipi di datoUnità 2
Pagina 32
Uso delle espressioni
Sebbene il linguaggio C consenta un uso indifferenziato dei due tipi di espressioni,è preferibile usare le espressioni-con-side-effect per formare delle istruzioni, evitando sempre l’uso di espressioni-con-side-effect all’interno di espressioni matematiche.
2013/2014Tipi di datoUnità 2
Pagina 33
Esempio:x = 5 * (y = 7);dovrebbe essere scritta comey = 7;x = 5 * y;
Riassumendo
le espressioni sono un’astrazione del concetto matematico di funzione e di applicazione di funzione
le espressioni-con-side-effect (istruzioni) sono un’astrazione del concetto di assegnazione cioè di modifica della memoria del programma.
2013/2014Tipi di datoUnità 2
Pagina 34
Definizione di costanti e numeri magici
Un numero magico è un letterale che compare nel codice senza spiegazioni. La presenza di numeri magici diminuisce la leggibilità e la modificabilità dei programmi.
Esempio:int compenso = 20000 * orelavoro;// cosa rappresenta 20000?
È meglio definire dei nomi simbolici (le costanti) e usare queste piuttosto che direttamente i letterali.
// definizione di una costante COMPENSO_ORARIOconst int COMPENSO_ORARIO = 20000;...// qui e’ chiaro cosa COMPENSO_ORARIO rappresentiint compenso = COMPENSO_ORARIO * orelavoro;
2013/2014Tipi di datoUnità 2
Pagina 35
Modificatore const
COMPENSO_ORARIO è una costante, cioè una variabile il cui contenuto non varia durante l’esecuzione del programma.
Questo effetto è ottenuto usando il modificatore const nella dichiarazione della variabile.
const indica che il valore non può essere modificato (cioè rimane costante).
2013/2014Tipi di datoUnità 2
Pagina 36
Vantaggi dell’uso di costanti
I principali vantaggi nell’usare le costanti sono:
• Leggibilità del programma: un identificatore di costante con un nome significativo è molto più leggibile di un numeroEsempio:COMPENSO_ORARIO è autoesplicativo, 20000 non lo è
• Modificabilità del programma: per modificare un valore costante usato nel programma basta semplicemente cambiare la definizione della costanteEsempio:const int COMPENSO_ORARIO = 35000;l’uso dei numeri magici obbliga a modificare tutte le occorrenze del valore nel programma, sostituendo ogni occorrenza di 20000 con 35000.
2013/2014Tipi di datoUnità 2
Pagina 37
Definizioni di costanti tramite #define
Oltre alla definizione di costanti tramite la parola chiave const, è possibile definire costanti tramite la direttiva #define.
#define COMPENSO_ORARIO 20000...int compenso = COMPENSO_ORARIO * orelavoro;
#define è una direttiva che viene processata dal pre-compilatore sostituendo ad ogni occorrenza del nome definito (nell’esempio COMPENSO_ORARIO) il valore corrispondente (nell’esempio 20000).
2013/2014Tipi di datoUnità 2
Pagina 38
Tipo short
{generalmente}
2013/2014Tipi di datoUnità 2
Pagina 39
Esempio short
short a, b; // Dichiarazione di //variabile di tipo short
a = 22700; // Uso di letterali
Nota: usare short al posto degli int consente di “risparmiare” memoria. Infatti, se si conosce con certezza il dominio di definizione di una variabile e tale dominio rientra in quello degli short, verrà utilizzata una quantità minore di memoria.
2013/2014Tipi di datoUnità 2
Pagina 40
Tipo long
{generalmente}
2013/2014Tipi di datoUnità 2
Pagina 41
Esempio long
long a, b; // Dichiarazione di // variabili di tipo long
a = 9000000000L; // Uso di letteralib = a + 2L; // Espressione aritm. che coinvolge
// operatori del linguaggio
2013/2014Tipi di datoUnità 2
Pagina 42
Tipo float
{generalmente}
2013/2014Tipi di datoUnità 2
Pagina 43
Esempio float
float a; // Dichiarazione di variabile// di tipo float
a = 3.14f; // Uso di letteralia *= 2f; // Espressione aritmetica che
// coinvolge operatori// del linguaggio// (equivalente a a=a*2f)
2013/2014Tipi di datoUnità 2
Pagina 44
Tipo double
{generalmente}
2013/2014Tipi di datoUnità 2
Pagina 45
Esempio double
double a; // Dichiarazione di variabile di // tipo double
a = 628E-2; // Uso di letteralia++; // Espressione aritmetica che
// coinvolge operatori del // linguaggio// (equivalente a: a=a+1.0)
2013/2014Tipi di datoUnità 2
Pagina 46
Esercizio Teorema di Pitagora
Esercizio 2.6Scrivere un programma che riceva in input da tastiera il valore di due cateti di un triangolo rettangolo e restituisca il valore dell’ipotenusa.
Esempio d’usoinserisci il primo cateto3inserisci il secondo cateto4valore ipotenusa: 5
2013/2014Tipi di datoUnità 2
Pagina 47
Soluzione Teorema di Pitagora#include <stdio.h>#include <math.h>
int main (){
double a, b, c;printf("inserisci il primo cateto\n");scanf("%lf", &a);printf("inserisci il secondo cateto\n");scanf("%lf", &b);c = sqrt(a*a + b*b);printf("valore ipotenusa: %f\n", c);return 0;
}
2013/2014Tipi di datoUnità 2
Pagina 48