Esercizi. Codifica file di testo
|
|
|
- Paolina Longo
- 9 anni fa
- Просмотров:
Транскрипт
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
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 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
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 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 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
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 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
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 - 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 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 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 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 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 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 Struttura del disco fisso Un disco fisso è composto da una serie di piatti sovrapposti Ogni piatto è
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 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
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 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 (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
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 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) 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
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
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
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 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! 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ù
