Appunti sull'implementazione in C di tipi di dato

Documenti analoghi
Appunti sulla lezione 3

in più stringhe,... ADT un tipo è caratterizzato dalle operazioni consentite su di esso: un numero è qualcosa che si può moltiplicare, sommare,...

Perché il linguaggio C?

Esercizi Strutture dati di tipo astratto

La Struttura Dati Pila

Programmazione I - Laboratorio

Perché il linguaggio C?

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

Esercitazioni di Prog. II (funzioni su insiemi) Chiara Petrioli

CREARE UNA LIBRERIA IN C

IL COMPONENTE STACK (pila)

Primi passi col linguaggio C

PILE E CODE. Pile (stack):

Esercitazione. Uso di funzioni e librerie di funzioni

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

ADT STACK (PILA) Svariate applicazioni del concetto di stack:

Fondamenti di Informatica II

Compilazione separata. Come realizzare correttamente un piccolo progetto su piu' file

ADT STACK (PILA) ADT STACK (PILA)

case 0: /* child 1 - writing end */ close(fd[0]); // close read end write(fd[1], string, (strlen(string)+1));/* +1 is termination \0 */ return (0);

Appunti senza pretese di P2+Lab: Pensare ricorsivamente, programmare iterativamente, parte II: Implementazione iterativa di Mergesort

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

ADT STACK (PILA) Svariate applicazioni del concetto di stack:

ADT STACK (PILA) ADT STACK (PILA) IL COMPONENTE STACK (PILA) CONSIDERAZIONI. Per utilizzare istanze del tipo di dato astratto

Compilazione separata. Come realizzare correttamente un piccolo progetto su piu' file

Client - Interfaccia - Implementazione

(*lista == NULL (*lista)->info >= elem) accede al campo next di *lista solo se *lista non e' NULL. */ #include <stdio.h> #include <stdlib.

Corso di Informatica A.A

La struttura dati CODA

Strutture dati dinamiche in C (II)

Compilazione separata

Progetto per il Laboratorio di Programmazione Un interprete per il linguaggio PINO. Modulo I: Le tavole dei simboli (TS)

Pile: implementazioni. Pile. Pile: liste /1. Pile: liste /2. Università Roma La Sapienza Corsi di Laurea Informatica/Tecnologie Informatiche

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Corso di Informatica 1 Esercitazione n. 7

PROGETTI SU PIU` FILE

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Abstact Data Type. Abstact Data Type. Pubblico e privato. Struttura di un ADT

Titolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott.

Funzioni dipendenti dal tipo definite al momento dell'uso

E12 Esercizi su Strutture dati dinamiche in C

Alberi ed Alberi Binari

Esempio. Le istruzioni corrispondono a quelle di sopra, ma sono scritte in modo simbolico. E indipendente dalla machina

Programmare. Compilatori e interpreti. Editor :: vi. Hello1.c. #include <stdio.h> >> cc Hello1.c. main() { printf( \n Hello World!

C: panoramica. Violetta Lonati

Laboratorio di Programmazione

La programmazione nel linguaggio C. Liste

Esercizio 1 Liste: calcolo del numero di elementi ripetuti in una lista

Struct, enum, Puntatori e Array dinamici

Il linguaggio C Strutture

Preprocessing, compilazione ed esecuzione. Utilizzando strumenti GNU...

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

STRUTTURA DI UN PROGRAMMA

cons: L E L (...), e (e,...) Operatori tradizionali sulle liste car: (e,...) cdr: What s LISTE? null: () TRUE (...) FALSE Una lista e' una

Esercitazione 11. Liste semplici

L albero e un tipo astratto di dati usato per rappresentare relazioni gerarchiche.

Fondamenti di Informatica: Ingegneria Meccanica Prova scritta del 12 luglio 2008

Programmazione I - Laboratorio

Laboratorio di Programmazione

Il linguaggio C. Notate che...

prova.c #include <stdio.h> char funzione(char); codice oggetto del main()

Il linguaggio C Strutture

Introduzione al C. Unità 10 Preprocessore

Programmazione II canale AD -- Esonero del 21/04/2006

STRUTTURA DI UN PROGRAMMA!

INFORMATICA - CdL in FISICA. COMPITO del 28/05/2003 SOLUZIONI PROPOSTE

Politecnico di Milano. Strutture dati dinamiche

Introduzione al C. Unità 10 Preprocessore. D. Bloisi, S. Peluso, A. Pennisi, S. Salza

Fondamenti di Informatica 2

Fondamenti di Informatica II 25. Laboratorio 7

Introduzione al linguaggio C Primi programmi

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Lezione 6 Struct e qsort

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Fondamenti di Informatica, Ingegneria Elettronica, Università La Sapienza Roma. aa R. Beraldi

Implementazione dell albero binario in linguaggio C++

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

Laboratorio di Programmazione

Allocazione dinamica della memoria

Introduzione ai puntatori in C Definizione

Lezione 8 Struct e qsort

OOP in C++ ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi

In una coda gli inserimenti si fanno alla fine e le cancellazioni all inizio! First In First Out

Il linguaggio C. Puntatori e dintorni

Informazioni Utili. Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2005/06 Tutor: Loris Cancellieri

/* programma per costruire una partizione del grafo in foreste disgiunte */ #include <stdio.h> #include <stdlib.h>

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Algoritmi e Programmazione Avanzata. Pile e code. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

FUNZIONI che operano su LISTE

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Alberi ed Alberi Binari di Ricerca

Informazioni Utili. Strumenti Utilizzati. Creazione e gestione di un progetto. Fondamenti di Informatica L-B (L-Z) Esercitazioni

INFORMATICA 2010/11 - CdL in FISICA TERZO APPELLO 8/09/2011: SOLUZIONI PROPOSTE

Transcript:

Appunti sull'implementazione in C di tipi di dato Alessandra Raffaetà Università Ca Foscari Venezia Corso di Laurea in Informatica

Programma in un singolo modulo Inserisce i numeri da 1 a 5 in una pila e poi li stampa /* pilasenzamoduli.c */ #include <stdio.h> #include <stdlib.h> /* Dichiarazione del tipo Pila */ typedef struct node{ /* tipo del nodo della lista */ int info; struct node *next; Node; typedef Node * List; /* tipo lista per memorizzare gli elementi*/ struct stack{ /* tipo dello stack realizzato con puntatori */ List contents; int size; ; typedef struct stack * Stack; 2

Programma in un singolo modulo (cont.)... continua /* Function Definitions */ /*post: costruisce uno stack vuoto */ Stack initstack(){ Stack s; s = (Stack) malloc(sizeof(struct stack)); s->contents = NULL; s->size = 0; return s; /*post: ritorna 1 se lo stack e' vuoto, 0 altrimenti */ int stackempty(stack s){ return s->contents == NULL; 3

Programma in un singolo modulo (cont.)... continua /*post: inserisce elem in cima allo stack */ void push(stack s, int elem){ List temp; temp = (List) malloc(sizeof(node)); temp->info = elem; temp->next = s->contents; s->contents = temp; (s->size)++; /*post: ritorna il numero di elementi nello stack */ int size(stack s){ return s->size; 4

Programma in un singolo modulo (cont.)... continua /*pre: stack non vuoto */ /*post: ritorna e rimuove l'elemento in cima allo stack */ int pop(stack s){ int ris; List temp; temp = (s->contents); s->contents = temp->next; ris = temp->info; free(temp); (s->size)--; return ris; /*pre: stack non vuoto */ /*post: ritorna l'elemento in cima allo stack */ int top(stack s){ return s->contents->info; 5

Programma in un singolo modulo (cont.)... continua int main(){ Stack s; int i; s = initstack(); for (i = 1; i <= 5; i++) push(s, i); while (!stackempty(s)) printf("%d\n", pop(s)); return EXIT_SUCCESS; 6

Programma in un singolo modulo: Problemi Realizzare un intero programma come un singolo modulo presenta vari inconvenienti: Ogni (minima) modifica richiede la ricompilazione dell'intero programma tempi di compilazione elevati!! Non è facile riutilizzare funzioni (di utilità generale) definite nel programma (es. push, pop ). Nota: Per il secondo problema un semplice cut&paste delle funzioni è una pessima soluzione per manutenzione: ogni operazione di aggiornamento (es. sostituzione del codice della funzione con uno più efficiente) su ogni copia! efficienza: il cut&paste è lento e ciascuna copia della funzione occupa spazio disco. 7

Programma in un singolo modulo: Problemi Chiameremo programma cliente un programma che usa un tipo di dato e implementazione un programma che specifica il tipo di dato. La realizzazione del tipo di dato è visibile ai programmi cliente. Non si può modificare la rappresentazione senza dover modificare i programmi cliente. 8

Suddivisione in più moduli Un programma C complesso è normalmente articolato in più file sorgenti compilati indipendentemente quindi collegati in un unico eseguibile Risolve i problemi menzionati precedentemente Uno stesso file può essere utilizzato da diversi programmi (funzioni riusabili) La rigenerazione di un eseguibile richiede la ricompilazione dei soli file sorgente modificati ed il linking. 9

Suddivisione in più moduli (cont.) Se un programma è diviso in più moduli sorgente se un file sorgente utilizza una funzione, non definita nello stesso file, deve contenere la dichiarazione del prototipo della funzione Es: per utilizzare push occorre dichiarare void push(stack s, int elem) direttive per il pre-processore / definizioni di tipo devono essere presenti in ogni file che le utilizza. Es. (non legate all'esempio) #define MAX 100 typedef struct stack * Stack; 10

Suddivisione in più moduli (cont.) Per rendere un modulo module.c facilmente riusabile si predispone un header file (file di intestazione) module.h contenente: direttive, definizioni di tipo prototipi delle funzioni definite Il file modulo module.c include il proprio header #include modulo.h Ogni file che utilizza il modulo ne include l'header #include modulo.h 11

Suddivisione in più moduli: Esempio /* stack.h */ typedef struct stack * Stack; Stack initstack(); int stackempty(stack s); void push(stack s, int elem); int pop(stack s); int top(stack s); int size(stack s); 12

Implementazione di un Tipo di dato astratto in C Utilizzo di un handle (aggancio, maniglia) per descrivere un riferimento a un oggetto astratto. Lo handle è definito come puntatore a una struttura che è specificata solo attraverso una etichetta. Il programma cliente non può accedere a un membro della struttura per dereferenziazione di un puntatore perché non conosce i nomi dei membri della struttura. Tutte le informazioni specifiche per la struttura dati sono incapsulate nell'implementazione. 13

Suddivisione in più moduli: Esempio /* implpilapunt.c */ #include <stdlib.h> #include "stack.h" /* contiene il tipo e i prototipi per Stack */ typedef struct node{ /* tipo del nodo della lista */ int info; struct node *next; Node; typedef Node * List; /* tipo lista per memorizzare gli elementi*/ struct stack{ /* tipo dello stack realizzato con puntatori */ List contents; int size; ; 14

Suddivisione in più moduli: Esempio... continua /*post: costruisce uno stack vuoto */ Stack initstack(){ Stack s; s = (Stack) malloc(sizeof(struct stack)); s->contents = NULL; s->size = 0; return s; /*post: ritorna 1 se lo stack e' vuoto, 0 altrimenti */ int stackempty(stack s){ return s->contents == NULL;... 15

Suddivisione in più moduli: Esempio /* usapila.c */ #include <stdio.h> #include <stdlib.h> #include "stack.h" /* contiene il tipo e i prototipi per Stack */ int main(){ Stack s; int i; s = initstack(); for (i = 1; i <= 5; i++) push(s, i); while (!stackempty(s)) printf("%d\n", pop(s)); return EXIT_SUCCESS; 16

Suddivisione in più moduli (cont.) Ogni file sorgente può essere compilato separatamente gcc -c modulo.c La compilazione produce il file oggetto modulo.o che contiene codice macchina tabella dei simboli La tabella dei simboli permette di ricombinare (tramite il compilatore gcc) il codice macchina con quello di altri moduli oggetto per ottenere file eseguibili. 17

Compilazione separata: Esempio Con l'opzione -c... $ gcc -c implpilapunt.c $ gcc -c usapila.c si generano i file oggetto implpilapunt.o e usapila.o Alternativamente, con un solo comando $ gcc -c implpilapunt.c usapila.c 18

Compilazione separata: Esempio Infine il linking dei file oggetto, risolve i riferimenti incrociati e crea un file eseguibile outpila $ gcc implpilapunt.o usapila.o -o outpila $./outpila 5 4 3 2 1 Se volessimo cambiare implpilapunt.c dovremmo ricompilare solo questo file e poi rifare il linking. 19