Para esta questão, suponha que você tem a struct
struct data {
int dia, mes, ano;
};
Escreva uma função que recebe duas datas d1 e d2 e imprime a mais antiga delas. Suponha que já existe uma função printdata( ) que pode ser usada.
struct data {
int dia, mes, ano;
};
Passo 1
O enunciado dá a seguinte definição de struct:
struct data {
int dia, mes, ano;
};
E pede: escrever uma função que receba duas datas,
Informações relevantes que o enunciado fornece:
d1 e d2, e imprima a mais antiga das duas usando uma função já existente printdata() (pode ser usada diretamente).Informações relevantes que o enunciado fornece:
- Cada data tem três campos inteiros:
dia,mes,ano. - Existe a função
printdata()para imprimir umastruct data(o enunciado não especifica a assinatura exata, mas vamos assumir que ela aceita umastruct datapor valor:void printdata(struct data d);— se for diferente (por exemplo, aceitar ponteiro), basta adaptar a chamada). - A tarefa é comparar as duas datas e imprimir a mais antiga (aquela que aconteceu primeiro no tempo).
O que a função deve fazer concretamente:
- Receber duas variáveis do tipo
struct data(d1ed2). - Determinar qual delas representa uma data anterior (mais antiga).
- Chamar
printdata(...)com a data mais antiga. - Se as datas forem iguais, imprimir qualquer uma (são equivalentes).
Passo 2
Ideia geral (visão simples e intuitiva): para decidir qual data é mais antiga, compara-se primeiro o ano; se os anos são diferentes, o menor ano é a data mais antiga. Se os anos são iguais, compara-se o mês; se os meses são iguais, compara-se o dia. Esse procedimento é chamado de comparação lexicográfica por ordem de prioridade: ano > mês > dia.
Por que isso funciona?
- Datas representam instantes no tempo ordenados por ano, depois por mês, depois por dia. Se uma data tem ano menor, ela ocorre antes de outra com ano maior, independente de mês e dia. Se o ano empata, aí o mês decide; se também empata, o dia decide.
Exemplo rápido para fixar:
d1 = {1, 1, 2000}ed2 = {31, 12, 1999}: comparar anos →2000vs1999→1999é menor, entãod2é a mais antiga.d1 = {5, 5, 2020}ed2 = {10, 3, 2020}: anos iguais (2020), comparar meses →5vs3→3é menor, logod2é a mais antiga.d1 = {10, 4, 2021}ed2 = {10, 4, 2021}: iguais em ano, mês e dia → datas iguais → imprimir qualquer uma.
Passo 3
Estratégia passo a passo (pseudocódigo lógico, para você aplicar na prova):
- Se
d1.ano < d2.ano, entãod1é a mais antiga → imprimird1. - Senão, se
d1.ano > d2.ano, entãod2é a mais antiga → imprimird2. - Senão (anos iguais): comparar meses:
- Se
d1.mes < d2.mes, imprimird1. - Se
d1.mes > d2.mes, imprimird2.
- Se
- Senão (meses iguais): comparar dias:
- Se
d1.dia <= d2.dia, imprimird1(observe que para igualdade podemos escolher qualquer uma). - Senão, imprimir
d2.
- Se
Observação sobre o caso de igualdade: decidi usar
<= ao comparar dias para imprimir d1 quando as datas são iguais. Isso garante um comportamento definido sem necessidade de tratar um caso extra.Passo 4
Implementação prática — o que cuidar ao codar:
- Use operadores de comparação simples (
<,>,<=) sobre os campos inteiros. - Evite fazer comparações compostas desnecessárias; seguir a ordem ano → mês → dia mantém o código claro e eficiente.
- Não é necessário validar se as datas são “válidas” (ex.: mês entre 1 e 12) a menos que o enunciado peça; aqui assumimos que os valores representam datas válidas.
- Sobre a função
printdata(): se ela forvoid printdata(struct data d);useprintdata(d1);. Se forvoid printdata(const struct data *d);então chamariaprintdata(&d1);. Ajuste conforme o que houver no seu código base.
Passo 5
Explicando linha a linha (guia mental para você explicar ou escrever no gabarito):
- Comece declarando a função com um nome claro, por exemplo
imprime_mais_antiga. - Compare
anodos dois parâmetros. Se diferente, chameprintdata()com a data de ano menor. - Se anos iguais, compare
mes. Se diferente, chameprintdata()com a data de mês menor. - Se meses iguais, compare
dia. Use<=para que, no caso de igualdade,d1seja impressa; caso contrário, imprimad2. - Termine a função (retorne
void, pois a função imprime diretamente).
Passo 6
Dica de exame: escreva o código claro e direto exatamente seguindo a ordem de comparação (ano → mês → dia). Comentários curtos ajudam o corretor a entender sua lógica. Se estiver inseguro sobre a assinatura de
printdata, escreva uma linha comentada com a suposição (por exemplo /* assume: void printdata(struct data d); */) — costuma ser aceito.Resposta
void imprime_mais_antiga(struct data d1, struct data d2) {
if (d1.ano < d2.ano) {
printdata(d1);
return;
} else if (d1.ano > d2.ano) {
printdata(d2);
return;
}
/* anos iguais */
if (d1.mes < d2.mes) {
printdata(d1);
return;
} else if (d1.mes > d2.mes) {
printdata(d2);
return;
}
/* anos e meses iguais */
if (d1.dia <= d2.dia) {
printdata(d1);
} else {
printdata(d2);
}
}