LABORATORIO di INFORMATICA

Documenti analoghi
Tipi di dato semplici

Linguaggio C - sezione dichiarativa: costanti e variabili

Tipo di dato. Ci siamo già imbattuti in questo concetto. Definizione generale di tipo di dato

Struttura dei programmi C

Laboratorio di Informatica Ingegneria Clinica Lezione 9/11/2011. Prof. Raffaele Nicolussi

Il linguaggio C. Notate che...

Tipi di dato. Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi:

Laboratorio di informatica Ingegneria meccanica

Linguaggio C. Tipi predefiniti. Università degli Studi di Brescia. Prof. Massimiliano Giacomin. Prof. M. Giacomin

Linguaggio C. Tipi predefiniti e operatori. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Primi passi col linguaggio C

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Il potere espressivo di un linguaggio è caratterizzato da: PROGRAMMA = DATI + CONTROLLO

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

LINGUAGGI DI PROGRAMMAZIONE!

Costanti e Variabili

Caratteristiche di un linguaggio ad alto livello

Tipi di dato primitivi

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Introduzione al Linguaggio C

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Classificazione Tipi semplici predefiniti Definizione di nuovi tipi Tipi strutturati

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2009/2010

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Programmare in C. Maurizio Palesi Salvatore Serrano. Valori. Operazioni. Un insieme di valori del tipo. Per operare su tali valori Tipi

4 - Tipi di dato primitivi

Fondamenti di Informatica Il linguaggio C (parte 1) IL LINGUAGGIO C

Le parole chiave char, int, float, double, ed enum descrivono i. che modificano i tipi base

Tipi interi lo standard (1)

Dati aggregati. Violetta Lonati

IL LINGUAGGIO C TIPI DI DATO

Gli array, le stringhe e le strutture

Utilizza i tipi di dati comuni a tutto il framework.net Accesso nativo ai tipi.net (C# è nato con.net) Concetti fondamentali:

Algoritmi e Strutture Dati

Il Linguaggio C. Caratteristiche. Caratteristiche. Esempio di programma in C. Tipi di dato primitivi in C. Dati

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Conversioni fra Tipi di Dati. Luca Abeni

Algoritmi, Strutture Dati e Programmi. UD 1.d: Dati e Tipi di Dato

Programmazione in Java (I modulo)

Linguaggio C. tipi di dati definiti dall utente. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Tipi di dati. una parola di memoria (16 o 32 bit), float. possibile rilevare errori nell uso di variabili mediante compilazione

Tipi di dato. Le variabili in C. Problema: dato in input un carattere, se esso è una lettera minuscola, trasformarla in maiuscola.

Il linguaggio C. Caratteristiche generali

Un elaboratore è un manipolatore di simboli (segni) intrinsecamente capace di trattare vari. caratteri char caratteri ASCII unsigned char

Appunti del corso di Informatica 1 (IN110 Fondamenti) 5 Rappresentazione delle informazioni

Rappresentazione della memoria

Lezione 6 Introduzione al C++ Mauro Piccolo

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Strutture dati e loro organizzazione. Gabriella Trucco

Variabili. Tipi di dati di base. Variabili. Variabili

Somma di numeri binari

LA CODIFICA DELL INFORMAZIONE. Introduzione ai sistemi informatici D. Sciuto, G. Buonanno, L. Mari, McGraw-Hill Cap.2

Tipi di dato-prima parte

Corso sul linguaggio C Modulo Tipi di dato

Informatica A. Il linguaggio C. A.a. 2006/2007. Allievi Ingegneria Gestionale

1 PANORAMICA SUL LINGUAGGIO C

Il linguaggio C. Puntatori e dintorni

Introduzione a Matlab

Introduzione al linguaggio C Puntatori

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Descrizione delle operazioni di calcolo. Espressioni costanti semplici

Linguaggio C: introduzione

IL PROBLEMA DEL PROGETTO

Sintassi: Per la dichiarazione di variabili dei tipi fondamentali:

Capitolo 2 Introduzione alla programmazione in C

La "macchina" da calcolo

SULL USO DEI CARATTERI. char x; si legge con ( %c,&x) e si stampa con ( %c,x) ma anche con ( %d,x) DUE ESEMPI

Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore)

Basi della programmazione in Java. Anteprima. Uso delle variabili. Il concetto di variabile Uso delle variabili. Input da tastiera I tipi Esercizi

Espressioni ed operatori in C

Il linguaggio C. I tipi di dati scalari. Il casting Le dichiarazioni di tipo I puntatori

1) definizione di una rappresentazione 2) specificazione di un algoritmo (dipendente dalla rappresentazione) 3) traduzione in un linguaggio

Linguaggio C: puntatori

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Linguaggi, Traduttori e le Basi della Programmazione

Compendio sottoinsieme del C++ a comune col C. (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica)

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Introduzione alla programmazione in C++

C: panoramica. Violetta Lonati

LABORATORIO di INFORMATICA

modificato da andynaz Cambiamenti di base Tecniche Informatiche di Base

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Linguaggio C: Espressioni

Tipi di Dati Avanzati

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Questa dispensa propone esercizi riepilogativi sui concetti visti finora ovvero:

Unità F1. Obiettivi. Il linguaggio C. Il linguaggio C++ Linguaggio C. Pseudolinguaggio. Primi programmi

Lab 02 Tipi semplici in C

Corso di Fondamenti di Programmazione canale E-O. Tipi di dato. Un esempio

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Le basi del linguaggio Java

Concetti base programmazione. Antonio Gallo

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal

Esercizi. La funzione swapint() primo tentativo

Fondamenti di Informatica

Transcript:

Università degli Studi di Cagliari Corso di Laurea Magistrale in Ingegneria per l Ambiente ed il Territorio LABORATORIO di INFORMATICA A.A. 2010/2011 Prof. Giorgio Giacinto TIPI DI DATI IN C http://www.diee.unica.it/giacinto/lab Introduzione! Per tipo di dato si intende un insieme di valori e un insieme di operazioni che possono essere applicate ad essi! Es. i numeri interi sono costituiti dall insieme {,-2,-1, 0,+1,+2, } e dalle operazioni aritmetiche (somma, sottrazione, )! La definizione di tipo di dato consente di trattare i dati in maniera astratta, cioè prescindendo dalla codifica realizzata dalla macchina concreta! Tuttavia in alcuni casi l uso di un tipo di dato piuttosto che un altro è legato alla rappresentazione concreta dei dati nella macchina Giorgio Giacinto 2010 Laboratorio di Informatica 2

Introduzione (cont.)! Tutte le variabili di un programma C hanno un tipo associato una volta per tutte alla dichiarazione! Per ogni variabile si conosce l insieme dei valori ammissibili e l insieme delle operazioni che possono essere applicate! Per ogni variabile si conosce a priori la quantità di memoria occupata (es.char: 1 byte, int: 1 parola)! E possibile rilevare eventuali errori nell uso della variabile durante la compilazione del programma! In espressioni che contengono variabili di tipo diverso il compilatore verifica se esiste compatibilità con i valori e le operazioni dei diversi tipi in base a regole predefinite. Giorgio Giacinto 2010 Laboratorio di Informatica 3 Classificazione dei tipi di dati! Tipi semplici: quando la variabile deve rappresentare informazioni semplici (velocità, temperatura)! Il dato non può essere scomposto (indivisibile)! Tipi strutturati: deve rappresentare dati più complessi rappresentati da più dati elementari (es.data)! Il dato può essere scomposto nelle sue componenti (ad es. la data può essere scomposta in tre componenti: giorno,mese, anno)! Tipi definiti dall utente (user-defined): il C offre la possibilità di definire e costruire nuovi tipi di dati da affiancare a quelli già esistenti nel linguaggio (built-in) Giorgio Giacinto 2010 Laboratorio di Informatica 4

Tipi semplici predefiniti! Il C prevede quattro tipi di base: char (caratteri), float (reali), int (interi), double (reali in precisione doppia)! I qualificatori di tipo signed, unsigned, short e long condizionano l insieme dei valori che la variabile tipizzata può assumere! I qualificatori di tipo short e long condizionano lo spazio allocato dal compilatore! Lo spazio allocato dipende dalla macchina utilizzata Giorgio Giacinto 2010 Laboratorio di Informatica 5 Tipi semplici predefiniti Giorgio Giacinto 2010 Laboratorio di Informatica 6

Tipo int! Il tipo interi è costituito dall insieme {,-2,-1,0,+1,+2, } e dalle operazioni aritmetiche (somma, sottrazione, moltiplicazione, ecc.)! Normalmente un int è memorizzato in una parola (16 o 32 bit)! Il compilatore può prevedere un allocazione di memoria inferiore o superiore rispettivamente nei casi di short int e long int. Vale sempre la regola: spazio_all.(short int)! spazio_all.(int)! spazio_all.(long int) Giorgio Giacinto 2010 Laboratorio di Informatica 7 signed int e unsigned int! signed int La rappresentazione binaria prevede l uso di un bit per il segno! Es. signed int a 16 bit: insieme valori da {-2 15,,2 15-1}! unsigned int Tutti i bit della rappresentazione binaria vengono utilizzati per il valore! Es. unsigned int a 16 bit: insieme valori da {0, 2 16-1}! N.B. spazio_all(signed int) = spazio_all(unsigned int) Giorgio Giacinto 2010 Laboratorio di Informatica 8

Intervallo di valori int! La libreria <limits.h> contiene le costanti che definiscono il minimo e il massimo valore di un int relativi all implementazione del linguaggio! Le costanti predefinite INT_MIN e INT_MAX contengono i limiti per int! Se il risultato delle operazioni su interi non forniscono valori appartenenti all insieme di appartenenza della variabile (ad es. valori maggiori di INT_MAX) si produce una segnalazione di errore (Integer Overflow) Giorgio Giacinto 2010 Laboratorio di Informatica 9 Tipi di dati: operazioni di tipo Built-in per dati di tipo int Giorgio Giacinto 2010 Laboratorio di Informatica 10

(1) Programma Anno bisestile #include <stdio.h> main() { int anno, resto; printf( Inserire l anno\n ); scanf( %d,&anno); while(anno > 0) { resto = anno%4; if(!resto) printf( L anno %d e bisestile\n,anno); else printf( L anno %d non e bisestile\n,anno); printf( Inserire l anno\n ); scanf( %d,&anno); } }/* Manca il controllo degli anni-secolo*/ Giorgio Giacinto 2010 Laboratorio di Informatica 11 Tipi float e double! I tipi float e double sono un approssimazione dei numeri reali rappresentati in virgola mobile (floating point)! Un numero decimale in virgola mobile viene rappresentato in C come mantissa ed esponente separati dalla lettera E! Ad es. 17500 diventa 1.75E4! N.B. Non si confonda la rappresentazione interna al calcolatore (binaria) con i tipi del C (pensati per il sistema decimale) Giorgio Giacinto 2010 Laboratorio di Informatica 12

Intervallo di valori float e double! In molti calcolatori: float memorizzato su 4 byte! precisione di circa 6 cifre decimali! intervallo di valori: da 10-38 a 10 +38 double memorizzato su 8 byte! precisione di circa 15 cifre decimali! intervallo di valori: da 10-308 a 10 +308 In generale: spazio_all.(float)! spazio_all.(double)! spazio_all.(long double) Giorgio Giacinto 2010 Laboratorio di Informatica 13 Operazioni Built-in per dati di tipo float e double Giorgio Giacinto 2010 Laboratorio di Informatica 14

Osservazioni sull uso dei reali! Le tecniche usate per la rappresentazione e l elaborazione dei reali possono introdurre errori di approssimazione! Es. il numero 1 potrebbe essere sostituito dal valore 0.999999! È pericoloso eseguire confronti di uguaglianza esatta tra valori reali.! Ad es. non è detto che (x/y) * y == x sia sempre verificata! È consigliabile considerare un certo margine di approssimazione Ad es.: if (x == y)può essere sostituita da if (x<=y+0.000001 && y<= x+0.000001) Questi temi vengono affrontati nei corsi di Calcolo Numerico Giorgio Giacinto 2010 Laboratorio di Informatica 15 (2) Conversione Fahrenheit- Celsius #include <stdio.h> main() { int Ftemp; float Ctemp; printf( Inserire la temperatura in gradi F\n ); scanf( %d,&ftemp); Ctemp = (5.0/9.0)*(Ftemp 32); printf( %d gradi F corrispondono a,ftemp); printf( %f gradi C\n,Ctemp); } N.B. Per ottenere la temperatura in Celsius si è usata la formula 5.0/9.0 perché in C 5/9 verrebbe interpretata come divisione fra interi con risultato intero (in questo caso 0) Giorgio Giacinto 2010 Laboratorio di Informatica 16

(3) Calcolo del volume di una sfera #include <stdio.h> main() { const float Pi = 3.1415; float volume,raggio; printf( Inserire il raggio della sfera: ); scanf( %f,&raggio); volume=(4.0/3.0)*pi*raggio*raggio*raggio; printf( \nil volume della sfera di raggio ); printf(( %f e %f\n,raggio,volume); } N.B. Le stampe a video sono state divise in diverse istruzioni printf solo per esigenze di visualizzazione della presentazione. Giorgio Giacinto 2010 Laboratorio di Informatica 17 Tipo char! L insieme dei caratteri di tipo char è l insieme dei caratteri ASCII! La codifica ASCII consente la rappresentazione di ciascun carattere attraverso un valore intero! Il compilatore C per un char alloca 1 byte! signed char: valori da 128 a +128! unsigned char: valori da 0 a 255! Il tipo char presenta gli stessi operatori del tipo int! E una conseguenza della codifica dei caratteri tramite interi Giorgio Giacinto 2010 Laboratorio di Informatica 18

Tipo char (cont.)! Un altra conseguenza della codifica dei caratteri con interi è l ordinamento dei caratteri! Se x e y sono due variabili di tipo char, l espressione x < y è vera se x precede y nella codifica ASCII! Alcuni caratteri sono caratteri di controllo, cioè la loro scrittura produce l esecuzione di un operazione! \n (newline)! \b (backspace)! \t (horizontal tab)! \r (carriage return) Giorgio Giacinto 2010 Laboratorio di Informatica 19 (4) Minuscole in Maiuscole #include <stdio.h> main() { char C,CM; printf( Inserire un carattere (# per terminare)\n ); scanf( %c,&c); while(c!= # ) { printf( Il codice ASCII del carattere %c è %d\n,c,c); if(c >= a && C <= z ) { CM = C ( a - A ); printf( La maiuscola di %c è %c e il suo codice ASCII è %d\n,c,cm,cm); } printf( Inserire un carattere (# per terminare)\n ); scanf( %c,&c); } } Giorgio Giacinto 2010 Laboratorio di Informatica 20

Classificazione dei tipi predefiniti C! Le variabili di tipo char, signed char, unsigned char, short, int, long, unsigned short, unsigned e unsigned long sono sempre rappresentate in memoria da un numero intero! Prendono anche il nome di tipi integral. Da notare che l indice di un array può essere solo di tipo integral In particolare i caratteri vengono trattati come piccoli interi e, viceversa, i piccoli interi possono essere trattati come caratteri. Giorgio Giacinto 2010 Laboratorio di Informatica 21 Classificazione dei tipi predefiniti C! Tutti i tipi arithmetic del C (integral e floating) condividono alcune importanti caratteristiche:! Sono totalmente ordinati, per ogni coppia x, y con x!= y, risulta o x < y o y < x! Sono limitati, cioè sono forniti di un valore minimo e massimo nel caso di numeri reali rappresentati in virgola mobile possono essere ignorati! I tipi integral sono insiemi discreti, cioè possono essere enumerati.! Nota: il tipo astratto floating rappresenta l insieme denso dei reali. Tuttavia in concreto il calcolatore può rappresentare solo un sottoinsieme discreto dei reali. Giorgio Giacinto 2010 Laboratorio di Informatica 22

Definizione di nuovi tipi: regole sintattiche! Tutti i tipi di dati non predefiniti utilizzati in un programma devono essere dichiarati come ogni altro elemento del programma Sintassi dichiarazione di tipo (type declaration): typedef <costruzione_tipo><identificatore_tipo>;! costruzione: specifica come è costruito a partire dai tipi esistenti! identificatore: l identificatore del nuovo tipo Es. typedef int anno; rende possibile dichiarare variabili di tipo anno Giorgio Giacinto 2010 Laboratorio di Informatica 23 Dichiarazioni di variabili basate sulla definizione di un nuovo tipo! Dichiarazione di variabile basata su nuovo tipo: <costruzione_tipo><id_variabile>[<costruzione_tipo>]! Scelta fra uso di typedef per definire un nuovo tipo o dichiarazione variabili in base al nuovo tipo:! Se diverse variabili usano un nuovo tipo, la sua definizione mediante typedef può rendere il programma più chiaro! Non vi sono regole precise: dipende dall esperienza e dal gusto personale Giorgio Giacinto 2010 Laboratorio di Informatica 24

Definizione di nuovi tipi: osservazioni! La funzione del typedef di fatto è quella di associare un nome a un tipo già esistente o nuovo! typedef non consente la definizione di nuove operazioni applicabili ai valori del nuovo tipo! Grossa limitazione nell uso dei nuovi tipi di dato a livello astratto Per realizzare nuovi tipi astratti di dato, occorrono altri strumenti del linguaggio C: funzioni e procedure (illustrate in un altra sezione) Giorgio Giacinto 2010 Laboratorio di Informatica 25 Tipi semplici definiti dall utente Ridefinizione Un nuovo tipo può essere definito dando un nuovo nome a un tipo già esistente: typedef <TipoEsistente> <NuovoTipo>; <TipoEsistente> può essere sia un built-in (predefinito), sia un tipo user-defined precedentemente definito Es. typedef int tipo1; typedef tipo1 tipo2; Giorgio Giacinto 2010 Laboratorio di Informatica 26

Tipi semplici definiti dall utente (cont.) Enumerazione esplicita dei valori Un nuovo tipo può essere costruito elencando i possibili valori Sintassi typedef enum {<valore>{,<valore>}}; Esempio typedef enum {lun,mar,mer,gio,ven,sab,dom} GiornSett; GiornSett x, y; x = lun; y = gio; Giorgio Giacinto 2010 Laboratorio di Informatica 27 Tipi semplici definiti dall utente: osservazioni su enumerazione! Il compilatore associa ai nuovi valori un progressivo valore intero! Questo valore intero viene considerato per la valutazione di espressioni, relazioni ed assegnamenti Ad esempio: x = lun; y = gio; in realtà x assume valore 0, e y assume valore 3! L enumerazione può essere perciò considerata come una ridefinizione del tipo int! Le operazioni su int possono essere applicate ai tipi enumerati! E definita una relazione di ordinamento in base all ordine con cui vengono elencati i valori di tipo Giorgio Giacinto 2010 Laboratorio di Informatica 28

Tipi di dati definiti per enumerazione: boolean Tramite il costruttore enum in C e possibile costruire il tipo di dato boolean che non esiste come predefinito Es. typedef enum {false, true} boolean; boolean flag, ok; Flag e ok sono variabili che possono assumere valori vero o falso Giorgio Giacinto 2010 Laboratorio di Informatica 29 TIPI STRUTTURATI

Tipi strutturati! Il C non possiede tipi built-in strutturati ma possiede quattro costruttori che consentono la definizione di tipi strutturati anche complessi array, struct, union e pointer (union e pointer non saranno trattati in questo corso) Giorgio Giacinto 2010 Laboratorio di Informatica 31 Array in C! Per array si intende una sequenza di celle di memoria consecutive e omogenee! Omogeneità. Ciascuna cella contiene dati uniformi: solo interi, solo numeri in virgola mobile, ecc.)! Alla sequenza viene dato un unico nome identificatore! Per identificare una cella nella sequenza occorre specificarne l indice! Le celle sono numerate consecutivamente a partire da 0! s[5] indica il 6 elemento dell array s Giorgio Giacinto 2010 Laboratorio di Informatica 32

Array in C (cont.)! Un array di 28 elementi ha indici con valori compresi fra 0 e 27.! L indirizzamento s[5] viene tradotto dalla macchina virtuale come la somma dell indice (5) all indirizzo della prima cella (la numero 0)! s[j] può essere trattato come una qualunque variabile e inserita nelle espressioni. Giorgio Giacinto 2010 Laboratorio di Informatica 33 Array in C (cont.) Esempi di istruzioni con array: a[3] = s[1] + x; if(a[4] > s[1] +3) s[2] = a[2] + a[1]; x = a[1]; a[i] = a[i+1]; a[i*x] = = s[a[j+1]-3]*(y-a[y]); NOTA: l indice in genere è il risultato del calcolo di una espressione Giorgio Giacinto 2010 Laboratorio di Informatica 34

Costruttore array array Analogamente alle variabili array, il costruttore array permette di costruire tipi di dati i cui elementi sono delle sequenze omogenee di valori appartenenti a un unico tipo, in cui ogni elemento è individuato mediante un indice Sintassi typedef <id_tipo_elem><id_nuovo_tipo>[<dim>]; Es. typedef int anarray[20]; anarray lista1, lista2; Giorgio Giacinto 2010 Laboratorio di Informatica 35 Costruttore array (cont.) <id_tipo_elem> identificatore di tipo degli elementi dell array <id_nuovo_tipo> identificatore del nome dato al nuovo tipo <dim> il numero di elementi contenuti nell array Note:! l indice per accedere agli elementi di un array varia da 0 a dim-1.! La variabile usata come indice deve essere di tipo integral Giorgio Giacinto 2010 Laboratorio di Informatica 36

Costruttore array (cont.)! Dichiarazione di una sola variabile di un tipo ottenuto mediante il costruttore array: <id_tipo_elem_><id_variabile>[<dim>]; Esempio: int lista[20];! Osservazioni! L array è un costruttore di tipo, non un tipo (in C è sbagliato parlare di variabili di tipo array)! La dichiarazione di un tipo array può essere implicita nella dichiarazione di una variabile Giorgio Giacinto 2010 Laboratorio di Informatica 37 Costruttore array: osservazioni (cont.)! Agli elementi degli array sono attribuibili tipi arbitrari (built-in, user-defined, semplici o strutturati)! Si possono avere per esempio degli array i cui elementi sono degli array Esempio typedef int Vettore[20]; typedef Vettore Matrice[20]; Matrice matrice1; (dichiarazione di variabile) Sinteticamente: typedef int Matrice[20][20]; int matrice1[20][20]; (dichiarazione di variabile) Giorgio Giacinto 2010 Laboratorio di Informatica 38

Costruttore array: osservazioni (cont.)! Un array ha dimensioni fisse durante l esecuzione del programma! Il compilatore ha bisogno di conoscere a priori la dimensione di memoria astratta da allocare per la macchina astratta! Il programmatore deve stimare a priori la memoria da allocare per evitare spreco di memoria o il rischio di overflow! Il rischio di overflow, cioè di accedere a elementi di un array che eccedono la sua dimensione, è pericoloso perché si accede ad aree di memoria che non appartengono all array Giorgio Giacinto 2010 Laboratorio di Informatica 39 Costruttore array: osservazioni (cont.)! Nella maggior parte dei casi le dimensioni necessarie per gli array relativi a un programma, variano da esecuzione a esecuzione! Ad es. il numero di fatture emesse da una ditta, il numero di studenti di un corso, ecc.! L allocazione dinamica della memoria in C non sarà oggetto di questo corso! In molti casi è possibile stimare una dimensione ragionevole, che cauteli contro i rischi di overflow e nello stesso tempo non causi spreco di memoria Giorgio Giacinto 2010 Laboratorio di Informatica 40

Costruttore array: osservazioni (cont.)! Per facilitare il cambiamento delle dimensioni degli array, è conveniente dichiarare le dimensioni attraverso dei #define! Nel caso si debba ricompilare il codice, è sufficiente cambiare il valore contenuto nella direttiva #define piuttosto che rintracciare nel codice tutte le istruzioni in cui si fa riferimento alle dimensioni dell array! A differenza delle definizione di costanti che riservano spazio in memoria, il preprocessore sostituisce all identificatore, a tempo di compilazione, il valore definito Giorgio Giacinto 2010 Laboratorio di Informatica 41 Operazioni su array! Nota bene: agli elementi di un array posso applicare tutte le operazioni relative al tipo degli elementi! Se ad esempio typedef int anarray[10]; anarray Array1,Array2; Per copiare il contenuto di Array1 in Array2 non è corretto Array1 = Array2 ma devo effettuare un istruzione ciclica che copia gli elementi ad uno ad uno (cfr. esempio Concatena_stringhe.c ) Giorgio Giacinto 2010 Laboratorio di Informatica 42

Stringhe di caratteri! Una sequenza ordinata di caratteri forma una stringa! ad es.: una parola, una frase, ecc.! Una stringa viene definita in C come un array di char Esempio typedef char String[30]; String Nome, Cognome; oppure char Nome[30], Cognome [30]; Giorgio Giacinto 2010 Laboratorio di Informatica 43 Costruttore struct! Il costruttore di tipi struct permette di aggregare elementi eterogenei (int, char, float, ) chiamati campi della struttura! Esempio Creazione di una rubrica telefonica. Ogni scheda contiene: Nome e Cognome (stringhe di caratteri) Indirizzo (stringa di caratteri distinta dalla prima) N.ri di telefono (array di interi, uno per ciascun numero): ecc. Giorgio Giacinto 2010 Laboratorio di Informatica 44

Sintassi struct typedef struct { <tipo_campo> <id_campo>{; <tipo_campo> <id_campo>} } <id_nuovo_tipo>;! Come per tutti i tipi nuovi, posso dichiarare variabili di tipo nuovo definite mediante struct, senza definire esplicitamente un nuovo tipo con typedef struct { <tipo_campo> <id_campo>{; <tipo_campo> <id_campo>} } <id_variabile>; Giorgio Giacinto 2010 Laboratorio di Informatica 45 Esempi di tipi costruiti con struct typedef struct { int Giorno; int Mese; int Anno; } Data; typedef char String[30]; typedef enum {Dirigente,Impiegato,Operaio} CatType; typedef struct { String Nome; String Cognome; int Stipendio; char CodiceFiscale[16]; Data DataAssunzione; CatType Categoria; } Dipendenti; Giorgio Giacinto 2010 Laboratorio di Informatica 46

Accesso agli elementi di un tipo definito con struct Sintassi <id_variabile>.<id_campo> Esempio Dipendenti Dip1, Dip2; Aumento di stipendio pari al 10% per Dip1 Dip1.Stipendio = Dip1.Stipendio + (Dip1.Stipendio*10)/ 100; Dip1.DataAssunzione.Giorno = 3; Dip1.DataAssunzione.Mese = 1; Dip1.DataAssunzione.Anno = 1993: Nota l accesso ai campi DataAssunzione definiti mediante struct Giorgio Giacinto 2010 Laboratorio di Informatica 47 Operazioni su tipi di dati costruiti con struct! Agli elementi di una struttura possono essere applicate tutte le operazioni del tipo che le caratterizza! Diversamente dall array la struttura può essere coinvolta, tramite il suo identificatore, in operazioni globali di confronto (==,!=) o assegnamento (=) Esempio. Dipendenti Dip1, Dip2; Dip2 = Dip1; Giorgio Giacinto 2010 Laboratorio di Informatica 48

Tipi costruiti mediante array di struct Esempio Elenco di dipendenti Dipendenti ElencoDipendenti[100]; definisce una sequenza di 100 elementi di tipo dipendenti. Per accedere al codice fiscale del 23 dipendente ElencoDipendenti[22].CodiceFiscale Per accedere al mese di nascita ElencoDipendenti[22].CodiceFiscale[8] Giorgio Giacinto 2010 Laboratorio di Informatica 49 Il C e la tipizzazione forte! Le regole di tipizzazione del C sono basate sulle linee guida seguenti! Si considerino le espressioni e gli assegnamenti che coinvolgono variabili eterogenee in tipo! Sono eseguibili se tutti i tipi referenziati risultano compatibili dopo l applicazione delle regole di conversione implicita messe a disposizione dal sistema! Sono non eseguibili se le variabili risultano ancora eterogenee anche dopo l applicazione delle regole di conversione implicita messe a disposizione dal sistema Giorgio Giacinto 2010 Laboratorio di Informatica 50

Il C e la tipizzazione forte! Le regole per la gestione dei tipi delle variabili sono verificate al momento della compilazione senza richiedere l esecuzione del programma! Questa proprietà viene chiamata tipizzazione forte! Conseguenza: un certo numero di errori può essere individuato durante la compilazione! Nel seguito si riportano le regole implicite di conversione.! Il programmatore può forzare una conversione fra tipi (operazione di cast) che non verrà illustrata in questo corso. Giorgio Giacinto 2010 Laboratorio di Informatica 51 Espressioni che coinvolgono elementi eterogenei in tipo! Regole di conversione implicita per espressioni aritmetiche del tipo x op y 1. Variabili di tipo char o short (signed o unsigned) vengono convertite in variabili di tipo int 2. Se l espressione è ancora eterogenea, si converte temporaneamente l operando di tipo inferiore facendolo dvenire di tipo superiore secondo la gerarchia int < long < unsigned < unsigned long < float < double < long double 3. Se L espressione risultante dopo il passo 2. è omogenea, l espressione viene eseguita e il risultato è di tipo uguale a quello di più alto livello gerarchico usato nella conversione Giorgio Giacinto 2010 Laboratorio di Informatica 52

Assegnamenti che coinvolgono elementi eterogenei in tipo! Vengono ancora usate le regole di conversione implicita Esempio double d; int i; d = i; (il sistema converte i in double e lo assegna a d) i = d; (il sistema tronca d alla parte intera) Giorgio Giacinto 2010 Laboratorio di Informatica 53 Organizzazione di tipi in altri linguaggi! In molti moderni linguaggi di programmazione l organizzazione dei tipi ha molte caratteristiche comuni a quelle del C.! Esistono linguaggi meno convenzionali (LISP, Prolog, Snobol, Smalltalk) che consentono la tipizzazione dinamica! Il tipo di una variabile può cambiare durante l esecuzione, per cui spesso è inutile dichiararlo all inizio.! Come in altri casi, gli elementi di flessibilità di un linguaggio da un lato consentono di scrivere programmi più efficienti, d altro lato possono essere fonte di errori. Giorgio Giacinto 2010 Laboratorio di Informatica 54