Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jaxoR en 12 Marzo 2014, 16:50 pm



Título: Me crashea el programa
Publicado por: jaxoR en 12 Marzo 2014, 16:50 pm
Bueno, mi problema es que el programa me crashea al poner 1 para que genere el codigo. El code no está terminado pero no puedo terminar de resolver eso:

Código
  1. int main()
  2. {
  3.    int a, i, j, k, f;
  4.    int b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  5.    char c[] = {'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', '\0'};
  6.    printf("==========================\n== Generador de codigos ==\n==========================\n\n* Ingrese 1 si quiere generar un codigo\n");
  7.    scanf("%i", &a);
  8.  
  9.    char letra[5];
  10.  
  11.    if (!(a = 1))
  12.    {
  13.        printf("Necesitas ingresar el numero 1 para generar un codigo\n");
  14.    }
  15.  
  16.    if (a = 1)
  17.    {
  18.        printf("En breve se generara tu codigo\n");
  19.  
  20.        for(j=0; j=5; j++)
  21.        {
  22.            i++;
  23.            k = 0;
  24.            k = 1 + rand() % 23;
  25.            c[k] = letra[i];
  26.        }
  27.    }
  28.  
  29.    return 0;
  30. }


Título: Re: Me crashea el programa
Publicado por: eferion en 12 Marzo 2014, 16:59 pm
Código
  1. int main()
  2. {
  3.  int a;
  4.  
  5.  scanf("%i", &a);
  6.  
  7.  if (!(a = 1))
  8.  {
  9.  }
  10.  
  11.  if (a = 1)
  12.  {
  13.  }
  14. }

Eso está mal se mire por donde se mire:

* !(a=1) es equivalente a !1... luego ese if NUNCA se ejecutará
* (a=1) es equivalente a 1... el segundo if se ejecutará SIEMPRE.

La forma correcta de ponerlo es usando los operadores de comparación:

Código
  1.  if ( a != 1 )
  2.  {
  3.  }
  4.  
  5.  if (a == 1)
  6.  {
  7.  }
  8. }

o mejor aún:

Código
  1.  if ( a != 1 )
  2.  {
  3.  }
  4.  else
  5.  {
  6.  }
  7. }

Luego, quitando eso, creo que deberías fijarte en la variable "i"... que no se inicializa en la vida... al no inicializarse, en "letra" vas a acceder a una posición de memoria incorrecta y el programa acabará con un bonito pantallazo.


Título: Re: Me crashea el programa
Publicado por: Stakewinner00 en 12 Marzo 2014, 17:09 pm
Código:
  char letra[5];
que valores tiene?


Título: Re: Me crashea el programa
Publicado por: eferion en 12 Marzo 2014, 17:12 pm
Código:
  char letra[5];
que valores tiene?

Tiene valores aleatorios... pero esas 5 posiciones están reservadas para la aplicación... otra cosa es que intentes acceder a letra[4561234]...

Sinceramente a mí me da la impresión que más que letra quería poner c.


Título: Re: Me crashea el programa
Publicado por: Stakewinner00 en 12 Marzo 2014, 17:18 pm
Tiene valores aleatorios... pero esas 5 posiciones están reservadas para la aplicación... otra cosa es que intentes acceder a letra[4561234]...

Sinceramente a mí me da la impresión que más que letra quería poner c.

Por eso hice la pregunta, por que me da que se descuido de algo ahí xD.

De paso podrías usar un if else en vez de dos if como te dijo eferion

Saludos


Título: Re: Me crashea el programa
Publicado por: Gh057 en 12 Marzo 2014, 17:30 pm
hola wiD^ estaba escribiendo los errores de sintaxis por ejemplo en la igualdad de la condición pero ya te fueron muy bien indicados; con respecto a la función aleatoria, deberías chequear la misma ya que al sumarle 1 no estás contemplando todas las k para el char c. (no tendrás nunca el valor para 'a' y luego creo que superas la cantidad de posiciones para el tope) saludos.


Título: Re: Me crashea el programa
Publicado por: jaxoR en 12 Marzo 2014, 19:33 pm
Gracias por toda la ayuda, pero me sigue crasheando el programa. Ahora lo tengo así:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    int a, i, j, k, f;
  7.    int b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  8.    char c[] = {'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', '\0'};
  9.    printf("==========================\n== Generador de codigos ==\n==========================\n\n* Ingrese 1 si quiere generar un codigo\n");
  10.    scanf("%i", &a);
  11.  
  12.    char letra[5];
  13.    i = 0;
  14.  
  15.    if (a != 1)
  16.    {
  17.        printf("Necesitas ingresar el numero 1 para generar un codigo\n");
  18.    }
  19.  
  20.    if (a == 1)
  21.    {
  22.        printf("En breve se generara tu codigo\n");
  23.  
  24.        for(j=0; j=5; j++)
  25.        {
  26.            i++;
  27.            k = 0;
  28.            k = 1 + rand() % 23;
  29.            c[k] = letra[i];
  30.        }
  31.    }
  32.  
  33.    return 0;
  34. }


Título: Re: Me crashea el programa
Publicado por: amchacon en 12 Marzo 2014, 19:50 pm
La condición del for es erronea.

¿Porque usas letra? Usa letra[j].


Título: Re: Me crashea el programa
Publicado por: Yugget en 12 Marzo 2014, 19:57 pm
Como bien dice amchacon,
La condición for es errónea,

Estás dandole un valor a j = 0 y luego dandole de nuevo otro valor a j = 5.

Y para el for sería asín:

Código
  1. for(j=0; j < 5; j++)
  2. {
  3.  
  4. }

Da un valor a j = 0, y si j es menor que 5, se incrementará.

Un cordial saludo.


Título: Re: Me crashea el programa
Publicado por: rir3760 en 13 Marzo 2014, 02:40 am
Aparte de todo lo dicho falta inicializar la semilla para los números aleatorios, esto puede hacerse con:
Código
  1. #include <stdlib.h>
  2. #include <time.h>
  3.  
  4. /* ... */
  5.  
  6. int main(void)
  7. {
  8.   /* ... */
  9.  
  10.   srand((unsigned) time(NULL));
  11.  
  12.   /* Uso de rand ...  */
  13. }

Y en el bucle la primera asignación a la variable "k" sobra, la asignación "c[ k ] = letra[ i ];" esta al revés (debería ser "letra[ i ] = c[ k ];") y por ultimo si se trata de una cadena falta agregar el terminador '\0'.

El code no está terminado pero no puedo terminar de resolver eso
En buen plan deberías conseguir un buen curso o libro, para recomendaciones solo tienes que utilizar el motor de búsqueda de los foros.

Un saludo


Título: Re: Me crashea el programa
Publicado por: jaxoR en 13 Marzo 2014, 20:29 pm
Tengo el libro de como programar en C/C++ de deitel. Pero en el libro nunca especifica de terminar el rand.

PD: Seguí adelante con el programa, pero me sigue crasheando, en cuanto ingreso 1 me crashea:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    int a, i, j, k, f;
  7.    int b[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  8.    char c[] = {'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', '\0'};
  9.    printf("==========================\n== Generador de codigos ==\n==========================\n\n* Ingrese 1 si quiere generar un codigo\n");
  10.    scanf("%i", &a);
  11.  
  12.    char letra[5];
  13.    int numero[5];
  14.    i = 0;
  15.  
  16.    if (a != 1)
  17.    {
  18.        printf("Necesitas ingresar el numero 1 para generar un codigo\n");
  19.    }
  20.  
  21.    if (a == 1)
  22.    {
  23.        for(j=0; j < 5; j++)
  24.        {
  25.            i++;
  26.            k = 0;
  27.            k = 1 + rand() % 23;
  28.            letra[i] = c[k];
  29.        }
  30.  
  31.        i = 0;
  32.        j = 0;
  33.        f = 0;
  34.  
  35.        for(j=0; j < 5; j++)
  36.        {
  37.            i++;
  38.            f = 0;
  39.            f = 1 + rand() % 9;
  40.            numero[i] = b[f];
  41.        }
  42.  
  43.  
  44.        printf("%s %s %s %s %s %i %i %i %i %i", letra[0], letra[1], letra[2], letra[3], letra[4], numero[0], numero[1], numero[2], numero[3], numero[4]);
  45.  
  46.    }
  47.  
  48.    return 0;
  49. }


Título: Re: Me crashea el programa
Publicado por: eferion en 13 Marzo 2014, 20:59 pm
si haces

Código
  1. printf("%s", letra[0] );

estás imprimiendo una cadena... una cadena es una secuencia de caracteres que acaba en el caracter '\0'. Dado que en tu caso, letra tiene una secuencia de caracteres que no termina en '\0', el programa seguirá imprimiendo el contenido de la memoria adyacente a letra y eso hace que el programa se muera.

Si lo que quieres es imprimir un caracter tienes que cambiar el printf por

Código
  1. printf( "%c", letra[0] );


Título: Re: Me crashea el programa
Publicado por: leosansan en 13 Marzo 2014, 21:24 pm
Yo le aconsejaría revisarlo todo ya que hay variables de más, falta la librería time.h, no inicializa rand, haría falta bajo mi punto de vista un bucle por si no introduce 1.

En fin, te lo dejo funcionando. Ya es cosa tuya mejorarlo:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int main(){
  6.    srand((unsigned) time(NULL));
  7.    int a, j, k=0, f=0;
  8.    int b[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  9.    char c[] = {"abcdefghijklmnopqrstuvwxys"};
  10.    char letra[5];
  11.    int numero[5];
  12.    do{
  13.      printf("==========================\n== Generador de codigos ==\n==========================\n\n* Ingrese 1 si quiere generar un codigo\n");
  14.      scanf("%d", &a);
  15.      if (a != 1)
  16.        printf("Necesitas ingresar el numero 1 para generar un codigo\n");
  17.    }while(a != 1);
  18.    for(j=0; j < 5; j++) {
  19.      k = 1 + rand() % 25;
  20.      letra[j] = c[k];
  21.    }
  22.     for(j=0; j < 5; j++){
  23.      f = 1 + rand() % 9;
  24.      numero[j] = b[f];
  25.    }
  26.    printf("%c %c %c %c %c %d %d %d %d %d", letra[0], letra[1], letra[2], letra[3], letra[4], numero[0], numero[1], numero[2], numero[3], numero[4]);
  27.    return 0;
  28. }

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


 


Título: Re: Me crashea el programa
Publicado por: jaxoR en 13 Marzo 2014, 21:37 pm
Dos preguntas:

Para que sirve el include time.h y que hace esto?

Código
  1. srand((unsigned) time(NULL));


Título: Re: Me crashea el programa
Publicado por: eferion en 13 Marzo 2014, 21:53 pm
Deberías conseguir y leer con tranquilidad un manual de C. Te dará muchas más satisfacciones que darte de cabezazos con estas cosas. Es un consejo.

los includes sirven para enlazar con código externo.

Código
  1. #include <time.h>

se sustituye por el contenido del archivo "time.h". De esta forma el compilador es capaz de encontrar las funciones definidas dentro de este archivo ( en este caso la función time().

Para saber qué hace la línea

Código
  1. srand((unsigned)time(NULL));

Deberías descomponerla en instrucciones simples:

Código
  1. // Esta linea te devuelve la fecha y la hora actuales.
  2. // Realmente almacena el numero de segundos desde el 01/01/1970 a las 00:00
  3. time_t tiempo = time(NULL);
  4.  
  5. // Esta linea convierte el valor anterior en un tipo basico de C, un entero sin signo.
  6. unsigned int valor = (unsigned)tiempo;
  7.  
  8. // Esta linea inicializa el generador de numeros aleatorios.
  9. // Pasarle el tiempo es una forma de que la semilla inicial sea mas o menos aleatoria.
  10. srand(valor);

En cualquier caso, en serio, consigue un buen manual de C y empieza a leerlo sin prisa. Adquirir una buena base es más importante que aprender a tirar líneas de código.


Título: Re: Me crashea el programa
Publicado por: rir3760 en 14 Marzo 2014, 02:38 am
Dos preguntas:

Para que sirve el include time.h y que hace esto?

Código
  1. srand((unsigned) time(NULL));
Tienes que leer con mas cuidado el tema, eso lo respondí en mi primer mensaje:
Aparte de todo lo dicho falta inicializar la semilla para los números aleatorios, esto puede hacerse con:
Código
  1. #include <stdlib.h>
  2. #include <time.h>
  3.  
  4. /* ... */
  5.  
  6. int main(void)
  7. {
  8.   /* ... */
  9.  
  10.   srand((unsigned) time(NULL));
  11.  
  12.   /* Uso de rand ...  */
  13. }
Antes de utilizar rand y srand se debe incluir <stdlib.h>, antes de time <time.h>.


Un saludo


Título: Re: Me crashea el programa
Publicado por: leosansan en 14 Marzo 2014, 07:02 am

Una pequeña observación: no guardas el código entero en ninguna parte.

Esto lo puedes solventar usando el mismo array letra con las letras y los números.

Otra cosita: el código puede considerarse débil, en el sentido de que van letras seguidas de números. Podrías hacerlo más fuerte entremezclando los números con las letras como te indico a continuación:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int main(){
  6.    srand((unsigned) time(NULL));
  7.    int a, j, k=0, f=0,cont=0;
  8.    char c[] = {"abcdefghijklmnopqrstuvwxys0123456789"};
  9.    char letra[11],codigo[11];
  10.    for(j=0; j < 11; j++)
  11.      codigo[j]='A';
  12.    do{
  13.      printf("==========================\n== Generador de codigos ==\n==========================\n\n* Ingrese 1 si quiere generar un codigo\n");
  14.      scanf("%d", &a);
  15.      if (a != 1)
  16.        printf("Necesitas ingresar el numero 1 para generar un codigo\n");
  17.    }while(a != 1);
  18.    for(j=0; j < 5; j++) {
  19.      k = rand() % 26;
  20.      letra[j] = c[k];
  21.    }
  22.    for(j=5; j < 10; j++){
  23.      f = 26 + rand() % 10;
  24.      letra[j] = c[f];
  25.    }
  26.    letra[j]='\0';
  27.    printf("%s\n", letra);
  28.    ///printf("%d   %s\n", j,letra);
  29.    for (j=0;j<10;j++){
  30.    j=0;
  31.    do{
  32.      k=rand ()%10;
  33.      if (codigo[j]=='A' && letra[k]!='A'){
  34.        codigo[j]=letra[k];
  35.        letra[k]='A';
  36.        j++;
  37.      }
  38.      }while (j<10);
  39.      codigo[10]='\0';
  40.    }
  41.    printf("%s\n", codigo);
  42.    return 0;
  43. }

También puedes hacerlo aún más fuerte usando más caracteres en el array letra, como /*/#@, etc.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)