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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con estructuras en C (Urgente)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Duda con estructuras en C (Urgente)  (Leído 6,167 veces)
jamatbar

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Duda con estructuras en C (Urgente)
« en: 4 Enero 2014, 16:31 pm »

Buenas, me han pedido un programa en la facultad en el que ,mediante estructuras, me pida dos fechas y el programa me dice si una fecha es posterior/anterior/igual a otra fecha y si los años son bisiestos o no.

Tengo dos ficheros, el primero es fecha.c que hace la lectura, comprobación, comparación, comprobación si es bisiesto o no,  con el código que me ha quedado así:

Código:
#include <stdio.h>
#include "fecha.h"

struct fecha leeFecha(void)

{

  struct fecha Fech;

    printf("Introduzca la fecha en formato dd/mm/aaaa: ");

    scanf("%d/%d/%d", &Fech.dia, &Fech.mes, &Fech.anio);
 

  return Fech;
}


int compruebaFecha(struct fecha *pFecha)
{
  int compru;
//  int dia;
 // int mes;
  int bis;

  {
    if (pFecha->dia < 1 || pFecha->dia > 31)

      compru = 0;

    else if (pFecha->mes < 1 || pFecha->mes > 12)

      compru = 0;

    else if ((pFecha->mes == 4 || pFecha->mes == 6 || pFecha->mes == 9 || pFecha->mes == 11) && (pFecha->dia > 30))

      compru = 0;

    else if (pFecha->mes == 2)

      {
        if ((bis = 1) && (pFecha->dia > 29))

          compru = 0;

        else if ((bis = 0) && (pFecha->dia > 28))

          compru = 0;
      }

    else

      compru = 1;
  }

  return compru;

}


int comparaFecha(struct fecha f1, struct fecha f2)
/* Función comparaFecha, devuelve:
   -1 si fecha1 < fecha2
   0 si fecha1 = fecha2
   1 si fecha1 > fecha2
*/
{
  int compara;

  if (f1.anio < f2.anio)
    compara = -1;
  else if (f1.anio > f2.anio)
    compara = 1;
  else
    {
      if (f1.mes < f2.mes)
        compara = -1;
      else if (f1.mes > f2.mes)
        compara = 1;
      else
        {
          if (f1.dia < f2.dia)
            compara = -1;
          else if (f1.dia > f2.dia)
            compara = 1;
          else
            compara = 0;
        }
    }

  return compara;
}



void imprimeFecha(struct fecha f)
{

  printf("%02d/%02d/%d", f.dia, f.mes, f.anio);

  return;
}



// Funcion para comprobar si un anio es bisiesto:
int esBisiesto(struct fecha f)
{
  int bis = 0;

  // anio bisiesto: {divisible por 4 y no por 100} o {divisible por 400}

  if (((f.anio % 4 == 0) && (f.anio % 100 != 0)) || (f.anio % 400 == 0))
    bis = 1;

  return bis;
}

Aquí está el fichero estructura.c que contiene a la función main y usa las funciones de fecha.c


Código:
#include <stdio.h>
#include "fecha.h"

int main()
{
  struct fecha f1;
  struct fecha f2;
  // struct fecha *pf1;
  // struct fecha *pf2;
  int a;
  int compara;
  int bis1;
  int bis2;

  f1 = leeFecha();
  a = compruebaFecha(&f1);

  if (a == 0)
    {
      printf("Formato de fecha incorrecto\n");
    }

  else
    {
      f2 = leeFecha();
      a = compruebaFecha(&f2);

      if (a == 0)
        {
          printf("Formato de fecha incorrecto\n");
        }

      else

        {

          compara = comparaFecha(f1, f2);

/* Imprimir */

          imprimeFecha(f1);
          {
            if (compara > 0)

              printf(" es posterior a ");

            else if (compara == 0)

              printf(" es igual a ");

            else

              printf(" es anterior a ");
          }

          imprimeFecha(f2);

          bis1 = esBisiesto(f1);
          bis2 = esBisiesto(f2);

          {
            if (bis1 == 1 && bis2 == 0)

              printf("\nLa primera fecha es en bisiesto\n");

            else if (bis1 == 0 && bis2 == 1)

              printf("\nLa segunda fecha es en bisiesto\n");

            else if (bis1 == 1 && bis2 == 1)

              printf("\nAmbas fechas son en bisiesto\n");

            else

              printf("\nNinguna de las dos fechas es en bisiesto\n");

          }
        }
    }
  return 0;
}

Y aquí está fecha.h:

Código:
#ifndef FECHA_H
#define FECHA_H

struct fecha {
  int dia;
  int mes;
  int anio;
};

#define AMBAS_BISIESTO   "Ambas fechas son en bisiesto\n"
#define PRIMERA_BISIESTO "La primera fecha es en bisiesto\n"
#define SEGUNDA_BISIESTO "La segunda fecha es en bisiesto\n"
#define NINGUNA_BISIESTO "Ninguna de las dos fechas es en bisiesto\n"

struct fecha leeFecha( void );
int compruebaFecha( struct fecha *pFecha );
int comparaFecha( struct fecha f1, struct fecha f2 );
void imprimeFecha( struct fecha f );
int esBisiesto( struct fecha f );

#endif


Pues bien, el programa me funciona perfectamente salvo por un pequeño error que no consigo solucionar, puede ser una tontería pero llevo tanto tiempo haciendo el programa que no lo veo.

En la ejecución, si le pongo las fechas 06/01/1981 y 02/06/1980 me dice:

6/1/1981 es posterior a 2/6/1980
La segunda fecha es en bisiesto

¿Cómo consigo que en vez de 6/1/1981 y 2/6/1980 me ponga 06/01/1981 y 02/06/1980?

Es decir, que no se "coma" esos ceros.

¿Alguna ayuda?, gracias de antemano

Necesito que me de la ejecución tal y como digo por que si no no me lo dan como válido el programa, aunque funcione correctamente

Un saludo!


« Última modificación: 4 Enero 2014, 20:31 pm por jamatbar » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con estructuras en C (Urgente)
« Respuesta #1 en: 4 Enero 2014, 16:33 pm »

Esta línea:
Código
  1. printf("%d/%d/%d", f.dia, f.mes, f.año);

Cámbiala por:

Código
  1. printf("%02d/%02d/%04d", f.dia, f.mes, f.año);


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda con estructuras en C (Urgente)
« Respuesta #2 en: 4 Enero 2014, 19:04 pm »

Y aquí está el fichero fecha.h:

Código
  1. #ifndef FECHA_H
  2. #define FECHA_H
  3.  
  4. struct fecha {
  5.  int dia;
  6.  int mes;
  7.  int año;
  8. };
  9.  
  10. /* ... */
  11.  
La solución ya la dio amchacon, otra parte a cambiar en el programa es el nombre del campo "año" ya que en C solo son validos (como parte de un identificador) los caracteres del alfabeto ingles (ello excluye a la 'ñ').

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
jamatbar

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: Duda con estructuras en C (Urgente)
« Respuesta #3 en: 4 Enero 2014, 20:08 pm »

Muchas gracias, ya está resuelto!
En línea

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Duda con estructuras en C (Urgente)
« Respuesta #4 en: 4 Enero 2014, 20:22 pm »

Vaya, es muy buen programa para fechas la verdad, solo una cosa:

es mejor no usar variables con "ñ" puede que de errores de compilación, o bueno, es solo una sugerencia.

año ---> anyo, es muy recomendable no usar ese tipo de caracteres para lenguajes de programación, verás, estos lenguajes son principalmente basados en habla inglesa, donde no existe este caracter.

slds
En línea


jamatbar

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: Duda con estructuras en C (Urgente)
« Respuesta #5 en: 4 Enero 2014, 20:35 pm »

Respecto a lo de la variable año, yo tengo puesto anyo, pero supongo que por englobar en esta web el código me sale con ñ xD

Me queda una última cosa, que es que cuando le meta las fechas por ejemplo: 29/02/2000 y 29/02/1900 (la primera fecha es correcta ya que el 2000 es un año bisiesto pero el segundo no, ya que el 1900 no es un año bisiesto), entonces tendría que ponerme simplemente el mensaje de "Formato de fecha incorrecto"

Si ahora lo hago me sale el mensaje: 29/02/2000 es posterior a 29/02/1900 La primera fecha es en bisiesto

¿Alguna ayuda?

Saludos!
En línea

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Duda con estructuras en C (Urgente)
« Respuesta #6 en: 4 Enero 2014, 21:18 pm »

Pues solo seria mostrar el mensaje en pantalla no?? ya comprobaste todo dentro de las funciones

Ya hiciste todo el trabajo sucio, solo es indicarlo en pantalla para el usuario.

Código
  1. bis1 = esBisiesto(f1);
  2. bis2 = esBisiesto(f2);
  3. {
  4.     if (bis1 == 1 && bis2 == 0)
  5.     {
  6.              printf("\nLa primera fecha es en bisiesto");
  7.              printf("\nLa segunda fecha no es bisiesto\n");
  8.     }
  9.  
  10.     else if (bis1 == 0 && bis2 == 1)
  11.     {
  12.              printf("\nLa primera fecha no es bisiesto");
  13.              printf("\nLa segunda fecha es en bisiesto\n");
  14.     }
  15.  
  16.     else if (bis1 == 1 && bis2 == 1)
  17.              printf("\nAmbas fechas son en bisiesto\n");
  18.  
  19.     else
  20.              printf("\nNinguna de las dos fechas es en bisiesto\n");
  21.  
  22. }
  23.  
En línea


jamatbar

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: Duda con estructuras en C (Urgente)
« Respuesta #7 en: 4 Enero 2014, 21:33 pm »

Pues solo seria mostrar el mensaje en pantalla no?? ya comprobaste todo dentro de las funciones

Ya hiciste todo el trabajo sucio, solo es indicarlo en pantalla para el usuario.

Código
  1. bis1 = esBisiesto(f1);
  2. bis2 = esBisiesto(f2);
  3. {
  4.     if (bis1 == 1 && bis2 == 0)
  5.     {
  6.              printf("\nLa primera fecha es en bisiesto");
  7.              printf("\nLa segunda fecha no es bisiesto\n");
  8.     }
  9.  
  10.     else if (bis1 == 0 && bis2 == 1)
  11.     {
  12.              printf("\nLa primera fecha no es bisiesto");
  13.              printf("\nLa segunda fecha es en bisiesto\n");
  14.     }
  15.  
  16.     else if (bis1 == 1 && bis2 == 1)
  17.              printf("\nAmbas fechas son en bisiesto\n");
  18.  
  19.     else
  20.              printf("\nNinguna de las dos fechas es en bisiesto\n");
  21.  
  22. }
  23.  

No pero no es eso lo que busco, lo que busco es que si por ejemplo pongo las fechas que he dicho (29/02/2000 y 29/02/1900) al ser la segunda una fecha incorrecta ,ya que no existe, que ponga sólo por pantalla "Formato de fecha incorrecto".

Poner que no es bisiesto estaría mal ya que el 29/02/1900 directamente es una fecha que no existe puesto que al no ser bisiesto el 29 de Febrero no existe xD
En línea

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Duda con estructuras en C (Urgente)
« Respuesta #8 en: 4 Enero 2014, 22:31 pm »

pues entonces el control tendria que ser mucho más estricto, especificandole al usuario que debe saber exactamente cuales son la cantidad de dias hay en cada mes en particular, incluyendo el mes bisiesto, dentro de las condiciones de los meses y dias, tendria que hacerse un ciclo (yo usaria un while).

En el que solo pueda usarse digamos, en enero, que solo tiene 31 días, no recibir la fecha que se use en el mes de enero --> DD/01/AAAA si es menor a 1 y mayor a 31, puesto que es incorrecto, indicandole al usuario que digite un fecha correcta, y así, se valide correctamente la información, en primera debe hacerse un control así en cada mes, dependiendo de la cantidad de días, y luego sería hacer un control particular sobre febrero, aunque lo indicado sería orientar al usuario sobre cuales años son biciestos. 
En línea


jamatbar

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: Duda con estructuras en C (Urgente)
« Respuesta #9 en: 4 Enero 2014, 22:40 pm »

Gracias por la ayuda aunque no tengo ni idea de como hacerlo :S
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] - Duda estructuras « 1 2 »
Programación C/C++
h0oke 14 7,225 Último mensaje 21 Mayo 2010, 22:34 pm
por Littlehorse
Duda con estructuras (struct)
Programación C/C++
alexis33de 1 2,748 Último mensaje 28 Agosto 2010, 03:41 am
por Littlehorse
[Duda] Estructuras « 1 2 »
ASM
xv0 15 9,256 Último mensaje 12 Febrero 2013, 10:18 am
por fary
Duda con estructuras
Dudas Generales
fins94 1 2,155 Último mensaje 4 Junio 2013, 18:55 pm
por ivancea96
Duda lista con estructuras c++
Programación C/C++
d00ze13 3 2,226 Último mensaje 19 Diciembre 2013, 15:34 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines