Vuelta a la desesperación con este código.

Iniciado por pacosn1111, 27 Abril 2015, 19:25 PM

0 Miembros y 1 Visitante están viendo este tema.

pacosn1111

Hola a tod@s, llevo toda la tarde dandole vueltas a por que no descifra mi código y es que ahora ni siquiera arranca por que genera los mismos numeros aleatorios para "generar_clave" por lo que se queda atascado en la función "comprobar_repetir_vector", por favor ayudadme llevo toda la tarde con este código y cada vez que toco algo arreglo una cosa y destrozo tres, estoy empezando en C, estaba acostumbrado a python y muchas cosas que antes no conocía ahora tengo que tenerlas en cuenta y me lio en mi propio código, bueno os dejo el codigo de lo que llevo:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <math.h>

// constantes

#define numero_de_letras 27

// variables globales

double claves[numero_de_letras][1000];
int clave[numero_de_letras];


// arrays globales
char letras[]="abcdefghijklmnopqrstuvwxyz ";
char cifrado[999999999];
char descifrado[999999999];

// prototipos de funciones
void generar_clave(int);
void ingresar_clave(int []);
int comprobar_repetir_vector(int, int []);
int comprobar_repetir_matriz(double, double [][1000]);
void arrancar_motor(int, int);
int suma(double);
double aleatorio(int, int);
double aleatorio_cifras(int);
void cifrar(int, int, char []);
void descifrar(int, char []);

int main() {

srand(getpid());
generar_clave(8);
arrancar_motor(8, 20);

cifrar(8, 20, "hola esto es una prueba de un texto cifrado");
printf("%s\n", cifrado);
descifrar(8, cifrado);
printf("El mensaje descifrado es:\n\n %s \n", descifrado);


}



// comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_matriz(double numero, double matriz[][1000]) {

int x;
int y;

for(x=0; x<numero_de_letras; x++) {

for(y=0;y<1000;y++) {
printf("pasa por aqui");
if (numero==matriz[x][y]) {

return 1;
}
}

}
return 0;

}

// comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_vector(int numero, int vector[]){

int x;
for(x=0; x<numero_de_letras;x++) {

if(numero==vector[x]) {
printf("\n%d\n", numero);
printf("\n%d\n", vector[x]);
return 1;

}
}
return 0;
}

// Devuelve la suma de las cifras de un numero
int suma(double numero) {

int resultado=0;
while (numero>0) {

resultado+=fmod(numero, 10);
numero/=10;
}
return resultado;
}

//Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
double aleatorio(int max, int min) {

return rand () % (max-min+1) + min;


}

//Genera un numero aleatorio de x cifras
double aleatorio_cifras(int cifras) {

int x;
int random;
char aux[2];
char num[cifras];

num[0]=0;
for(x=0; x<cifras; x++){

random=rand () % 10;

if((random==0) && (x==0)) { x--; continue;  }
sprintf(aux, "%d", random);
strcat(num, aux);

}
return atof(num);

}

//Genera una clave optimidada y la guarda en la variable global clave.
void generar_clave(int numero_suma) {

srand(getpid());

int maximo, minimo, x, y, num_random;

int max=120;
int min=60;

maximo=numero_suma*max/20;
minimo=numero_suma*min/20;


for(x=0;x<numero_de_letras;) {
num_random=aleatorio(maximo, minimo);
if (comprobar_repetir_vector(num_random, &clave[0])==1) {
continue;
}
clave[x]=num_random;
x++;
}

printf("se ha generado la clave: \n");
for(y=0;y<numero_de_letras;y++) {

printf("(%d)", clave[y]);

}
printf("\n");
}

// Permite ingresar el valor de cualquier array en la variable global clave.
void ingresar_clave(int array[]) {

srand(getpid());

int x;

for(x=0;x<numero_de_letras;x++) {

clave[x]=array[x];
}

}
// Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
void arrancar_motor(int numero_cifras, int cantidad_numeros){


int y, z, h;
double num_random;

for(z=0; z<numero_de_letras; z++) {
printf("Inicializando letra %c\n", letras[z]);
for(h=0; h<cantidad_numeros;) {
num_random=aleatorio_cifras(numero_cifras);
if (((fabs(suma(num_random)-clave[z])) < 0.00001) && (comprobar_repetir_matriz(num_random, claves))==0) {

claves[z][h]=num_random;
printf("%.0lf\n", num_random);
h++;



} else { continue;  }


}
}
printf("se ha generado la clave: \n");
for(y=0;y<numero_de_letras;y++) {

printf("(%d)", clave[y]);

}
printf("\ncon un numero de cifras de %d\n", numero_cifras);
}

// Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {


int letra, letrass, x;
char cifrado_inside[strlen(texto)*numero_cifras];
cifrado_inside[0] = 0;
char string_auxiliar[numero_cifras+1];
for(letra=0; strlen(texto)>letra; letra++) {


for(letrass=0; letrass<numero_de_letras; letrass++) {

if (texto[letra]==letras[letrass]) {

sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
strcat(cifrado_inside, string_auxiliar);
break;
}

}

}
strcpy(cifrado, cifrado_inside);

}

// Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
void descifrar(int numero_cifras, char cifrado[]) {


char auxiliar[numero_cifras];
int x, y=0, z;

for(x=0; x<strlen(cifrado); x++) {

auxiliar[y]=cifrado[x];
y++;


if(y==numero_cifras) {

for(z=0; z<numero_de_letras; z++) {

if(fabs(suma(atof(auxiliar))-clave[z]) < 0.00001) {

// printf("\n%d\n", suma(atof(auxiliar)));

descifrado[strlen(descifrado)]=letras[z];
y=0;
break;

}

}

}

}

}



Gracias de antemano.

Saludos.