In questa lezione implementeremo il cifrario di Cesare da file.

Nella scorsa lezione abbiamo implementato semplicemente l’algoritmo per il cifrario di Cesare inserendo un testo da tastiera lungo massimo 100 caratteri, potete consultare la lezione al link: il cifrario di Cesare in C.

Oggi ci occuperemo invece di scrivere un programma che simuli il cifrario di Cesare sia per il mittente che per il destinatario.

Il testo è salvato in un file, ad esempio di nome testo.txt. Il mittente, dopo averlo cifrato lo salva in un altro file di testo di nome testocifrato.txt.

Il destinatario legge il file testocifrato.txt, decifra il messaggio e lo salva nel file testodecifrato.txt.

Per semplicità consideriamo il messaggio senza spazi vuoti, senza accenti, senza punteggiatura, lungo 14 caratteri e tutto in maiuscolo.

Banner Pubblicitario

Immaginiamo dunque che nel file di testo ci sia scritto CODINGCREATIVO. Questo è dunque il testo che deve essere cifrato in base alla chiave digitata in input dal mittente.

Sviluppiamo quindi le seguenti funzioni:

void stampaAlfabeto(int c);
Si occupa di stampare l’alfabeto cifrato in base alla chiave fornita in input.

void messCifrato(char testo[n],int c);
Si occupa di cifrare la frase presa in input in base alla chiave fornita in input.

void messDecifrato(char testo[n],int c);
Si occupa di decifrare la frase presa in input in base alla chiave fornita in input.

Ecco l’algoritmo per il cifrario di Cesare da file:

#include <stdio.h>

#define n 14

void stampaAlfabeto(int c);
void messCifrato(char testo[n],int c);
void messDecifrato(char testo[n],int c);

int main(int argc, char *argv[]) {
     int c,i;
     char testo[n+1];
     FILE *input;
     FILE *input2;
 	
     do {
    	printf("--> MITTENTE\n\tInserisci la chiave: ");
    	scanf("%d",&c);  
     } while(c<=0 || c>26);
    
    stampaAlfabeto(c);  //stampa il nuovo alfabeto 
     
    input=fopen("Testo.txt","r");   //apriamo il file in lettura 
    fscanf(input,"%s",testo); 
    fclose(input);
    printf("\tTesto in chiaro letto da file: %s\n", testo);
    
    messCifrato(testo,c); 

    printf("\n-->DESTINATARIO \n");  
       
    input2=fopen("TestoCifrato.txt","r");    
    fscanf(input2,"%s",testo); 
    fclose(input2);
 
    printf("\tTesto cifrato letto dal file : %s\n", testo);
    messDecifrato(testo,c);
    printf("\n");

 	return 0;
}

void stampaAlfabeto(int c) {
	int i, cont=65;
 	char cifrato[26];

        printf("\tAlfabeto cifrato con chiave %d: \n\t", c); 
 	 	
 	for(i=0;i<26-c;i++) {
	   	cifrato[i]=cont+c;
    	        printf("%c ",cifrato[i]);
    	        cont++;
	}  
 	printf("\n\n");
}     


void messCifrato(char testo[n+1],int c) {	
	int i;  
	FILE *output;
	 	
 	for(i=0;i<n;i++)
	      if(testo[i]<'Z'-c)
			testo[i]+=c;		
    		else
        		testo[i]='A'+c-('Z'-testo[i])-1;
 
 	printf("\n");
 	output=fopen("TestoCifrato.txt","w"); //apro il file 
 	fprintf(output,"%s",testo);
 	fclose(output); 
 	printf("\tTesto cifrato scritto su file: %s\n", testo);
} 

void messDecifrato(char testo[n+1],int c) {	
	int i;
	FILE *output2;

 	for(i=0;i<n;i++)
 		if(testo[i]<'A'+c)
 			testo[i] = 'Z'-(c-(testo[i]-'A')-1);
 		else
 	 		testo[i]-=c;
	               
  	output2=fopen("TestoDecifrato.txt","w");
  	fprintf(output2,"%s",testo);
  	fclose(output2);
  	
  	printf("\tTesto decifrato scritto su file: %s\n", testo); 
} 

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Banner pubblicitario

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C