[C con Clase] Duda acerca de else if

Davidson, Steven srd4121 en njit.edu
Mar Abr 15 20:21:58 CEST 2014


Hola Óscar,

2014-04-15 14:06 GMT-04:00 Oscar Aparicio Holgado <pelucheloko en hotmail.com>:

> Hola que tal.
>
> Tengo el siguiente código (es el juego de piedra papel y tijera) :
>
>
Veamos el código fuente.

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

Los nombres correctos son <ctime> y <cstdlib>.

using namespace std;
>
> int main()
> {
>
>     srand( time(NULL) );
>
> const char *ordenador[3] = { "piedra", "papel", "tijera" };
> int s = rand() % 3;
>
> //cout << "Eleccion de la maquina: " << ordenador[s] << endl;
>
> int eleccion;
>
> cout << "Introduce n. jugada (1 = piedra, 2 = papel, 3 = tijera): ";
> cin >> eleccion;
> cout << endl;
>
> if(eleccion == 1);
>

Aquí tienes el error: el punto y coma.

Te interesa que 'if' controle todo lo que sigue, pero al indicar el punto y
coma, básicamente tienes esto:

if( eleccion == 1 ) {}

if(eleccion == 1 && ordenador[s] == ordenador[0])  ...

O sea, tienes dos sentencias independientes, cuando te interesa que la
segunda sea dependiente de la primera

            if(eleccion == 1 && ordenador[s] == ordenador[0])
>

Estás comprobando direcciones de memoria, porque el contenido de
'ordenador' es un puntero. Además, no tiene sentido comprobar cadenas de
caracteres, cuando tienes un índice.

Simplemente comprueba el índice calculado de 's'.

                 cout << "Empate!" << endl;
>             else if(eleccion == 1 && ordenador[s] == ordenador[1])
>                  cout << "Perdistes panoli!" << endl;
>             else if(eleccion == 1 && ordenador[s] == ordenador[2])
>

No tiene sentido comprobar si 'eleccion == 1' tres veces, porque ya lo
comprobaste al principio:

if( eleccion == 1 )
{
  ...
}

Tampoco tiene sentido comprobar la última posibilidad de:

ordenador[s] == ordenador[2]

porque si llegas aquí, significa que sólo te queda una opción. Por
deducción, debe ser este caso.

                 cout << "Ganastes tronko!" << endl;
>          else if(eleccion == 2);
>

Aquí está el otro error.

             if(eleccion == 2 && ordenador[s] == ordenador[0])
>                  cout << "Ganastes tronko!!" << endl;
>              else if(eleccion == 2 && ordenador[s] == ordenador[1])
>                  cout << "Empate!!" << endl;
>              else if(eleccion == 2 && ordenador[s] == ordenador[2])
>                 cout << "Perdistes panoli!!" << endl;
>          else if(eleccion == 3);
>

Y aquí el tercero.


>              if(eleccion == 3 && ordenador[s] == ordenador[0])
>                  cout << "Perdistes panoli!!!" << endl;
>              else if(eleccion == 3 && ordenador[s] == ordenador[1])
>                  cout << "Ganastes tronko!!!" << endl;
>              else if(eleccion == 3 && ordenador[s] == ordenador[2])
>                  cout << "Empate!!!" << endl;
> return 0;
> }
>
>
Sugiero que analices el problema y sobre todo el comportamiento, antes de
lanzarte a programar. Como pista, sugiero que crees una tabla de las
posibilidades y de los resultados; algo como,

J1 \ J2 |  R | P | T
----------+----+---+----
    R    |      |    |
----------+----+---+----
    P    |      |    |
----------+----+---+----
    T    |      |    |

donde,

J1 : Jugador #1
J2 : Jugador #2
R : piedra
P : papel
T : tijera

Rellena cada casilla con el resultado desde el punto de vista de J1:
G : Ganador
E : Empate
V : Vencido   (es por no usar P de perdedor, porque usamos P como Papel)

Ahora puedes diseñar tu programa basado en este análisis.


Espero que esto te oriente.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140415/0536ba57/attachment.html>


Más información sobre la lista de distribución Cconclase