elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con vectores.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con vectores.  (Leído 5,593 veces)
elkiedis

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Ayuda con vectores.
« en: 8 Octubre 2012, 05:10 am »

Hola a todos! Hace rato que no visitaba el foro pero volví a retomar el lenguaje C y ahora estoy teniendo un inconveniente con una función que debo desarrollar.

El tema es el siguiente. En mi programa tengo un vector Cartas de 10 posiciones. Lo inicializo del 0 al 9. Es decir... Cartas[1] es igual a 1, Cartas[2] es igual a 2, y así... El cero no interesa en este caso porque solo se utilizan las cartas del 1 al 9.
A medida que el juego avanza, algunas cartas del vector se cambian por el valor 0 (quedando estas "tapadas") y necesito validar si dentro del vector existe una carta que equivalga a una tirada de Dados realizada por el jugador, o si al menos, existe la posibilidad de sumar 2 cartas del Vector para obtener el resultado de la tirada de Dados.
La tirada de Dados consta de 2 dados de 6 caras c/u. Siendo la tirada mas baja posible 2, y la mas alta 12.

Código:
int validaJugada ()
{
    int i, j, p, suma;
    for (i=1; i<10; i++)
    {
        for (j=1; j<10; j++)
        {
            suma = Cartas[i] + Cartas[j];
            if (suma == Dados)
            {
               p = 1;
               break;
            }
            else
            {
               p = 0;
            }
        }
    }   
return p;
}

En este código solo comparo las sumas de Cartas[1] con Cartas[1], Cartas[1] con Cartas[2], Cartas[1] con Cartas[3]... Así hasta Cartas[9].
Luego comparo las sumas de Cartas[2] con Cartas[1], Cartas[2] con Cartas[2], Cartas[2] con Cartas[3]... Así hasta Cartas[9].
y sucesivamente... hasta que termine el ciclo..
Ahora... el problema está en que no debería sumar cartas de la misma posición... es decir Cartas[1] con Cartas[1], o Cartas[2] con Cartas[2]... y no sé como obviar o exceptuar esto..

Tendría que dejar una posicion del vector fija como pivot y sumarla con todas las otras una por una hasta la ultima posicion, y luego comenzar a hacer lo mismo pero desde la segunda posición, pero realmente se me complica...

Desde ya muchas gracias por su ayuda..




En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Ayuda con vectores.
« Respuesta #1 en: 8 Octubre 2012, 05:17 am »

Código
  1. if (i != j) {
  2.     suma = Cartas[i] + Cartas[j];
  3.     //...
  4. }

de manera que solo sume y haga esas cosas si los indices son distintos.

un saludo!


En línea

elkiedis

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Ayuda con vectores.
« Respuesta #2 en: 8 Octubre 2012, 05:34 am »

Genial! tan sencillo como eso y no se me había ocurrido :(

Ahora he corrido una prueba de la validación y no sé por qué motivo no funciona como lo esperado.
Aquí les dejo el código de ejemplo.

Código:
#include <stdio.h>
#include <stdlib.h>

void mostrarCartas (void);
int validaJugada (void);

int Cartas[10], Dados;

int main (){
    
    int i, Posible;
  
    Dados = 6;  /* ejemplo de tirada cualquiera */
  
    for(i=0; i<10; i++)
    {
       Cartas[i]=i;
    }
    
    Cartas[6]=0;   /* fijamos la carta 6 en 0 */
    Cartas[5]=0;   /* fijamos la carta 5 en 0 */

    Posible = validaJugada();
    
    mostrarCartas();
    printf("\nPosible: %d", Posible);
    
    
system("pause");
return EXIT_SUCCESS;
    }

/* ----- Funcion que muestra las cartas ----- */
void mostrarCartas ()
{
   printf("\n-%d-%d-%d-%d-%d-%d-%d-%d-%d-\n\n", Cartas[1],Cartas[2],Cartas[3],Cartas[4],Cartas[5],Cartas[6],Cartas[7],Cartas[8],Cartas[9]);    
}

/* ----- Funcion que valida la jugada ----- */
int validaJugada ()
{
    int i, j, p;
    int suma = 0;
    for (i=1; i<10; i++)
    {
        for (j=1; j<10; j++)
        {
            if (i != j)
            {
            suma = Cartas[i] + Cartas[j];
            }
            if (suma == Dados)
            {
               p = 1;
               break;
            }
            else
            {
               p = 0;
            }
        }
    }    

    return p;
}


Los Dados (valor 6), pueden ser igualados sumando el 2 con el 4, y sin embargo el resultado de la variable Posible termina siendo 0 cuando debería ser 1... Alguno puede ayudarme? No encuentro donde está el error...

Muchas gracias xiruko por la ayuda!
« Última modificación: 8 Octubre 2012, 05:40 am por elkiedis » En línea

elkiedis

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Ayuda con vectores.
« Respuesta #3 en: 8 Octubre 2012, 20:01 pm »

Alguien podría por favor tratar de ayudarme? Necesito saber en qué me estoy equivocando porque ese código no hace lo esperado..

Gracias!
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Ayuda con vectores.
« Respuesta #4 en: 8 Octubre 2012, 22:13 pm »

he mirado el codigo, y a pesar de que no soy partidario de las variables globales (puedes hacer lo mismo pasando las variables como parametros a funciones) creo que el problema esta en el break de la funcion validajugada(). este break hara que salgas del for, pero en tu caso al tener 2 for, el break hara que salgas del primero (el de indice j) pero luego seguiras dentro por el otro for (el de indice i), por lo que pasaran cosas raras que no creo que quieras que pasen (entre otras, que p tome el valor 0 de nuevo).

para arreglar esto sin alterarte mucho el codigo, seria de la siguiente manera:

Código
  1. int validaJugada () {
  2.  
  3.    int i, j;
  4.    int suma = 0;
  5.  
  6.    for (i=1; i<10; i++)
  7.    {
  8.        for (j=1; j<10; j++)
  9. {
  10. if (i != j)
  11. {
  12. suma = Cartas[i] + Cartas[j];
  13. if (suma == Dados) return 1;
  14. }
  15. }
  16.   }    
  17.  
  18.    return 0;
  19. }

ahora bien, no se por que haces que tu funcion solo pueda devolver un 1 o un 0. y si la tirada de dados es un 8? habria dos posibles soluciones, 2+6 y 3+5, por lo que esta funcion deberia devolver 2 no? si es asi, a la que encuentres 1 posible, deberias hacer esos valores 0, y seguir buscando hasta recorrer todo el array por si acaso hay otra posible. se me ocurre hacerlo asi:

Código
  1. int validaJugada () {
  2.  
  3.    int i, j, p=0; // p inicialmente vale 0, y si se encuentra alguna posibilidad, se cambia el valor
  4.    int suma = 0;
  5.  
  6.    for (i=1; i<10; i++)
  7.    {
  8.        for (j=1; j<10; j++)
  9. {
  10. if (i != j)
  11. {
  12. suma = Cartas[i] + Cartas[j];
  13. if (suma == Dados) {
  14.                             p++;
  15.                             Cartas[i]=0;
  16.                             Cartas[j]=0;
  17.                             break;
  18.                        }
  19. }
  20. }
  21.   }    
  22.  
  23.    return p;
  24. }

espero que alguna de las dos soluciones te sirva, un saludo!
« Última modificación: 8 Octubre 2012, 22:55 pm por xiruko » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ayuda con vectores.
« Respuesta #5 en: 9 Octubre 2012, 03:06 am »

necesito validar si dentro del vector existe una carta que equivalga a una tirada de Dados realizada por el jugador
Para esto solo tienes que verificar el valor de "Dados" sea menor que 10 y que el valor de "Cartas[ Dados ]" sea diferente de cero.


o si al menos, existe la posibilidad de sumar 2 cartas del Vector para obtener el resultado de la tirada de Dados.
La tirada de Dados consta de 2 dados de 6 caras c/u. Siendo la tirada mas baja posible 2, y la mas alta 12.
Para esto solo necesitas de un bucle. La función con los cambios:
Código
  1. int validaJugada(void)
  2. {
  3.   int i;
  4.   int j;
  5.  
  6.   if (Dados > 9){
  7.      i = Dados - 9;
  8.      j = 9;
  9.   }else {
  10.      i = 1;
  11.      j = Dados - 1;
  12.   }
  13.  
  14.   while (i < j && (!Cartas[i] || !Cartas[j])){
  15.      i++;
  16.      j--;
  17.   }
  18.  
  19.   return i < j;
  20. }

Un saludo
En línea

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
elkiedis

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Ayuda con vectores.
« Respuesta #6 en: 9 Octubre 2012, 04:04 am »

Para esto solo tienes que verificar el valor de "Dados" sea menor que 10 y que el valor de "Cartas[ Dados ]" sea diferente de cero.

Para esto solo necesitas de un bucle. La función con los cambios:
Código
  1. int validaJugada(void)
  2. {
  3.   int i;
  4.   int j;
  5.  
  6.   if (Dados > 9){
  7.      i = Dados - 9;
  8.      j = 9;
  9.   }else {
  10.      i = 1;
  11.      j = Dados - 1;
  12.   }
  13.  
  14.   while (i < j && (!Cartas[i] || !Cartas[j])){
  15.      i++;
  16.      j--;
  17.   }
  18.  
  19.   return i < j;
  20. }

Un saludo

rir3760 , muchas gracias por tu ayuda! Pero el codigo que propones no tiene en cuenta si las cartas ya ha sido previamente tapadas o no...
En línea

elkiedis

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Ayuda con vectores.
« Respuesta #7 en: 9 Octubre 2012, 04:06 am »

he mirado el codigo, y a pesar de que no soy partidario de las variables globales (puedes hacer lo mismo pasando las variables como parametros a funciones) creo que el problema esta en el break de la funcion validajugada(). este break hara que salgas del for, pero en tu caso al tener 2 for, el break hara que salgas del primero (el de indice j) pero luego seguiras dentro por el otro for (el de indice i), por lo que pasaran cosas raras que no creo que quieras que pasen (entre otras, que p tome el valor 0 de nuevo).

para arreglar esto sin alterarte mucho el codigo, seria de la siguiente manera:

Código
  1. int validaJugada () {
  2.  
  3.    int i, j;
  4.    int suma = 0;
  5.  
  6.    for (i=1; i<10; i++)
  7.    {
  8.        for (j=1; j<10; j++)
  9. {
  10. if (i != j)
  11. {
  12. suma = Cartas[i] + Cartas[j];
  13. if (suma == Dados) return 1;
  14. }
  15. }
  16.   }    
  17.  
  18.    return 0;
  19. }

ahora bien, no se por que haces que tu funcion solo pueda devolver un 1 o un 0. y si la tirada de dados es un 8? habria dos posibles soluciones, 2+6 y 3+5, por lo que esta funcion deberia devolver 2 no? si es asi, a la que encuentres 1 posible, deberias hacer esos valores 0, y seguir buscando hasta recorrer todo el array por si acaso hay otra posible. se me ocurre hacerlo asi:

Código
  1. int validaJugada () {
  2.  
  3.    int i, j, p=0; // p inicialmente vale 0, y si se encuentra alguna posibilidad, se cambia el valor
  4.    int suma = 0;
  5.  
  6.    for (i=1; i<10; i++)
  7.    {
  8.        for (j=1; j<10; j++)
  9. {
  10. if (i != j)
  11. {
  12. suma = Cartas[i] + Cartas[j];
  13. if (suma == Dados) {
  14.                             p++;
  15.                             Cartas[i]=0;
  16.                             Cartas[j]=0;
  17.                             break;
  18.                        }
  19. }
  20. }
  21.   }    
  22.  
  23.    return p;
  24. }

espero que alguna de las dos soluciones te sirva, un saludo!

Me ha servido tu codigo colega! Muchas gracias un abrazo grande!!!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ayuda con vectores.
« Respuesta #8 en: 10 Octubre 2012, 03:20 am »

gracias por tu ayuda! Pero el codigo que propones no tiene en cuenta si las cartas ya ha sido previamente tapadas o no...
Si toma en cuenta las cartas que ya han sido marcadas con el valor cero. Ello se realiza con la segunda condición:
Código
  1. (!carta[i] || !carta[j])
Si alguna de las cartas es igual a cero se pasa a revisar el siguiente par.


Si extendemos para crear un programa sencillo terminamos con:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int validar_jugada(int carta[], int tirada, int *a, int *b);
  6.  
  7. int main (void)
  8. {
  9.   int carta[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  10.   int tirada;
  11.   int a;
  12.   int b;
  13.   int i;
  14.   int j;
  15.  
  16.   srand((unsigned) time(NULL));
  17.  
  18.   /* Cinco tiradas, solo se revisan pares de cartas */
  19.   for (i = 0; i < 5; i++){
  20.      for (j = 1; j < 11; j++)
  21.         if (carta[j])
  22.            printf(" %d", carta[j]);
  23.         else
  24.            printf(" X");
  25.      putchar('\n');
  26.  
  27.      tirada = 2 + rand() % 11;
  28.      printf("La tirada es %d, es una ", tirada);
  29.      if (validar_jugada(carta, tirada, &a, &b)){
  30.         puts("jugada valida\n");
  31.         carta[a] = carta[b] = 0;
  32.      }else
  33.         puts("jugada NO valida\n");
  34.   }
  35.  
  36.   return EXIT_SUCCESS;
  37. }
  38.  
  39. int validar_jugada(int carta[], int tirada, int *a, int *b)
  40. {
  41.   int i;
  42.   int j;
  43.  
  44.   if (tirada > 9){
  45.      i = tirada - 9;
  46.      j = 9;
  47.   }else {
  48.      i = 1;
  49.      j = tirada - 1;
  50.   }
  51.  
  52.   while (i < j && (!carta[i] || !carta[j])){
  53.      i++;
  54.      j--;
  55.   }
  56.   if (i < j){
  57.      *a = i;
  58.      *b = j;
  59.   }
  60.  
  61.   return i < j;
  62. }


Y un ejemplo de su salida:
Código:
1 2 3 4 5 6 7 8 9 10
La tirada es 7, es una jugada valida

 X 2 3 4 5 X 7 8 9 10
La tirada es 9, es una jugada valida

 X X 3 4 5 X X 8 9 10
La tirada es 5, es una jugada NO valida

 X X 3 4 5 X X 8 9 10
La tirada es 3, es una jugada NO valida

 X X 3 4 5 X X 8 9 10
La tirada es 12, es una jugada valida

Un saludo
En línea

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
elkiedis

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Ayuda con vectores.
« Respuesta #9 en: 10 Octubre 2012, 04:15 am »

Gracias nuevamente por tu ayuda! ya pude resolver el problema. De todos modos rir3760, fijate que no está validando bien las sumas ni las jugadas...

Fijate en tu ejemplo:

 1 2 3 4 5 6 7 8 9 10
La tirada es 7, es una jugada valida

 X 2 3 4 5 X 7 8 9 10
La tirada es 9, es una jugada valida

 X X 3 4 5 X X 8 9 10  // Aquí se podría tomar el 5, no necesariamente se debían sumar 2 cartas.
La tirada es 5, es una jugada NO valida

 X X 3 4 5 X X 8 9 10  // Aquí se podría tomar el 3, no necesariamente se debían sumar 2 cartas.
La tirada es 3, es una jugada NO valida

 X X 3 4 5 X X 8 9 10  // Aquí se podía dar una jugada valida sumando el 8 con el 4.
La tirada es 12, es una jugada valida
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con vectores c++
Programación C/C++
indict 3 2,155 Último mensaje 15 Noviembre 2012, 09:23 am
por norris
[Ayuda] Vectores
Programación C/C++
bemone 4 2,442 Último mensaje 23 Agosto 2013, 17:12 pm
por bemone
Ayuda Vectores Dinámicos
Programación C/C++
windic 3 1,973 Último mensaje 8 Octubre 2014, 22:02 pm
por ivancea96
Ayuda con c++ vectores
Programación C/C++
andru23 2 2,204 Último mensaje 23 Abril 2015, 09:11 am
por Orubatosu
Ayuda con vectores c++
Programación C/C++
Faceless 3 1,863 Último mensaje 16 Noviembre 2015, 04:05 am
por Faceless
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines