martes, 5 de julio de 2011

ANSI C tarea: Uso de condicionales

Dentro de la programación existen estructuras que nos auxilian en caso de tener que tomar una decisión con respecto al flujo de nuestro programa. Es decir, puede existir el caso en el que debamos realizar ciertas operaciones si se cumple una condición o si ésta no se cumple.

Puedes manejar una decisión dentro de tu programa, de cuatro formas en C:

1. if...


   if(condición){
      realiza algo;
   }

2. if...else


   if(condición){
      realiza algo;
   }
   else{
      realiza otra acción distinta;
   }

3. ...?...:... (es como un if...else abreviado)


   (condicion) ? realiza algo : realiza otra acción distinta;

4. switch


   switch(valor obtenido despues de tomar una decision){
      case 1:
         Realiza una primera acción;
         break; (break es opcional: si solamente quieres que realice solo esta acción)
      case 2:
         Realiza una segunda acción;
         break;
      .
      .
      .
      default:
         Accion a realizar si ninguno de los otros casos se cumplió
         break; (buena práctica de programación colocar un break al final aunque no es necesario)
   }

Para ilustrar su uso, se encuentra el ejemplo siguiente de un programa que calcula la edad aproximada en días, horas, minutos y segundos de un usuario cuando éste introduce su fecha de nacimiento:


#include <stdio.h>

int main(int argc, char** args){

  //Variables
  int dia;
  int mes;
  int anio;
  int edadEnAnios;
  unsigned long edadEnDias;
  unsigned long edadEnHoras;
  unsigned long edadEnMinutos;
  unsigned long edadEnSegundos;
  int opcion;

  //Instrucciones para un usuario
  printf("Introduce tu fecha de nacimiento\n");
  printf("Dia (numero entre 1 y 31): \n");
  scanf("%d", &dia);
  printf("Mes (numero entre 1  y 12): \n");
  scanf("%d", &mes);
  printf("Anio (que no pase de 2011): \n");
  scanf("%d", &anio);

  /*
    Estas son solo algunas condiciones para verificar la fecha escrita por el 
    usuario pero podrian existir otras
   */
  //Condicion para verificar que el numero del dia sea valido
  if(dia < 1 || dia > 31){
    printf("Fecha no valida, el dia debe ser un numero entre 1 y 31\n");
  }
  //Condicion para verificar que el numero de mes sea valido
  else if(mes < 1 || mes > 12){
    printf("Fecha no valida, el mes debe ser un numero entre 1 y 12\n");
  }
  //Condicion para verificar que el anio sea valido
  else if(anio > 2010){
    printf("Para fines de este programa, el anio no puede ser mayor a 2010\n");
  }
  //Si el mes se encuentra entre Enero y Julio, los meses pares en este rango
  //solamente tienen 30 dias, excepto Febrero, que tiene menos
  else if(mes < 8 && (mes % 2 == 0) && (dia > 30)){
    printf("Fecha no valida, el mes que escribiste solo tiene 30 dias\n");
  }
  //Si el mes se encuentra entre Agosto y Diciembre, los meses impares en este
  //rango, tienen 30 dias
  else if(mes >= 8 && (mes % 2 != 0) && (dia > 30)){
    printf("Fecha no valida, el mes que escribiste solo tiene 30 dias\n");
  }
  //Si el mes es Febrero, es un anio que marca fin de siglo, es bisiesto y 
  //el dia escrito es mayor que 29, entonces no es una fecha valida
  else if((mes == 2) && (anio % 100 == 0) && (anio % 400 == 0) && (dia > 29)){
    printf("Fecha no valida, Febrero solo tiene 29 dias en el anio %d\n", anio);
  }
  //Si el mes es febrero, es un anio que marca fin de siglo, no es bisiesto y
  //el dia escrito es mayor que 28, entonces no es una fecha valida
  else if((mes == 2) && (anio % 100 == 0) && (anio % 400 != 0) && (dia > 28)){
    printf("Fecha no valida, Febrero solo tiene 28 dias en el anio %d\n", anio);
  }
  //Si el mes es febrero, no es un anio que marca fin de siglo, es anio 
  //bisiesto y el dia escrito es mayor que 29, no es una fecha valida
  else if((mes == 2) && (anio % 100 != 0) && (anio % 4 == 0) && (dia > 29)){
    printf("Fecha no valida, Febrero solo tiene 29 dias en el anio %d\n", anio);
  }
  //Si el mes es febrero, no es un anio que marca fin de siglo, no es 
  //bisiesto y el dia escrito es mayor que 28, no es una fecha valida
  else if((mes == 2) && (anio % 100 != 0) && (anio % 4 != 0) && (dia > 28) ){
    printf("Fecha no valida, Febrero solo tiene 28 dias en el anio %d\n", anio);
  }
  /*
    Si todas las condiciones anteriores verifican la validez de la fecha
    se procede a realizar calculos sencillos para poder estimar el numero
    de dias vividos por la persona cuya fecha de nacimiento se introdujo.
    Este programa no funciona cuando la persona tiene menos de un anio de 
    vida. Despues se despliega un menu de opciones.
  */
 
  else{
    
    edadEnAnios = 2011 - anio;
    edadEnDias = (edadEnAnios * 365);
    edadEnHoras = edadEnDias * 24;
    edadEnMinutos = edadEnHoras * 60;
    edadEnSegundos = edadEnMinutos * 60;

    //Menu
    printf("Selecciona una opcion:\n");
    printf("1. Conocer tu edad aproximada en dias\n");
    printf("2. Conocer tu edad aproximada en horas\n");
    printf("3. Conocer tu edad aproximada en minutos\n");
    printf("4. Conocer tu edad aproximada en segundos\n");

    scanf("%d", &opcion);
    
    //Acciones que realiza el programa dependiendo de la eleccion del
    //usuario
    switch(opcion){
    case 1:
      printf("Has vivido aproximadamente %lu dias\n", edadEnDias);
      break;
    case 2:
      printf("Has vivido aproximadamente %lu horas\n", edadEnHoras);
      break;
    case 3:
      printf("Has vivido aproximadamente %lu minutos\n", edadEnMinutos);
      break;
    case 4:
      printf("Has vivido aproximadamente %lu segundos\n", edadEnSegundos);
      break;
    default:
      printf("Opcion no valida.\n");
      break;
    }
  }
}

Algunos ejemplos de la salida de este programa son los siguientes:

Este programa solamente aproxima el número de días que podría haber vivido una persona. No toma en cuenta años bisiestos y además se basa en el número de años transcurridos desde la fecha de nacimiento de la persona, por lo que si alguien introduce una fecha cuyo año sea el año en curso (2011), no se realizan los cálculos adecuados y se obtendrá que la persona ha vivido 0 días cuando probablemente haya vivido 100 días. Sin embargo, sí realiza algunas validaciones en cuanto a la fecha de nacimiento introducida por el usuario pero su objetivo principal no es el cálculo de los días, horas, minutos y segundos exactos, sino la demostración del uso de los condicionales y cómo éstos pueden anidarse o combinarse de distintas maneras.

Referencias

"Leap year". Wikipedia. The Free Encyclopedia. 2011

Decisions. The GNU C Programming Tutorial, Edition 4.1

1 comentario: