Dúvida sobre o que exatamente esse if's estão fazendo

Olá, bom dia. Sou iniciante em java e estou realizando alguns exercícios no beecrowd para me aperfeiçoar (não sei se é o melhor caminho mas por ele trilho). Estava quebrando cabeça com um algoritmo, então apelei para o código que correspondia ao correto e não entendi bem o que exatamente esses if’s estão fazendo exatamente. OBS: O algoritmo serve para contar quantas horas e minutos se passaram ao fazer uma atividade.
Captura de tela 2024-02-29 110028

Se você sabe o que o algoritmo deve fazer, ficar mais fácil de compreender o motivo desses ifs. Se você precisa calcular um intervalo, mas por algum motivo o usuário digitou um valor final menor que o valor inicial, o cálculo de intervalo vai dar negativo, o que não faz sentido nesse contexto.

Um bom jeito de entender é fazer um teste de mesa sobre esse algoritmo (link explicando teste de mesa). Pegue papel e caneta (ou use o bloco de notas) e faça a sequência de passos desse algoritmo, pra entender os resultados.

Abraço.

1 curtida

Primeiro, eu mudaria os nomes das variáveis (principalmente calculo e calculo1) para deixar mais claro o que cada uma é:

int horaInicial, horaFinal, minutoInicial, minutoFinal;
// ler os valores do Scanner, etc

// cálculo
int diferencaHoras = horaFinal - horaInicial;
if (diferencaHoras < 0) {
    diferencaHoras += 24;
}
int diferencaMinutos = minutoFinal - minutoInicial;
if (diferencaMinutos < 0) {
    diferencaMinutos += 60;
    diferencaHoras--;
}

Repare que também mudei um pouco as contas, pois vc estava fazendo a mesma subtração duas vezes, o que é redundante.

Enfim, a ideia é o seguinte: se a hora inicial for, por exemplo, 23, e a hora final for 1, a diferença entre elas será -22. Mas neste caso, se começou às 23h e terminou às 01h, o algoritmo está considerando que o horário final é no dia seguinte. Então a diferença deveria ser de duas horas. Por isso somamos 24, para que o resultado seja 2. É só um pequeno truque matemático que ajusta o valor negativo para este caso específico.

Claro que poderíamos considerar que se o horário final é menor, então seria um erro. Mas neste caso, foi considerado que é o dia seguinte. Não sei se isso estava no enunciado, mas enfim…


Já o cálculo dos minutos é diferente. Vamos supor que o horário inicial é 9 e o final é 11 (ou seja, a diferencaHoras é 2). Se o minuto inicial é 10 e o minuto final é zero, quer dizer que estamos calculando a diferença entre 09:10 e 11:00 (ou seja, uma diferença de 1 hora e 50 minutos).

Mas ao fazer horaFinal - horaInicial, o resultado será 2, e ao fazer minutoFinal - minutoInicial, o resultado será -10. Neste caso, como diferencaMinutos é negativo, ele entra no segundo if, somando 60 a diferencaMinutos (que é -10). Portanto, agora diferencaMinutos será 50 (de novo, outro pequeno truque matemático para ajustar o valor negativo). E também diminuímos 1 ao valor da diferencaHoras (que passa a ser 1).


Resumindo, o primeiro if trata do caso em que o horário final é menor que o inicial, indicando que na verdade ele corresponde ao dia seguinte.

E o segundo if trata do caso em que o minuto final é menor que o inicial, indicando que ainda não completou uma hora cheia (e fazendo os ajustes necessários).

Muito obrigado, tava muito preso nisso. O senhor poderia me explicar para que serve o (diferencaHoras–)? E o senhor tem alguma dica para me aperfeiçoar no java além de fazer exercícios? estou apenas fazendo coisas na área mais simples da sintaxe mesmo, ainda não mexi com objetos, por exemplo.

Serve para subtrair 1 do valor, mas repare que na verdade são dois caracteres - e não um como vc colocou. Ou seja, isso:

diferencaHoras = diferencaHoras - 1;

É equivalente a:

diferencaHoras--;

Claro que tem alguns detalhes a mais, mas estão além do escopo do tópico.