Esercizi. Codifica file di testo

Размер: px
Начинать показ со страницы:

Download "Esercizi. Codifica file di testo"

Транскрипт

1 Politecnico di Milano Esercizi Esercizi di riepilogo sul linguaggio C: file, puntatori, liste Codifica file di testo Utilizzando la codifica di Cesare, scrivere un programma in grado di criptare e decriptare un file di testo Il programma chiederà all utente il nome del file da elaborare, il nome del file in cui scrivere il risultato, l operazione da effettuare (codifica o decodifica) ed il codice

2 #include <stdio.h> #include <string.h> Codifica file di testo const unsigned int CRIPTA = 0; const unsigned int DECRIPTA = 1; void codificacesare (char *car, unsigned int k, unsigned int azione) int temp; Codifica file di testo if (azione == CRIPTA) *car = *car - 'a'; temp = *car + k; if (temp < 26) *car = temp; else *car = temp - 26; *car = *car + 'a';

3 Codifica file di testo else /* decripta */ *car = *car - 'a'; temp = *car - k; if (temp >= 0) *car = temp; else *car = temp + 26; *car = *car + 'a'; Codifica file di testo void codificafile(char nfilein[], char nfileout[], unsigned int cod, unsigned int oper) FILE *filein, *fileout; char car; filein = fopen (nfilein, "r"); fileout = fopen (nfileout, "w"); fscanf (filein, "%c", &car); while (!feof(filein)) codificacesare (&car, cod, oper); fprintf (fileout, "%c", car); fscanf (filein, "%c", &car); fclose (filein); fclose (fileout);

4 Codifica file di testo void main() char nomefilein[100], nomefileout[100]; unsigned int codice, operazione; printf ("File input: "); scanf ("%s", nomefilein); printf ("File output: "); scanf ("%s", nomefileout); printf ("Codice: "); scanf ("%u", &codice); printf ("0=cripta, 1=decripta: "); scanf ("%u", &operazione); codificafile (nomefilein, nomefileout, codice, operazione); Elimina tag HTML Il programma legge un file di testo contenente una pagina HTML, elimina i tag presenti e salva il testo in un altro file. I tag scartati saranno visualizzati sul monitor. Miglioramenti: Scrivere solo il testo che si trova in <body> </body> Scrivere i tag in modo più leggibile: uso sotto l altro con i simboli < e > - 8-4

5 #include <stdio.h> Elimina tag HTML void eliminatag (char nomefilehtml[], char nomefiletesto[]) typedef enum tag, testo, errore TipoStato; FILE *dochtml, *doctesto; char car; TipoStato stato = testo; dochtml = fopen (nomefilehtml, "r"); if (dochtml == NULL) printf ("File %s non trovato\n", nomefilehtml); return; Elimina tag HTML doctesto = fopen (nomefiletesto, "w"); fscanf (dochtml, "%c", &car); while (!feof(dochtml) && stato!= errore) if (stato == testo) switch (car) case '<': stato = tag; break; case '>': stato = errore; break; default: fprintf (doctesto, "%c", car); break;

6 Elimina tag HTML else if (stato == tag) switch (car) case '<': stato = errore; break; case '>': stato = testo; break; default: printf ("%c", car); break; fscanf (dochtml, "%c", &car); fclose (doctesto); fclose (dochtml); Elimina tag HTML void main() char nomefilehtml[255], nomefiletesto[255]; printf ("Nome file HTML: "); scanf ("%s", nomefilehtml); printf ("Nome file testo: "); scanf ("%s", nomefiletesto); eliminatag (nomefilehtml, nomefiletesto);

7 Archivio film Il programma dovrà permettere all utente, tramite un menù, di gestire un archivio di film Dovranno essere disponibili le seguenti operazioni: 1. L utente inserisce un certo numero di film: Codice identificativo numerico e titolo (senza spazi) L inserimento della lista di film è terminato immettendo uno codice pari a zero 2. L utente inserisce un codice e l elaboratore verifica se il corrispondente film è presente nel file (ed in questo caso ne scrive i dati sul monitor) Utilizzare l algoritmo di ricerca binaria e l algoritmo bubble-sort E se usassimo l ordinamento per inserzione? Archivio film: ricerca binaria Valore della variabile inizio Valore della variabile medio Valore della variabile fine Posizione iniziale all apertura del file Posizione dopo fseek() archivio = fopen ("pippo", "rb"); fseek (archivio, -sizeof(film), SEEK_END); inizio = 0; fine = ftell(archivio) / sizeof(film); medio = (inizio + fine) / 2;

8 Archivio film #include <stdio.h> typedef struct unsigned int codice; char titolo[100]; Film; void ordina (char nomefile[]) typedef enum falso, vero Booleano; FILE *archivio; Film filmcorrente, filmsuccessivo; unsigned int numfilm, i; Booleano scambio; Archivio film /* "r+b" permette di leggere/scrivere su file binario esistente */ archivio = fopen (nomefile, "r+b"); fseek (archivio, -sizeof(film), SEEK_END); /* calcola numero di film inseriti nel file */ numfilm = ftell (archivio) / sizeof(film) + 1 ; do scambio = falso; /* si riporta a inizio file */ fseek (archivio, 0, SEEK_SET);

9 Archivio film for (i = 0; i < numfilm - 1; i++) fread (&filmcorrente, sizeof(film), 1, archivio); fread (&filmsuccessivo, sizeof(film), 1, archivio); if (filmcorrente.codice > filmsuccessivo.codice) /* sposta testina due record all'indietro */ fseek(archivio,-2*sizeof(film), SEEK_CUR); fwrite (&filmsuccessivo, sizeof(film),1, archivio); Archivio film fwrite (&filmcorrente, sizeof(film), 1, archivio); scambio = vero; while (scambio); fclose (archivio);

10 Archivio film void inserisci (char nomefile[]) FILE *archivio; Film nuovofilm; /* apertura file per scrivere in append */ archivio = fopen (nomefile, "ab"); printf ("Codice film diverso da 0: "); scanf ("%u", &nuovofilm.codice); if (nuovofilm.codice!= 0) printf ("Titolo film: "); scanf ("%s", nuovofilm.titolo); Archivio film while (nuovofilm.codice!= 0) fwrite (&nuovofilm, sizeof(nuovofilm), 1, archivio); printf ("Codice film diverso da 0: "); scanf ("%u", &nuovofilm.codice); if (nuovofilm.codice!= 0) printf ("Titolo film: "); scanf ("%s", nuovofilm.titolo); fclose (archivio); ordina (nomefile); /* riordina tutto il file */

11 Archivio film void cerca (char nomefile[]) typedef enum falso, vero Booleano; Booleano trovato = falso; FILE *archivio; Film filmcorrente; unsigned int codcercato; int inizio, fine, medio; printf ("Codice cercato: "); scanf ("%u", &codcercato); archivio = fopen (nomefile, "rb"); inizio = 0; fseek (archivio, -sizeof(film), SEEK_END); fine = ftell (archivio) / sizeof(film); Archivio film do medio = (inizio + fine) / 2; fseek (archivio, medio * sizeof(film), SEEK_SET); fread (&filmcorrente, sizeof(filmcorrente), 1, archivio); if (codcercato < filmcorrente.codice) fine = medio - 1; else if (codcercato > filmcorrente.codice) inizio = medio + 1;

12 Archivio film else trovato = vero; while (!trovato && inizio <= fine); if (trovato) printf ("Trovato in posiz: %u\n", medio); printf("codice: %u\n",filmcorrente.codice); printf("titolo: %s\n",filmcorrente.titolo); else printf ("Non trovato!\n"); fclose (archivio); Archivio film unsigned int menu () unsigned int scelta; printf ("1. Inserisci elenco film\n"); printf ("2. Cerca film\n"); printf ("3. Esci\n"); printf ("\nscelta: "); scanf ("%u", &scelta); return scelta;

13 Archivio film void main() char nomearchivio[] = "numeri.dat"; unsigned int n; do n = menu(); switch (n) case 1: inserisci (nomearchivio); case 2: while (n!= 3); break; cerca (nomearchivio); break; Riepilogo sui file Le funzioni fscanf(), fread(), fprintf(), fwrite() leggono/scrivono a partire dalla posizione corrente della testina all interno del file Dopo l operazione, la testina si sposta in avanti di una quantità di byte pari al numero di byte letti/scritti Il tipo del dato letto dal file deve essere in accordo con quanto la funzione si aspetta: Se un file contiene una stringa e lo leggo con: fscanf (file, "%d", &varintera); la variabile varintera conterrà un valore scorretto! Idem per quanto riguarda fread()

14 Riepilogo sui file Uso di sizeof() con fread() e fwrite(): Quando leggo/scrivo variabili che non siano vettori, uso il nome della variabile: int v; fread (&v, sizeof(v), 1, ilfile); Quando leggo/scrivo variabili vettore, uso: Il nome della variabile, per leggere/scrivere tutto il vettore in un colpo solo: int vet[10]; fread (vet, sizeof(vet), 1, ilfile); Il nome del tipo, per leggere/scrivere solo una cella del vettore: int vet[10], i = 0; fread (&vet[i], sizeof(int), 1, ilfile); Riepilogo sui file File di testo o binari? Quando è richiesto di leggere/scrivere delle variabili strutturate, si usano i file binari Quando è richiesto di spostarsi all interno del file (fseek()), si usano i file binari Quando è richiesto di leggere/scrivere stringhe di caratteri, si usano (tipicamente) file di testo Quando scrivo con fprintf(), leggo con fscanf(), quando scrivo con fwrite(), leggo con fread()

15 Puntatori char *p, s[]= xyz ; p = s; p x y z \0 s int *p2; p2 = 23; oppure int *p3; *p3 = 23; oppure int *p4, var; p4 = &var; *p4 = 23; p2 p p3 99 Es. di valore casuale 23 var Indirizzo: 23? Indirizzo: Puntatori Dato il seguente frammento di programma C: int *p1, *p2, x, y; x = 10; y = 20; p1 = &x; p2 = p1; *p1 = 5; p2 = &y; y = 30; *p2 = *p1 + *p2; *p1 = *p1 + x; Disegnare il valore di tutte le variabili al termine dell esecuzione di ogni riga. Le variabili x e y si trovano, rispettivamente, nelle celle di memoria di indirizzo 1000 e

16 Puntatori int *p1, *p2, x, y; x = 10; y = 20; p1 = &x; p2 = p1; p1 x y p2????? 10??? 10 20? ? Puntatori *p1 = 5; p2 = &y; y = 30; *p2 = *p1 + *p2; *p1 = *p1 + x; p1 x y p

17 Le liste dinamiche Le liste dinamiche: operazioni tipiche Inserimento di un elemento: In testa alla lista In coda alla lista In un punto generico (equivale ad inserire in testa ad una sotto-lista) Cancellazione di un elemento: Dalla testa Dalla coda Da un punto generico (equivale a cancellare la testa di una sotto-lista) Cancellazione totale della lista Ricerca Stampa della lista Ordinamento

18 Le liste dinamiche: definizione #include <stdio.h> #include <stdlib.h> struct Elem int dato; struct Elem *prox; ; typedef struct Elem ElementoLista; typedef ElementoLista *Lista; Le liste dinamiche: libreria di funzioni Lista inserisciintesta (Lista lista, int dato); Lista inserisciincoda (Lista lista, int dato); Lista cancellatesta (Lista lista); Lista cancellacoda (Lista lista); Lista cancellalista (Lista lista); Lista cercainlista (Lista lista, int dato); void scrivilista (Lista lista); In un caso reale, sostituirò int con il tipo che mi interessa Per esempio, potrei definire il tipo CartaIdentita e costruire quindi un lista di carte di identità

19 Le liste dinamiche: il main void main() unsigned int num, i; int d, cercato; Lista lamialista, elem; /* Nessuna limitazione a priori! */ printf ("Quanti dati? "); scanf ("%u", &num); for (i = 0; i < num; i++) printf ("Dato: "); scanf ("%d", &d); lamialista=inserisciincoda(lamialista,d); printf ("Dato da cercare: "); scanf ("%d", &cercato); Le liste dinamiche: il main scrivilista(lamialista); elem = cercainlista (lamialista, cercato); if (elem!= NULL) printf ("Dato cercato: %d\n", elem->dato); else printf ("Dato non trovato\n"); lamialista = cancellatesta (lamialista); scrivilista(lamialista); lamialista = cancellacoda (lamialista); scrivilista(lamialista); lamialista = cancellalista (lamialista); scrivilista(lamialista);

20 Le liste dinamiche: inserisci in testa Lista inserisciintesta (Lista lista, int dato) Lista nuovoelem; nuovoelem=(lista)malloc(sizeof(elementolista)); nuovoelem->dato = dato; nuovoelem->prox = lista; return nuovoelem; Dopo ogni inserimento, lista (il puntatore alla testa della lista) viene modificato Le liste dinamiche: inserisci in coda Lista inserisciincoda (Lista lista, int dato) Lista nuovoelem, cursore; nuovoelem=(lista)malloc(sizeof(elementolista)); nuovoelem->dato = dato; nuovoelem->prox = NULL; if (lista == NULL) return nuovoelem; else cursore = lista; while (cursore->prox!= NULL) cursore = cursore->prox; cursore->prox = nuovoelem; return lista;

21 Le liste dinamiche: inserisci in coda Due casi: Lista vuota il nuovo elemento è il primo della lista; la funzione ne ritorna l indirizzo Lista non vuota arriva all ultimo elemento e vi appende il nuovo. Nel secondo caso, lista non viene modificato La funzione deve comunque ritornare qualcosa: ritorna lista Le liste dinamiche: cancella la testa Lista cancellatesta (Lista lista) Lista temp; temp = lista->prox; free (lista); return temp; Dopo ogni cancellazione, lista (il puntatore alla testa della lista) viene modificato

22 Le liste dinamiche: cancella la coda Lista cancellacoda (Lista lista) Lista cursore; if (lista == NULL) return lista; else if (lista->prox == NULL) free (lista); return NULL; Le liste dinamiche: cancella la coda else cursore = lista; while (cursore->prox->prox!= NULL) cursore = cursore->prox; free (cursore->prox); cursore->prox = NULL; return lista;

23 Le liste dinamiche: cancella la coda Tre casi: Lista già vuota non fa nulla Lista composta da un solo elemento la testa punta a NULL Lista composta da più elementi il penultimo punta a NULL Le liste dinamiche: cancellazione totale Lista cancellalista (Lista lista) Lista temp, cursore; cursore = lista; while (cursore!= NULL) temp = cursore->prox; free (cursore); cursore = temp; return cursore; Come potrei definirla usando le funzioni cancellatesta() o cancellacoda()?

24 Le liste dinamiche: ricerca Lista cercainlista (Lista lista, int dato) Lista cursore; int trovato = 0; cursore = lista; while (cursore!= NULL && trovato == 0) if (cursore->dato == dato) trovato = 1; else cursore = cursore->prox; if (trovato == 1) return cursore; else return NULL; Le liste dinamiche: ricerca Ricerca lineare: parto dal primo elemento e vado avanti Non molto efficiente (la ricerca binaria è molto più veloce) Ma, posso fare diversamente? Liste accesso sequenziale!

25 Le liste dinamiche: scrivi lista void scrivilista (Lista lista) Lista cursore; printf ("Inizio lista\n"); cursore = lista; while (cursore!= NULL) printf ("%d\n", cursore->dato); cursore = cursore->prox; printf ("Fine lista\n"); Le liste dinamiche: conclusione Allocazione dinamica il programmatore non è obbligato a porre dei limiti al numero di dati da memorizzare in RAM Prendo spazio quando serve, usando la malloc() Libero spazio quando posso, usando la free() Scomodo i vettori sono più facili da usare Non esistono pasti gratis!!! Accesso solo sequenziale Idem come sopra!!!

Esercizi. Stringhe. Stringhe Ricerca binaria

Esercizi. Stringhe. Stringhe Ricerca binaria Politecnico di Milano Esercizi Stringhe Stringhe Array di caratteri Funzioni: strcpy() strcmp() strlen() char stringaa[10], stringab[10]; strcpy(stringaa, stringab); Copia if (strcmp(stringaa, stringab)

Подробнее

Gestione dei file. File di testo e binari

Gestione dei file. File di testo e binari Gestione dei file Un file e definito come un oggetto, presente nel file system, costituito da una sequenza continua di bytes Un file, per poter essere utilizzato, deve essere aperto Successivamente e possibile

Подробнее

Esercizi. La funzione swapint() primo tentativo

Esercizi. La funzione swapint() primo tentativo Politecnico di Milano Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio di array. #include

Подробнее

Gestione dei File in C

Gestione dei File in C Gestione dei File in C Maurizio Palesi DIIT Università di Catania Viale Andrea Doria 6, 95125 Catania [email protected] http://www.diit.unict.it/users/mpalesi Sommario In questo documento saranno introdotte

Подробнее

Esercitazione 11. Liste semplici

Esercitazione 11. Liste semplici Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene

Подробнее

Esercizi. Filtraggio

Esercizi. Filtraggio Politecnico di Milano Esercizi Preparazione alla prima prova intermedia Filtraggio L utente inserisce un array di numeri reali non negativi (un numero negativo indica la fine della fase di inserimento)

Подробнее

Linguaggio C. Esercizio 1

Linguaggio C. Esercizio 1 Linguaggio C Esercizi su puntatori e liste Walter Didimo (e-mail:[email protected]) supplemento al Corso di Calcolatori Elettronici (Riccardo Torlone) 1 Esercizio 1 Siano p e q due puntatori a variabili

Подробнее

Esercizi C su array e matrici

Esercizi C su array e matrici Politecnico di Milano Esercizi C su array e matrici Massimo, media e varianza,, ordinamento, ricerca e merge, matrice simmetrica, puntatori Array Array o vettore Composto da una serie di celle int vett[4]

Подробнее

Strutture dati dinamiche

Strutture dati dinamiche Strutture dati dinamiche - Liste concatenate - Pile -> LIFO (last in first out) - Code -> FIFO (first in first out) - Alberi binari: gestione dati in algoritmi complessi Liste Concatenate Formata da elementi

Подробнее

Gestione dei file in C

Gestione dei file in C Gestione dei file in C Fondamenti di Informatica Che cos è un file e a cosa serve? Memoria di massa vs memoria centrale q La memoria di massa (disco fisso) è un dispositivo di memorizzazione generalmente

Подробнее

L'Allocazione Dinamica della Memoria nel linguaggio C

L'Allocazione Dinamica della Memoria nel linguaggio C L'Allocazione Dinamica della Memoria nel linguaggio C Prof. Rio Chierego [email protected] http://www.riochierego.it/informatica.htm Sommario Questo documento tratta l'allocazione dinamica della memoria

Подробнее

Strutture Dinamiche. Fondamenti di Informatica

Strutture Dinamiche. Fondamenti di Informatica Strutture Dinamiche Fondamenti di Informatica 1 Indice Allocazione e de-allocazione di memoria Liste e loro gestione Companies, srl 2 Allocazione e cancellazione di memoria malloc (sizeof (TipoDato));

Подробнее

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Подробнее

Gestione dei File. dischi nastri cd

Gestione dei File. dischi nastri cd Gestione dei File Per mantenere disponibili i dati tra le diverse esecuzioni di un programma, questi si devono archiviare in file su memoria di massa (dati persistenti): dischi nastri cd Un file è un astrazione

Подробнее

Gestione dei files. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni Via Leopardi 132

Gestione dei files. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni Via Leopardi 132 Gestione dei files Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni Via Leopardi 132 Struttura del disco fisso Un disco fisso è composto da una serie di piatti sovrapposti Ogni piatto è

Подробнее

Strutture Dati Dinamiche

Strutture Dati Dinamiche Strutture Dati Dinamiche Motivazioni Le variabili considerate fino a questo punto devono essere dichiarate staticamente, ossia la loro esistenza, il loro nome e la loro dimensione devono essere previsti

Подробнее

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste 4 Le liste collegate 4.0 Le liste collegate c Diego Calvanese Fondamenti di Informatica Corso di Laurea in Ingegneria Elettronica A.A. 2001/2002 4.0 0 4 Le liste collegate Rappresentazione di liste 4.1

Подробнее

Prof. G. Ascia. Gestione dei File C

Prof. G. Ascia. Gestione dei File C Gestione dei File C 1 Generalità Il linguaggio C non contiene alcuna istruzione di Input/Output. Tali operazioni vengono svolte mediante chiamate a funzioni definite nella libreria standard contenute nel

Подробнее

I files in C. A cura del prof. Ghezzi

I files in C. A cura del prof. Ghezzi I files in C A cura del prof. Ghezzi 1 Perchè i files? Realizzano la persistenza dei dati dati che sopravvivono all esecuzione del programma Sono delle strutture di dati sequenziali 2 Files e S.O. I files

Подробнее

Laboratorio di Programmazione

Laboratorio di Programmazione Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 21 Strutture dinamiche Gli array ci permettono di memorizzare un insieme di dati dello stesso tipo Deve essere noto staticamente il

Подробнее

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Dipartimento di Elettronica, Informazione e Bioingegneria Informatica B Sezione D Franchi Alessio Mauro,

Подробнее

Gestione di files Motivazioni

Gestione di files Motivazioni Gestione di files Motivazioni Un programma in esecuzione legge (sequenzialmente) una sequenza di caratteri prodotti "al volo" dall'utente (tramite tastiera) il programma in esecuzione scrive (sequenzialmente)

Подробнее

Esercizio 1 (15 punti)

Esercizio 1 (15 punti) Esercizio 1 (15 punti) Corsi di laurea in Ingegnera Elettronica e Ingegneria Gestionale Fondamenti di Programmazione / Fondamenti di Informatica I Prova scritta del 16 giugno 2017 Il noto gioco MasterMind

Подробнее

Esercizi C sui tipi definiti dall utente

Esercizi C sui tipi definiti dall utente Politecnico di Milano Esercizi C sui tipi definiti dall utente Typedef,, tipi enumerativi e strutturati Sinonimi: typedef int Intero; Intero a; int b; Definire un nuovo tipo typedef char Stringa[10]; Stringa

Подробнее

Linguaggio C: i file

Linguaggio C: i file Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica A - GES Prof. Plebani A.A. 2006/2007 Linguaggio C: i file La presente dispensa e da utilizzarsi ai soli fini didattici previa

Подробнее

File binari e file di testo

File binari e file di testo I file File binari e file di testo distinzione tra file binari file di testo si possono usare funzioni diverse per la gestione di tipi di file diversi Programmazione Gestione dei file 2 File binari e file

Подробнее

File e puntatori a file

File e puntatori a file File e puntatori a file Vitoantonio Bevilacqua [email protected] La libreria stdio.h mette a disposizione delle funzioni che hanno la peculiarità di trattare con questa nuova tipologia di

Подробнее

STRINGHE: ARRAY DI CARATTERI! a p e \0

STRINGHE: ARRAY DI CARATTERI! a p e \0 STRINGHE: ARRAY DI CARATTERI! Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più

Подробнее