/*
* arquivo:
* ------------------
* Este programa lê uma data (day, month, year) e um inteiro NumDias.
* Ele determina qual é a data correspondente ao dia seguinte da data fornecida,
* e determina também qual é a data depois de decorrer NumDias (em relaçao à data dada).
*/
#include <stdio.h>
#include <stdlib.h>
/******* Prototipos das funcoes ***********************/
int EhBissexto(int ano);
/* devolve 1 se ano é bissexto; 0 em caso contrario */
int NumDiasMes(int mes, int ano);
/* devolve o numero de dias do mes do ano correspondente */
/* Valores possiveis: 31, 30, 29 ou 28 */
void DataSeguinte(int *dia, int *mes, int *ano);
/* Veja os parâmetros:são apontadores <==========================Veja */
/* calcula a data correspondente ao dia seguinte da data dada: */
/************************************************************/
int main()
{
int day, month, year, NumDias, i;
printf("Forneca uma data que existe (dia mes ano):\n");
scanf("%d %d %d", &day, &month, &year);
printf("Data dada: %2d /%2d /%4d\n", day, month, year);
printf("Nao eŽ feita verificacao se a data dada é correta\n");
printf
("Se a data dada é incorreta, a resposta certamente será incorreta.\n");
DataSeguinte(&day, &month, &year); /* chamada da funcao DataSeguinte <====== Veja */
/* Veja como foi feita a chamada: */
/* foram passados os endereços das */
/* variáveis day, month e year. */
printf("Dia seguinte: %2d /%2d /%4d\n", day, month, year);
printf
("Forneca o numero de dias a serem computados a partir da data dada:\n");
scanf("%d", &NumDias);
printf("Numero de dias depois da data dada: %d\n", NumDias);
for (i = 1; i < NumDias; i++)
DataSeguinte(&day, &month, &year); /* chamada da funcao DataSeguinte */
printf("Nova data: %2d /%2d /%4d\n", day, month, year);
system("PAUSE");
return 0;
}
/********** Funcoes ***********************/
int EhBissexto(int ano)
{
return ((ano % 4 == 0) && (ano % 100 != 0))
|| (ano % 400 == 0);
}
/******/
int NumDiasMes(int mes, int ano)
{
if (mes < 1 || mes > 12)
printf("Tem erro: mes inexistente!\n");
else
switch (mes) {
case 2:
if (EhBissexto(ano))
return 29;
else
return 28;
case 4:
case 6:
case 9:
case 11:
return 30;
default:
return 31;
}
}
/******/
void DataSeguinte(int *dia, int *mes, int *ano)
{
int NumeroDeDiasDoMes;
NumeroDeDiasDoMes = NumDiasMes(*mes, *ano); /* Veja: passagem de valor */
if (*dia == NumeroDeDiasDoMes) { /* é o ultimo dia do mes */
*dia = 1; /* dia seguinte */
if (*mes == 12)
*ano = *ano + 1; /* unico caso em que muda o ano; senao o ano fica inalterado */
*mes = (*mes + 1) % 12; /* se estiver em dezembro o mes seguinte é janeiro; */
/* senao, é sempre o *mes +1 */
} else
*dia = *dia + 1; /* se não é final do mes, muda o dia, mas o mes e o ano ficam inalterados */
}