#include <stdio.h>	
#include <stdlib.h>		

#define ANO_LIMITE  2013
	
int main(int argc, char *argv[]) 	
{			
     int data_valida;
     int dia, mes, ano;

     while (1)
     {
        data_valida=1;  /* Assume que a data eh valida ate que prove o contrario */
        
        printf ("Digite o DIA: ");  
        scanf  ("%d",&dia);	
        printf ("Digite o MES: ");  
        scanf  ("%d",&mes);
        printf ("Digite o ANO: ");  
        scanf  ("%d",&ano);		
        
        printf ("Data digitada: %d/%d/%d\n",dia,mes,ano);
        
        if (dia < 1 || dia > 31) 
        {  printf("Dia invalido! Digite novamente a data...\n");  
           data_valida=0; }
        
        if (mes < 1 || mes > 12) 
        {  printf("Mes invalido! Digite novamente a data...\n");  
           data_valida=0; }
        
        if (ano < 0 || ano > ANO_LIMITE) 
        {  printf("Ano invalido! Digite novamente a data...\n");  
           data_valida=0; }
        
        if ( (dia == 31) && ((mes == 2) || (mes == 4) || (mes == 6) || (mes == 9) || (mes == 11)) )
        {  printf("Dia do mes invalido! Digite novamente a data...\n");  
           data_valida=0; }  
           
        if (dia == 30 && mes == 2)
        {  printf("Dia do mes invalido! Digite novamente a data...\n");  
           data_valida=0; }       
           
        if (dia == 29 && mes == 2 && ((ano % 4) != 0) )
        {  
           if (dia == 29 && mes == 2 && ((ano % 100) == 0) ) 
           {  printf("Dia do mes invalido (nao eh ano bissexto)! Digite novamente a data...\n");  
           data_valida=0; }    
           else
           if (dia == 29 && mes == 2 && ((ano % 400) != 0) )
           {  printf("Dia do mes invalido (nao eh ano bissexto)! Digite novamente a data...\n");  
              data_valida=0; } 
        }
                 
        if (data_valida) break;   /* Se a data continua valida, entao sai do loop de repeticao */        
    }
    
    printf ("\n");
    printf ("PARABENS: DATA VALIDA!\n");
    printf ("\n");
    
    system("PAUSE");	
    return 0;   
}	
