lunes, 5 de diciembre de 2011

Lenguaje C , Ejercicio calcular edad

Veo interesante , crear un apartado dedicado a la programación en C en el blog.

No solo por su utilidad a la hora de crear aplicaciones, sino también como foro de debate a la hora de plantear ejercicios y su debida resolución, para el entendimiento del lenguaje.

Para programa en C es necesario tener conocimiento sobre la sintaxis de  este lenguaje , pero esta característica no es lo único necesario.

1º Necesitaremos un Compilador y un Linkeador, cualidades que emplean diferentes programas en una sola aplicación , ademas ... muchas disponibles gratuitamente y son validas para lenguaje C y C++.
Os recomiendo este Dev-C++. cuya pagina web es http://www.bloodshed.net/


2º Un libro sobre programación  C, o un manual en pdf /ebook.

            Os recomiendo este: http://www.sisoft.ucm.es/Manuales/Lenguaje_C.pdf
            Que distribuye los servicios informaticos de la UCM
             (Universidad Complutense de Madrid)

           *Yo utilizo el libro de Luis Joyanes
           "C, algoritmos ,programación y estructuras de datos"de la editorial  SCHAUM (muy  recomendado).

3º Lápiz , Papel y paciencia.



Ejercicio: (Calcular edad):

Escribir un programa que recibiendo como entrada 2 datos de fecha en formato dia (1 a 31) , mes (1 a 12) , y año (entero de cuatro dígitos) siendo fecha de nacimiento y fecha actual dichos datos ,calcule la edad en formato "Años" , siendo el calculo para una edad adulta,  y en "Meses / Días" si tuviera menos de 1 año ,en caso de calcular la edad de un bebé.

==========================================================

Propongo el mio, como ejercicio resuelto:

#include (stdio.h) 
#include (stdlib.h)
#include (conio2.h)
//crear tabla datos "fecha"
typedef struct {
        int dia;
        int mes;
        int anyo;
        }fecha;
int main(int argc, char *argv[])
{
    //variables
   
    int Edad;
    int error=0;
    fecha Fnacimiento;
    fecha Factual;
    fecha Fedad;
 //pantalla presentacion
//ESTRUCTURA VISIBLE - PEDIR FECHAS
    clrscr ();
    gotoxy (2,2);
    printf ("Introducir - Fecha de Nacimiento :");
    gotoxy (2,4);
    printf ("Introducir - Fecha Actual : \n\n\n\n\n\n");

    //Pedir fecha de nacimiento en Fecha de Nacimiento
             gotoxy (37,2);
             scanf (" %d" ,&Fnacimiento.dia);
             gotoxy (39,2);
             printf ("/");
             gotoxy (40,2);
             scanf (" %d" ,&Fnacimiento.mes);
             gotoxy (42,2);
             printf ("/");
             gotoxy (43,2);
             scanf (" %d" ,&Fnacimiento.anyo);
             //comprobar que este sea correcta la introduccion
             if (Fnacimiento.mes<1 || Fnacimiento.mes>12)
                             error=1;
            else if (Fnacimiento.dia<1 || Fnacimiento.dia>31)
                             error=1;
                             else
                            //comprobar dia en mes de 30 dias
                              switch (Fnacimiento.mes) {
                               case 4:
                               case 6:
                               case 9:
                               case 11:     
                               if (Fnacimiento.dia>30)
                                   error=1;
                                   break;
                             //comprobar Febrero
                                         case 2:
                                         if (Fnacimiento.dia>28)
                                          error=1;
                                          break;
                                          }
  
  //Pedir fecha de actual en Fecha de Actual
             gotoxy (30,4);
             scanf (" %d" ,&Factual.dia);
             gotoxy (32,4);
             printf ("/");
             gotoxy (33,4);
             scanf (" %d" ,&Factual.mes);
             gotoxy (35,4);
             printf ("/");
             gotoxy (36,4);
             scanf (" %d" ,&Factual.anyo);
             //comprobar que este sea correcta la introduccion
             if (Factual.mes<1 || Factual.mes>12)
                             error=1;
            else if (Factual.dia<1 || Factual.dia>31)
                             error=1;
                             else
                             
                             //comprobar dia en mes de 30 dias
                              switch (Factual.mes) {
                               case 4:
                               case 6:
                               case 9:
                               case 11:     
                               if (Factual.dia>30)
                                   error=1;
                                   break;
                             //comprobar Febrero
                                         case 2:
                                         if (Factual.dia>28)
                                          error=1;
                                          break;
                                          }
//FIN ESTRUCTURA VISIBLE PEDIR FECHAS
      
    Fedad.dia=Factual.dia-Fnacimiento.dia;
    Fedad.mes=Factual.mes-Fnacimiento.mes;
    Fedad.anyo=Factual.anyo-Fnacimiento.anyo;
 
//si es un Bebe ...años menor1


if (Factual.anyo-Fnacimiento.anyo==0) {
       if (Factual.dia-Fnacimiento.dia<0); 
                       switch (Fnacimiento.mes){
                                     case '4':
                                     case '6':
                                     case '9':
                                     case '11':
                                     Fedad.mes--,Fedad.dia=Fedad.dia+30;
                                     break;
                                     case '2':
                                     Fedad.mes--,Fedad.dia=Fedad.dia+28;
                                     break;
                                     }
                                      (Fedad.mes--,(Fedad.dia=Fedad.dia+31));
              
      printf ("\n La edad es ...: %d Meses / %d Dias \n" ,Fedad.mes,Fedad.dia);
      }else 
      printf ("\n La edad es ...: %d  Anyos  \n ",Factual.anyo-Fnacimiento.anyo);

  system("PAUSE");
  return 0;
}
  

6 comentarios:

Rixolo dijo...

Para completarlo 100% correctamente , abría que añadirle la función año Bisiesto.
Que se compone de comprobar que el mes de febrero del año que introducimos si es de 28 o 29 dias , dependiendo de si es bisiesto o no.

Un año es bisiesto si es divisible entre 4, excepto el último de cada siglo (aquel divisible por 100), salvo que este último sea divisible por 400.

Saludos!

Rixolo dijo...

La función Bisiesto quedaría algo asi:



//funcion bisiesto

int Bisiesto(int anyo)
{
int error=0;
if ( ((anyo%4==0) && (anyo%100!=0) || (anyo%400==0) )
error=0;
else
error=1;
return error;
}

Rixolo dijo...

Ya le he encontrado algunos "flecos" por definir mejor , para perfeccionarlo y así poder usarlo mas adelante o incluso convertirlo en "libreria" propia, tipo (calculafechas.h)para poder usar mas adelante esta función,"calcular edad".

Uno de esos "flecos" por ejemplo , es que depende de algunas fechas introducidas , si coincide se da el caso que el programa muestra... X años, X meses y 31 dias...
Para corregirlo , debo añadirle la función de:" si resultado dias es "==31", "dias==0 ,meses++".

Saludos!

metagam123 dijo...

Me parece muy interesante como este leguaje en duferentes ramas ya sea computacion, electronica y robotica
el primer leguaje que apredi fue c
y me gusto aunque ya es antiguo
Me gusta como este lenguaje.

William Urbina dijo...

Hola me podrian ayudar a hacer el mismo ejemplo en dev c++,, incluyendo lo del año bisiesto,, es una nota para pasar el ciclo,, ayudenme por favor!!!! mi correo es williamdk69@yahoo.com

Rixolo dijo...

William
Esta todo explicado...apenas hay que copiar y pegar.
Pero si te digo una cosa ... sino desarrollas tu mismo el programa no seras capaz de entenderlo, que es de lo que se trata el estudio de C y C++.

Mas adelante utilizarás herramientas que esta clase de código lo automatiza.
Pero para saber que estas haciendo es necesario conocer el código fuente.

Un saludo

Quizá le interese