Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - pacosn1111

#41
Creo que estás usando el while como si fuese un condicional y no como un bucle, me parece muy mala práctica.
#42
Hola a tod@s, me propuse escribir un programa que ordenara un array en otro array, he intentado ya de todo pero me sigue dando el mismo fallo, en vez de ordenar el array correctamente me genera un "222222222".

El código fuente es este:


#include <stdlib.h>
#include <stdio.h>

void ordenar_array(int [], int []);
int comprobar_repetir_vector(int, int []);

int main() {

  int num_array[]={5, 8, 7, 3, 1, 6, 2, 4, 9};
  int num_result[9];
  ordenar_array(num_array, num_result);

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

    printf("%d", num_result[x]);

  }

}

void ordenar_array(int num_array[], int num_result[]) {

int aux=num_array[0];
int len=sizeof(num_array);

  for(int x=0;len+1>x;x++) {

    for(int y=0;len+1>y;y++) {

      if (num_array[y]<aux && comprobar_repetir_vector(num_array[y], num_result)==0) {


        aux=num_array[y];

      }

    }

  num_result[x]=aux;

  }

}

int comprobar_repetir_vector(int numero, int vector[]){

int x;
int len=sizeof(vector);
for(x=0; x<len+1;x++) {

if(numero==vector[x]) {

return 1;

}
}
return 0;
}


Gracias de antemano.

Saludos.
#43
Si, que ya estaba solucionado, pero sin darme cuenta he generado una cita en blanco.

Saludos.
#44
Cita de: engel lex en 20 Mayo 2015, 22:56 PM
el codigo tiene una lista de errores...

1-
Código (cpp) [Seleccionar]
char aleatorio[cifras+1];

debe ser 1 más de largo para que puedas colocarle el caracter de terminación

2-
aquí es raro que no te diera error... estás accediendo a una posición invalida
Código (cpp) [Seleccionar]
aleatorio[cifras+1]='\0';


debe ser
Código (cpp) [Seleccionar]
aleatorio[cifras]='\0';

Gracias, solucionado.

ya que el ciclo es x menor que cifras (nunca llega a cifras)

3-
lo tipico  con la linea 21 y el switch es que
int eleccion=(int)(rand() % 3)

y que el switch empieze en 0... sin embargo el metodo funciona, ya que se evalua primero el "%" y luego "+"

pero en 25, 28 y 31 tienes un error...
los array son de 26 y 10 de largo..

cuando haces
aleatorio[x]=num[rand() % 9+1];

se toma un numero entre 0 y 8, luego le sumas 1... así que "a", "A" y "0" nunca se darán


#45
Gracias por tu respuesta, pero ya lo he corregido y sigue dando el mismo fallo.
#46
Hola a tod@s, acabo de escribir un simple código en C que te pregunta con un scanf de cuantos caracteres quieres la clave y te genera una clave aleatoria con mayusculas minusculas y números aleatorios, cuando uso un numero de caracteres alto como 25 todo va bien, pero cuando uso uno pequeño, como 5, obtengo lo siguiente:

x81Zw@

Es decir, esa arroba de más no se por que me aparece, dejo aquí el código:


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

void main() {

srand(time(NULL));

int cifras, x;
char min[]="abcdefghijklmnopqrstuvwxyz";
char may[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char num[]="0123456789";

printf("Escribe el número de cifras del string a crear...");
scanf("%d", &cifras);
printf("\n");

char aleatorio[cifras];

for(x; x<cifras; x++) {
int eleccion=(int)(rand() % 3+1);

switch ( eleccion ) {
case 1:
aleatorio[x]=min[rand() % 25+1];
break;
case 2:
aleatorio[x]=may[rand() % 25+1];
break;
case 3:
aleatorio[x]=num[rand() % 9+1];
break;
default:
continue;
}

aleatorio[cifras+1]='\0';
}
printf("%s\n", aleatorio);
}


Saludos.
#47
Te faltan las llaves que engloba lo que está  dentro de los condicionales, no me explico como compila, te dejo el código corregido:


#include <stdio.h>
int main()
{
int user=1024;
int pass=4567;
int useru,passu;

printf("Introduce tu nombre de usuario. \n");
scanf("%d",&useru);
do
{
if (useru!=user)
                       {
printf("Prueba de nuevo. \n");
scanf("%d",&useru);
                       }
}
while (useru!=user);

printf("Escribe tu contraseña. \n");
scanf("%d",&passu);
do
{
if (passu!=pass)
                     {
printf("Vuelve a intentarlo. \n");
scanf("%d",&passu);
                     }
}
while (passu!=pass);

printf("Accediendo al sistema... \n");
return 0;
}


PD: Estas llaves SOLO no son necesarias cuando el contenido del if es únicamente UNA instrucción, en el resto de casos como este si son obligatorias.
#48
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.
#49
Hola a todos, ya casi he conseguido crear snakecode (aunque arranca bastante lenta la funcion arrancar_motor), solo me falta conseguir que cifre y descifre, he creado las funciones pero algo estoy haciendo mal por que no funcionan bien, dejo el código 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 []);
int comprobar_repetir_matriz(int, 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() {


generar_clave(32);
arrancar_motor(32, 20);

cifrar(32, 20, "prueba");
printf("%El mensaje cifrado es:\n %s\n", cifrado);
descifrar(32, cifrado);
printf("El mensaje descifrado es:\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(int n, double numero, double matriz[][1000]) {

int x;
int y;
for(x=0; x<n-1; x++) {

for(y=0;y<1000;y++) {

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 n, int numero, int vector[]){

int x;
for(x=0; x<n-1;x++) {

if(numero==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;


}

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) {


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(x, 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[]) {

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){

srand(time(NULL));

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])) < pow(1, -9999999999999)) && (comprobar_repetir_matriz(z, 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];
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(suma(atof(auxiliar))==clave[z]) {

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

}

}

}

}

}



Me da violación de segmento la función cifrar.

Para que veais mas o menos lo que debe de hacer os dejo el mismo algoritmo en python, lo escribí hace tiempo y funciona perfecto, es mas hasta arranca más rapido, lo estoy portando a C por cuestiones didácticas mas que nada:

Código (python) [Seleccionar]

# -*- encoding: utf-8 -*-

#snakecode is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
   #the Free Software Foundation, either version 3 of the License, or
   #(at your option) any later version.

   #SnakeCode is distributed in the hope that it will be useful,
   #but WITHOUT ANY WARRANTY; without even the implied warranty of
   #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   #GNU General Public License for more details.
   #
   #You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.


#constantes

maxr=120
minr=60

import random

#Devuelve la suma de las cifras de un numero

def suma(numero):

resultado=0
while numero>0:
resultado+=numero%10
numero/=10
return resultado

#Genera una lista con Z numeros aleatorios de X cifras, cuyas cifras sumen Y cantidad

def generador_aleatorio(numero_de_suma, numero_de_cifras, cantidad_de_numeros):
max=""
min="1"
lista_numeros=[]

for x in range(0, numero_de_cifras):
max+="9"
for x in range(1, numero_de_cifras):
min+="0"

while cantidad_de_numeros>0:
var=random.randint(int(min), int(max))
if suma(var)==numero_de_suma and lista_numeros.count(var)==0:
cantidad_de_numeros-=1
lista_numeros.append(var)
print var
return lista_numeros

# Genera una clave optimizada automáticamente devolviendo una lista, esa lista puede ser utilizada posteriormente al inicializar el motor con init

def generar_clave(nc):

maximo=nc*maxr/20
minimo=nc*minr/20

pass_random=[]

while len(pass_random)<28:

var=random.randrange(minimo, maximo)
if pass_random.count(var)==0:
pass_random.append(var)

return pass_random

# Inicializa el motor, el primer parámetro es el numero de cifras y el segundo es la lista que contiene la clave, ambos parametros imprescindibles para cifrar y descifrar con exito, el tercer parámetro, que es opcional, es la cantidad de numeros por letra generados.

def init(nc, lista, nn=20):

global claves
global letras
global numero_cifras
numero_cifras=nc

claves={}
letras=( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "ñ", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", " ")
for y in range(0, 28):
print "inicializando letra ", letras[y]
claves[letras[y]]=generador_aleatorio(int(lista[y]), nc, nn)

print "se ha generado la clave", lista, "con un numero de cifras de", nc


#Devuelve un texto cifrado pasandole un texto en claro

def cifrar(texto):

cifrado=""
for x in texto:

cifrado+=str(random.choice(claves[x]))

return cifrado

#Devuelve un texto en claro pasandole un texto cifrado

def descifrar(cifrado):

separado=[]
for x in range(0, len(cifrado), numero_cifras):

separado.append(cifrado[x:x+numero_cifras])

texto=""

for x in separado:
for y in claves:

if suma(int(x))==suma(int(claves[y][0])):

texto+=y

return texto




Gracias de antemano.

Saludos.




Seré mas específico, la función que da violación de segmento esta:


void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {


int letra, letrass, x;
char cifrado_inside[strlen(texto)*numero_cifras];
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);

}





He logrado solucionarlo, pero ahora no cifra bien por que sale un caracter raro al principio de lo que está cifrado, es decir algo así:

@5206852228998504

El código que llevo ahora es este:

void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {


int letra, letrass, x;
char cifrado_inside[strlen(texto)*numero_cifras];
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);

}


Ayudadme por favor.

Saludos.




Ya lo he resuelto, gracias de todas formas.
#50
Cita de: T. Collins en 24 Abril 2015, 17:11 PM
strcat

char * strcat ( char * destination, const char * source );

Concatenate strings
Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.

Puedes poner esto antes del for:
num[0] = 0;

Gracias, solucionado!