Esercizi su File e Liste

Slides:



Advertisements
Presentazioni simili
File Linguaggio C.
Advertisements

Puntatori Linguaggio C.
Uso avanzato di C.
Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
Stringhe di caratteri In linguaggio C.
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati 2/ed 2 Copyright © The McGraw.
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Liste.
Esercizi su alberi binari
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Esercizi su alberi binari di ricerca
Esercizi su strutture dinamiche Fondamenti di Programmazione Canale AD a.a. 2009/2010.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – Ver. aggiornata al 9 Maggio 2012.
Allocazione dinamica della memoria
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Laboratorio di Linguaggi lezione XI: I/O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Esercizi su alberi binari
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
Strutture di controllo nel C
Politecnico di Milano Esercizi Stringhe Ricerca binaria.
Esercizi di riepilogo sul linguaggio C: file, puntatori, liste
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
File di testo, file binari
Le liste dinamiche La ricorsione
I File.
Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…),
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
Corso di informatica Athena – Periti Informatici
1 Gestione dei File. 2 Perché i file? Sono strutture dati persistenti Sono solitamente memorizzati sui dischi –Si usano dall'interno dei programmi Realizzano.
Unità Didattica 3 Linguaggio C
Programmazione di Calcolatori
C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
Esercizi su File.
Esercizi Liste.
Esercizi Liste.
Quattro Esercizi su File e Liste
Esercizio (tde ) Si progetti e codifichi una funzione C che riceve in ingresso un vettore di liste definite typedef struct Node { int numero; struct.
Grafi Rappresentazione mediante liste di adiacenza:
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni – BCOR Ingegneria Elettronica – BELR Introduzione al C Esercitazione 5 D. Bloisi, A.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Programmazione in linguaggio C
Esercitazioni su liste
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 13 e 14 GESTIONE DEI FILE A) Nozioni sulla gestione dei.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Transcript della presentazione:

Esercizi su File e Liste

Esercizio Si progetti e codifichi un programma C che apre il file di testo input.txt e genera il file di testo output.txt, che contiene, in ordine inverso ma inalterate, le sole linee di input.txt che hanno lunghezza compresa tra 10 e 20 caratteri (ignorando le altre linee). A tale scopo, il programma alloca una lista dinamica che contiene le linee da trasferire, genera il file scandendo la lista e la dealloca prima di terminare. Si usi la seguente definizione della lista: typedef struct EL { char linea[21]; struct EL * next; } Nodo; typedef Nodo * Lista; Si provi a costruire la lista nel modo più semplice che permetta poi di generare facilmente l'output Si può assumere che l'ultima linea di input.txt termini con '\n' e che nessuna linea superi i 255 caratteri

Essendo chiaramente assai più complicato (e inutile) scandire il file un carattere alla volta, scandisco il file di input una linea per volta con fgets() o con fscanf(…”%s”…), controllo subito se ogni linea è da trasferire, e nel caso la inserisco in testa alla lista dinamica, in un nodo appositamente allocato. Così facendo, al termine del file di input la lista in memoria contiene le linee già in ordine inverso: il file di output si genera con una semplice scansione lineare, durante la quale si dealloca la lista. int main () { FILE * fp; char buffer[256]; // max 255 caratteri + 1 per il '\0' Lista lis = NULL, tmp; if ( (fp=fopen("input.txt","r")) == NULL ) // Selezione linee da tenere return -1; while( fgets( buffer, 256, fp ) != NULL ) if ( strlen(buffer) >= 10 && strlen(buffer) <= 20 ) insTesta(&lis, buffer); close(fp); if ( (fp=fopen("output.txt","w")) == NULL ) return -2; while ( lis != NULL ) { // Man mano che trascrivo, dealloco fputs( lis->linea , fp ); tmp = lis; lis = lis->next; free(tmp); } return 0; void insTesta( Lista *lista, char * line ) { // Normale inserimento in Lista tmp = *lista; // testa con assegnamento *lista = (Lista) malloc(sizeof(Nodo)); // del "dato" con strcpy strcpy( (*lista)->linea, line ); (*lista)->next = tmp;

Esercizio (tde 14-9-2010) Le telecamere di un parcheggio multilivello riconoscono le targhe di ogni auto in ingresso. Se la targa è contenuta nel file credito.txt (formattato come nel riquadro) e il credito è di almeno 2,50 €, la funzione int checkin(char * targa) restituisce 1, altrimenti restituisce 0 (e una botola risucchia l’auto in un pozzo senza fondo). Si codifichi in C la funzione checkin

int checkin(char. targa) { FILE int checkin(char * targa) { FILE * f; char line[100], plaque[8]; float credit; if( (f = fopen("credito.txt", "r")) == NULL ) return -1; while( fgets(line, 100, f) != NULL ) { sscanf(line, "%s%f", plaque, &credit); if( strcmp(targa,plaque) == 0 && credit >= 2.50 ) { fclose(f); return 1; } return 0;

Esercizio (continua) Le auto ammesse leggono su un display il piano a cui devono recarsi, che è calcolato automaticamente dal sistema come il primo che abbia almeno un posto libero. La struttura dati del sistema è la seguente typedef struct Car { char * targa; struct Car * next; } Auto; typedef Auto * Lista; typedef struct Level { int postiliberi; Lista macchine; struct Level * next; } Piano; typedef Piano * ListaDiListe; dove ogni piano è pieno se il suo attributo postiliberi vale 0 e vuoto se la sua lista macchine è vuota. Si codifichi in C la funzione int assegnapiano(ListaDiListe L, char * targa), che restituisce il numero del piano oppure -1 se non c’è posto. La funzione alloca anche il nodo corrispondente all’auto entrata

Vediamo prima una semplice soluzione iterativa int assegnapiano(ListaDiListe L, char * targa) { int p = 1; while( L != NULL && L->postiliberi == 0 ) { L = L->next; p++; } if( L == NULL ) return -1; L->macchine = instesta(L->macchine, targa); (L->postiliberi)--; return p; Lista instesta(Lista L, char * targa) { Lista punt; punt = (Lista)malloc(sizeof(Auto)); punt->targa = (char *)malloc(8); // 7 caratteri per la targa, uno per /0 strcpy(punt->targa,targa); punt->next = L; return punt;

E anche una semplice soluzione ricorsiva, usando la stessa funzione di servizio int assegnapiano(ListaDiListe L, char * targa) { int p; if( L == NULL ) return -1; if( L->postiliberi <= 0 ) { if( (p = assegnapiano(L->next, targa)) < 0 ) return -1; else return p + 1; } L->macchine = instesta(L->macchine, targa); (L->postiliberi)--; return 1;

Esercizio (continua) Si gestisca con la funzione ...checkout( ... ) l’uscita di un’auto dal parcheggio, in modo da lasciare la struttura dati in uno stato consistente. La funzione non si occupa dell’addebito del costo del parcheggio. Le soluzioni sostanzialmente ricorsive ricevono un punto di bonus

Possiamo definire due funzioni di servizio (ricorsive) direttamente ispirate a quelle viste a lezione per trovare e cancellare un’auto in una lista semplice (la lista macchine di ogni piano). int find(Lista cars, char * targa) { if( cars == NULL ) return 0; if( strcmp(cars->targa, targa) == 0 ) return 1; return find(cars->next, targa); } Lista remove(Lista cars, char * targa) { Lista punt; if( Lista != NULL ) if( strcmp(cars->targa, targa) == 0 ) { punt = cars->next; free(cars->targa); // era stata allocata una stringa dinamica free(cars); return punt; else { cars–>next = remove(cars->next, targa); return cars; else

E usarle in una funzione (ricorsiva) che in ogni piano del parcheggio prima verifica se c’è la macchina, e se la trova la dealloca e aggiorna il contatore dei posti liberi in quel piano. void checkout(ListaDiListe L, char * targa) { Lista cars; if( L == NULL ) printf("\n Nessuna traccia della macchina!\n"); else if( find(L, targa) ) { L->macchine = remove(L->macchine, targa); (L->numeroposti)++; } else checkout(L->next, targa);