elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con algoritmos para pasar una fecha a días y calcular la diferencia.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con algoritmos para pasar una fecha a días y calcular la diferencia.  (Leído 3,066 veces)
seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Duda con algoritmos para pasar una fecha a días y calcular la diferencia.
« en: 4 Agosto 2015, 13:08 pm »

Buenas, son varios ejercicios, aquí os dejo los enunciados.

12) Teniendo en cuenta que el calendario gregoriano está vigente desde 1583 y que, según
este calendario, son bisiestos los años divisibles por 4, salvo los años seculares (los
divisibles por 100) que además deben ser divisibles por 400 para que sean bisiestos,
defínanse las funciones siguientes: bool esBisiesto(int anno), que determina si un
año del calendario gregoriano es bisiesto o no; int ultimoDeMes(int mes, int anno),
que calcula el último día de cada mes, teniendo en cuenta el año y bool
fechaCorrecta(int dia,int mes,int anno), que determina si los valores de sus
argumentos corresponden a una fecha correcta o no en el calendario gregoriano.
13) Continuando con el ejercicio anterior, defínanse también las funciones void
avanzar(int& d, int& m, int& a), que avanza un día la fecha del argumento y void
retroceder(int& d, int& m, int& a), que retrocede un día la fecha del argumento.
14) Defínanse las funciones: bool esAnterior(int d1,int m1,int a1,int d2,int
m2,int a2), que determina si la fecha d1/m1/a1 es anterior o no a la fecha d2/m2/a2, y
int diferencia(int d1,int m1,int a1,int d2,int m2,int a2), que calcula el
número de días que debe avanzar (resultado positivo) o retroceder (resultado negativo) la
fecha d1/m1/a1 hasta alcanzar la fecha d2/m2/a2.
15) Agrúpense las funciones de los tres ejercicios anteriores en un programa repetitivo que
pida una fecha del teclado, compruebe si es correcta, y ofrezca una serie de opciones para
avanzar o retroceder la fecha, para comparar con otra fecha, que se pedirá del teclado, o
para calcular la diferencia de días con otra fecha que también se deberá leer del teclado.



Me funciona todo excepto calcular la diferencia de días entre 2 fechas y la verdad tengo la cabeza saturada, ya he descubierto unos cuantos fallos que he arreglado, pero aun así sigue sin darme la diferencia correcta. Concretamente el error suceda si introduzco meses o años diferentes.

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. bool esbisiesto(int anno);
  5.  
  6. int ultimodelmes (int mes, int anno);
  7.  
  8. bool fechacorrecta(int dia, int mes, int anno);
  9.  
  10. void avanzar(int& d, int& m, int& a);
  11.  
  12. void retroceder(int& d, int& m, int& a);
  13.  
  14. bool esAnterior(int d1,int m1,int a1,int d2,int m2,int a2);
  15.  
  16. int diferencia(int d1,int m1,int a1,int d2,int m2,int a2);
  17.  
  18. int mesAdias (int mes, int anno);
  19.  
  20. int annoAdias (int anno);
  21.  
  22.  
  23. //-------------------
  24.  
  25. int main(){
  26.    int dia, mes, anno;
  27.    int dia2, mes2, anno2;
  28.    do{
  29.        cout<<"Introduce una fecha para saber si es correcta (dia, mes, año): "<<endl;
  30.        cout<<"Dia: ";
  31.        cin>>dia;
  32.        cout<<"Mes: ";
  33.        cin>>mes;
  34.        cout<<"año: ";
  35.        cin>>anno;
  36.        if (fechacorrecta(dia, mes, anno)) cout<<"Ha introducido una fecha correcta."<<endl;
  37.        else cout<<"Fecha incorrecta."<<endl;
  38.    }while(!fechacorrecta(dia, mes, anno));
  39.  
  40.    int menu=999;
  41.    while(menu!=0){
  42.        cout<<endl
  43.            <<"###########################################################"<<endl
  44.            <<"1.Avanzar un dia la fecha."<<endl
  45.            <<"2.Retroceder un dia la fecha."<<endl
  46.            <<"3.Comparar fecha introducida con otra a introducir."<<endl
  47.            <<"4.Calcular la diferencia en dias de la fechas introducidas."<<endl
  48.            <<"0.Salir"<<endl
  49.            <<"-----------------------------------------------------------"<<endl
  50.            <<endl;
  51.  
  52.        cout<<"Introduzca una opcion valida: ";
  53.        cin>>menu;
  54.  
  55.        switch (menu){
  56.  
  57.            case 0:
  58.            break;
  59.  
  60.            case 1:
  61.                avanzar(dia, mes, anno);
  62.                cout<<dia<<"/"<<mes<<"/"<<anno<<endl;
  63.            break;
  64.  
  65.            case 2:
  66.                retroceder(dia, mes, anno);
  67.                cout<<dia<<"/"<<mes<<"/"<<anno<<endl;
  68.            break;
  69.  
  70.            case 3:
  71.                do{
  72.                    cout<<"Introduce otra fecha para comparar: "<<endl;
  73.                    cout<<"Dia: ";
  74.                    cin>>dia2;
  75.                    cout<<"Mes: ";
  76.                    cin>>mes2;
  77.                    cout<<"año: ";
  78.                    cin>>anno2;
  79.                }while(!fechacorrecta(dia2, mes2, anno2));
  80.  
  81.                if(esAnterior(dia, mes, anno, dia2, mes2, anno2)) cout<<dia<<"/"<<mes<<"/"<<anno<<" es anterior a "<<dia2<<"/"<<mes2<<"/"<<anno2<<endl;
  82.                else cout<<dia<<"/"<<mes<<"/"<<anno<<" NO ES anterior a "<<dia2<<"/"<<mes2<<"/"<<anno2<<endl;
  83.            break;
  84.  
  85.            case 4:
  86.                do{
  87.                    cout<<"Introduce otra fecha para comparar: "<<endl;
  88.                    cout<<"Dia: ";
  89.                    cin>>dia2;
  90.                    cout<<"Mes: ";
  91.                    cin>>mes2;
  92.                    cout<<"año: ";
  93.                    cin>>anno2;
  94.                }while(!fechacorrecta(dia2, mes2, anno2));
  95.  
  96.                cout<<diferencia(dia, mes, anno, dia2, mes2, anno2);
  97.            break;
  98.  
  99.  
  100.  
  101.  
  102.            }
  103.  
  104.  
  105.    }
  106. return 0;
  107. }
  108.  
  109. //-------------------
  110.  
  111. bool esbisiesto(int anno){
  112.   if(anno>1583){
  113.        if(anno%4==0){
  114.            if((anno%100==0) and (anno%400==0)){
  115.                return true;
  116.            }else  return true;
  117.  
  118.  
  119.        }else return false;
  120.  
  121.    }else return false;
  122. }
  123.  
  124. int ultimodelmes (int mes, int anno){
  125.    if (mes==2){
  126.        if(esbisiesto(anno)) return 29;
  127.        else return 28;
  128.    }else if (mes!=2 and mes%2==0) return 30;
  129.    else return 31;
  130. }
  131.  
  132. bool fechacorrecta(int dia, int mes, int anno){
  133.    if(dia>31 or mes>12 or anno<1583){
  134.        return false;
  135.    }else{
  136.        if(dia>ultimodelmes(mes, anno)) return false;
  137.        else return true;
  138.    }
  139. }
  140.  
  141. void avanzar(int& d, int& m, int& a){
  142.    ++d;
  143.    if(d>ultimodelmes(m,a)) ++m;
  144.    if(m>12){
  145.        ++a;
  146.        m=1;
  147.        d=1;
  148.    }
  149.  
  150. }
  151.  
  152. void retroceder(int& d, int& m, int& a){
  153.    --d;
  154.    if(d<1){
  155.        if(m>1){
  156.            --m;
  157.            d=ultimodelmes(m, a);
  158.        }else{
  159.            m=12;
  160.            --a;
  161.            d=ultimodelmes(m, a);
  162.        }
  163.    }
  164. }
  165.  
  166. bool esAnterior(int d1,int m1,int a1,int d2,int m2,int a2){
  167.    if(a1>a2) return false;
  168.    else if (a1<a2) return true;
  169.    else{
  170.        if(m1>m2) return false;
  171.        else if(m1<m2) return true;
  172.        else {
  173.            if(d1>d2) return false;
  174.            else if(d1<d2) return true;
  175.            else cout<<"LAS DOS FECHAS SON LA MISMA"<<endl;
  176.        }
  177.    }
  178. }
  179.  
  180. int mesAdias(int mes, int anno){
  181.    int dias=0;
  182.    for(unsigned contador=1; contador<=mes; contador++){
  183.        if(mes%2==0){
  184.            if(mes==2){
  185.                if(esbisiesto(anno))dias+=29;
  186.                else dias+=28;
  187.            }else dias+=30;
  188.        }else dias+=31;
  189.    }
  190.    return dias;
  191. }
  192.  
  193. int annoAdias(int anno){
  194.    int dias=0;
  195.    for(unsigned contador=1; contador<= anno; contador++){
  196.        if(esbisiesto(anno)) dias+=366;
  197.        else dias+=365;
  198.    }
  199.    return dias;
  200. }
  201.  
  202. int diferencia(int d1,int m1,int a1,int d2,int m2,int a2){
  203.    int suma1=0, suma2=0;
  204.    suma1=d1+mesAdias(m1, a1)+annoAdias(a1);
  205.    suma2=d2+mesAdias(m2, a2)+annoAdias(a2);
  206.    if (suma1<=suma2) return suma2-suma1;
  207.    else return suma1-suma2;
  208. }
  209.  
  210.  
  211.  
  212.  


« Última modificación: 4 Agosto 2015, 13:10 pm por seryioo » En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: Duda con algoritmos para pasar una fecha a días y calcular la diferencia.
« Respuesta #1 en: 4 Agosto 2015, 18:00 pm »

Así a simple vista tienes un problema en este método:

Código
  1. int ultimodelmes (int mes, int anno){
  2.    if (mes==2){
  3.        if(esbisiesto(anno)) return 29;
  4.        else return 28;
  5.    }else if (mes!=2 and mes%2==0) return 30; //Agosto entra por aquí (FALSE)
  6.    else return 31;
  7. }

Recuerda que Agosto tiene 31 días al igual que julio. En este método agosto es el mes 8, es distinto de 2 y deja resto 0 con 2, por lo tanto te va devolver 30. Lo cual es falso.

Salu2s


En línea

seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Re: Duda con algoritmos para pasar una fecha a días y calcular la diferencia.
« Respuesta #2 en: 4 Agosto 2015, 19:40 pm »

cierto, no me había dado cuenta, ahora cuando llegue a casa lo pruebo. Puede que fuese por esa tontería.

Gracias.
En línea

seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Re: Duda con algoritmos para pasar una fecha a días y calcular la diferencia.
« Respuesta #3 en: 4 Agosto 2015, 21:19 pm »

Buenas, he corregido un par de cosas basadas en el error de que agosto tiene 31 días y no 30.

Código
  1. int ultimodelmes (int mes, int anno){
  2.    if (mes==2){
  3.        if(esbisiesto(anno)) return 29;
  4.        else return 28;
  5.    }else if (mes!=2 and mes%2==0){
  6.        if(mes==8) return 31;
  7.        else return 30;
  8.    }
  9.    else return 31;
  10. }
  11.  

y

Código
  1. int mesAdias(int mes, int anno){
  2.    int dias=0;
  3.    for(unsigned contador=1; contador<=mes; contador++){
  4.        if(mes%2==0){
  5.            if(mes==2){
  6.                if(esbisiesto(anno))dias+=29;
  7.                else dias+=28;
  8.            }else if (mes==8) dias+=31;
  9.             else dias+=30;
  10.        }else dias+=31;
  11.    }
  12.    return dias;
  13. }
  14.  



He comprobado que funcione con las siguientes  2 fechas: 2/2/2000 y 2/1/2000 y me dice que la diferencia son 27 días... sigo sin ver el problema...
En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: Duda con algoritmos para pasar una fecha a días y calcular la diferencia.
« Respuesta #4 en: 4 Agosto 2015, 21:42 pm »

Código
  1. int mesAdias(int mes, int anno){
  2.    int dias=0;
  3.    for(unsigned contador=1; contador<=mes; contador++){
  4.        if(mes%2==0){
  5.            if(mes==2){
  6.                if(esbisiesto(anno))dias+=29;
  7.                else dias+=28;
  8.            }else if (mes==8) dias+=31;
  9.             else dias+=30;
  10.        }else dias+=31;
  11.    }
  12.    return dias;
  13. }
  14.  

Con respecto a este método, explícame "semánticamente" que significa? Pues cogí papel y lápiz y la verdad no le encuentro sentido. Date cuenta que la variable mes la mantienes fija, o sea, estas sumando con el ejemplo que dices:

Código
  1. suma1=d1+mesAdias(m1, a1)+annoAdias(a1);
  2. suma2=d2+mesAdias(m2, a2)+annoAdias(a2);

Esto te está dando así:

Citar
suma1 = 2 + 31 + 366 = 399
suma2 = 2 + 58 + 366 = 426

Luego la resta te da 27. Lo cuál por supuesto que está mal. Porque entre el 2/2/2000 y 2/1/2000 hay 31 días.

Lo que quiero que expliques es como funciona tu algoritmo para ver si trabajamos desde ahí, porque en mi opinión no está bien diseñado

EDITO: No hagas doble post

Salu2s
« Última modificación: 4 Agosto 2015, 21:44 pm por DarK_FirefoX » En línea

seryioo

Desconectado Desconectado

Mensajes: 83



Ver Perfil
Re: Duda con algoritmos para pasar una fecha a días y calcular la diferencia.
« Respuesta #5 en: 5 Agosto 2015, 01:21 am »

Vale, quizás debería haber puesto lo siguiente, ya que como dices mes está estático y contador es la variable que va sumando los días de los respectivos meses hasta la variable mes.

Código
  1. int mesAdias(int mes, int anno){
  2.    int dias=0;
  3.    for(unsigned contador=1; contador<=mes; contador++){
  4.        if([b]contador[/b]%2==0){
  5.            if([b]contador[/b]==2){
  6.                if(esbisiesto(anno))dias+=29;
  7.                else dias+=28;
  8.            }else if (mes==8) dias+=31;
  9.             else dias+=30;
  10.        }else dias+=31;
  11.    }
  12.    return dias;
  13. }
  14.  
  15.  

PD: Acabo de probarlo y me devuelve 29 días :(

Por cierto, la función annoAdias lo que hace es pasar cuantos días sería en este caso 2000 años con su bucle for en el que contador va de 1 a 2000 sumando cada pasada 365 dias (o 366 según sea bisiesto).

mesAdias hace algo similar, con mes=2 el bucle for recorre con contador del 1 al 2 y suma a dias 31+28 (o 29 días si es bisiesto)
« Última modificación: 5 Agosto 2015, 01:31 am por seryioo » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Calcular días entre dos fechas...
Ejercicios
*-.Sub-Vorbio.-* 0 4,853 Último mensaje 13 Noviembre 2008, 00:51 am
por *-.Sub-Vorbio.-*
Calcular dias entre Fecha A y Fecha B « 1 2 »
.NET (C#, VB.NET, ASP)
Braayhaan 19 13,668 Último mensaje 22 Julio 2010, 15:23 pm
por MANULOMM
[Ayuda] Algoritmos para calcular contraseñas "por defecto" de routers
Redes
DoHITB 3 2,999 Último mensaje 1 Julio 2013, 14:44 pm
por HdM
Ayuda con código para calcular los días de un mes
Programación C/C++
D_F4UL7 1 2,068 Último mensaje 25 Octubre 2016, 15:22 pm
por MAFUS
Metodo para calcular dias transcurridos
Programación C/C++
Beginner Web 5 1,873 Último mensaje 26 Septiembre 2018, 14:28 pm
por M4RQUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines