Corso di Laboratorio di Informatica
Ingegneria Clinica – BCLR
Unità 2
Char
Domenico Daniele Bloisi
Docente
Ing. Domenico Daniele Bloisi, PhD
Ricercatore
Dipartimento di Ingegneria Informatica, Automatica
e Gestionale “Antonio Ruberti”
Via Ariosto 25
(adiacente Piazza Dante,
Manzoni
Tram 3 fermata via Labicana)
email: [email protected]
home page:
Laboratorio di Informatica
2014/2015
Char
Unità 2
Pagina 2
http://www.dis.uniroma1.it/~bloisi
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 avvisi
http://www.dis.uniroma1.it/~bloisi/didattica/labinf1415.html#Avvisi
Pagina 3Laboratorio di Informatica
2014/2015
Char
Unità 2
Orari
Lunedì 12.00 – 13.30
Aula 4, via del Castro Laurenziano 7A
Martedì 14.00 – 17.15
Aula 15, Laboratorio Didattico via Tiburtina 205
Mercoledì 12.00 – 13.30
Aula 4, via via del Castro Laurenziano 7A
Pagina 4Laboratorio di Informatica
2014/2015
Char
Unità 2
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• Clausola unsigned
Pagina 5Laboratorio di Informatica
2014/2015
Char
Unità 2
Precisione nella rappresentazione
Non tutti i numeri compresi tra −3.4028235 · 10+38 e +3.4028235 · 10+38 sono rappresentabili come float
I numeri rappresentabili come float sono tanto più vicini tra loro
quanto più sono vicini allo zero. Inoltre, essi sono tanto più lontani
fra loro quanto più ci si avvicina al massimo valore rappresentabile
(in valore assoluto).
Pagina 6
Considerazioni simili valgono anche per i double
Laboratorio di Informatica
2014/2015
Char
Unità 2
Esempio 1
Il seguente frammento di codice
float x = 1222333444.0f;
printf("x = %f\n", x);
x += 1.0;
printf("x + 1 = %f\n", x);
producex = 1222333440.000000
x + 1 = 1222333440.000000
Pagina 7Laboratorio di Informatica
2014/2015
Char
Unità 2
Esempio 2
Il seguente frammento di codice
int j = 1222333444;
printf("j = %d\n", j);
j += 1;
printf("j + 1 = %d\n", j);
producej = 1222333444
j + 1 = 1222333445
Pagina 8Laboratorio di Informatica
2014/2015
Char
Unità 2
Precisione nelle misure
La precisione del risultato di una operazione
dipende dalla precisione con cui si conoscono i
dati.
Esempi:9.2 * 5.3 = 48.76
(la seconda cifra decimale non è significativa in
questo esempio)
9.25 * 5.35 = 49.48
(qui, invece, lo è)
Pagina 9Laboratorio di Informatica
2014/2015
Char
Unità 2
Conversione di tipi
E’ possibile trasformare un tipo di dato in un altro
attraverso una conversione
Una conversione può essere:
• Implicita (detta anche promozione) quando viene
effettuata dal compilatore per assicurare che gli
operandi siano dello stesso tipo.
• Esplicita quando viene effettuata dal
programmatore tramite l’operatore unario cast
Pagina 10Laboratorio di Informatica
2014/2015
Char
Unità 2
Gerarchia di promozione
long double
double
float
unsigned long
long
unsigned int
int
short
char
perdita di
precisionepromozione
Tipo inferiore
Tipo superiore
Pagina 11Laboratorio di Informatica
2014/2015
Char
Unità 2
Conversione di tipo implicita -
operatori binari (1/2)
Se gli operatori binari vengono utilizzati con due operandi di
tipo diverso, il tipo inferiore viene promosso a quello superiore
e il risultato sarà del tipo superiore.
ESEMPIO di regola (informale)oper1 + oper2: se oper1 è double e oper2 è float,
oper2 promosso a double e l’espressione è double
a = c + b;
float (tipo dell’operando)
double (tipo dell’operando)
double (tipo dell’espressione)
Pagina 12Laboratorio di Informatica
2014/2015
Char
Unità 2
Conversione di tipo implicita -
operatori binari (2/2)
Attenzione!!!Se a e b sono di tipo float, mentre c di tipo double, allora
a = b + c;
assegnerà il valore double risultato della somma a una
variabile float, con il potenziale effetto di avere una perdita di
informazione.
In un assegnamento, il tipo della variabile destinazione
definisce il tipo finale.
Pagina 13Laboratorio di Informatica
2014/2015
Char
Unità 2
Conversione di tipo implicita -
chiamata di funzione . . .
int f(float, int);
int main() {
int a; float b;
f(a, b);
. . .
}
int f(float p1, int p2) {
. . .
}
Possibile perdita
di informazione:
tipi in chiamata
diversi dai tipi definiti
nel prototipo
Pagina 14Laboratorio di Informatica
2014/2015
Char
Unità 2
Conversione di tipo implicita -return
int f() {
float b;
int c;
. . .
return b * c;
}
Possibile perdita
di informazione:
valore restituito
diverso dal tipo di
ritorno definito
Pagina 15Laboratorio di Informatica
2014/2015
Char
Unità 2
Conversione di tipo esplicita (cast)
Per convertire esplicitamente un dato da un tipo ad un altro si
deve effettuare un’operazione di cast.
Sintassi
(tipo) espressione;
• tipo è il nome di un tipo
• espressione è un’espressione il cui tipo verrà forzato a
tipo
Semantica
Converte il tipo di un’espressione a un altro tipo, in modo da
rendere possibili operazioni che coinvolgano tipi altrimenti
incompatibili.
Pagina 16Laboratorio di Informatica
2014/2015
Char
Unità 2
Esempio cast
int a = (int) 3.75; // cast a int
// dell’espressione 3.75
// (di tipo double)
printf("%d", a); // stampa 3
Nell’esempio il valore 3.75 viene troncato a 3.
Esempio:
Pagina 17Laboratorio di Informatica
2014/2015
Char
Unità 2
ATTENZIONE: Il risultato di una operazione di cast
potrebbe essere affetto da perdita di precisione.
Assegnazioni fra tipi di dato primitivi
numerici diversiUn valore di un tipo di dato non va assegnato ad una variabile
di un tipo di dato inferiore, altrimenti si rischia perdita di
precisione.
Esempio:int a; long b; a = b;
un valore long non va assegnato ad una variabile int
int a; float b; a = b;
un valore float non va assegnato ad una variabile int
Nota: il compilatore gcc non segnala alcun errore
Pagina 18Laboratorio di Informatica
2014/2015
Char
Unità 2
Esempio
#include <stdio.h>
int main () {
long b = 90000L;
short a = (short) 3.75; // cast a short
// dell’espressione 3.75
// (di tipo double)
printf("%hd\n", a);
a = b; //si assegna long a short
printf("%hd\n", a);
printf("%ld\n", b);
return 0;
}
Pagina 19Laboratorio di Informatica
2014/2015
Char
Unità 2
Compilazione ed esecuzione
Pagina 20Laboratorio di Informatica
2014/2015
Char
Unità 2
Tipo char
Pagina 21Laboratorio di Informatica
2014/2015
Char
Unità 2
Dominio ASCII
Una variabile di tipo char può contenere un carattere
alfanumerico o un simbolo.
Lo standard ASCII stabilisce una corrispondenza tra numeri e
simboli alfabetici, numerici o simboli speciali in varie lingue.Ad esempio, il carattere 'A' corrisponde al codice numerico
65, il carattere 'B' al codice numerico 66, ecc.
Per maggiori dettagli sullo standard ASCII
si veda, ad esempio, il sito web: www.asciitable.com
Pagina 22Laboratorio di Informatica
2014/2015
Char
Unità 2
Tavola ASCII
Esempio char
Una variabile di tipo char può contenere un
carattere alfanumerico o un simbolo.
I letterali del tipo char possono essere denotati
tramite gli apici''.
Esempio:char c = 'A'; char c = '0';
char c = 67; //corrisponde alla C in ASCII
Non si tratta del numero zero, ma
del carattere zero (48 ASCII)
Pagina 24Laboratorio di Informatica
2014/2015
Char
Unità 2
Operazioni sui char
Conversione da char a int
corrisponde a calcolare il codice ASCII di un carattere
char c = 'A';
int i = (int)c; // i contiene il codice ASCII
// del carattere 'A'
printf("%d\n", i); // stampa 65
Domanda: cosa stampa printf("%c\n", i); ?
Pagina 25Laboratorio di Informatica
2014/2015
Char
Unità 2
Operazioni sui char
Conversione da char a int
conversione da carattere a intero corrispondente tramite il
carattere '0'char c = '5';
int i = (int)c - (int)'0'; // i = 53 - 48
printf("%d\n", i); // stampa 5
printf("%c\n", i); // stampa ♣ (ENQUIRY)
Pagina 26Laboratorio di Informatica
2014/2015
Char
Unità 2
Operazioni sui char
Conversione da int a char
corrisponde a creare un carattere a partire dal suo codice
ASCII
int i = 65; // codice ASCII del carattere 'A'
char c = (char)i;
printf("%c\n", c); // stampa 'A'
Domanda: cosa stampaint i = 1065;
char c = (char)i;
printf("%c\n", c);
?
Pagina 27Laboratorio di Informatica
2014/2015
Char
Unità 2
Operazioni sui char
Conversione da int a char
conversione da intero a carattere corrispondente tramite il
codice ASCII del carattere '0'
int i = 5;
char c = (char)(i + (int)'0'); // c = 5 + 48
printf("%c\n", c); // stampa 5 (53 ASCII)
printf("%d\n", c); // stampa 53
Pagina 28Laboratorio di Informatica
2014/2015
Char
Unità 2
Operazioni sui char
Conversione da char a int
char c = '5';
int i = (int)c - (int)'0'; // i = 53 - 48
printf("%d\n", i); // stampa 5
Conversione da int a char
int i = 5;
char c = (char)(i + (int)'0'); // c = 5 + 48
printf("%c\n", c); // stampa 5 (53 ASCII)
Pagina 29Laboratorio di Informatica
2014/2015
Char
Unità 2
Esercizio
Esercizio 2.8
Si scriva un programma C in grado di visualizzare
tutte le cifre del codice ASCII corrispondenti alle
lettere del proprio nome.
Pagina 30Laboratorio di Informatica
2014/2015
Char
Unità 2
Soluzione Erika
#include <stdio.h>
int main()
{
char c = 'E';
printf("%c corrisponde a %d\n", c, c);
c = 'r';
printf("%c corrisponde a %d\n", c, c);
c = 'i';
printf("%c corrisponde a %d\n", c, c);
c = 'k';
printf("%c corrisponde a %d\n", c, c);
c = 'a';
printf("%c corrisponde a %d\n", c, c);
return 0;
}
Pagina 31Laboratorio di Informatica
2014/2015
Char
Unità 2
Il tipo char usato come tipo numerico
Poiché i valori char vengono convertiti
automaticamente in valori interi, essi sono spesso
usati per rappresentare interi a 8 bit, con
dominio [-128,+127]
Con le dovute attenzioni, è possibile utilizzare char come tipo intero ad 8 bit.
Pagina 32Laboratorio di Informatica
2014/2015
Char
Unità 2
Esempio:
Nell’elaborazione delle immagini il dominio per rappresentare
le intensità di colore è [0,255]
La clausola unsigned
I tipi numerici interi char, short, int, long
possono essere dichiarati con la clausolaunsigned.
Sintassi
unsigned <tipo> <variabile>;
Semantica
I dati contenuti nelle relative variabili saranno
interpretati come valori senza segno (ovvero valori
non negativi).
Pagina 33Laboratorio di Informatica
2014/2015
Char
Unità 2
La clausola unsigned
Sintassi ammessa[ signed | unsigned ] int
[ signed | unsigned ] short [ int ]
[ signed | unsigned ] long [ int ]
Pagina 34Laboratorio di Informatica
2014/2015
Char
Unità 2
Tabella di confronto signed/unsigned
Pagina 35Laboratorio di Informatica
2014/2015
Char
Unità 2
Esempio
stampa2147483647 2147483647
-2147483648 2147483648
#include <stdio.h>
int main() {
int x; unsigned int u;
x = 2147483647; u = x;
printf("%d %u\n", x, u);
x = 2147483647+1; u = x;
printf("%d %u\n", x, u);
return 0;
}
Pagina 36Laboratorio di Informatica
2014/2015
Char
Unità 2
Definizione di nuovi tipi
In C è possibile definire nuovi tipi mediante l’istruzione typedef
Esempio:typedef int TipoA;
typedef int TipoB;
TipoA a = ...;
TipoB b = ...;
Pagina 37Laboratorio di Informatica
2014/2015
Char
Unità 2
Esercizi
Esercizio 2.9
Scrivere un programma in linguaggio C che legga un importo in Euro x e restituisca il corrispondente importo in Dollari.
Esercizio 2.10
Scrivere un programma in linguaggio C che legga da tastiera
due numeri interi e stampi su schermo:
• media aritmetica (la loro somma diviso 2)
• media geometrica (la radice quadrata del loro
prodotto)
Pagina 38Laboratorio di Informatica
2014/2015
Char
Unità 2