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.