Angella Andrea - Italian Blog

Infinita passione per lo sviluppo software !
posts - 133, comments - 216, trackbacks - 9

My Links

News

MIT OpenCourseWare: I'm invested Wikipedia Affiliate Button


Sto leggendo:

Archives

Post Categories

Siti web realizzati

Siti web tecnici

Algoritmi – Calcolare l’angolo compreso tra le due lancette dell’orologio


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

Print | posted on mercoledì 1 settembre 2010 02:30 |

Feedback

Gravatar

# re: Algoritmi – Calcolare l’angolo compreso tra le due lancette dell’orologio

"Has to be" ;) .... meglio ancora "must be"
01/09/2010 14:52 | Miky
Gravatar

# re: Algoritmi – Calcolare l’angolo compreso tra le due lancette dell’orologio

Ha un problema: ritorna un angolo in [0,180], mentre dovrebbe essere in [0,180[...

Poi penso che il calcolo possa essere semplificato...

Infine, userei ArgumentOutOfRangeException.

-LV
01/09/2010 15:04 | LudovicoVan
Gravatar

# re: Algoritmi – Calcolare l’angolo compreso tra le due lancette dell’orologio

> come fattore per le ore

Come fattore per i minuti...

Devo proprio scappare!!

-LV
02/09/2010 02:33 | LudovicoVan
Gravatar

# re: Algoritmi – Calcolare l’angolo compreso tra le due lancette dell’orologio

Pardon, last one... :)

A meno che non si tratti dell'ennesima svista, si semplifica cosi':

-------------------------------------------

public static ClockHands CalcClockHands(TimeSpan time)
{
const double hRat = 360d / 12d;
const double mRat = 360d / 60d;
const double sRat = 360d / 60d;

double h = time.TotalHours % 12d;
double m = time.TotalMinutes % 60d;
double s = time.TotalSeconds % 60d;

ClockHands clockHands = new ClockHands()
{
HoursHandAngle = h * hRat,
MinutesHandAngle = m * mRat,
SecondsHandAngle = s * sRat,
};

return clockHands;
}

-------------------------------------------

-LV
03/09/2010 04:02 | LudovicoVan
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET