Método de clase no funciona - Ayuda

Iniciado por Cero++, 20 Diciembre 2018, 02:11 AM

0 Miembros y 2 Visitantes están viendo este tema.

Cero++

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;
}
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

CalgaryCorpus

#1
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.
.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Cero++

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?
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

MCKSys Argentina

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!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


MAFUS

Por eso es que necesita los dos meses. En vez de quitar ese if lo que debe hacer es prescindir del switch.

MCKSys Argentina

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.
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Cero++

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
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

MAFUS

Verás, por ejemplo, Virgo va desde 24 de Agosto a 22 de Septiembre. Por eso es necesario controlar día y mes.

Cero++

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
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

MAFUS

Sí, acabo de mirar bien la solución que te han dado y es muy buena.