Informatica 3. LEZIONE 5: Tipi di dati

Похожие документы
IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

Il linguaggio C. Notate che...

Astrazione Dati. Nicola Fanizzi. Linguaggi di Programmazione [010194] 10 mag, Dipartimento di Informatica Università degli Studi di Bari

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

Specifica: la sintassi. Specifica: la semantica. Specifica: la semantica

LINGUAGGI DI PROGRAMMAZIONE!

Linguaggio C - sezione dichiarativa: costanti e variabili

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

Strutture dati e loro organizzazione. Gabriella Trucco

Costanti e Variabili

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

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

Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati

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

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

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Introduzione al Linguaggio C

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

Indice. Prefazione. 3 Oggetti e Java 53

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

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

Il linguaggio C. Puntatori e dintorni

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

Funzioni, Stack e Visibilità delle Variabili in C

Introduzione alla programmazione in C++

Espressioni ed operatori in C

Programmazione in Java (I modulo)

Laboratorio di programmazione

Programmazione con Java

Lezione 6 Introduzione al C++ Mauro Piccolo

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

Client - Interfaccia - Implementazione

Dati aggregati. Violetta Lonati

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

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

Linguaggi e Ambienti di Programmazione

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

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

ADT: Abstract Data Type. Quasi ADT. ADT per collezioni di dati (code generalizzate) 04 I tipi di dati astratti (I parte)

Caratteristiche di un linguaggio ad alto livello

14 - Metodi e Costruttori

IL LINGUAGGIO C TIPI DI DATO

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Indice generale Introduzione...vii Parte I Concetti e costrutti fondamentali... 1 Capitolo 1 Introduzione al linguaggio... 3

Introduzione a Matlab

SQL e linguaggi di programmazione. Cursori. Cursori. L interazione con l ambiente SQL può avvenire in 3 modi:

Fondamenti di Informatica T-1

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73

Le basi del linguaggio Java

Informatica 3. LEZIONE 1: Introduzione. Modulo 1: Introduzione al corso Modulo 2: Introduzione ai linguaggi di programmazione

Транскрипт:

Informatica 3 LEZIONE 5: Tipi di dati Modulo 1: Tipi e costruttori di tipo Modulo 2: Tipi definiti dall utente e tipi di dati astratti Modulo 3: Sistemi di tipi

Informatica 3 Lezione 5 - Modulo 1 Tipi e costruttori di tipo

Introduzione I dati di un linguaggio di programmazione vengono organizzati attraverso il concetto di tipo Il tipo di un dato specifica i valori che una variabile di quel tipo può assumere e le operazioni ammissibili I linguaggi offrono: Tipi di dati predefiniti dal sistema Costruttori di tipo (dati aggregati) Tipi definiti dall utente Tipi di dati astratti

Tipi predefiniti Tutti i linguaggi di programmazione offrono un insieme di tipi predefiniti Booleani Caratteri Interi Reali Definiscono un insieme di valori e le operazioni che si possono compiere su di essi Tipi predefiniti in C++: char, float, double, int, void Permettono di: Classificare i dati manipolati da un programma Proteggere i dati da operazioni illegali

Vantaggi Vantaggi dei tipi predefiniti: Nascondere la rappresentazione sottostante Non si può accedere direttamente alla stringa di bit (nome dell entità del tipo) Occorre applicare delle operazioni Migliora la leggibilità del codice Rende l implementazione dei tipi modificabile maggiore portabilità Verificare il corretto uso delle variabili a tempo di compilazione (se il tipo è noto) Migliora l affidabilità del codice Non consente di verificare tutti i tipi di errore x=i/j; non può verificare se j!=0 Fare l overloading degli operatori a tempo di compilazione Es. int i,j,k; i=j+k; //operatore + tra interi

Tipi primitivi Tipi primitivi: Non sono costruiti a partire da altri tipi I loro valori sono atomici e non possono essere decomposti Spesso coincidono con i tipi predefiniti, salvo eccezioni (es. caratteri e stringhe in Ada) Si possono costruire nuovi tipi primitivi Si definiscono i valori del nuovo tipo Operazioni: dipendono dal linguaggio Esempio: tipo enumerativo

Tipo enumerativo Tipo ordinale i cui valori sono definiti dall'utente Le uniche operazioni ammesse sono quelle valide per tutti gli ordinali (:=, <>,=, <, >,..., ORD, DEC, INC,..) Esempio: enum colore {bianco, giallo, rosso, verde, blu}; 0 1 2 3 4 colore MioColore=giallo; switch(miocolore) {case bianco:...} NB: l'ordine tra gli elementi è quello in cui sono dichiarati (se non si specificano valori): bianco < giallo < rosso < verde < blu

Aggregati Dai tipi primitivi: tipi aggregati Aggregato: Ha un nome Può aggregare oggetti omogenei o disomogenei Permette operazioni sull intero oggetto oppure sui suoi componenti, selezionandoli

Costruttori di aggregati Prodotto cartesiano: A 1 x A 2 x x A n tuple ordinate (c 1,c 2,,c n ), con c i A i Esempi: Numero complesso: (parte reale, parte immaginaria) --> float x float Punto: (x,y) --> int x int oppure float x float Esempi di costruttori: Struct, record ecc. struct complesso { float reale; float immag; }; complesso num; num.reale

Costruttori di aggregati Mapping finito: Mapping: dominio codominio Esempi di costruttore: Routine Array int vett[10]; definisce un mapping dai valori 0..9 all insieme degli interi indicizzazione vett[5]=0; C++: Indici non nel dominio specificato Indici compresi tra 0 e N-1 (in altri linguaggi anche altri intervalli) Non si possono specificare slicing (es. vett[1..3])

Costruttori di aggregati Union Il tipo viene specificato come un insieme disgiunto di campi Esempio di costruttore: union indirizzo { short int offset; long unsigned ind_assoluto; }; mutuamente esclusivi

Costruttori di aggregati Ricorsione: Per definire aggregati la cui dimensione cresce arbitrariamente e la cui struttura ha complessità arbitraria Tramite puntatori: un componente viene definito come puntatore all oggetto Esempio di costruttore: struct nodo { int numero; nodo* succ; };

Informatica 3 Lezione 5 - Modulo 2 Tipi definiti dall utente e tipi di dati astratti

Tipi definiti dall utente tipo semplice o aggregato a cui è associato un nome scelto dall'utente enum bool {FALSE, TRUE}; bool b; Nome del tipo Dichiarazione variabile struct complesso{ float parte_intera; float parte_immaginaria; }; complesso numero;

Tipi definiti dall utente Vantaggi: leggibilità modificabilità fattorizzazione espressione (limitata) della semantica di una variabile Problemi: il nuovo tipo non è protetto da operazioni illegali rapprsentazione interna visibile

Tipo di dato astratto Tipo di dato astratto (abstract data type ADT): Tipo di dato (insieme di valori e collezione di operazioni su tali valori) accessibile solo attraverso un interfaccia Consente di scrivere programmi per mezzo di astrazioni di alto livello Si tengono distinte le trasformazioni concettuali operate sui dati dalla strutturazione dei dati e dalle specifiche implementazioni algoritmiche Meccanismi astratti per applicazioni specifiche utili per risolvere problemi in svariati domini applicativi

Tipo di dato astratto in C++ In C++: costrutto class Estensione di una struct in cui i campi possono essere dati oppure routine Solo alcuni dati/routine sono accessibili altri sono nascosti Parti pubblica e privata della classe La dichiarazione delle funzioni pubbliche formano la sua interfaccia

Esempio: pila Esempio: il tipo di dato PILA (STACK) Descrizione: una pila é un ADT in cui é possibile inserire un elemento (PUSH) La push aumenta la dimensione della pila di 1 rimuovere l'ultimo elemento inserito (POP) La pop decrementa la dimensione della pila di 1 push pop Politica LIFO (Last In First Out)

Esempio in C++ class stack_of_char{ public: stack_of_char(int size); ~stack_of_char(); void push(char c); char pop(); int empty() const;... private: // codice dipendente // dall implementazione } Operazioni che si possono applicare al nuovo tipo stack_of_char pila(10); pila.push( a ); pila.push( b ); char c=pila.pop(); if(pila.empty()) { }... push a

Esempio in C++ class stack_of_char{ public: stack_of_char(int size); ~stack_of_char(); void push(char c); char pop(); int empty() const;... private: // codice dipendente // dall implementazione } Operazioni che si possono applicare al nuovo tipo stack_of_char pila(10); pila.push( a ); pila.push( b ); char c=pila.pop(); if(pila.empty()) { }... push b a

Esempio in C++ class stack_of_char{ public: stack_of_char(int size); ~stack_of_char(); void push(char c); char pop(); Operazioni che si possono applicare al nuovo tipo int empty() const;... private: // codice dipendente // dall implementazione } stack_of_char pila(10); pila.push( a ); pila.push( b ); char c=pila.pop(); if(pila.empty()) { }... b pop a

ADT generici ADT generici: ADT parametrici rispetto al tipo dei loro componenti Costrutto C++: template template<class T> class stack { public: stack (int size); ~stack (); void push(t c); T pop(); int empty() const; private: //codice dipendente //dall implementazione }; stack<int> int_st(30); stack<char> char_st(10);

Informatica 3 Lezione 5 - Modulo 3 Sistemi di tipi

Sistema dei tipi Sistema dei tipi (type system): insieme di regole utilizzate dal linguaggio per strutturare e organizzare i tipi Gli oggetti sono istanze di tipo Ogni tentativo di manipolare gli oggetti con operazioni illegali è un errore di tipo (error type) Un programma è type safe se non presenta errori di tipo

Sistema dei tipi Un sistema dei tipi si dice forte se garantisce la type safety Linguaggio fortemente tipizzato Il compilatore può garantire la correttezza dei tipi Altrimenti si dice debole Linguaggio debolmente tipizzato I linguaggi tipizzati staticamente (il tipo di ogni oggetto è noto a tempo di compilazione) sono fortemente tipizzati Non è vero il contrario

Compatibilità dei tipi Ad un oggetto di tipo T1 si possono applicare operazioni del tipo T2 se T1 è compatibile con T2 Conformità o equivalenza Esempio: struct s1{ int y; int w; }; struct s2{ int y; int w; }; s1 a, x; s2 b; s3 c; int d; a=b; x=a; c=funz(b); d=funz(a); Compatibilità di nome: Un nome di tipo è compatibile solo con se stesso Compatibilità strutturale: struct s3{ int y; }; s3 funz(s1 z) { T1 è compatibile con T2 se hanno la stessa struttura richiede di sostituire ricorsivamente al nome dei tipi definiti dall'utente la loro definizione. }

Conversioni di tipo Cambiamento implicito o esplicito del tipo di un operando al fine di soddisfare le regole di compatibilità Si supponga di voler effettuare la seguente operazione int num1, somma; float num2; somma = num1 + num2; In diversi linguaggi i compilatori applicano delle conversioni automaticamente: coercizione (num1 - int) + (num2 - float) = (float) --> assegnamento a (int) C/C++: casting somma = num1 + (int) num2;

Controllo, conversione e compatibilità tra tipi x=y+z regole di conversione controllo di tipo regole di compatibilità OK KO

Tipi e sottotipi Sottotipo: T' è sottotipo di T se ha le stesse proprietà di T ma un insieme di valori ristretto. T' non è un nuovo tipo, ma ha dei vincoli in più Valori: sottoinsieme dei valori di un tipo Stesse operazioni type naturale=0..maxint; cifra=0..9; età=0..120; T T

Sistemi monomorfici e polimorfici Sistema monomorfico: Ogni oggetto appartiene ad un tipo Sistema fortemente tipizzato e poco flessibile E possibile verificare a tempo di compilazione la correttezza dei tipi Sistema polimorfico: Ogni oggetto può appartenere a uno o più tipi Tipi compatibili, coercizione, sottotipi I linguaggi offrono diversi livelli di polimorfismo

Classificazione di polimorfismo Polimorfismo Universale: insieme infinito di tipi Parametrico: es. routine generiche Inclusione: es. sottotipi Ad hoc: insieme finito di tipi Overloading Coercizione

Verifica degli errori Errori: Del linguaggio Dell applicazione Verifica degli errori: Statica: a tempo di compilazione Non è possibile rilevare tutti gli errori (es. divisione per 0) Dinamica: durante l esecuzione sui dati di input