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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  restricción de fecha enc++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: restricción de fecha enc++  (Leído 928 veces)
juligarc10

Desconectado Desconectado

Mensajes: 47


Ver Perfil
restricción de fecha enc++
« en: 10 Diciembre 2018, 17:43 pm »

Hola amigos.

Necesito ayudar urgente, ya que non consigo que esta parte del programa me funcione. Esta parte del programa intenta hacer que por ejemplo en año bisiesto te permita introducir hasta 29 dias, pero en año no bisiesto hasta 28. O por ejemplo que si metes la fecha 2/13/2018 te vuelva a pedir la fecha; entre otras cosas... El problema es que no cumple su función tal y como debería, por ejemplo si introduces la fecha 31/4/2000, el programa creee que es valida, cuando no debería. Echenle un vistazo por favor. Aqui les dejo la parte del codigo que falla. El codigo compila. Un saludo.

Código:
do{variosClientes.Clientes[variosClientes.numClientes].fecha.dia=leerEntero("Fecha\n dia");
    variosClientes.Clientes[variosClientes.numClientes].fecha.mes=leerEntero("Fecha\n mes");
    variosClientes.Clientes[variosClientes.numClientes].fecha.anho=leerEntero("Fecha\n anho");
    a=variosClientes.Clientes[variosClientes.numClientes].fecha.anho;
    b=variosClientes.Clientes[variosClientes.numClientes].fecha.mes;
    c=variosClientes.Clientes[variosClientes.numClientes].fecha.anho;
if ((a % 4 == 0) && (a % 100 != 0 || a % 400 == 0)&&(b==2)&&((a>29)||(a<1))){ //febrero en año bisiesto
        x=true;
        break;}
    if ((b==1||b==3||b==5||b==7||b==8||b==10||b==12)&&(a>31||a<1)){ //meses con 31 dias
        x=true;
        break;}
    if ((b==4||b==6||b==9||b==11)&&(a>30||a<0)){ //meses con 30 dias
        x=true;
        break;}
    if (b<1||b>12){ //meses inexistente
        x=true;
        break;}
    if ((b==2)&&(a<1||a>28)&&(a % 4 != 0)){//febrero en año no bisiesto
        x=true;
        break;}
}while (x);


En línea

Beginner Web


Desconectado Desconectado

Mensajes: 557


youtu.be/0YhflLRE-DA


Ver Perfil
Re: restricción de fecha enc++
« Respuesta #1 en: 10 Diciembre 2018, 17:53 pm »

Hola muchacho, puedes usar esta funcion que acabo de hacer recien para ti  ;-)
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. typedef struct tfecha{
  5. int dia;
  6. int mes;
  7. int anyo;
  8. };
  9.  
  10. bool validar_fecha(tfecha fecha)
  11. {
  12. switch(fecha.mes){
  13. case 1: case 3: case 5: case 7: case 8: case 10: case 12:
  14. if(fecha.dia>0 && fecha.dia<32)
  15. return true;
  16. else
  17. return false;
  18. break;
  19. case 4: case 6: case 9: case 11:
  20. if(fecha.dia>0 && fecha.dia<31)
  21. return true;
  22. else
  23. return false;
  24. break;
  25. case 2: if(fecha.anyo%4==0){
  26. if(fecha.dia>0 && fecha.dia<30)
  27. return true;
  28. else
  29. return false;
  30. }
  31. else{
  32. if(fecha.dia>0 && fecha.dia<29)
  33. return true;
  34. else
  35. return false;
  36. }
  37. break;
  38. default: return false;
  39. }
  40. }
  41.  
  42. int main()
  43. {
  44. tfecha fecha;
  45. do{
  46. cout<<"Ingrese dia: ";
  47. cin>>fecha.dia;
  48. cout<<"Ingrese mes: ";
  49. cin>>fecha.mes;
  50. cout<<"Ingrese año: ";
  51. cin>>fecha.anyo;
  52. }while(validar_fecha(fecha)==false);
  53. cout<<"Fecha: "<<fecha.dia<<"/"<<fecha.mes<<"/"<<fecha.anyo<<endl;
  54. system("pause");
  55. }
PD: No se hacen tareas, esto es solo un mini ejemplo


« Última modificación: 10 Diciembre 2018, 17:58 pm por Beginner Web » En línea

{_id: "5ef16999f6ce240abc225ss3",
nombre: "Ana Keldysh",
nacionalidad: "Argentina",
edad: "17",
profesion: "Desarrollador Web Full Stack, pero la verdad hago de todo.",
"__v": 0
}
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 834



Ver Perfil
Re: restricción de fecha enc++
« Respuesta #2 en: 10 Diciembre 2018, 18:10 pm »

Te recomiendo encapsular todas esas comprobaciones en una o varias funciones para tener un código más legible.
Código
  1. bool fechaValida(const int day, const int month, const int year){
  2.    bool valido = true;
  3.    int limiteFebrero = diasFebrero(year); // devuelve 29 si es bisiesto, 28 si no lo es
  4.    if(month < 1 || month > 12 || day < 1 || day > 31) // condiciones que no dependen de nada, se salen de los limites
  5.        valido = false;
  6.    else if(month == 2 && day > limiteFebrero) // condiciones que dependen de que que sea bisiesto
  7.        valido = false;
  8.    else if(mes30Dias(month) && day == 31) //condiciones para los meses de 30 dias
  9.        valido = false;
  10.    return valido;
  11. }

Usando <if else> que es más recomendable que usar <break> no tienes que comprobar una condición que ya se ha evaluado antes ya que si entra en un <else if> es porque no ha entrado en un <if> anterior.

Te he dejado un ejemplo de como podría quedar mejor encapsulado. Yo creo que así es más legible. Además esa es una función que puedes usar siempre que trabajes con fechas por lo que viene bien tenerlo en una función. Ahora te queda completar las funciones que he usado ahí y que no están implementadas.

Creo que no me he dejado ninguna comprobación. De ser así podéis comentármelo.  :-X
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 834



Ver Perfil
Re: restricción de fecha enc++
« Respuesta #3 en: 10 Diciembre 2018, 18:14 pm »

Citar
case 2: if(fecha.anyo%4==0)
Un año no es bisiesto porque sea divisible por 4 únicamente.

Citar
Desde un enfoque algorítmico, se consideran las proposiciones o enunciados lógicos siguientes:

p: Es divisible entre 4
q: Es divisible entre 100
r: Es divisible entre 400
Entonces se utiliza la fórmula lógica <p && (!q || r)> para establecer si un año dado es bisiesto: es bisiesto si es divisible entre cuatro y (no es divisible entre 100 ó es divisible entre 400).
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
AlbertoBSD
Programador y
Colaborador
***
Desconectado Desconectado

Mensajes: 3.530


🏴 Libertad!!!!!


Ver Perfil WWW
Re: restricción de fecha enc++
« Respuesta #4 en: 10 Diciembre 2018, 18:22 pm »

Se podria dejar en una sola funcion:

Código
  1. #include<stdio.h>
  2. #include<stdbool.h>
  3.  
  4. bool fechaValida(const int day, const int month, const int year);
  5.  
  6. int main() {
  7. if(fechaValida(29,2,2004)) {
  8. printf("Fecha Valida\n");
  9. }
  10. else {
  11. printf("Fecha NO Valida\n");
  12. }
  13. }
  14.  
  15. bool fechaValida(const int day, const int month, const int year){
  16. int dias_mes[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
  17. bool valido = true;
  18. if(year % 4 == 0)
  19. dias_mes[1] = 29;
  20. if(month < 1 || month > 12 || day < 1 || day > dias_mes[month-1]) //Unica condicion
  21. valido = false;
  22. return valido;
  23. }
« Última modificación: 10 Diciembre 2018, 18:37 pm por AlbertoBSD » En línea

Donaciones 13vBzS5AEyW93fNFDARXiZpSpgbPhSghoW
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 834



Ver Perfil
Re: restricción de fecha enc++
« Respuesta #5 en: 10 Diciembre 2018, 18:30 pm »

Bastante más sencillo al usar los arrays para los días, es cierto. Lo único como he comentado antes, cambiando la condición de que sea bisiesto, ya que ese código no es cierto.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
AlbertoBSD
Programador y
Colaborador
***
Desconectado Desconectado

Mensajes: 3.530


🏴 Libertad!!!!!


Ver Perfil WWW
Re: restricción de fecha enc++
« Respuesta #6 en: 10 Diciembre 2018, 18:42 pm »

Jajajaja tengo que ver bien lo de los años bisiestos, mientras tanto segun tu enunciado quedaria asi no?

Código
  1. bool fechaValida(const int day, const int month, const int year){
  2. int dias_mes[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
  3. bool valido = true;
  4. if(year % 4 == 0 && (!(year % 100 == 0) || (year % 400 == 0) ))
  5. dias_mes[1] = 29;
  6. if(month < 1 || month > 12 || day < 1 || day > dias_mes[month-1]) //Unica condicion
  7. valido = false;
  8. return valido;
  9. }
« Última modificación: 10 Diciembre 2018, 18:47 pm por AlbertoBSD » En línea

Donaciones 13vBzS5AEyW93fNFDARXiZpSpgbPhSghoW
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 834



Ver Perfil
Re: restricción de fecha enc++
« Respuesta #7 en: 10 Diciembre 2018, 18:44 pm »

Exacto, además me estaba dando cuenta también de que usar dos arrays para solo cambiar un valor de podía cambiar ese valor en la condición, pero veo que te has adelantado  :xD
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
juligarc10

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: restricción de fecha enc++
« Respuesta #8 en: 10 Diciembre 2018, 19:31 pm »

Hola muchacho, puedes usar esta funcion que acabo de hacer recien para ti  ;-)
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. typedef struct tfecha{
  5. int dia;
  6. int mes;
  7. int anyo;
  8. };
  9.  
  10. bool validar_fecha(tfecha fecha)
  11. {
  12. switch(fecha.mes){
  13. case 1: case 3: case 5: case 7: case 8: case 10: case 12:
  14. if(fecha.dia>0 && fecha.dia<32)
  15. return true;
  16. else
  17. return false;
  18. break;
  19. case 4: case 6: case 9: case 11:
  20. if(fecha.dia>0 && fecha.dia<31)
  21. return true;
  22. else
  23. return false;
  24. break;
  25. case 2: if(fecha.anyo%4==0){
  26. if(fecha.dia>0 && fecha.dia<30)
  27. return true;
  28. else
  29. return false;
  30. }
  31. else{
  32. if(fecha.dia>0 && fecha.dia<29)
  33. return true;
  34. else
  35. return false;
  36. }
  37. break;
  38. default: return false;
  39. }
  40. }
  41.  
  42. int main()
  43. {
  44. tfecha fecha;
  45. do{
  46. cout<<"Ingrese dia: ";
  47. cin>>fecha.dia;
  48. cout<<"Ingrese mes: ";
  49. cin>>fecha.mes;
  50. cout<<"Ingrese año: ";
  51. cin>>fecha.anyo;
  52. }while(validar_fecha(fecha)==false);
  53. cout<<"Fecha: "<<fecha.dia<<"/"<<fecha.mes<<"/"<<fecha.anyo<<endl;
  54. system("pause");
  55. }
PD: No se hacen tareas, esto es solo un mini ejemplo

Muchos gracias. Me ha servido perfectamente. Aunque como creo que te han comentado por abajo el año bisiesto no se determina por esto solamente, (año%4==0), sino que depende de estas condiciones (año%4==0)&& (año% 100 != 0 || caño% 400 == 0).

Gracias y un saludo.
En línea

Beginner Web


Desconectado Desconectado

Mensajes: 557


youtu.be/0YhflLRE-DA


Ver Perfil
Re: restricción de fecha enc++
« Respuesta #9 en: 12 Diciembre 2018, 04:26 am »

Hola, perdon que venga a hacer spam pero queria saber si este TAD Fecha esta bien/se le puede mejorar las operaciones que tiene, me gusto la forma en la que AlbertoBSB validó  la fecha con esa función ;)
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. typedef struct tfecha{
  7. int dia;
  8. int mes;
  9. int anyo;
  10. };
  11.  
  12. void crear_fecha(tfecha &fecha);
  13. bool validar_fecha(tfecha fecha);
  14. void igualdad_fechas(tfecha a, tfecha b);
  15. void comparar_fechas(tfecha a, tfecha b);
  16. bool bisiesto(tfecha fecha);
  17. void dias(tfecha fecha);
  18. void mostrar_mes(tfecha fecha);
  19. void mostrar_fecha(tfecha fecha);
  20.  
  21. int main()
  22. {
  23. tfecha a, b;
  24. crear_fecha(a);
  25. crear_fecha(b);
  26. igualdad_fechas(a,b);
  27. comparar_fechas(a,b);
  28. if(bisiesto(a)==true)
  29. cout<<"Año bisiesto"<<endl;
  30. else
  31. cout<<"Año normal"<<endl;
  32. dias(a);
  33. mostrar_mes(a);
  34. system("pause");
  35. }
  36.  
  37. void crear_fecha(tfecha &fecha)
  38. {
  39. do{
  40. cout<<"Ingrese dia: ";
  41. cin>>fecha.dia;
  42. cout<<"Ingrese mes: ";
  43. cin>>fecha.mes;
  44. cout<<"Ingrese año: ";
  45. cin>>fecha.anyo;
  46. }while(validar_fecha(fecha)==false);
  47. mostrar_fecha(fecha);
  48. }
  49.  
  50. bool validar_fecha(tfecha fecha)
  51. {
  52. int dias_mes[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  53. bool valido=true;
  54. if(bisiesto(fecha)==true)
  55. dias_mes[1]=29;
  56. if(fecha.mes<1 || fecha.mes>12 || fecha.dia<1 || fecha.dia>dias_mes[fecha.mes-1])
  57. valido=false;
  58. return valido;
  59. }
  60.  
  61. void igualdad_fechas(tfecha a, tfecha b)
  62. {
  63. if(a.dia==b.dia && a.mes==b.mes && a.anyo==b.anyo)
  64. cout<<"Son iguales"<<endl;
  65. else
  66. cout<<"Son diferentes"<<endl;
  67. }
  68.  
  69. void comparar_fechas(tfecha a, tfecha b)
  70. {
  71. if(a.anyo>b.anyo)
  72. cout<<"Es mayor"<<endl;
  73. else{
  74. if(a.anyo<b.anyo)
  75. cout<<"Es menor"<<endl;
  76. else{
  77. if(a.mes>b.mes)
  78. cout<<"Es mayor"<<endl;
  79. else{
  80. if(a.mes<b.mes)
  81. cout<<"Es menor"<<endl;
  82. else{
  83. if(a.dia>b.dia)
  84. cout<<"Es mayor"<<endl;
  85. else
  86. cout<<"Son iguales"<<endl;
  87. }
  88. }
  89. }
  90. }
  91. }
  92.  
  93. bool bisiesto(tfecha fecha)
  94. {
  95. return (fecha.anyo%4==0 && (fecha.anyo%100!=0 || fecha.anyo%400==0));
  96. }
  97.  
  98. void dias(tfecha fecha)
  99. {
  100. //Tomar en cuenta que se toma los dias que pasaron desde el 1 de Enero.
  101. //suma_dias[11]={...]; es la suma de dias entre los meses anteriores al mismo.
  102. int cantidad_dias=-1, suma_dias[11]={31,59,90,120,151,181,212,243,273,304,334};//xd
  103. if(fecha.mes<2)
  104. cantidad_dias+=fecha.dia;
  105. else
  106. cantidad_dias+=fecha.dia+suma_dias[fecha.mes-2];
  107. if(fecha.mes>2 && bisiesto(fecha)==true)
  108. cantidad_dias++;
  109. cout<<"Cantidad de dias desde el 1 de Enero: "<<cantidad_dias<<endl;
  110. }
  111.  
  112. void mostrar_mes(tfecha fecha)
  113. {
  114. switch(fecha.mes){
  115. case 1: cout<<"Enero"<<endl;break;
  116. case 2: cout<<"Febrero"<<endl;break;
  117. case 3: cout<<"Marzo"<<endl;break;
  118. case 4: cout<<"Abril"<<endl;break;
  119. case 5: cout<<"Mayo"<<endl;break;
  120. case 6: cout<<"Junio"<<endl;break;
  121. case 7: cout<<"Julio"<<endl;break;
  122. case 8: cout<<"Agosto"<<endl;break;
  123. case 9: cout<<"Semptiembre"<<endl;break;
  124. case 10: cout<<"Octubre"<<endl;break;
  125. case 11: cout<<"Noviembre"<<endl;break;
  126. case 12: cout<<"Diciembre"<<endl;break;
  127. }
  128. }
  129.  
  130. void mostrar_fecha(tfecha fecha)
  131. {
  132. cout<<"Fecha: "<<fecha.dia<<"/"<<fecha.mes<<"/"<<fecha.anyo<<endl;
  133. }
  134.  
  135.  
En línea

{_id: "5ef16999f6ce240abc225ss3",
nombre: "Ana Keldysh",
nacionalidad: "Argentina",
edad: "17",
profesion: "Desarrollador Web Full Stack, pero la verdad hago de todo.",
"__v": 0
}
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines