2009-12-14 7 views
2

J'ai un certain nombre de miles et une vitesse en MPH que j'ai convertis en nombre d'heures nécessaires pour parcourir cette distance à cette vitesse. Maintenant, j'ai besoin de convertir ce nombre décimal en heures, minutes et secondes. Comment puis-je faire cela? Ma meilleure estimation en ce moment est:C++ convertit les heures décimales en heures, minutes et secondes

double time = distance/speed; 
int hours = time; // double to integer conversion chops off decimal 
int minutes = (time - hours) * 60; 
int seconds = (((time - hours) * 60) - minutes) * 60; 

Est-ce exact? Y a-t-il une meilleure manière de faire cela? Merci!

Répondre

2

Je ne connais pas les fonctions C++ du haut de la tête, mais ce "pseudo-code" devrait fonctionner.

double time = distance/speed; 
int hours = time; 
double minutesRemainder = (time - hours) * 60; 
int minutes = minutesRemainder; 
double secondsRemainder = (minutesRemainder - minutes) * 60; 
int seconds = secondsRemainder; 

Corrigé n'ayant pas besoin d'étage.

Pour autant que le commentaire ne fonctionne pas pour des temps négatifs, vous ne pouvez pas avoir une distance négative en physique. Je dirais que ce serait une erreur d'entrée de l'utilisateur, pas une erreur de codeur!

+0

Oups, erreur mineure dans mes maths, mise à jour pour la corriger. –

+2

Pour 'time' positif,' floor' est complètement superflu. Pour "time" négatif, c'est incorrect. – avakar

+0

C'est faux. vous n'avez pas besoin de multiplier min * 60 !!! – Dani

1

Je ne sais pas si c'est mieux ... en fait je ne sais pas avec certitude que c'est correct car je ne l'ai pas testé, mais je convertirais d'abord les heures au nombre total de secondes, puis convertissez-le en heures/minutes/secondes. Cela ressemblerait à ceci:

 
int totalseconds = time * 3600.0; 

// divide by number of seconds in an hour, then round down by casting to an integer. 
int hours = totalseconds/3600; 

// divide by 60 to get minutes, then mod by 60 to get the number minutes that aren't full hours 
int minutes = (totalseconds/60) % 60; 

// use mod 60 to to get number of seconds that aren't full minutes 
int seconds = totalseconds % 60; 
+0

en heures, de secondes au total serait temps * 3600,0 et heures serait étage (totalseconds/3600) Vous êtes loin ... –

+0

En fait, à l'exception de ce '* 60.0', il l'a obtenu tout à fait raison. – avakar

+0

Je viens de corriger le code pour le multiplier par 3600 comme noté par Aequitarum. À moins que mon C-foo ne soit en panne, la conversion des heures devrait être maintenant, car la conversion en entier prendra automatiquement la parole. Peut-être serait-il plus facile à lire avec un appel explicite de floor(). S'il s'agissait d'un code de production destiné à une maintenance à long terme, il serait probablement judicieux d'être aussi explicite que possible. –

0

Je dirais que vous avez raison. :-)

Bien que je devrais ajouter, si une méthode comme celle Aequitarium Custos a présenté est plus lisible ou préférable à vous, certainement utiliser cette méthode. Parfois, il est plus facile de calculer les éléments de données un à la fois, et de calculer le suivant à partir de celui que vous venez de calculer, plutôt que d'utiliser une formule absolue commençant toujours à partir de votre première donnée. En fin de compte, tant que vos maths sont corrects (et je pense que c'est le cas), c'est à vous de décider comment vous voulez écrire le code.

0

a. Vérifiez si la vitesse n'est pas 0

b. C'est une mauvaise programmation de mettre un double dans un IMHO int. utilisation du sol (en supposant que le temps soit positif ...)

c. si la vitesse et la distance sont int - le résultat sera erroné ...

d. @Aequitarum Custos l'a eu juste après l'édition ...

+1

Même si vous utilisez 'floor', vous mettez toujours un double dans un int. – avakar

Questions connexes