Autor Tema: Crear palabras aleatorias a partir de una serie de caracteres en C (lenguajeC)  (Leído 4012 veces)

Reno92

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Programación en C

Buenos días,

Estoy metiéndome en el mundo de la programación, y me gustaría saber como realizar combinaciones de caracteres de orden aleatorio previamente definidos. Es decir,

Si tengo {@,&,$,#,%}

crear x combinaciones cambiando el orden de cada caracter aleatoriamente, por ejemplo:

primera
{@,$,%,#,&}
segunda
{&,$,@,%,#}
tercera
{%,&,$,@,#}

Así hasta x veces. He pensado en usar la funcion rand(), y también quiero emplear un temporizador  para dejar un espacio de tiempo entre una y otra combinación, o hacer que se pase a la combinación siguiente pulsando una tecla empleando la función  getch() o similar.

Tengo dificultades para la acción combinatoria de caracteres. ¿Vosotros cómo lo haríais? Comentadme sugerencias.

Gracias y saludos,

Reno92

« última modificación: 09 de Septiembre 2016, 09:48 de César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2228
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola!

Como veo que es tu primer mensaje en los foros remitirte a leer las indicaciones para escribir en los foros disponibles en http://www.aprenderaprogramar.com/foros/index.php?topic=1460.0 donde se explica cómo pegar código, cómo poner título a los temas, etc.

Si estás empezando con programación te recomiendo leer este hilo http://www.aprenderaprogramar.com/foros/index.php?topic=1313.0

Y para C consultar este curso: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=82&Itemid=210

Para ir dando pie a que se muestren nuevas combinaciones bastaría pedir al usuario que pulse una tecla o que indique si quiere continuar o no quiere continuar (para acabar el programa). En el curso que te he indicado hay ejemplos de esto.

Aquí te dejo un procedimiento de ejemplo aunque quizás te resulte demasiado complejo si estás empezando (yo optaría por seguir el curso primero y luego ir viendo cosas más complejas):

Código: [Seleccionar]
void gen_random(char *s, const int len) {
    static const char alphanum[] =     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 
    for (int i = 0; i < len; ++i) {
        s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
    }
 
    s[len] = 0;
}

Para el problema que has propuesto la idea podría ser: tienes 5 caracteres a los que le asignamos posición 0, 1, 2, 3 y 4.

Ahora generas un número aleatorio entre 0 y 4 (en el curso está explicado cómo), compruebas que no haya salido antes (con un condicional) y si es así lo añades al resultado como nueva combinación. Una vez creada la combinación, muestras el resultado y le pides al usuario que si quiere continuar.

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

Reno92

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Programa en c

Buenas Krall,

Has optado por crear una funcion para calcular la aleatoriedad, con dos variables, una de tipo char direccionada a un puntero (*S) y otra de tipo const int llamada len (supongo que hace referencia a la longitud del string). Despues declaras el array con todos los caracteres que se emplearan para realizar combinaciones. Pero a mi juicio el array lo declaras de una manera un poco extraña, empleando "static const char", nunca había visto esa declaración para una cadena de caracteres. ¿A que hace referencia el "static const", (¿ constante?) es imprescindible declarar el array empleando esa nomenclatura?
Luego empleas el for teniendo como índice int i, mientras que i sea menor que length-len (longitud del string) , el bucle se reitera una y otra vez e i++. ok y por último declaras la operación para calcular las combinaciones aleatorias,

Código: [Seleccionar]
s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
sizeof sirve para calcular la longitud del string, en este caso denominado alphanum, y le restas 1 porque el tipo de declaración con encomillado doble " ", hace que tanga por defecto el caracter "\0" de fin de cadena. Así , aludiendo que la cadena de caracteres prevamente declarada tiene un total 52 elementos ((27*2)-2 la ñ no se incluye, Mayusc y minusculas) esteableces el numero aleatorio con la funcion rand(), que seria rand()%51. De esta forma la variable puntero tipo char S almacena los elementos de cero a 51 del array. Empleas el índice i para asignar el valor a las respectivas posiciones de los elementos,
Así Sî[ i ], si i =3 y el rand de 0 a 51 resulta que es 2 se tiene que S[3]=C; y asi consigues las combinaciones.

lo que no me queda claro es porque empleas S[len]=0; , una vez que el i iguala a len el bucle finaliza no?

Bien declaro la función main y revoco la función que has hecho tu, así:

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int gen_random(char *s, const int len)
 {
    static const char alphanum[] =     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    for (int i = 0; i < len; i++) {
        s[i] = alphanum[rand()%(sizeof(alphanum) - 1)];   
        return s[i];
    }
 
}
 
int main()
 {
char string;
int len;
char *z;             /variable puntero para almacenar los datos de la revocacion de la funcion
len=3;

*z=&gen_random(string, len);   /se almacena s[i] de la función en *z
printf("%s", *z);                            /%s cadena de caracteres contenida en *z tras la 
               
                                                                       revocacion de la función
return 0;
}

He cambiado la funcion void gen_ rand por el tipo int, para devolver valor y posibilitar la revocación de la función. Estos son los errores que da el código:

gcc -Wall  -o "programa string lafanumerico" "programa string lafanumerico.c" -lncurses (en el directorio: /home/eduardo/Documentos/Programación/C++ programs)
programa string lafanumerico.c: In function ‘main’:
programa string lafanumerico.c:46:18: warning: passing argument 1 of ‘gen_random’ makes pointer from integer without a cast [-Wint-conversion]
   *z=&gen_random(string, len);
                  ^
programa string lafanumerico.c:28:5: note: expected ‘char *’ but argument is of type ‘char’
 int gen_random(char *s, const int len)
     ^
programa string lafanumerico.c:46:6: error: lvalue required as unary ‘&’ operand
   *z=&gen_random(string, len);
      ^
programa string lafanumerico.c:48:10: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
   printf("%s", *z);
          ^
programa string lafanumerico.c: In function ‘gen_random’:
programa string lafanumerico.c:36:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
Ha fallado la compilación.

Comentame, no estoy familiarizado con el uso de los punteros para leer y almacenar contenidos de otras variables. La sintaxis es errónea. Coméntame

Muchas gracias y saludos,

Reno 92

PD: s[ i ]   s[ i ] = alphanum[rand()%(sizeof(alphanum) - 1)];   s [  i  ] , no se porque desaparecen los corchetes y la i
« última modificación: 15 de Septiembre 2016, 10:17 de César Krall »

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 391
    • Ver Perfil
Hola Reno92 la [ i ] desaparece porque es el símbolo del editor del foro para introducir cursiva, entonces lo que hace si encuentra ese símbolo como texto es meter una cursiva y eliminarlo.

Para solucionar eso puedes hacer dos cosas: meter el código dentro de [code ] ...  [ / code], de esa manera lo considera código y no mete cursivas.

Otra opción es separar los corchetes poniendo s [ i ] ya no lo toma como cursiva

Saludos!

 

Esto es un laboratorio de ideas...
Aprender a programar

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".