Definir o tipo tempo, para representar valores da forma hor:mim:seg. Escrever a função tempo retrocede(tempo t, int s ), que retorna o valor de t decrescido de s segundos. Escrever a função main() para testar a função retrocede.

Passo 1

O enunciado pede para criar um tipo abstrato “tempo” que armazene horas, minutos e segundos, e escrever uma função retrocede(tempo t, int s) que subtrai s segundos de t. Vamos precisar de struct em C e manipular tempo por meio de aritmética com segundos.

Passo 2

Primeiro vamos definir o tipo tempo como uma struct C contendo três inteiros: hora, minuto e segundo. Essa representação direta facilita o acesso e a modificação de cada campo.

Passo 3

Para subtrair s segundos de t de forma robusta, o truque é converter o tempo em um único valor (total de segundos), fazer a subtração, ajustar possíveis valores negativos usando módulo e depois converter de volta para horas, minutos e segundos.

Passo 4

Implementamos a função tempo retrocede(tempo t, int s):
  • convertemos t em total de segundos: total = t.hora3600 + t.minuto60 + t.segundo;
  • subtraímos s e usamos o módulo de 86400 para tratar wrap de dia;
  • reagruparamos horas, minutos e segundos no struct resultado.

Passo 5

Por fim, escrevemos um main() simples que cria instâncias de tempo, chama retrocede com diferentes valores de s e imprime o resultado formatado para verificar se a função está correta.

Resposta

#include <stdio.h>
// Definição do tipo tempo
typedef struct {
int hora;
int minuto;
int segundo;
} tempo;
// Função que retrocede o tempo t em s segundos
tempo retrocede(tempo t, int s) {
// converte t para total de segundos
int total = t.hora * 3600 + t.minuto * 60 + t.segundo;
// subtrai s e ajusta para o intervalo [0, 86400)
total = (total - s) % 86400;
if (total < 0) {
total += 86400;
}
// reconverte para horas, minutos e segundos
tempo resultado;
resultado.hora = total / 3600;
resultado.minuto = (total % 3600) / 60;
resultado.segundo = total % 60;
return resultado;
}
int main() {
// Testes da função
tempo t1 = {0, 0, 10};
tempo t2;
// exemplo 1: retrocedendo 5 segundos
t2 = retrocede(t1, 5);
printf("De %02d:%02d:%02d retrocedendo 5s --> %02d:%02d:%02d\n",
       t1.hora, t1.minuto, t1.segundo,
       t2.hora, t2.minuto, t2.segundo);

// exemplo 2: retrocedendo 20 segundos (vai dar wrap para o dia anterior)
t2 = retrocede(t1, 20);
printf("De %02d:%02d:%02d retrocedendo 20s --> %02d:%02d:%02d\n",
       t1.hora, t1.minuto, t1.segundo,
       t2.hora, t2.minuto, t2.segundo);

// exemplo 3: horário qualquer
tempo t3 = {12, 34, 56};
t2 = retrocede(t3, 3600 + 61); // subtrai 1h01s
printf("De %02d:%02d:%02d retrocedendo 3661s --> %02d:%02d:%02d\n",
       t3.hora, t3.minuto, t3.segundo,
       t2.hora, t2.minuto, t2.segundo);

return 0;
}

Exercícios relacionados