Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Cero++ en 20 Diciembre 2018, 02:11 AM

Título: Método de clase no funciona - Ayuda
Publicado por: Cero++ en 20 Diciembre 2018, 02:11 AM
Buenas, aquí les adjunto el código que hice, la verdad es que no entiendo por qué no devuelve nada, probé dándole un valor entre 1 - 12 y según ese valor retornar "x" string. Peeeero tampoco anduvo, me ayudan por favor?

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
struct Fecha{
int dd,mm,aa;
};
class Fecha1{
Fecha A;
public:
//A
Fecha1(int _dd,int _mm, int _aa){
A.dd=_dd; A.mm=_mm; A.aa=_aa;
}
//B
int Ver_dd();
int Ver_mm();
int Ver_aa();
//C
int Diferencia_en_anios(Fecha1 _a);
//D
string Signo_zodiacal();
};
int Fecha1:: Ver_dd(){
return A.dd;
}
int Fecha1:: Ver_mm(){
return A.mm;
}
int Fecha1:: Ver_aa(){
return A.aa;
}
int Fecha1::Diferencia_en_anios(Fecha1 _a){
return _a.Ver_aa()-A.aa;
}
/*
Acuario: 20 Enero – 18 Febrero.
Piscis: 19 Febrero – 20 Marzo.
Aries: 21 Marzo – 19 Abril.
Tauro: 20 Abril – 20 Mayo.
Géminis: 21 Mayo – 20 Junio.
Cáncer: 21 Junio – 22 Julio.
Leo: 23 Julio – 22 Agosto.
Virgo: 23 Agosto – 22 Septiembre
Libra: 23 Septiembre - 22 Octubre
Escorpio: 23 Octubre - 21 Noviembre
Sagitario: 22 Noviembre - 21 Diciembre
Capricornio: 22 Diciembre - 19 Enero
*/
string Fecha1::Signo_zodiacal(){
string aux;
switch (A.mm){
case 1:
if(A.dd>=20 && A.mm>=1){
if(A.dd<=18 && A.mm<=2){
aux= "Acuario";
}
}
break;
case 2:
if(A.dd>=19 && A.mm>=2){
if(A.dd<=20 && A.mm<=3){
aux= "Piscis";
}
}
break;
case 3:
if(A.dd>=21 && A.mm>=3){
if(A.dd<=19 && A.mm<=4){
aux= "Aries";
}
}
break;
case 4:
if(A.dd>=20 && A.mm>=4){
if(A.dd<=20 && A.mm<=5){
aux= "Tauro";
}
}
break;
case 5:
if(A.dd>=21 && A.mm>=5){
if(A.dd<=20 && A.mm<=6){
aux= "Geminis";
}
}
break;
case 6:
if(A.dd>=21 && A.mm>=6){
if(A.dd<=22 && A.mm<=7){
aux= "Cancer";
}
}
break;
case 7:
if(A.dd>=23 && A.mm>=7){
if(A.dd<=22 && A.mm<=8){
aux= "Leo";
}
}
break;
case 8:
if(A.dd>=23 && A.mm>=8){
if(A.dd<=22 && A.mm<=9){
aux= "Virgo";
}
}
break;
case 9:
if(A.dd>=23 && A.mm>=9){
if(A.dd<=22 && A.mm<=10){
aux= "Libra";
}
}
break;
case 10:
if(A.dd>=23 && A.mm>=10){
if(A.dd<=21 && A.mm<=11){
aux= "Escorpio";
}
}
break;
case 11:
if(A.dd>=22 && A.mm>=11){
if(A.dd<=21 && A.mm<=12){
aux= "Sagitario";
}
}
break;
case 12:
if(A.dd>=22 && A.mm>=12){
if(A.dd<=19 && A.mm<=1){
aux= "Capricornio";
}
}
break;
}
return aux;
}
int main(int argc, char *argv[]) {
Fecha1 A(29,2,1996),B(30,5,2018);
cout<<"Edad: "<<A.Diferencia_en_anios(B)<<endl;
cout<<"Su signo es: "<<A.Signo_zodiacal(); //No muestra el signo......
return 0;
}
Título: Re: Método de clase no funciona - Ayuda
Publicado por: CalgaryCorpus en 20 Diciembre 2018, 03:48 AM
El switch está controlado por un valor de A.mm
Es superfluo hacerlo parte del if que acompaña cada opción
es imposible que el valor sea simultáneamente un valor y además cumpla las condiciones de los if.
.
Título: Re: Método de clase no funciona - Ayuda
Publicado por: Cero++ en 21 Diciembre 2018, 00:49 AM
Cita de: CalgaryCorpus en 20 Diciembre 2018, 03:48 AM
El switch está controlado por un valor de A.mm
Es superfluo hacerlo parte del if que acompaña cada opción
es imposible que el valor sea simultáneamente un valor y además cumpla las condiciones de los if.
.


Entiendo, entonces, no debería utilizar el switch? Cómo debería proceder?
Título: Re: Método de clase no funciona - Ayuda
Publicado por: MCKSys Argentina en 21 Diciembre 2018, 15:33 PM
Cita de: Cero++ en 21 Diciembre 2018, 00:49 AM
Entiendo, entonces, no debería utilizar el switch? Cómo debería proceder?

Hola!

Podrías probar quitando de los if's el valor A.mm. Con eso simplificas el código.

Por ejemplo, fíjate el switch, cuando A.mm es 1:

Tu if trata de ver si A.dd es >= a 20, pero también que A.mm sea >= 1. Esto último es True, pero redundante, ya que switch te asegura el valor de A.mm (que es 1).

Lo mismo con el segundo if.

Es más, podrías poner 1 solo if que haga las comparaciones sobre A.dd solamente.

Por ejemplo:

Código (cpp) [Seleccionar]

switch (A.mm){
case 1:  //A.mm vale 1, osea mes = Enero
if(A.dd>=20 && A.dd<=18){
aux= "Acuario";
}
break;


De esa forma, has simplificado el código y puede ver el error: A.dd jamás podrá ser >= que 20 y <= que 18...  ;)

Lo que deberías hacer es algo como:

Código (cpp) [Seleccionar]

switch (A.mm){
case 1:  //A.mm vale 1, osea mes = Enero
if(A.dd>=20){ //Del 20 al final es Acuario
aux= "Acuario";
} else { //Del 1 al 19 es Capricornio
aux= "Capricornio";
}
break;


Saludos!
Título: Re: Método de clase no funciona - Ayuda
Publicado por: MAFUS en 21 Diciembre 2018, 16:00 PM
Por eso es que necesita los dos meses. En vez de quitar ese if lo que debe hacer es prescindir del switch.
Título: Re: Método de clase no funciona - Ayuda
Publicado por: MCKSys Argentina en 21 Diciembre 2018, 16:14 PM
Cita de: MAFUS en 21 Diciembre 2018, 16:00 PM
Por eso es que necesita los dos meses. En vez de quitar ese if lo que debe hacer es prescindir del switch.

Mi sugerencia es en base al criterio de solución que seleccionó. Si quita el switch, va a tener que usar if's con 2 condiciones dobles (mes y año), o bien anidados; lo cual, para mí, es más engorroso.

Pero bueno, cada cual decide cuál es el método que mejor se le adapta a sus necesidades.

Saludos!

PD: No soy desarrollado en C++, sólo sé programar un poco en el mismo.
Título: Re: Método de clase no funciona - Ayuda
Publicado por: Cero++ en 23 Diciembre 2018, 01:01 AM
Cita de: MCKSys Argentina en 21 Diciembre 2018, 15:33 PM
Hola!

Lo que deberías hacer es algo como:

Código (cpp) [Seleccionar]

switch (A.mm){
case 1:  //A.mm vale 1, osea mes = Enero
if(A.dd>=20){ //Del 20 al final es Acuario
aux= "Acuario";
} else { //Del 1 al 19 es Capricornio
aux= "Capricornio";
}
break;


Saludos!

Muchisimas gracias!!! Me ha funcionado! Gracias por tomarte la molestia de responder y ayudarme  ;D
Título: Re: Método de clase no funciona - Ayuda
Publicado por: MAFUS en 23 Diciembre 2018, 02:41 AM
Verás, por ejemplo, Virgo va desde 24 de Agosto a 22 de Septiembre. Por eso es necesario controlar día y mes.
Título: Re: Método de clase no funciona - Ayuda
Publicado por: Cero++ en 23 Diciembre 2018, 22:32 PM
Cita de: MAFUS en 23 Diciembre 2018, 02:41 AM
Verás, por ejemplo, Virgo va desde 24 de Agosto a 22 de Septiembre. Por eso es necesario controlar día y mes.


Pero de hecho, me ha funcionado, aunque no lo probé con todos los signos  ;D
Título: Re: Método de clase no funciona - Ayuda
Publicado por: MAFUS en 23 Diciembre 2018, 23:21 PM
Sí, acabo de mirar bien la solución que te han dado y es muy buena.