Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Cifrario di Cesare - cesare.c

cesare.c

Caricato da: Red
Scarica il programma completo

  1. /*
  2. Titolo:Cifrario di Cesare
  3. Created by Red U.G.O.System
  4. */
  5. /*librerie*/
  6. #include <stdio.h>
  7. #include <string.h>
  8.  
  9. /*prototipi*/
  10. int CODIFICA(char nome1[], char nome2[]);
  11. int DECODIFICA(char nome1[]);
  12. void NOME(char nome1[],char nuovo_nome[]);
  13. char CONTROLLO(char app, int chiave, int tipo);
  14. int CIFRA(int code,int chiave,int lim_inf,int lim_sup);
  15. int DECIFRA(int code,int chiave,int lim_inf,int lim_sup);
  16.  
  17. /*funzione principale che tre operazioni:
  18.     se riceve:
  19.     -cesare nomeFile.txt chiave
  20.       va alla codifica del testo
  21.     -cesare nomeFile.cdc
  22.       va alla decodifica del testo
  23.     -se la sintassi è sbagliata finisce il programma
  24. */
  25. int main (int argc, char *argv[]){
  26.     if (argc==3){
  27.         CODIFICA(argv[1], argv[2]);
  28.     }/*if*/
  29.     else{  
  30.         if (argc==2){
  31.             DECODIFICA(argv[1]);
  32.         }/*if*/    
  33.         else{
  34.             printf ("Sintassi corretta:\n cesare nomeFile.txt chiave\n oppure\n cesare nomeFile.cdc");
  35.             return 1;
  36.         }/*else*/
  37.     }/*else*/
  38. return 0;
  39. }/*main*/
  40.  
  41. /*funzione che cifra il testo contenuto nel file .txt che:
  42.     -controlla che la chiave è compresa tra 1 e 26
  43.     -apre il file .txt in lettura
  44.     -cambia l'estensione del file in .cdc e lo apre in scrittura
  45.     -scrive nel primo carattere del file .cdc la chiave sotto forma di lettera
  46. */
  47. int CODIFICA(char nome1[], char nome2[]){
  48.     FILE *ptesto, *pcodice;
  49.     int i, chiave,lettera;
  50.     char app,nuovo_nome[30];            
  51.    
  52.     chiave=atoi(nome2);
  53.     if (chiave<1||chiave>26){
  54.         printf("La chiave deve essere compresa tra 1 e 26");
  55.         return 1;
  56.     }/*if*/    
  57.      
  58.     if ((ptesto=fopen (nome1, "r"))== NULL){
  59.         printf ("Impossibile leggere file %s", nome1);
  60.         return 3;
  61.     }/*if*/
  62.    
  63.     NOME(nome1,nuovo_nome);
  64.     if ((pcodice=fopen(nuovo_nome,"w"))==NULL){
  65.         printf ("Impossibile creare file .cdc");
  66.         fclose(ptesto);
  67.         return 2;
  68.     }/*if*/
  69.    
  70.     lettera=chiave+96;/*sommo 96 per scrivere la chiave come lettera*/
  71.     fprintf(pcodice,"%c",lettera);
  72.     while((app=fgetc(ptesto))!= EOF){
  73.         app= CONTROLLO(app, chiave,0);
  74.         fputc(app,pcodice);
  75.     }/*while*/
  76.     fclose (ptesto);
  77.     fclose (pcodice);
  78. }/*CODIFICA*/
  79.  
  80. /*funzione cambia l'estensione del file:
  81.     -se esso è .txt diventerà .cdc
  82.     -se esso è .cdc diventerà .txt
  83. */
  84. void NOME(char nome1[],char nuovo_nome[])
  85. {
  86.     char app[40];
  87.     int lung;
  88.    
  89.     strcpy(app,nome1);
  90.     lung=strlen(app);
  91.     if(app[lung-3]=='c')
  92.         app[lung-3]='t';
  93.     else
  94.         app[lung-3]='c';
  95.        
  96.     if(app[lung-2]=='d')
  97.         app[lung-2]='x';
  98.     else
  99.         app[lung-2]='d';
  100.        
  101.     if(app[lung-1]=='c')
  102.         app[lung-1]='t';
  103.     else
  104.         app[lung-1]='c';
  105.    
  106.     strcpy(nuovo_nome,app);
  107. }/*NOME/
  108.  
  109. /*funzione che controlla a quale delle 5 classi appartiene il carattere:
  110.   minuscole,maiuscole,punteggiature,spazio e invio,e il resto.
  111.   La funzione riceve una variabile tipo che:
  112.       -se ha il valore 0 permette il passaggio alla funzione CIFRA
  113.       -se ha il valore 1 permette il passaggio alla funzione DECIFRA
  114. */
  115. char CONTROLLO(char app, int chiave, int tipo)
  116. {
  117.     int code;
  118.     int lim_inf,lim_sup;
  119.     code=app;
  120.     if(app!=32&&app!='\n'){
  121.         if(code>32&&code<65){
  122.             lim_inf=33;
  123.             lim_sup=64;
  124.             code=(tipo==0?CIFRA(code,chiave,lim_inf,lim_sup):DECIFRA(code,chiave,lim_inf,lim_sup));
  125.         }/*if*/
  126.         else{
  127.             if(code>64&&code<91){
  128.                 lim_inf=65;
  129.                 lim_sup=90;
  130.                 code=(tipo==0?CIFRA(code,chiave,lim_inf,lim_sup):DECIFRA(code,chiave,lim_inf,lim_sup));
  131.             }/*if*/
  132.             else{
  133.                 if(code>96&&code<123){
  134.                     lim_inf=97;
  135.                     lim_sup=122;
  136.                     code=(tipo==0?CIFRA(code,chiave,lim_inf,lim_sup):DECIFRA(code,chiave,lim_inf,lim_sup));
  137.                 }/*if*/
  138.             }/*else*/
  139.         }/*else*/
  140.     }/*if*/                      
  141.     return code;
  142. }/*CONTROLLO*/
  143.  
  144. /*funzione che trasforma il carattere letto nel file .txt nel relativo
  145.   carattere cifrato*/
  146. int CIFRA(int code,int chiave,int lim_inf,int lim_sup)
  147. {    
  148.     code+=chiave;              
  149.     if(code>lim_sup){
  150.         code=(code-lim_sup)+lim_inf-1;/*sottraggo 1 perchè il limite inferiore
  151.                                         comprende già una lettera*/
  152.     }/*if*/
  153.     return code;
  154. }/*CIFRA*/    
  155.  
  156.  
  157. /*funzione che decifra il testo contenuto nel file .cdc che:
  158.     -apre il file .cdc in lettura
  159.     -ricavo la chiave dal primo carattere del file .cdc
  160.     -cambia l'estensione del file in .txt e lo apre in scrittura
  161. */
  162. int DECODIFICA(char nome1[]){
  163.     FILE *ptesto, *pcodice;
  164.     int i, chiave;
  165.     char app,lettera,nuovo_nome[30];            
  166.    
  167.              
  168.     if ((pcodice=fopen (nome1, "r"))== NULL){
  169.         printf ("Impossibile leggere file %s", nome1);
  170.         return 3;
  171.     }/*if*/
  172.    
  173.     lettera=fgetc(pcodice);
  174.     chiave=lettera-96;/*tolgo 96 per ottenere un numero*/
  175.    
  176.     NOME(nome1,nuovo_nome);
  177.     if ((ptesto=fopen(nuovo_nome,"w"))==NULL){
  178.         printf ("Impossibile creare file .txt");
  179.         fclose(pcodice);
  180.         return 2;
  181.     }/*if*/
  182.    
  183.     while((app=fgetc(pcodice))!=EOF){
  184.         app= CONTROLLO(app, chiave,1);
  185.         fputc(app,ptesto);
  186.     }/*while*/
  187.     fclose (ptesto);
  188.     fclose (pcodice);
  189. }/*DECODIFICA*/
  190.    
  191. /*funzione che trasforma il carattere letto nel file .cdc nel relativo
  192.   carattere decifrato*/    
  193. int DECIFRA(int code,int chiave,int lim_inf,int lim_sup)
  194. {
  195.     if((code-chiave)<lim_inf){
  196.         chiave=(code-chiave)-lim_inf;
  197.         code=lim_sup+chiave+1;/*sommo 1 perchè il limite superiore
  198.                                 comprende già una lettera*/  
  199.     }/*if*/
  200.     else
  201.         code-=chiave;
  202.     return code;
  203. }/*DECIFRA*/