Appunti sulla lezione 3

Documenti analoghi
Appunti sull'implementazione in C di tipi di dato

La Struttura Dati Pila

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

Esercizi Strutture dati di tipo astratto

Perché il linguaggio C?

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

Programmazione I - Laboratorio

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

Perché il linguaggio C?

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

CREARE UNA LIBRERIA IN C

IL COMPONENTE STACK (pila)

PILE E CODE. Pile (stack):

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

Fondamenti di Informatica II

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

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

La struttura dati CODA

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);

Primi passi col linguaggio C

Esercitazione. Uso di funzioni e librerie di funzioni

ADT STACK (PILA) ADT STACK (PILA)

Laboratorio di Programmazione

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

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

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

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

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

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

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

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

Strutture dati dinamiche in C (II)

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

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

Laboratorio di Programmazione

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

C: panoramica. Violetta Lonati

Corso di Informatica 1 Esercitazione n. 7

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

Corso di Informatica A.A

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

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

Laboratorio di Programmazione

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

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

Funzioni dipendenti dal tipo definite al momento dell'uso

Il linguaggio C Strutture

Programmazione I - Laboratorio

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

Client - Interfaccia - Implementazione

La programmazione nel linguaggio C. Liste

1. Realizzare una funzione: int trovaritardatari(file *fprestiti, FILE *frate, Prestito *dest, int dim)

Struct, enum, Puntatori e Array dinamici

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

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

Introduzione al C. Unità 10 Preprocessore

Esercitazione 11. Liste semplici

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

Compilazione separata

STRUTTURA DI UN PROGRAMMA

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

PROGETTI SU PIU` FILE

Alberi ed Alberi Binari

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

FUNZIONI che operano su LISTE

E12 Esercizi su Strutture dati dinamiche in C

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

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

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

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

Introduzione ai puntatori in C Definizione

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

Il linguaggio C Strutture

1. realizzare una funzione int estraimulte(file *fmutui, FILE *fpagamenti, Mutuo *dest, int dim)

Lezione 8 Struct e qsort

Il linguaggio C. Notate che...

Fondamenti di Informatica

Informatica 3. LEZIONE 13: Liste doppie, pile e code. Modulo 1: Free list Modulo 2: Lista doppia Modulo 3: Pila Modulo 4: Coda

Fondamenti di Informatica 2

Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2007/08 Tutor: Barbara Pettazzoni

Fondamenti di Informatica 2

Politecnico di Milano - Dipartimento di Elettronica, informazione e Bioingegneria Prof. Mauro Negri

Lezione 6 Struct e qsort

Strutture dati. Le liste

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

STRUTTURA DI UN PROGRAMMA!

Corso di Linguaggi di Programmazione

Fondamenti di Informatica e Laboratorio T-AB Prova Pratica - 16 Giugno 2009 Compito A

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

Esempio di costruzione di una classe: un dizionario

Laboratorio di Informatica. Lezione 8: Liste e alberi

Il linguaggio C. Puntatori e dintorni

Strutture Dinamiche. Strutture Dinamiche

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

Perché usare UniversiBO?

Transcript:

Appunti sulla lezione 3 Alessandra Raffaetà Università Ca Foscari Venezia Corso di Laurea in Informatica

Informazioni sul corso Pagina web del corso: www.dsi.unive.it/~asdnew Mailing list: asd@listserver.dsi.unive.it Iscrivetevi tramite la pagina web del corso! 2

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; 3

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 emptystack(stack s){ return s->contents == NULL; 4

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; 5

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; 6

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

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. 8

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. 9

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. 10

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; 11

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 12

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

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. 14

Suddivisione in più moduli: Esempio /* implpilapunt.c */ #include <stdio.h> #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; ; 15

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 emptystack(stack s){ return s->contents == NULL;... 16

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 x, i; s = initstack(); for (i = 1; i <= 5; i++) push(s, i); while (!emptystack(s)){ x = pop(s); printf("%d\n", x); return EXIT_SUCCESS; 17

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. 18

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 19

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. 20

Implementazione tramite Array /* implpilaarray.c */ #include <stdio.h> #include <stdlib.h> #include "stack.h" /* contiene il tipo e i prototipi per Stack */ #define MAX 100 struct stack{ /* tipo dello stack realizzato con array */ int contents[max]; int top; ; Stack initstack(){ Stack s; s = (Stack) malloc(sizeof(struct stack)); s->top = -1; return s; 21

Implementazione tramite Array (cont.)... continua int emptystack(stack s){ return s->top == -1; void push(stack s, int elem){ if (s->top + 1 == MAX){ printf("errore pila piena\n"); return; s->contents[++(s->top)] = elem; 22

Implementazione tramite Array (cont.)... continua int pop(stack s){ return s->contents[(s->top)--]; int top(stack s){ return s->contents[s->top]; int size(stack s){ return s->top + 1; 23

Compilazione separata: Esempio $ gcc -c implpilaarray.c $ gcc implpilaarray.o usapila.o -o outpila $./outpila 5 4 3 2 1 24