Problema:
Data un’ora, calcolare l’angolo in gradi compreso tra la lancetta dei minuti e la lancetta dei secondi in un orologio analogico (sempre il piu’ piccolo dei due).
Input:
L’input e’ costituito da due interi che rappresentano rispettivamente il valore delle ore (h) e il valore dei minuti (m).
Il valore delle ore e’ un intero compreso tra 0 e 11 estremi compresi.
Il valore dei minuti e’ un intero compreso tra 0 e 59 estremi compresi.
Output:
L’output e’ un numero reale (compreso tra 0 e 180 gradi) che rappresenta l’angolo cercato.
Il mio ragionamento:
Misuriamo gli angoli assoluti in senso orario e partendo dalla positione che indica le 12.
Il valore assoluto dell’angolo della lancetta dei minuti e’ dato da:
m * (360 / 60) = 6 * m
Il valore assoluto dell’angolo della lancetta delle ore e’ dato da:
h * (360 / 12) + (m / 60) (360 / 12) = 30 * h + m / 2
La differenza di questi due angoli in valore assoluto e’ uno dei due angoli tra le lancette:
Abs( 6 * m – (30 * h + m / 2)) =
Abs( 5.5 * m – 30 * h )
Tuttavia se questo angolo e’ maggiore di 180 significa che dobbiamo considerare il suo esplementare:
(360 – angle)
La mia soluzione:
public static double GetAngleBetweenClockHands(byte h, byte m)
{
if (h < 0 || h > 11) throw new ArgumentOutOfRangeException("h must be between 0 and 11");
if (m < 0 || m > 59) throw new ArgumentOutOfRangeException("m must be between 0 and 59");
double angle = Math.Abs(5.5 * m - 30 * h);
return angle <= 180 ? angle : 360 - angle;
}
Correzioni suggerite:
- Usare “must be” invece di “has to”
- Usare l’eccezione piu’ specifica ArgumentOutOfRangeException invece che ArgumentException