Este es un tema más de matemáticas que de programación.
Por cierto, el código de ejemplo no es correcto, las horas no se están calculando bien porque hace directamente módulo entre 24 sobre las horas totales. Y no es correcto.
Pero vamos a verlo poco a poco.
Supón que
HorasTotales = 200Y queremos saber a cuantas semanas, días y horas equivalen esa cantidad de horas.
Si una semana tiene 168 horas, pues es evidente que si dividimos esas HorasTotales entre 168, nos dirá a cuantas semanas equivalen
200 / 168 = 1,19Vale, con ese resultado sabemos que 200 horas equivale a 1 semana y un poco más.
Esa parte decimal, el 0,19, no es una semana completa, pero equivale a cierta cantidad de días y de horas.
Pero, ¿como transformamos ese 0.19 en días? ¿Dividimos entre 24 porque un día tiene 24 horas?
0,19 / 24 = 0.007916Buff... estamos obteniendo valores decimales muy pequeños que no nos dicen gran cosa.
Es evidente que el razonamiento matemático que estamos siguiendo no es el bueno.
No podemos coger la parte decimal y seguir haciendo cálculos con ella.
Lo que tenemos que coger es el "resto", que como su propio nombre indica, es lo que "resta" sin computar tras haber hecho la división, es lo que realmente ha sobrado.
Para obtener el resto se usa el operador "módulo", que en muchos lenguajes (no todos) se representa con el símbolo %.
Ojo porque puede confundirnos y pensar que estamos calculando porcentajes. Pero no es así, en Java ese operador lo que nos da es el resto.
Entonces, recapitulemos.
Si hacemos una "división entera" de HorasTotales entre 168 nos dirá las "semanas enteras" equivalentes.
En el código que has puesto no se ve, pero la variable Semanas seguramente será de tipo int. Esto fuerza a que la división sea "entera", es decir, esa variable no va a recoger la parte decimal, solo la parte entera.
Así que:
Semanas = 200 / 168 = 1Ya tenemos calculado el valor de Semanas.
Ahora queremos calcular el valor de Dias.
Como hemos dicho, necesitamos el resto resultante de dividir entre 168, el valor que nos daba las semanas.
Para ello usamos el operador módulo:
Dias = 200 % 168 = 32Tenemos el valor 32, pero eso es lo que ha sobrado al
transformar en semanas.
Eso que sobra, ahora hay que
transformarlo en días32 / 24 = 1,33333Similar a como ocurría antes, tenemos 1 día entero y un poco más.
Ese poco más, el 0.3333, no da para un día, pero si equivaldrá a unas horas que hay que calcular.
Así que una vez más, habrá que obtener el resto, que nos indicará
las horas que han sobrado.
Es aquí donde fallaba el código que has puesto de ejemplo. Para las horas no se hace mod 24 directamente sobre las hora totales, si no sobre el resto obtenido al dividir entre 168
Recapitulación final:
Semanas = 200 / 168 = 1Dias = 200 % 168 / 24 = 1Horas = (200 % 168) % 24 = 8Según esto,
200 horas equivalen a 1 semana, 1 día y 8 horas.¿Es correcto?
Pues a ver...
1 semana = 168 horas
1 dia = 24 horas
resto = 8 horas
----------
200 horasEsto, escrito así rápido en Java podría ser:
public class CalculaSemanas {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.print("Horas totales: ");
int horasTotal = teclado.nextInt();
int semanas = horasTotal / 168;
int dias = horasTotal % 168 / 24;
int horas = (horasTotal % 168) % 24;
System.out.println("\n" + horasTotal + " horas equivalen a");
System.out.println("- Semanas: " + semanas);
System.out.println("- Dias: " + dias);
System.out.println("- Horas: " + horas);
teclado.close();
}
}
Y si probamos a ejecutarlo en pantalla nos da este resultado:
Horas totales: 200
200 horas equivalen a
- Semanas: 1
- Dias: 1
- Horas: 8
Y bueno, espero haberme explicado bien.
Como digo, esto es más matemáticas que programación. Hay que entender como obtener el resto de la división y qué se puede calcular con él.
Pregunta lo que necesites. Y si alguien sabe explicarlo mejor que yo, por favor, que lo haga y todos aprendemos más.
Un saludo.