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

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

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

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

Piero Scotto - C14 1

C14 #11 Gestione dei file di

testo, matrici e struct

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

Piero Scotto - C14 2

Finalità del corso

Finalità del corso

Finalità del corso

Finalità del corso

Finalità del corso

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

Piero Scotto - C14 3

Il cifrario di CesareSi 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).

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

Piero Scotto - C14 4

#define MAXSTRING 80#define LETTEREALFABETO 26int 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);

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

Piero Scotto - C14 5

#include<stdio.h>#include<ctype.h>#include<string.h>#include<stdlib.h>#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);

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

Piero Scotto - C14 6

/* 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<l; i++) { c = riga[i]; /* metto il carattere i-esimo in c */ if (isupper(c)) /* maiuscola */ { c += codice; if (c > '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;}

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

Piero Scotto - C14 7

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.

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

Piero Scotto - C14 8

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

Piero Scotto - C14 9

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

Piero Scotto - C14 10

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

Piero Scotto - C14 11

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

Piero Scotto - C14 12

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

Piero Scotto - C14 13

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

Piero Scotto - C14 14

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

Piero Scotto - C14 15