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.

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, 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 uma struct data (o enunciado não especifica a assinatura exata, mas vamos assumir que ela aceita uma struct data por 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 (d1 e d2).
  • 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} e d2 = {31, 12, 1999}: comparar anos → 2000 vs 19991999 é menor, então d2 é a mais antiga.
  • d1 = {5, 5, 2020} e d2 = {10, 3, 2020}: anos iguais (2020), comparar meses → 5 vs 33 é menor, logo d2 é a mais antiga.
  • d1 = {10, 4, 2021} e d2 = {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):
  1. Se d1.ano < d2.ano, então d1 é a mais antiga → imprimir d1.
  2. Senão, se d1.ano > d2.ano, então d2 é a mais antiga → imprimir d2.
  3. Senão (anos iguais): comparar meses:
    • Se d1.mes < d2.mes, imprimir d1.
    • Se d1.mes > d2.mes, imprimir d2.
  4. Senão (meses iguais): comparar dias:
    • Se d1.dia <= d2.dia, imprimir d1 (observe que para igualdade podemos escolher qualquer uma).
    • Senão, imprimir d2.
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 for void printdata(struct data d); use printdata(d1);. Se for void printdata(const struct data *d); então chamaria printdata(&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 ano dos dois parâmetros. Se diferente, chame printdata() com a data de ano menor.
  • Se anos iguais, compare mes. Se diferente, chame printdata() com a data de mês menor.
  • Se meses iguais, compare dia. Use <= para que, no caso de igualdade, d1 seja impressa; caso contrário, imprima d2.
  • 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);
    }
}

Exercícios relacionados