Complessità di tempo(operazione confronto)a fine discussione

di il
8 risposte

Complessità di tempo(operazione confronto)a fine discussione

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

8 Risposte

  • Re: Complessità di tempo(operazione confronto)a fine discussione

    Cosa c'è in questa dichiarazione della funzione e della matrice 2D che non va?
    PRECOMPILATORE
    ......
    void popola_matrice(char *,int );
    .....
    
    
    
    CHIAMATA DI FUNZIONE NEL MAIN
    ....
    popola_matrice(&matrix[0][0],scelta);
    ......
    
    
    FUNZIONE
    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));
            *m={{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}};
            ......
    
    mi da un errore quando inizializzo l'array *m


    error: expected expression before '{' token
  • Re: Complessità di tempo(operazione confronto)a fine discussione

    Intanto devi usare gli apici ' ' per i caratteri e in secondo luogo puoi inizializzare la matrice nel main
    
       char matrix[RIG][COL] = {
    							{'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'}
    					 };
    
  • Re: Complessità di tempo(operazione confronto)a fine discussione

    Giusto anche gli apici..comunque lo stesso mi da l'errore
    perche non posso inizializzarla nella function passandola come parametro?
  • Re: Complessità di tempo(operazione confronto)a fine discussione

    Visto che ho la funzione popola matrice volevo inizializzarla lì, ma i puntatori a m vanno bene vero?
    e allora perche mi da l'errore
  • Re: Complessità di tempo(operazione confronto)a fine discussione

    Non puoi inizializzarla nella funzione a partire dall'argomento. Devi assegnare i singoli valori e non va bene il puntatore. Il parametro sarà

    int m[RIG][COL]

    e scriverai

    m[0][0]='8';

    e così via
  • Re: Complessità di tempo(operazione confronto)a fine discussione

    Fatto, tutto risolto!
    ora il programma funziona di nuovo bene.
    Mi manca solamente un ultimissima cosa:la traccia richiede anche un analisi della complessità di tempo con operazione dominante CONFRONTO
    non so proprio dove mettere mano!
    grazie fin ad ora!!
    attendo vostre risposte in merito
  • Re: Complessità di tempo(operazione confronto)a fine discussione

    Ragazzi, nessuno sa aiutarmi?
    ve ne sarei molto grato se scambiassimo qualche messaggio riguardo la complessità di tempo.
  • Re: Complessità di tempo(operazione confronto)a fine discussione

    Che classe di complessità ha la funzione codifica, con operazione dominante il confronto?
    se qualcuno me la fa anche capire come si fa a vederla

    questa è la funzione
    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 && 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;
    }
    
Devi accedere o registrarti per scrivere nel forum
8 risposte