• Jueves 14 de Noviembre de 2024, 04:28

Autor Tema:  Duda con codigo C  (Leído 3814 veces)

cltomas

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Duda con codigo C
« en: Miércoles 9 de Marzo de 2011, 15:05 »
0
Tengo que hacer el siguiente programa:
Código: C
  1. /*Dados como entrada 3 enteros representando la fecha como dia ? mes, año, imprimir la fecha del dia anterior.
  2.  Por ejemplo para una entrada como: 1 3 1992 La salida seria: Fecha anterior a 1-3-1992 es 29-02-1992 */
  3.                                                        
  4.  
Este es mi codigo:
Código: C
  1. #include <stdio.h>
  2.  
  3. /*Dados como entrada 3 enteros representando la fecha como dia ? mes, año, imprimir la fecha del dia anterior.
  4.  Por ejemplo para una entrada como: 1 3 1992 La salida seria: Fecha anterior a 1-3-1992 es 29-02-1992 */
  5.                                                        
  6.                                        
  7. int main()
  8. {
  9.      int dia;
  10.      int mes;
  11.      int anno;
  12.     int dia2, mes2;
  13.     int fecha;
  14.     int anno2;
  15.    
  16.     printf("nIntroduce el Día del mes=>n");
  17.     scanf("%d", &dia);
  18.     getchar();
  19.     printf("nIntroduce el mes [numerario]=>n");
  20.     scanf("%d", &mes);
  21.     getchar();
  22.     printf("nIntroduce el año =>n");
  23.     scanf("%d", &anno);
  24.     getchar();
  25.    
  26.      dia2=dia-1;
  27.      mes2=mes-1;
  28.      anno2=anno-1;
  29.    
  30.     /* como restringir la entrada del dia y mes a 2 digitos y año a 4 digitos*/
  31.    
  32.      if((dia2 == 0) && (mes2 == 0) && (anno != 0)) //caundo la fecha introducida sea del tipo 1-1-1977 sera 30-12-1976
  33.      
  34.       {
  35.          dia2 = 31;
  36.          mes2 = 12;
  37.        
  38.          printf("n[1º] La fecha anterior a %d-%d-%d es %d-%d-%dn", dia, mes, anno, dia2, mes2, anno2);
  39.       }
  40.     else
  41.         if ((dia2 > 0) && (mes2 == 0) && (anno != 0))// cuando la fecha introducida sea del tipo 12-1-1977 sera 11-1-1977
  42.    
  43.       {
  44.            dia2=dia - 1;
  45.            mes2=mes2 + 1;
  46.          
  47.            printf("n[2º]La fecha anterior a %d-%d-%d es %d-%d-%dn", dia, mes, anno, dia2, mes2, anno);
  48.         }
  49.      else
  50.          if ((dia2 == 0) && (mes2 > 0) && (anno != 0))// cuando la fecha introducida sea del tipo 1-12-1977 sera 30-11-1977
  51.        {
  52.            dia2= 30;
  53.            mes2=mes -1;
  54.            
  55.           printf("n[3º]La fecha anterior a %d-%d-%d es %d-%d-%dn", dia, mes, anno, dia2, mes2, anno);
  56.        }
  57.      else
  58.         if ((dia2 > 0) && (mes2>0) && (anno != 0))//cuando la fecha introducida sea del tipo 16-4-1977 sera 15-4-1977
  59.        {
  60.           dia2=dia -1;
  61.           mes2=mes2 + 1;
  62.          
  63.           printf("n[4º]La fecha anterior a %d-%d-%d es %d-%d-%dn", dia, mes, anno, dia2, mes2, anno);          
  64.         }
  65.  
  66.       else  
  67.            if ((dia == 0) || (mes == 0) || (anno == 0))
  68.       {    
  69.           printf("n[5] ERROR ..Has introducido un 0.. n");
  70.       }
  71.      else
  72.       {
  73.            printf("nERROR!!!! (día, mes, año negativo?)n");//para numero negativos LoL!!!!
  74.       }  
  75.    getchar();
  76.     return 0;
  77. }
  78.  
  79.  
Sé que me ido por las ramas con el codigo, pero soy novato y autodidacta, mis dudas son:
1.-¿ como hago para cuando el mes del año tenga 31 días y no 30?.
2.-¿como restringir la entrada del dia y mes a 2 digitos y año a 4 digitos?

Desde ya gracias y Saludos  :hola:

perrete

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Duda con codigo C
« Respuesta #1 en: Miércoles 9 de Marzo de 2011, 15:25 »
0
Para los días de cada mes, sólo se me ocurre que los vayas comprobando uno a uno, porque además tienes el problema de febrero que tiene 28...

Para restringir la entrada del mes, puedes utilizar un bucle while, que se repita hasta que el número introducido sea menor que 13. Es una forma muy básica de control de errores, pero en este caso funcionaría.

Y para el año igual, si son cuatro dígitos enciérralo en otro while donde se controle que el número introducido sea mayor que 1000 y menor que 9999.

Espero haberte sido de ayuda, un saludo!

cltomas

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Duda con codigo C
« Respuesta #2 en: Miércoles 9 de Marzo de 2011, 15:33 »
0
Gracias, el problema es que se debe realizar sin while ya que aún no llego a los bucles while, for .... :brickwall:

cltomas

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Duda con codigo C
« Respuesta #3 en: Miércoles 9 de Marzo de 2011, 15:34 »
0
Gracias, el problema es que se debe realizar sin while ya que aún no llego a los bucles while, for .... :brickwall:


doble post lo siento..no se borrarlo

perrete

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Duda con codigo C
« Respuesta #4 en: Miércoles 9 de Marzo de 2011, 16:01 »
0
Pues entonces con un if, cuando se introduzca el numero del mes compruebas que sea menor que 13 y mayor que 0, y el año compruebas que sea mayor que 1000 y menor que 9999. Un saludo!

ehecatl

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Duda con codigo C
« Respuesta #5 en: Miércoles 30 de Marzo de 2011, 05:33 »
0
Ya viste la instrucción swith-case? creo que puede venirte bastante bien para el tema de los meses, haces 12 cases, cada uno para cada mes y de este modo, filtras esa condicion de meses de 30-31 dias (incluyendo a febrero, claro), ademas de que podrias meterle tambien, dentro del case 2 (febrero), la condicion cuando el año sea bisiesto que te brinque con 29 dias ...

Saludos
Ehecatl

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Duda con codigo C
« Respuesta #6 en: Miércoles 30 de Marzo de 2011, 09:22 »
0
switch es mala solución, aunque desde luego la más usada. Es mucho más eficiente (si ya has visto vectores/arreglos/arrays):

Código: C
  1. int dias_meses[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  2.