[C con Clase] Duda acerca de else if
Oscar
pelucheloko en hotmail.com
Jue Abr 24 20:26:49 CEST 2014
El pasado 2014-04-24 16:40:06, Steven Davidson escribió:
SD> Hola Óscar,
SD> 2014-04-24 8:12 GMT-04:00 Oscar <pelucheloko en hotmail.com>:
SD> > El pasado 2014-04-15 18:21:46, Steven Davidson escribió:
SD> >
SD> > Gracias por la respuesta Steven, estaba "desuscrito" de la lista de
SD> > distribución por que al ser cuenta de hotmail me comenta Salvador Pozo que
SD> > hay algún tipo de problema y hasta hoy no habia visto tu respuesta
SD> >
SD> >
SD> Entendido. Es una pena que haya estos problemas con Hotmail.
SD> Probaré a quitar el ; después del if y veré que tal :-)
SD> >
SD> >
SD> Mejor :)
SD> SD> Estás comprobando direcciones de memoria, porque el contenido de
SD> > SD> 'ordenador' es un puntero. Además, no tiene sentido comprobar cadenas
SD> > de
SD> > SD> caracteres, cuando tienes un índice.
SD> > SD> Simplemente comprueba el índice calculado de 's'.
SD> >
SD> > Esto no lo entendí muy bien
SD> >
SD> >
SD> Estás haciendo esto:
SD> if( ordenador[s] == ordenador[0] ) ...
SD> Lo cual implica que compruebas direcciones de memoria. Sin embargo, sabemos
SD> que estas direcciones de memoria son elementos del array, 'ordenador', y
SD> por tanto, se guardan contiguamente en memoria. Lo anterior se puede
SD> reescribir así:
SD> *(ordenador + s) == *(ordenador + 0)
SD> Lo que propongo es comprobar los índices en lugar de las direcciones de
SD> memoria; esto es,
SD> if( s == 0 ) ...
SD> Aquí, 0 (cero) significaría "piedra", que es la primera cadena guardada en
SD> 'ordenador'.
SD> Podrías crear un tipo enumerado o tres constantes para representar cada
SD> resultado; por ejemplo,
SD> enum resultado_t { PIEDRA, PAPEL, TIJERA };
SD> ...
Entiendo el enum, pero no se como ni donde utilizarlo
SD> y luego, usamos estas constantes en lugar de las cadenas de caracteres; por
SD> ejemplo,
SD> if( s == PIEDRA ) ...
¿por qué s sería igual a piedra? ¿no es PIEDRA una de las opciones del enum?
SD> El código queda más legible.
SD> Por último, debería aclarar que no estoy diciendo que tu solución para
SD> comprobar el resultado sea incorrecta, sino que hay otra forma algo más
SD> simple de solucionar el problema.
SD> Espero que esto te oriente.
SD> Steven
SD> _______________________________________________
SD> Lista de correo Cconclase Cconclase en listas.conclase.net
SD> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SD> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Este es el código retocado con los cambios sugeridos:
#include <iostream>
#include <ctime>
#include <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;
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)
{
if(s == 0)
cout << "Empate!" << endl;
else if(s == 1)
cout << "Perdistes panoli!" << endl;
else
cout << "Ganastes tronko!" << endl;
}
else if(eleccion == 2)
if(s == 0)
cout << "Ganastes tronko!!" << endl;
else if(s == 1)
cout << "Empate!!" << endl;
else
cout << "Perdistes panoli!!" << endl;
else
if(s == 0)
cout << "Perdistes panoli!!!" << endl;
else if(s == 1)
cout << "Ganastes tronko!!!" << endl;
else
cout << "Empate!!!" << endl;
return 0;
}
Está más simple que antes, ¿se puede simplificar más aún?
Más información sobre la lista de distribución Cconclase