Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Wazzp en 23 Septiembre 2010, 23:57 pm



Título: Comparar fechas. Ayuda! C++
Publicado por: Wazzp en 23 Septiembre 2010, 23:57 pm
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    int d,m,a;
  8.    cout<<"Ingresa una fecha en formato DD-MM-AAAA"<<endl;
  9.    cin>>d>>m>>a;
  10.    cout<<"Ingresaste.."<<d<<"/"<<m<<"/"<<a<<endl;
  11.    int D,M,A;
  12.    cout<<"Ingresa una segunda fecha para comparar con la primera.."<<endl;
  13.    cin>>D>>M>>A;
  14.    cout<<"Ingresaste.."<<D<<"/"<<M<<"/"<<A<<endl;
  15.    cout<<"Comparar?? 1=si y 2=no"<<endl;
  16.    int t;
  17.    cin>>t;
  18.  
  19.    Eleccion:
  20.    switch(t) {
  21.    case '1':
  22.    goto calculo;
  23.    break;
  24.    case '2':
  25.    goto rehacer;
  26.    break;
  27.    default:
  28.    cout <<"Error,Reingresa los datos"<<endl;
  29.    break;
  30.    }
  31.    calculo:
  32.    {
  33.            cout<<"Aki iria el algoritmo para la comparacion"<<endl;
  34.                //El cual aun no se como hacer ^^^^^^^^^^^^^
  35.    }
  36.  
  37.    rehacer:
  38.    {
  39.        cout<<"Ingresa una fecha en formato DD-MM-AAAA"<<endl;
  40.    cin>>d>>m>>a;
  41.    cout<<"Ingresaste.."<<d<<"/"<<m<<"/"<<a<<endl;
  42.    cout<<"Ingresa una segunda fecha para comparar con la primera.."<<endl;
  43.    cin>>D>>M>>A;
  44.    cout<<"Ingresaste.."<<D<<"/"<<M<<"/"<<A<<endl;
  45.    cout<<"Comparar?? 1=si y 2=no"<<endl;
  46.    goto Eleccion;
  47.    }
  48.    cin.ignore();
  49.    cin.get();
  50.    return 0;
  51. }
  52.  

Estoy creando este programa que calcula el tiempo que paso entre 2 fechas.. necesito que me tiren alguna indirecta para el algoritmo del calculo.. y por favor,diganme si tengo algo mal en el codigo hasta ahora.. Creo que el switch lo tengo mal porque cada vez que pongo 1 por ejemplo,ejecuta el cout y luego vuelve al principio en lugar de terminar el programa.. gracias de antemano


Título: Re: No se que haceer! Ayuda! C++
Publicado por: [L]ord [R]NA en 24 Septiembre 2010, 00:49 am
No entiendo siquiera que es lo que quieres, si te explicas bien creo que seria mejor, verifica tambien que el codigo que tengas sea compilable... Evita los GoTo, no estamos en Basic. para eso existen las funciones, los bucles y las sentencias condicionales.


Título: Re: No se que haceer! Ayuda! C++
Publicado por: Wazzp en 24 Septiembre 2010, 00:51 am
Sinceramente,estaba leyendo uno de los libros que tengo y fue la unica manera en la que se me ocurrio.. La idea es comprar dos fechas diferentes y calcular la cantidad de dias que pasaron entre fecha1 y fecha2.. El codigo compila sin errores ni warnings asi que supongo que esta bien..


Título: Re: No se que haceer! Ayuda! C++
Publicado por: [L]ord [R]NA en 24 Septiembre 2010, 01:31 am
1) el codigo tiene un error cuando se introducen las fechas... verificalo.
2) El Switch tiene un error, siempre sale default porque solicitas un int y luego lo comparas con un char sin realizar la conversion... Mira la Tabla ASCII.

Compara primero los años, buscales la diferencia, despues los meses y despues los dias, entonces toma en consideracion la longitud del año con respecto a los meses y si el año es o no es bisiesto.

Un consejo: Si el libro que estas leyendo te recomienda GoTo inmediatamente deja de leerlo... te aseguro que quien escribio el libro a suerte debe de saber basic.


Título: Re: No se que haceer! Ayuda! C++
Publicado por: Wazzp en 24 Septiembre 2010, 20:10 pm
No es que lo recomienda.. en un momento aparece un ejemplo con el goto.. Pero no dice nada al respecto.. es como una mencion de que existe.. ahora me fijo y lo corrijo.. Gracias por la ayuda RNA  :D

EDIT: Revisando el Codigo,hice algunas modificaciones y el codigo compila y funciona bien.. Ahora mi problema es como reemplazar los goto.. Deberia usar void x () siendo x una funcion hecha por mi?? Si es asi aun no estoy seguro de como hacerlo, y si no es asi no tengo ni idea.. ayuda?


Título: Re: No se que haceer! Ayuda! C++
Publicado por: Littlehorse en 24 Septiembre 2010, 20:39 pm
Citar
EDIT: Revisando el Codigo,hice algunas modificaciones y el codigo compila y funciona bien.. Ahora mi problema es como reemplazar los goto.. Deberia usar void x () siendo x una funcion hecha por mi?? Si es asi aun no estoy seguro de como hacerlo, y si no es asi no tengo ni idea.. ayuda?

Si, usar funciones seria lo ideal. Tal vez te sirva revisar este capitulo de conclase (http://c.conclase.net/curso/?cap=003).

Saludos


Título: Re: No se que haceer! Ayuda! C++
Publicado por: Wazzp en 24 Septiembre 2010, 21:51 pm
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int d,m,a,D,M,A;
  6.    int calculo();
  7.    int datos();
  8.    void eleccion(int t);
  9.  
  10. int main()
  11. {
  12.    int datos();
  13.    {
  14.        cout<<"Ingresa una fecha en formato DD-MM-AAAA"<<endl;
  15.    cin>>d>>m>>a;
  16.    cout<<"Ingresaste.."<<d<<"/"<<m<<"/"<<a<<endl;
  17.  
  18.    cout<<"Ingresa una segunda fecha para comparar con la primera.."<<endl;
  19.    cin>>D>>M>>A;
  20.    cout<<"Ingresaste.."<<D<<"/"<<M<<"/"<<A<<endl;
  21.    }
  22.  
  23.    int eleccion(int t);
  24.    {
  25.     cout<<"Comparar?? 1=si, 2=no y 3=salir"<<endl;
  26.       int t;
  27.    cin>>t;
  28.  
  29.        switch(t)
  30.        {
  31.        case 1:
  32.        break;
  33.  
  34.        case 2:
  35.        break;
  36.  
  37.        case 3:
  38.        cout <<"Algun mensaje de salida.."<<endl;
  39.        cin.get();
  40.        return 0;
  41.  
  42.        default:
  43.        cout <<"Error,Reingresa los datos"<<endl;
  44.        break;
  45.  
  46.        }
  47.    }
  48.  
  49.  
  50. }

No se si voy bien pero por ahora tengo esto.. Alguien me podria decir si de lo de las funciones esta bien? si lo estan hago rapido el algoritmo para el calculo,relleno las funciones que me faltan y lo compilo a ver si funciona..


Título: Re: No se que haceer! Ayuda! C++
Publicado por: satu en 25 Septiembre 2010, 12:25 pm
Hola, la idea es esa pero no lo haces bien. Donde tienes definidas las funciones escribes su código y luego dentro del main solo tienes que llamar a la función:
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void datos(int &d, int &m, int &a, int &D, int &M, int &A) //Los parametros son de salida (por referencia)
  6.    {
  7.    //Aqui el code, que en tu caso seria:
  8.    cout<<"Ingresa una fecha en formato DD-MM-AAAA"<<endl;
  9.    cin>>d>>m>>a;
  10.    cout<<"Ingresaste.."<<d<<"/"<<m<<"/"<<a<<endl;
  11.  
  12.    cout<<"Ingresa una segunda fecha para comparar con la primera.."<<endl;
  13.    cin>>D>>M>>A;
  14.    cout<<"Ingresaste.."<<D<<"/"<<M<<"/"<<A<<endl;
  15.    }
  16.  
  17.  
  18. void calculo(int d, int m, int a, int D, int M, int A)
  19.    {
  20.    //Esta funcion calcula el tiempo que ha pasado entre las 2 fechas y lo muestra
  21.    //Aqui el code
  22.    }
  23.  
  24.  
  25. int main()
  26. {
  27.    int d, m, a, D, M, A, t;
  28.  
  29.    //Esto yo lo haria asi
  30.    do{
  31.        datos(d, m, a, D, M, A); //Aqui ya se almecenan en las variables los valores
  32.        cout<<"Comparar?? 1=si, 2=no y 3=salir"<<endl;
  33.        cin>>t;
  34.  
  35.        switch(t)
  36.            {
  37.            case 1: //Llamas a la funcion calcular y listo
  38.            calcular(d, m, a, D, M, A);
  39.            break;
  40.  
  41.            case 2: //Por ejemplo pides que se vuelvan a introducir los datos
  42.            cout<<"Vuelve a introducir los datos...."<<endl;
  43.            break;
  44.  
  45.            case 3:
  46.            cout <<"Algun mensaje de salida.."<<endl;
  47.            cin.get();
  48.            return 0;
  49.  
  50.            default:
  51.            cout <<"Error"<<endl;
  52.            break;
  53.            }
  54.    }while(t!=3);
  55.  
  56. return 0;
  57. }



Título: Re: No se que haceer! Ayuda! C++
Publicado por: PiroskY en 25 Septiembre 2010, 15:13 pm
Che, pero por que primero no intentas hacer el codigo que compare dos fechas?

btw: Tenes que validar que las 2 fechas esten bien o se supone que van a ingresar fechas correctas?


Título: Re: No se que haceer! Ayuda! C++
Publicado por: satu en 25 Septiembre 2010, 16:38 pm
Hola

Eso lo tiene que hacer él, es su tarea.

Y claro que puede comprobar que las fechas estén bien, pero eso ya depende de él. De esta forma tienes que confiar en que la fecha introducida sea válida, pero así está bien, eso ya depende de cómo quiera hacerlo, mientras más comprobaciones "mejor" (nótense las comillas) pero si no se lo piden....

Saludos


Título: Re: No se que haceer! Ayuda! C++
Publicado por: Wazzp en 25 Septiembre 2010, 16:59 pm
Eso de la comprobacion de la voy a agregar mas adelante.. primero quiero lo basico y se lo mando a mi amiga que me lo pidio.. y ahi le pregunto si quiere esa comprobacion,si me dice que no,el programa esta bien,si las kiere,solamente tengo que agregarlas y listo! Gracias por la ayuda :)


Título: Re: No se que haceer! Ayuda! C++
Publicado por: PiroskY en 25 Septiembre 2010, 17:07 pm
jaja a wazzap le decia que lo haga
Porque hizo toda una estructura todo ordenadito, pero primero que nada yo haria el programa funcional, y despues le doy mejor formato

Intenta hacer el codigo que compare las 2 fechas y decinos que tal te fue


Título: Re: No se que haceer! Ayuda! C++
Publicado por: Wazzp en 25 Septiembre 2010, 18:30 pm
Ok.. les voy a ser 100% Sincero.. No tengo NI IDEA de que hice XD Solo se que compila y funciona bien.. pero no creo que el algoritmo para las fechas este bien.. Alguien corrige? porque ya lo revise como 20 veces y no se cual podria ser un error..
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.    void datos(int &d,int &m,int &a,int &D,int &M,int &A)
  5.    {
  6.    cout<<"Ingresa una fecha en formato DD-MM-AAAA"<<endl;
  7.    cin>>d>>m>>a;
  8.    cout<<"Ingresaste.."<<d<<"/"<<m<<"/"<<a<<endl;
  9.  
  10.    cout<<"Ingresa una segunda fecha para comparar con la primera.."<<endl;
  11.    cin>>D>>M>>A;
  12.    cout<<"Ingresaste.."<<D<<"/"<<M<<"/"<<A<<endl;
  13.    }
  14.    void calculo(int d,int m,int a,int D,int M,int A,int m2,int a2,int r)
  15.     {
  16.        if (a>=A)
  17.        {
  18.            a2=a-A;
  19.        }
  20.  
  21.      if (a<=A)
  22.    {
  23.        a2=A-a;
  24.    }
  25.    if (m>=M)
  26.    {
  27.        m2=M-m;
  28.    }
  29.        else if (m<=M)
  30.        {
  31.           m2=M-m;
  32.        }
  33.    r=(a2*365)+(m2*30)+(D-d);
  34.    cout<<"El resultado seria: "<<r<<"dias.."<<endl;
  35.    }
  36.  
  37. int main()
  38. {
  39.   int d,m,a,D,M,A;
  40.   int a2=0,m2=0,r=0;
  41.   datos(d,m,a,D,M,A);
  42.   int t;
  43.   cout<< "Comparar..? 1=si 2=no-quiero cambiar las fechas 3=salir"
  44.   <<endl;
  45.   cin>>t;
  46.   do
  47.     {
  48.       switch(t)
  49.       {
  50.            case 1:
  51.            calculo(d,m,a,D,M,A,a2,m2,r);
  52.            return 0;
  53.            break;
  54.            case 2:
  55.            cout<<"Revisa las fechas.."<<endl;
  56.            datos(d,m,a,D,M,A);
  57.            calculo(d,m,a,D,M,A,a2,m2,r);
  58.            return 0;
  59.            break;
  60.            default:
  61.            return 0;
  62.            break;
  63.       }
  64.    }while(t!=3);
  65.  
  66. }

Ahh y disculpa satu pero use tu idea.. Una pregunta,es necesario ubicar los & dentro del void()??


Título: Re: No se que haceer! Ayuda! C++
Publicado por: PiroskY en 25 Septiembre 2010, 18:59 pm
Pero los meses no tienen todo 30 dias

Vos lo que queres hacer es algo simplesito que calcule aproximadamente, o tiene que ser exacto?
Porque tampoco estas teniendo en consideracion años bisiestos

Mira, yo empece hace poquito a programar, y lo que haria es lo siguiente:
dividi el calculo en 3 etapas
Primero calcular cuantos dias faltan hasta el fin de año de la primer fecha
despues culcular cuantos años hay entre las 2 fechas
y por ultimo cuantos dias pasaron del ultimo año

Esto te funcionaria solo para fechas en las que los años no son el mismo
pero el otro caso lo haces a parte y listo

No se si estoy ayudando demasiado, que alguien me diga si es el caso, soy nuevo en el foro


Título: Re: No se que haceer! Ayuda! C++
Publicado por: Wazzp en 25 Septiembre 2010, 19:16 pm
Aclaro por las dudas: El programa es para una amiga,en ningun caso debe ser 100% Exacto. Ya le pregunte el tema de la exactitud del programa y me dijo que no hacia falta.. Si en algun momento me pide que lo haga mas exacto usaria un par de Ifs mas para los meses que tengan 30/31/28/29 dias y los años bisiestos

Igual,Ayudes demasiado o no,quiero darte las gracias :) Todo esto me ayuda mas que a realizar el ejercicio(Que sinceramente no tiene tanta importancia) Me ayuda a pensar como programador,y creo que eso no se puede aprender de ningun lado, Solo tu interes y tus ganas de ser un programador pueden servir :) -Solo mi opinion-

Saludos del Wazzp  :rolleyes:


Título: Re: No se que haceer! Ayuda! C++
Publicado por: PiroskY en 25 Septiembre 2010, 19:27 pm
bueno, si no tiene que ser exacto esta bien


Te diria que intentes volver a hacerlo siguiendo los tips de las 3 etapas
Y si no va a ser tan exacto, tampoco te gastes en fijarte cual es la fecha anterior a la otra
Que en la primer variable se ingrese la fecha mas antigua y en la segunda la mas actual


Título: Re: No se que haceer! Ayuda! C++
Publicado por: Wazzp en 25 Septiembre 2010, 19:33 pm
Hmmm... Wow.. Se me acaba de ocurrir una muy buena idea o.o!!! Tu comment fue disparador! Graciaas!! Cuando termine el code lo posteo por si a alguien le interesa usarlo :) (Voy a ponerle lo de los años bisiestos y los meses antes de postearlo asi es 99.99% Exacto)

EDIT:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.    void datos(int &d,int &mcont,int &a,int &D,int &Mcont,int &A,int &t)
  5.    {
  6.    cout<<"Ingresa una fecha(DD/MM/AAAA. Debe ser la mas antigua!)"<<endl;
  7.    cin>>d>>mcont>>a;
  8.    cout<<"Ingresaste.."<<d<<"/"<<mcont<<"/"<<a<<endl;
  9.  
  10.    cout<<"Ingresa una segunda fecha. Debe ser la mas reciente."<<endl;
  11.    cin>>D>>Mcont>>A;
  12.    cout<<"Ingresaste.."<<D<<"/"<<Mcont<<"/"<<A<<endl;
  13.    cout<< "Comparar..? 1=si 2=no-quiero cambiar las fechas 3=salir"
  14.   <<endl;
  15.   cin>>t;
  16.    }
  17.  
  18.    void ABis(int a,int A,int m,int M)
  19.    {
  20.        if ( ( ( a % 4 == 0 ) && (a % 100 != 0 ) ) || ( (a % 400 ==0)))
  21.  
  22.            m=1;
  23.             else
  24.                m=2;
  25.  
  26.       if ( ( ( A % 4 == 0 ) &&( A % 100 != 0 ) ) || ( (A % 400 ==0) ) )
  27.  
  28.           M=1;
  29.            else
  30.                M=2;
  31.    }
  32.  
  33.    void meses(int m,int mb,int Mb,int M,int mcont,int Mcont)
  34.    {
  35.        if ((mcont==1)||(mcont==3)||(mcont==5)||(mcont==7)||(mcont==8)||(mcont==10)||(mcont==12))
  36.        {
  37.             mb=31;
  38.        }
  39.  
  40.            else if ((mcont==4)||(mcont==6)||(mcont==9)||(mcont==11))
  41.            {
  42.                mb=30;
  43.  
  44.        };
  45.    if ((Mcont==1)||(Mcont==3)||(Mcont==5)||(Mcont==7)||(Mcont==8)||(Mcont==10)||(Mcont==12))
  46.        {
  47.            Mb=31;
  48.        }
  49.        else if ((Mcont==4)||(Mcont==6)||(Mcont==9)||(Mcont==11))
  50.        {
  51.            Mb=30;
  52.        };
  53.    if ((m==1)&&(mcont==2))
  54.    {
  55.        mb=29;
  56.        }
  57.        else if((m==2)&&(mcont==2))
  58.        {
  59.            mb=28;
  60.        }
  61.  
  62.    }
  63.  
  64.    void calculo(int d,int m,int a,int X,int mcont,int mb,int Mb,int mb1,int A,int M,int Mcont,int R,int Y)
  65.    //Calcularia la cantidad de dias hasta el fin del año
  66.    {
  67.       {
  68.         while (mcont<=12)
  69.         ABis(a,A,m,M);
  70.       meses(m,mb,Mb,M,mcont,Mcont);
  71.     X+=mb;
  72.     mcont++;
  73.     };
  74.     {
  75.          while (Mcont>=1)
  76.          ABis(a,A,m,M);
  77.       meses(m,mb,Mb,M,mcont,Mcont);
  78.     Y+=Mb;
  79.     Mcont--;
  80.     };
  81.     R=(X-Y);
  82.     cout<<"La respuesta seria: "<<R<<" Dias."<<endl;
  83.     }
  84.  
  85.   int main()
  86. {
  87.   int d,a,D,A,t,m,M;
  88.   int mb=0;int Mb=0;int mcont=0;
  89.   int X=0;int Mcont=0;
  90.   int Y=0;int mb1=0;
  91.   int R=0;
  92.   datos(d,mcont,a,D,Mcont,A,t);
  93.  
  94.   do
  95.     {
  96.       switch(t)
  97.       {
  98.            case 1:
  99.            calculo(d,m,a,X,mcont,mb,Mb,mb1,A,M,Mcont,R,Y);
  100.            break;
  101.  
  102.            case 2:
  103.            cout<<"Revisa las fechas.."<<endl;
  104.            calculo(d,m,a,X,mcont,mb,Mb,mb1,A,M,Mcont,R,Y);
  105.            return 0;
  106.            break;
  107.  
  108.            default:
  109.            return 0;
  110.            break;
  111.       }
  112.    }while(t!=3);
  113. return 0;
  114. }
  115.  
Por que se cuelga en lugar de empezar cuando pongo introduzco Comparar en switch?