La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Piero Scotto - C141 C14 #11 Gestione dei file di testo, matrici e struct.

Presentazioni simili


Presentazione sul tema: "Piero Scotto - C141 C14 #11 Gestione dei file di testo, matrici e struct."— Transcript della presentazione:

1 Piero Scotto - C141 C14 #11 Gestione dei file di testo, matrici e struct

2 Finalità del corso Piero Scotto - C142

3 3 Il cifrario di Cesare Si scriva un programma che cifri/decifri un file di testo in base ad un codice segreto. Il programma deve chiedere il nome del file di input, il nome del file di output e il codice segreto (un numero intero). La cifratura avviene sostituendo le sole lettere (maiuscole e minuscole separatamente) con altre lettere in base al valore del codice. Il valore del codice indica di quanti caratteri si deve traslare ciascuna delle lettere: se ad es. il codice è 3, allora A --> D, B --> E,... X --> A, Y --> B, Z --> C. La corrispondenza completa delle lettere maiuscole (per le minuscole è analogo) è: Ad esempio, con codice=3 Ciao diventa Fldr. Si noti che per decifrare un testo basta inserire come codice il valore opposto a quello usato per la cifratura (qui –3).

4 Piero Scotto - C144 #define MAXSTRING 80 #define LETTEREALFABETO 26 int main() { int codice, i, l; int c; char riga[MAXSTRING]; /* riga da cifrare e un vettore di 80 caratteri */ char FileIN[FILENAME_MAX]; char FileOUT[FILENAME_MAX]; /* FILE *fpIN, *fpOUT; printf("Input file: "); gets(FileIN); if ( (fpIN = fopen(FileIN, "r")) == NULL ) { fprintf(stderr, "Impossibile aprire il file: %s\n", FileIN); return EXIT_FAILURE; } printf("Output file: "); gets(FileOUT); if ( (fpOUT = fopen(FileOUT, "w")) == NULL ) { fprintf(stderr, "Impossibile aprire il file: %s\n", FileOUT); return EXIT_FAILURE; } printf("Codice: "); scanf("%d", &codice);

5 Piero Scotto - C145 #include #define MAXSTRING 80 #define LETTEREALFABETO 26 int main() { int codice, i, l; int c; char riga[MAXSTRING]; /* riga da cifrare */ char FileIN[FILENAME_MAX]; /* FILENAME_MAX e la massima lunghezza di un file, costante di stdio.h */ char FileOUT[FILENAME_MAX]; FILE *fpIN, *fpOUT; /* fpIN e fpOUT sono dei puntatori ai file che leggo e che scrivo */ printf("Input file: "); gets(FileIN); if ( (fpIN = fopen(FileIN, "r")) == NULL ) { fprintf(stderr, "Impossibile aprire il file: %s\n", FileIN); return EXIT_FAILURE; } /* una possibile modalita di apertura del file in lettura con segnalazione di errore */ printf("Output file: "); gets(FileOUT); if ( (fpOUT = fopen(FileOUT, "w")) == NULL ) { fprintf(stderr, "Impossibile aprire il file: %s\n", FileOUT); return EXIT_FAILURE; } /* una possibile modalita di apertura del file in scrittura con segnalazione di errore */ printf("Codice: "); scanf("%d", &codice);

6 Piero Scotto - C146 /* I valori utili per codice sono da 0 a 25, ad es. 26 equivale a 0, 27 a 1, etc. quindi conviene riportare il codice fornito dall'utente come ad un valore tra 0 e 25 calcolando il resto di (codice % 26). Lo standard pero' non garantisce che l'operatore % mantenga il segno nel risultato, quindi lo si calcola sempre come valore positivo e poi si cambia di segno al risultato se codice era negativo */ codice = (codice>=0 ? +1 : -1) * (abs(codice) % LETTEREALFABETO); while (fgets(riga, MAXSTRING, fpIN) != NULL) /* ciclo while fino alla fine del file */ { l = strlen(riga); /* misuro la lunghezza della riga, cioe quanti sono i caratteri */ for (i=0; i 'Z') /* sfora a destra */ c -= LETTEREALFABETO; else if (c < 'A') /* sfora a sinistra */ c += LETTEREALFABETO; riga[i] = (char)c; /* operazione di casting su c */ } else if (islower(c)) /* minuscola */ { c += codice; if (c > 'z') c -= LETTEREALFABETO; else if (c < 'a') c += LETTEREALFABETO; riga[i] = (char)c; } fputs(riga, fpOUT); /* metto la riga modificata sul file fpOUT */ } fclose(fpIN); fclose(fpOUT); return EXIT_SUCCESS; }

7 Piero Scotto - C147 E opportuno mettere il file di testo nella directory di dev- cpp o del compilatore e ricordarsi il nome. Se mandiamo in esecuzione il file e indichiamo testo.txt ovvero Quel ramo del lago di Como, che volge a mezzogiorno, tra due catene non interrotte di monti, tutto a seni e a golfi, a e testo2.txt come file di output con codice 35 otteniamo: Zdnu ajvx mnu ujpx mr Lxvx, lqn exupn j vniixprxawx, caj mdn ljcnwn wxw rwcnaaxccn mr vxwcr, cdccx j bnwr n j pxuor, j Se poi usiamo testo2.txt come testo di input e testo3.txt come testo di output scrivendo come codice -35 abbiamo nuovamente il testo iniziale.

8 Piero Scotto - C148

9 9

10 10

11 Piero Scotto - C1411

12 Piero Scotto - C1412

13 Piero Scotto - C1413

14 Piero Scotto - C1414

15 Piero Scotto - C1415


Scaricare ppt "Piero Scotto - C141 C14 #11 Gestione dei file di testo, matrici e struct."

Presentazioni simili


Annunci Google