Salve ragazzi sono di nuovo qui a chiedervi un aiuto.
Se avete un po di tempo leggete, grazie
Sono alle prese con un progetto di programmazione 1:la codifica e decodifica polialfabetica.
devo scrivere un programma in C nel quale in ingresso si inserisce una frase ed in uscita avremo un codice crittografato secondo alcune condizioni definite dalla traccia. Il programma andrà a sostituire i caratteri della frase,opportunamente accoppiati a due a due, con quelli presenti in una matrice
2D di sostituzione.
Io il programma l'ho scritto e
funziona pure ma, per comodità mia e anche perche non sapevo gestire altrimenti, ho usato un
vettore monodimensionale, trattandolo come un 2D con indice di riga e di colonna attraverso lo schema di memorizzazione, e non uno
bidimensionale, e proprio qui sorge il problema.
Il professore mi ha detto di attenermi alla traccia e di usare uno 2D.
Ora sono un po in difficoltà perchè mi perdo un po' quando devo iniziare ad usare puntatori e indirizzi,non riesco a gestirli bene.
la traccia è la seguente
Cifratura/decifratura
Si vuole sviluppare un programma per la cifratura/decifratura di un messaggio.
Sviluppare una coppia di algoritmi, implementati come function, per crittografare
e decrittografare un messaggio. L’algoritmo si basa sulla cosiddetta cifratura
polialfabetica, che consiste nel trasformare il messaggio in un testo di lunghezza
maggiore o uguale a quella del messaggio, detto il “testo cifrato”, utilizzando una
matrice di caratteri (prefissata), detta “matrice di sostituzione”. Il messaggio da
crittografare viene dapprima partizionato in coppie di lettere adiacenti; se in tale
partizionamento accade che una coppia è formata dalla stessa lettera, allora si
inserisce una X tra le due. Per esempio, il messaggio è LET US MEET AT
NOON viene partizionato in LE TU SM EX ET AT NO ON. Si è inserito una X
tra le due E, ma non tra le due O, che si trovano in coppie diverse. Si consideri la
seguente matrice di sostituzione:
8 J E Q D N 5 O
P U 3 A R F L W
4 V C 2 T M B I
K 7 Z S G X H Y
Ogni coppia di lettere viene crittografata nel seguente modo:
a. se le lettere sono nella stessa riga della matrice di sostituzione, le due
lettere da inserire nel testo cifrato saranno le lettere immediatamente a
destra nella stessa riga. Ogni riga è considerata circolare. Per esempio, la
coppia TI viene crittografata come M4.
b. se le lettere sono nella stessa colonna della matrice di sostituzione, le due
lettere da inserire nel testo cifrato saranno le lettere immediatamente sotto
nella stessa colonna. Ogni colonna è considerata circolare. Per esempio, la
coppia RG viene crittografata come TD.
c. se le lettere appaiono in differenti righe e colonne della matrice di
sostituzione, ognuna delle due lettere sarà crittografata con la lettera nella
stessa riga ma nella colonna dell’altra lettera.. Per esempio, la coppia LE
viene crittografata come 35.
Il messaggio LET US MEET AT NOON viene quindi crittografato in
35VRX2NZDCR25885.
Il main legge da tastiera il messaggio da crittografare (l’equivalente di LET US
MEET AT NOON nell’esempio), chiama la function di cifratura (passando come
parametro il messaggio e la matrice di sostituzione), che restituisce il teso cifrato,
visualizza il testo cifrato, chiama la function di decifratura, passando come
parametro il testo cifrato e la matrice di sostituzione, visualizza il messaggio
decifrato, che deve coincidere con il messaggio di partenza. Usare solo lettere
maiuscole. Usare le stringhe per rappresentare il messaggio e il testo crittografato
e decrittografato Fare una versione alternativa del main, in cui la matrice di
sostituzione è una permutazione casuale della matrice precedente, usando la
function rand(), il cui prototipo è in <stdlib.h>, per generare gli interi
casuali per lo scambio a coppie di elementi della matrice. Nella Relazione si
deve riportare l’analisi della complessità di tempo dell’algoritmo (operazione
dominante: confronto)
il codice del mio programma è il seguente
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define RIG 4
#define COL 8
#define DIM_MESS 1000
#define DIM_COD 2000
void popola_matrice(char *,int );
void stampa_matrice(char *);
void codifica(char *,char *,char *,int *,int *);
void decodifica(char *,char *,char *,int *,int *);
void verifica(char *,char *);
int main()
{
char matrix[RIG*COL],codice[DIM_COD],mess[DIM_MESS],decifratura[DIM_MESS];
int scelta=0,posx[DIM_COD],posbs[DIM_COD];
printf("Quale matrice di cifratura vuoi utilizzare:\n1)Semplice\n2)Permutata\n");
fflush(stdin);
while(scelta!=1 && scelta!=2)
scanf("%d",&scelta);
popola_matrice(matrix,scelta);
printf("Vuoi stampare la matrice di sostituzione?\n1)Si\n2)No\n");
scelta=0;
fflush(stdin);
while(scelta!=1 && scelta!=2)
scanf("%d",&scelta);
if (scelta==1) stampa_matrice(matrix);
printf("Inserisci un messaggio da codificare\n");
fflush(stdin);
gets(mess);
printf("Messaggio:%s\n",mess);
codifica(codice,mess,matrix,posx,posbs);
printf("Codificato:%s\n",codice);
decodifica(decifratura,codice,matrix,posx,posbs);
printf("Decodificato:%s\n",decifratura);
verifica(mess,decifratura);
return 0;
}
void popola_matrice(char *m,int scelta)
{
char temp;
int i,j,i1,j1,m2[RIG*COL],scambi=0,trovato=0;
srand((unsigned int)time(NULL));
strcpy(m,"8JEQDN5OPU3ARFLW4VC2TMBIK7ZSGXHY");
for(i=0;i<RIG;i++)
{
for(j=0;j<COL;j++)
m2[COL*i+j]=0;
}
if (scelta!=1)
{
while(scambi<(RIG*COL/2))
{
trovato=0;
while(!trovato)
{
i=rand()%RIG;
j=rand()%COL;
if (!m2[COL*i+j])
{
trovato=1;
m2[COL*i+j]=1;
}
}
trovato=0;
while(!trovato)
{
i1=rand()%RIG;
j1=rand()%COL;
if (!m2[COL*i1+j1])
{
trovato=1;
m2[COL*i1+j1]=1;
}
}
temp=m[COL*i+j];
m[COL*i+j]=m[COL*i1+j1];
m[COL*i1+j1]=temp;
scambi++;
}
}
}
void stampa_matrice(char *matrix)
{
int i,j;
for (i=0;i<RIG;i++)
{
for (j=0;j<COL;j++)
printf("%c ",matrix[COL*i+j]);
printf("\n");
}
}
void codifica(char *cod,char *mess,char *matrix,int *posx,int *posbs)
{
int i,j,lcod=0,cond=0,h,k,r1=0,r2=0,c1=0,c2=0;
lcod=strlen(mess);
for(i=0;i<lcod;i++)
cod[i]=mess[i];
for (i=0;i<DIM_COD;i++)
posx[i]=0;
for(i=0;i<DIM_COD;i++)
posbs[i]=0;
for(i=0;i<lcod;i++) //salvataggio indici posizioni degli spazi
{
if(cod[i]==' ')
posbs[i]=1;
}
for(i=0;i<lcod;i++)//elimino gli spazi
{
if(cod[i]==' ')
{
for(j=i;j<lcod;j++)
cod[j]=cod[j+1];
lcod--;
}
}
i=0;
cond=0;
//Inserimento delle 'X' tra gli accoppiamenti
while(!cond && i<lcod)
{
if(i%2==0 && /*i<lcod &&*/ cod[i+1]==cod[i])
{
lcod++;
for(j=lcod-1;j>i;j--)
cod[j]=cod[j-1];
posx[i+1]=1;
cod[i+1]='X';
cond=1;
}
if (cond==1)
i=0;
else
i++;
}
//cod[lcod]=0;
//Sostituzione
for (i=0;i<lcod;i++)
{
if(i%2==0 && i<lcod-1)
{
for(h=0;h<RIG;h++)
{
for(k=0;k<COL;k++)
{
if(cod[i]==matrix[COL*h+k])
{
r1=h;
c1=k;
}
if(cod[i+1]==matrix[COL*h+k])
{
r2=h;
c2=k;
}
}
}
if(r1==r2)//STESSA RIGA
{
cod[i]=matrix[COL*r1+((c1+1)%COL)];
cod[i+1]=matrix[COL*r1+((c2+1)%COL)];
}
if(c1==c2)//STESSA COLONNA
{
cod[i]=matrix[COL*((r1+1)%RIG)+c1];
cod[i+1]=matrix[COL*((r2+1)%RIG)+c1];
}
if(r1!=r2 && c1!=c2)//DIVERSI
{
cod[i]=matrix[COL*r1+c2];
cod[i+1]=matrix[COL*r2+c1];
}
}
}
cod[lcod]=0;
}
void decodifica(char *decod,char *cod,char *matrix,int *posx,int *posbs)
{
int lcod,i,j,r1=0,r2=0,c1=0,c2=0,h,k;
lcod=strlen(cod);
for (i=0;i<lcod;i++)
{
if(i<lcod-1 && i%2==0)
{
for(h=0;h<RIG;h++)
{
for(k=0;k<COL;k++)
{
if(cod[i]==matrix[COL*h+k])
{
r1=h;
c1=k;
}
if(cod[i+1]==matrix[COL*h+k])
{
r2=h;
c2=k;
}
}
}
if(r1==r2)//STESSA RIGA
{
cod[i]=matrix[COL*r1+((c1+(COL-1))%COL)];
cod[i+1]=matrix[COL*r1+((c2+(COL-1))%COL)];
}
if(c1==c2)//STESSA COLONNA
{
cod[i]=matrix[COL*((r1+(RIG-1))%RIG)+c1];
cod[i+1]=matrix[COL*((r2+(RIG-1))%RIG)+c1];
}
if(r1!=r2 && c1!=c2)//DIVERSI
{
cod[i]=matrix[COL*r1+c2];
cod[i+1]=matrix[COL*r2+c1];
}
}
} //TOGLIE LE X
for(i=0;i<lcod;i++)
{
if(cod[i]=='X' && posx[i])
{
for(j=i;j<lcod;j++)
cod[j]=cod[j+1];
lcod--;
}
}
for(i=0;i<lcod;i++)
{
if(posbs[i])
{
lcod++;
for(j=lcod-1;j>=i;j--)
{
cod[j+1]=cod[j];
if(j==i)
cod[j]=' ';
}
}
}
cod[lcod]=0;
strcpy(decod,cod);
}
void verifica(char *mess,char *dec)
{
int sbagliato=0,i,dim;
if(strlen(mess)!=strlen(dec))
{
printf("Errore: la decifratura non ha lo stesso size del messaggio.\n");
}
else
{
i=0;
dim=strlen(mess);
while(!sbagliato && i<dim)
{
if(mess[i]!=dec[i])
{
sbagliato=1;
}
else
i++;
}
if (!sbagliato)
printf("Decifratura corretta.\n");
else
printf("Errore decifratura.\n");
}
}
mi potete aiutare a modificare il programma in modo che tratti un array 2D anche con tutte le eventuali chiamate per gli indici
grazie
ps. ho la consegna del progetto tra 2 giorni