Problema con apuntadores!!!!!!

Iniciado por 7hongo7, 1 Julio 2013, 06:00 AM

0 Miembros y 1 Visitante están viendo este tema.

7hongo7

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;
}

eferion

Código (cpp) [Seleccionar]

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 (cpp) [Seleccionar]

for(*opcion=1;*opcion<=7;(*opcion)++)

7hongo7

Cita de: eferion en  1 Julio 2013, 07:58 AM
Código (cpp) [Seleccionar]

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 (cpp) [Seleccionar]

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

eferion

Código (cpp) [Seleccionar]
         if(*computadora<*opcion)
                       printf("Mi numero es meno\n");
               else if(*computadora>*opcion)
                       printf("Mi numero es mayor\n");
               else
                       printf("Acertaste");
                       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 (cpp) [Seleccionar]
int main()
{
 int num,com,i;
 int acertado = 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) && (acertado == 0);(*opcion)++)
 {
   printf("%d oportunidad---->",*opcion);
   scanf("%d",numero);
   if(*computadora<*numero)
     printf("Mi numero es meno\n");
   else if(*computadora>*numero)
     printf("Mi numero es mayor\n");
   else
   {
     printf("Acertaste");
     acertado = 1;
   }
 }

 if ( acertado == 0 )
 {
   printf("Lastima se te acabaron las oportunidades\n");
   printf("%d",*computadora);
 }
 
 return 0;
}


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

7hongo7

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

rir3760

Otra opción es utilizar una sentencia "break;" dentro del bucle:
puts("Tienes 7 oportunidades para adivinar el numero");
for (*opcion = 1; *opcion < 8; (*opcion)++){
   printf("%d oportunidad---->", *opcion);
   fflush(stdout);
   scanf("%d", numero);
   
   if (*computadora < *numero)
      puts("Mi numero es menor");
   else if(*computadora > *numero)
      puts("Mi numero es mayor");
   else
      break;
}

if (*opcion < 8)
   printf("Acertaste en tu %d oportunidad\n", *opcion);
else {
   printf("Lastima se te acabaron las oportunidades");
   printf(" (%d)\n", *computadora);
}


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

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

eferion

Cita de: rir3760 en  5 Julio 2013, 04:14 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

kmilinh0

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