Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 7hongo7 en 1 Julio 2013, 06:00 am



Título: Problema con apuntadores!!!!!!
Publicado por: 7hongo7 en 1 Julio 2013, 06:00 am
Hola de nuevo aqui molestandolos de nuevo pero tengo un problema con un programa sobre apuntadores, en el programa nosotros tenemos que adivinar el numero que la computadora genera con apuntadores el problema es que al momento de ejecutar solamente tengo la primera oportunidad no me da las otras oportunidades y dice "violacion de segmento core generado", este es mi codigo alguien me puede ayudar muchas gracias!!!!!!


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

int main()
{
        int num,com,i,ii=0;
        int *numero,*computadora,*opcion;
        numero = &num;
        computadora = &com;
        opcion = &i;
        printf("Juego que adivina el numero de la computadora<----------\n");
        srand(time(NULL));
        *computadora = (rand()%50)+1;
        printf("Tienes 7 oportunidades para adivinar el numero\n");
        for(*opcion=1;*opcion<=7;opcion++){
                printf("%d oportunidad---->",ii+1);
                scanf("%d",opcion);
                if(*computadora<*opcion)
                        printf("Mi numero es meno\n");
                else if(*computadora>*opcion)
                        printf("Mi numero es mayor\n");
                else
                        printf("Acertaste");
                        exit(1);
        }
        printf("Lastima se te acabaron las oportunidades\n");
        printf("%d",*computadora);
        return 0;
}


Título: Re: Problema con apuntadores!!!!!!
Publicado por: eferion en 1 Julio 2013, 07:58 am
Código
  1. for(*opcion=1;*opcion<=7;opcion++)

en el último "opcion" te falta un asterisco... si no lo pones lo que haces es modificar la dirección a la que apunta el puntero.

Código
  1. for(*opcion=1;*opcion<=7;(*opcion)++)


Título: Re: Problema con apuntadores!!!!!!
Publicado por: 7hongo7 en 1 Julio 2013, 20:23 pm
Código
  1. for(*opcion=1;*opcion<=7;opcion++)

en el último "opcion" te falta un asterisco... si no lo pones lo que haces es modificar la dirección a la que apunta el puntero.

Código
  1. for(*opcion=1;*opcion<=7;(*opcion)++)

Hago l cambio como me dices pero me sigue dando solamente una oportunidad acierte o no el numero de la computadora, realmente no se como hacerlo y sobre la violacion de segmento ya no me aparece ahora si compila bien jejejeje :P :P


Título: Re: Problema con apuntadores!!!!!!
Publicado por: eferion en 1 Julio 2013, 21:30 pm
Código
  1.          if(*computadora<*opcion)
  2.                        printf("Mi numero es meno\n");
  3.                else if(*computadora>*opcion)
  4.                        printf("Mi numero es mayor\n");
  5.                else
  6.                        printf("Acertaste");
  7.                        exit(1);

ese exit( 1 ) se va a ejecutar siempre.

Si quieres que un if o un else abarque más de una instrucción tienes que ponerlo entre llaves.

Más cosas... estás almacenando el dato del usuario en opcion y aparte usas esa variable para comprobar que no se pasa de 7 intentos... no va a funcionar.

Y además, personalmente, prefiero no usar exit salvo causas de fuerza mayor... yo lo dejaría así:

Código
  1. int main()
  2. {
  3.  int num,com,i;
  4.  int acertado = 0;
  5.  int *numero,*computadora,*opcion;
  6.  numero = &num;
  7.  computadora = &com;
  8.  opcion = &i;
  9.  printf("Juego que adivina el numero de la computadora<----------\n");
  10.  srand(time(NULL));
  11.  *computadora = (rand()%50)+1;
  12.  printf("Tienes 7 oportunidades para adivinar el numero\n");
  13.  for(*opcion=1;(*opcion<=7) && (acertado == 0);(*opcion)++)
  14.  {
  15.    printf("%d oportunidad---->",*opcion);
  16.    scanf("%d",numero);
  17.    if(*computadora<*numero)
  18.      printf("Mi numero es meno\n");
  19.    else if(*computadora>*numero)
  20.      printf("Mi numero es mayor\n");
  21.    else
  22.    {
  23.      printf("Acertaste");
  24.      acertado = 1;
  25.    }
  26.  }
  27.  
  28.  if ( acertado == 0 )
  29.  {
  30.    printf("Lastima se te acabaron las oportunidades\n");
  31.    printf("%d",*computadora);
  32.  }
  33.  
  34.  return 0;
  35. }

Verás que también he eliminado el uso de ii... ya tienes esa información en la variable *opcion, luego es redundante... aparte de que no incrementabas nunca el valor de dicha variable.

Deberías aprender a usar los depuradores para corregir los errores de tu código.

Un saludo


Título: Re: Problema con apuntadores!!!!!!
Publicado por: 7hongo7 en 3 Julio 2013, 22:39 pm
Muchas gracias eferion me sirvio muchisimo tu codigo, fue una buena guia para poder hacer mi programa y te haré caso con lo del depurador, es que soy algo nuevo en esto de la programacion de nuevo muchas gracias ;-) ;-) ;-) ;-)


Título: Re: Problema con apuntadores!!!!!!
Publicado por: rir3760 en 5 Julio 2013, 04:14 am
Otra opción es utilizar una sentencia "break;" dentro del bucle:
Código
  1. puts("Tienes 7 oportunidades para adivinar el numero");
  2. for (*opcion = 1; *opcion < 8; (*opcion)++){
  3.   printf("%d oportunidad---->", *opcion);
  4.   fflush(stdout);
  5.   scanf("%d", numero);
  6.  
  7.   if (*computadora < *numero)
  8.      puts("Mi numero es menor");
  9.   else if(*computadora > *numero)
  10.      puts("Mi numero es mayor");
  11.   else
  12.      break;
  13. }
  14.  
  15. if (*opcion < 8)
  16.   printf("Acertaste en tu %d oportunidad\n", *opcion);
  17. else {
  18.   printf("Lastima se te acabaron las oportunidades");
  19.   printf(" (%d)\n", *computadora);
  20. }

La desventaja es el mentado salto mientras que la ventaja es evitar el uso de la bandera. Cuestión de estilos.

Un saludo


Título: Re: Problema con apuntadores!!!!!!
Publicado por: eferion en 5 Julio 2013, 08:08 am
Otra opción es utilizar una sentencia "break;" dentro del bucle:

...

La desventaja es el mentado salto mientras que la ventaja es evitar el uso de la bandera. Cuestión de estilos.

Exacto, yo es que vengo de un proyecto donde las aplicaciones tienden a ser monstruosas y es fácil encontrarse una docena de breaks en un for... se te cae el alma a los pies cuando tienes que depurar eso XDDDD


Título: Re: Problema con apuntadores!!!!!!
Publicado por: kmilinh0 en 5 Julio 2013, 10:16 am
sabes que sino depuras tu mismo no vas a aprender? Una cosa es tener dudas en algo y otra que al primer segmention fault q te salga pongas tu código para q te lo arreglen. Si ves las horas que muchos hemos estado poniendo prints y usando el GDB...
Para las violaciones de segmento lo mejor es ejecutar con el GDB, tiene infinidad de posibilidades. Por ejemplo, si te sale una violacion de segmento puedes saber en que linea ha sido y mirar pq pasa esto. Anda lee un poco xD :
http://users.dcc.uchile.cl/~lmateu/CC41C/gdb.txt