Definir o tipo data, adequado para representar valores da forma: dia/mês/ano. Escrever as funções data prafrente(data D, int d), que retorna a data D acrescida de d dias e data pratras(data D, int d ), que retorna a data D decrescida de dias. Considere que fevereiro tem sempre 28 dias. Escrever a função main() para testar as funções prafrente e pratras.

Passo 1

A questão pede para criar um tipo em C que guarde datas no formato dia/mês/ano e duas funções: uma que avança a data em um certo número de dias e outra que retrocede. Além disso, precisamos de um main() que teste essas funções. Vamos precisar manejar o limite de dias de cada mês (com fevereiro fixo em 28 dias) e o estouro de mês/ano.

Passo 2

Primeiro, definimos uma struct chamada Data com três inteiros: dia, mês e ano. Assim temos um tipo que agrupa as três informações de data.
Depois, fazemos uma função auxiliar diasNoMes(int mes) que retorna quantos dias aquele mês tem (com um vetor estático e fevereiro=28).

Passo 3

Para implementar dataPraFrente(Data D, int d), usamos um laço while(d>0). A cada iteração incrementamos D.dia em 1 e diminuímos d. Se D.dia ultrapassar diasNoMes(D.mes), zeramos D.dia para 1 e incrementamos o mês; se o mês passar de 12, voltamos para 1 e incrementamos o ano.

Passo 4

A função dataPraTras(Data D, int d) é parecida, mas andando para trás: enquanto d>0, decrementamos D.dia e d; se D.dia ficar abaixo de 1, decrementamos o mês (ou o ano, se mês ficar abaixo de 1), e ajustamos D.dia com o número correto de dias do novo mês.

Passo 5

Por fim, em main() declaramos algumas datas de teste, chamamos dataPraFrente e dataPraTras e imprimimos os resultados usando printf para verificar que tudo funcionou.
Segue abaixo o código completo em C que sintetiza tudo isso.

Resposta

#include <stdio.h>
// Definição do tipo Data
typedef struct {
int dia;
int mes;
int ano;
} Data;
// Função auxiliar que retorna número de dias no mês (fevereiro = 28)
int diasNoMes(int mes) {
int dias[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
return dias[mes - 1];
}
// Avança a data D em d dias
Data dataPraFrente(Data D, int d) {
while (d > 0) {
D.dia++;
d–;
if (D.dia > diasNoMes(D.mes)) {
D.dia = 1;
D.mes++;
if (D.mes > 12) {
D.mes = 1;
D.ano++;
}
}
}
return D;
}
// Retrocede a data D em d dias
Data dataPraTras(Data D, int d) {
while (d > 0) {
D.dia–;
d–;
if (D.dia < 1) {
D.mes–;
if (D.mes < 1) {
D.mes = 12;
D.ano–;
}
D.dia = diasNoMes(D.mes);
}
}
return D;
}
// Função para imprimir data no formato dd/mm/aaaa
void imprimeData(Data D) {
printf("%02d/%02d/%04d", D.dia, D.mes, D.ano);
}
int main() {
Data hoje = {28, 2, 2023};
Data futuro, passado;
// Testando avanço
futuro = dataPraFrente(hoje, 5);
printf("Data inicial: ");
imprimeData(hoje);
printf(" + 5 dias = ");
imprimeData(futuro);
printf("\n");

// Testando retrocesso
passado = dataPraTras(hoje, 10);
printf("Data inicial: ");
imprimeData(hoje);
printf(" - 10 dias = ");
imprimeData(passado);
printf("\n");

return 0;
}

Exercícios relacionados