[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