Cifrario di cesare

di il
3 risposte

Cifrario di cesare

MI è stato assegnato questo esercizio del cifrario di cesare, dove la chiave di criptaggio ovvero il salto da eseguire deve essere casuale, il problema che non mi funziona quando digito tipo "casa"
l'indice di c è 2 ed esce una chiave come 20 superando quindi la lunghezza dell'alfabeto, cercavo quindi una soluzione per far cominciare a girare di nuovo l'alfabeto dalla lettera a ed assegnare quindi la corrispondente lettera, perchè superato l'indice di z mi da simboli che non c'entrano nulla. Grazie in anticipo

#include <stdio.h>
#include <string.h>
void cesare (char s,int salto)
{
char alfabeto[21]={'a','b', 'c', 'd' ,'e' ,'f' ,'g' ,'h' ,'i' ,'l' ,'m' ,'n', 'o', 'p' ,'q', 'r', 's' ,'t' ,'u', 'v' ,'z'} ;
int i;
for(i=0;i<21;i++)
{
if(s==alfabeto)
{
printf ("%c",alfabeto[i+salto]);
break;
}
}
}
int main()

{
char cript[100];
int S,lung,i;
printf("Inserisci la parola da criptare > ");
scanf("%­s",cript);
S=rand()%21; //S è il salto che dovrà eseguire nella criptazione
lung=strlen(cript);
for (i=0;i<lung;i++)
{
cesare(cript,S);
}
return 0;
}

3 Risposte

  • Re: Cifrario di cesare

    L'operazione di modulo (%) può darti il concetto di circolarità che credi.
  • Re: Cifrario di cesare

    L'operazione modulo (%) ti fornisce il resto di una divisione. 30 % 9 = 3;

    Vedo che lo hai usato anche nel rand quindi credo tu sappia a cosa serva...

    Questo ti serve per rendere circolare una particolare struttura (in questo caso il tuo array). Perchè se tu giustamente dopo il salto vai fuori dall'indice massimo dell'array hai bisogno che in qualche modo dopo il max ritorni a 0. Il modulo ti aiuta proprio in questo. Se nel tuo caso come hai detto hai c e ti esce 20, l'indice nuovo sarebbe 22 che andrebbe oltre il tuo array, aggiungendo invece l'operatore di modulo (equazione_che_ti_serve % 21) fai in modo che si ripetano gli indici che servono a te (nel tuo caso 22 % 21 = 1, quindi sarebbe b).

    Spero di essere stato chiaro.
  • Re: Cifrario di cesare

    Eduadie ha scritto:


    L'operazione modulo (%) ti fornisce il resto di una divisione. 30 % 9 = 3;

    Vedo che lo hai usato anche nel rand quindi credo tu sappia a cosa serva...

    Questo ti serve per rendere circolare una particolare struttura (in questo caso il tuo array). Perchè se tu giustamente dopo il salto vai fuori dall'indice massimo dell'array hai bisogno che in qualche modo dopo il max ritorni a 0. Il modulo ti aiuta proprio in questo. Se nel tuo caso come hai detto hai c e ti esce 20, l'indice nuovo sarebbe 22 che andrebbe oltre il tuo array, aggiungendo invece l'operatore di modulo (equazione_che_ti_serve % 21) fai in modo che si ripetano gli indici che servono a te (nel tuo caso 22 % 21 = 1, quindi sarebbe b).

    Spero di essere stato chiaro.
    Grazie mille sei stato chiarissimo!!
Devi accedere o registrarti per scrivere nel forum
3 risposte