• Lunes 8 de Julio de 2024, 06:26

Autor Tema:  proglema con metodo de sacar la diferencia de años  (Leído 1672 veces)

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
proglema con metodo de sacar la diferencia de años
« en: Miércoles 22 de Octubre de 2008, 19:20 »
0
Hola,no se lo errores que me da en este caso,la cuestion del método es que quiero sacar la diferencia en años,ahora mismo solo quiero que me saque en segundos y a partir de ahi la convertiré en años,pero en int getDiferenciaAnyos  tengo unos fallos que no se de donde vienen,me dan errores de compilacion que no se el porqué, para ver si viendo el código me podeis ayudar, para ver el código los tengo que pasar los dos ficheros Fecha.cc ,Fecha.h  ,gracias de antemano


//Fecha.cc
Código: Text
  1.   
  2. #include<iostream>
  3. #include<ostream>
  4. #include<string>
  5. #include<cstring>
  6. #include<string.h>
  7. #include "Fecha.h"
  8. #include<ctime>
  9. #include<sstream>
  10.  
  11. //#include"Punto.h"
  12. using namespace std;
  13.  
  14. /*
  15. Fecha::Fecha(){
  16.     dia=1;
  17.     mes=2;
  18.     anyo=2000;
  19. }
  20. */
  21. Fecha::~Fecha(){
  22.     dia=-1;
  23.     mes=-1;
  24.     anyo=-1;
  25.  
  26. }
  27.  
  28. Fecha::Fecha(){
  29.  
  30. //fecha y hora del sistema
  31.  time_t ahora=time(0);
  32.  
  33. tm* localtm=localtime(&ahora);
  34. dia=localtm->tm_mday;
  35. mes=localtm->tm_mon+1;
  36. anyo=localtm->tm_year+1900;
  37. /*
  38. //convertir a struct tm para fecha y hora local
  39. tm* localtm=localtime(&ahora);
  40. cout<<localtm->tm_mday <<"/"
  41.     <<localtm->tm_mon+1<<"/"
  42.     <<localtm->tm_year+1900<<endl;
  43. */
  44. }
  45. Fecha::Fecha(const Fecha &f){
  46.     dia=f.dia;
  47.     mes=f.mes;
  48.     anyo=f.anyo;
  49.  
  50. }
  51.  
  52. Fecha::Fecha(int d,int m,int a){
  53.  
  54.     //bool diac,mesc,anyoc;
  55.     if(!setDia(d)){
  56.         dia=-1;
  57.     }
  58.     else{
  59.         dia=d;
  60.  
  61.     }
  62.  
  63.     if(!setMes(m)){
  64.         mes=-1;
  65.     }
  66.     else{
  67.         mes=m;
  68.  
  69.     }
  70.  
  71.     if(!setAnyo(a)){
  72.         anyo=-1;
  73.     }
  74.     else{
  75.         anyo=a;
  76.  
  77.     }
  78.     /*
  79.     dia=d;
  80.     mes=m;
  81.     anyo=a;
  82.    
  83.    
  84.     dia=setDia(d);
  85.     mes=setMes(m);
  86.     anyo=setAnyo(a);
  87.     */
  88. }
  89.  
  90. bool Fecha::setDia(int d){
  91.     bool correcto=false;
  92.         if  ((d>=1)&&(d<=31)){
  93.             correcto=true;
  94.             dia=d;
  95.         }
  96.         else {
  97.             dia=-1;
  98.         }
  99.  
  100. return correcto;
  101. }
  102.  
  103. bool Fecha::setMes(int m){
  104.     bool correcto=false;
  105.         if  ((m>=1)&&(m<=12)){
  106.             correcto=true;
  107.             mes=m;
  108.         }
  109.         else{
  110.             mes=-1;
  111.         }
  112. return correcto;
  113. }
  114.  
  115. bool Fecha::setAnyo(int a){
  116.     bool correcto=false;
  117.         if  (a>0){
  118.             correcto=true;
  119.             anyo=a;
  120.         }
  121.         else{
  122.             anyo=-1;
  123.         }
  124.  
  125. return correcto;
  126. }
  127.  
  128. int Fecha::getDia()const{
  129.  
  130.     return dia;
  131. }
  132.  
  133. int Fecha::getMes()const{
  134.  
  135.     return mes;
  136. }
  137. int Fecha::getAnyo()const{
  138.  
  139.     return anyo;
  140. }
  141.  
  142. void Fecha::Imprimir(ostream &os)const{
  143.  
  144. //bool diacorrecto,mescorrecto,anyocorrecto;
  145.  //os<<dia<<"/"<<mes<<"/"<<anyo;
  146. //cout<<endl;
  147. //ahora vamos a validar
  148.     /*
  149.     diacorrecto=f2.setDia(dia);
  150.     mescorrecto=f2.setMes(mes);
  151.     anyocorrecto=f2.setAnyo(anyo);
  152.    
  153.     if((diacorrecto==false)||(mescorrecto==false)||(anyocorrecto==false)){
  154.         os<<"fecha no valida"<<endl;
  155.     }
  156.     else{
  157.         os<<dia<<"/"<<mes<<"/"<<anyo;
  158.     }
  159.     */
  160.  
  161.     if( (dia==-1)||(mes==-1)||(anyo==-1) ){
  162.         os<<"fecha no valida"<<endl;
  163.     }
  164.     else{
  165.         os<<dia<<"/"<<mes<<"/"<<anyo;
  166.     }
  167.  
  168. }
  169.  
  170. string Fecha::toString()const {
  171.     /*
  172.     //opcion 1
  173.     string fecha="";
  174.     int resto;
  175.        
  176.     fecha=dia/10 +'0';
  177.     //cout<<fecha<<endl;
  178.     fecha+=dia%10 +'0';
  179.     //cout<<fecha<<endl;
  180.  
  181.    
  182.     fecha+=mes/10+'0';
  183.     fecha+=mes%10 + '0';
  184.    
  185.     //convertimos el año a string
  186.     fecha+=anyo/1000 +'0';
  187.     resto=anyo%1000;
  188.     fecha+=resto/100+'0';
  189.     resto=resto%100;
  190.     fecha+=resto/10+'0';
  191.     fecha+=resto%10+'0';
  192.     */
  193.     //opcion 2
  194.     stringstream sfecha;
  195.  
  196.     sfecha << dia << '/' << mes << '/' << anyo << endl;
  197.  
  198.     // el método str() del objeto stringstream devuelve un string
  199.     // con los datos que contiene el flujo de datos.
  200.     //cout << sfecha.str() << endl;
  201.    
  202. return sfecha.str();
  203.  
  204.  
  205. }
  206. int Fecha::getDiferenciaAnyos(const Fecha &f)const{
  207.  
  208.     int diferencia;
  209.  
  210.      time_t ahora=time(0);
  211.  
  212.     tm* tm1=localtime(&ahora);
  213.     tm* tm2=new tm(*tm1);
  214.  
  215.     tm1->tm_mday=dia;
  216.     tm1->tm_mon=mes-1;
  217.     tm1->tm_year=anyo-1900;
  218.    
  219.     time_t t1=mktime(tm1);
  220.     //time_t t2=mktime(tm2);
  221.  
  222.     diferencia=difftime(time_t t1,time_t t2);
  223.  
  224. return diferencia;  
  225. }
  226. //---------------------------------------------------------------------------------------------------------------------
  227. //Fecha.h
  228.  
  229. #include<iostream>
  230. #include<ostream>
  231. #include<string>
  232. #include<cstring>
  233. #include<string.h>
  234. #include<ctime>
  235. #include<sstream>
  236. using namespace std;
  237.  
  238.  
  239.  
  240. class Fecha{
  241.  
  242.     private:
  243.         int dia,mes,anyo;  
  244.  
  245.     public:
  246.        
  247.         Fecha();
  248.         Fecha(int d,int m,int a);
  249.         Fecha(const Fecha &f);
  250.         ~Fecha();
  251.         bool setDia(int d);
  252.         bool setMes(int m);
  253.         bool setAnyo(int a);
  254.         int getDia()const;
  255.         int getMes()const;
  256.         int getAnyo()const;
  257.         bool isBisiesto()const;
  258.         void Imprimir(ostream &os)const;
  259.         string toString()const;
  260.         int getDiferenciaAnyos(const Fecha &f)const;
  261.        
  262. };
  263.  
  264.  
  265.  
« última modificación: Miércoles 22 de Octubre de 2008, 20:51 por pacorubio77 »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: proglema con metodo de sacar la diferencia de años
« Respuesta #1 en: Miércoles 22 de Octubre de 2008, 19:24 »
0
Nen, ¿cuándo vas a poner etiquetas de código?

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: proglema con metodo de sacar la diferencia de años
« Respuesta #2 en: Miércoles 22 de Octubre de 2008, 19:49 »
0
Perdonar,lo siento,pero me teneis que decir como poner todo para que os sea a vosotros más cómodo.

Una cosa,si os habeis fijado int getDiferenciaAnyos ,devuelve un entero,,,,pero difftime devuelve un double...que hago para luego convertir esos segundos en años?

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: proglema con metodo de sacar la diferencia de años
« Respuesta #3 en: Miércoles 22 de Octubre de 2008, 20:38 »
0
fijate arriba del cuadro donde podes escribir cuando dejas un mensaje que hay como unas cajitas con texto adentro, B i u Quote Code ....

pincha la Code y pone entre el [ CODE  ]  y el [    /CODE    ] el codigo, cuando veo un codigo sin indentar ni ganas dan de leerlo

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: proglema con metodo de sacar la diferencia de años
« Respuesta #4 en: Miércoles 22 de Octubre de 2008, 20:54 »
0
Ya he puesto el código un poco más ordenado,lo que más me importa es lo que dije antes,que mi funcion devuelve un entero,pero la funcion difftime devuelve un double y cuando hago la diferencia me sale un numero con este formato 1,1256e2, y eso como lo convierto a años?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: proglema con metodo de sacar la diferencia de años
« Respuesta #5 en: Miércoles 22 de Octubre de 2008, 22:43 »
0
Lo tienes muy fácil. Ve por pasos: si 1 minuto son 60 segundos, ¿cuántos segundos son una hora? ¿cuántos segundos un día? ¿cuántos un año?

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: proglema con metodo de sacar la diferencia de años
« Respuesta #6 en: Jueves 23 de Octubre de 2008, 11:20 »
0
Hola,lo que tu dices es que esa cantidad de segundos que me da X segundos /60= Y minutos,con los Y minutos que me da Y minutos /60=Zhoras, las horas Zhoras /24= K dias, y con los dias K dias /365=T años ,a eso te refieres? y si es bisiesto?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: proglema con metodo de sacar la diferencia de años
« Respuesta #7 en: Jueves 23 de Octubre de 2008, 11:35 »
0
Efectivamente, aunque lo puedes hacer de una forma más rápida dividiendo directamente entre 60*60*24*365 = 31.536.000 segundos/año.

Cita de: "pacorubio77"
y si es bisiesto?

Un año es bisiesto si cumple que el resto de dividir entre 4 es 0, y tiene un día más, esto es, 366 en total.