Presentazione di PowerPoint - uniroma1.itbloisi/didattica/ingegneriaClinica...Laboratorio di...

Post on 24-Sep-2020

2 views 0 download

transcript

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: bloisi@dis.uniroma1.it

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