2011-10-04 6 views
1

開始時刻と終了時刻をこの形式で入力するようにユーザーに求めています。15.45(軍事時間でコロンの代わりに10進数で)それらの時間を浮動小数点に変換して計算します。私は1時間の60分を10進数に変換することを心がけています。例えば - ユーザーが12.45の開始点と14.15の終了点を入力すると、これはそれぞれ12.75と14.25に変換されます。この変換についてどうすればいいですか?C++で数学関数を有効にするために時間入力をfloatに変換する

また、私は、とにかく好奇心を感じることができると信じています:23.59より大きい時間と最後の2桁の時間が59より大きくないように入力を検証するにはどうすればよいですか?

+0

数分で計算するだけの理由はありますか? – user786653

+0

はい、いろいろな理由 – Jake

答えて

2

数値のいずれかがdoubleになると、 はdoubleで、計算結果はdoubleとなります。だから、3つのC++の構文のいずれかを使用して、doubleminutesを変換することができます: static_cast<double>(minutes)double(minutes)または(double)minutes、 またはちょうどではなく整数60よりも、60.0で割ます。 (私は明示的 になりたいので、私はdouble(minutes)/60.0を書きたいと何人かの人々が static_castを好む、この場合であっても。。)

検証に関しては、私は、変換前にそれを行うだろう。 に数分を追加すると、それは遅すぎます。

2

だけ

double time = hours + minutes/60.0; 
bool hoursValid = hours < 24; // hours are unsigned, right? 
bool minutesValid = minutes < 60; 

例を使用します。

char buf[] = "9.45"; 
unsigned int hours, minutes; 
sscanf(buf, "%d.%d", &hours, &minutes); 
printf("%f", hours + minutes/60.0); // outputs 9.75 

あなたが入力としてdouble 9.45を取得する場合、あなたはあなたが分離する必要が#include <cmath>に必要と

hours = floor(v); 
minutes = (v - hours) * 100; 
+0

このコンピュータの前に座っていたのは長すぎると思います。ありがとうございました。 – Jake

+0

@ジェイク:あなたは大歓迎です! – Vlad

0

としてそれを分割数値の整数と小数成分。整数部分をそのまま維持し、小数部を60で割った値を加算します。

時間と分に分かれば、検証も簡単です。

0

あなたのコードがユーザからの値を文字列として読み込むと仮定します。時間と分を2つの別々の値として取得するには、小数点のユーザー入力を解析する必要があります。いったんそれがあれば、分を1時間に変換して数時間に加えることができます。

0
bool military_time_valid(float a) { 
    int t = (int)a; 
    if (t >= 24) 
     throw std::runtime_error("invalid hours"); 
    if (a-t >= .6) 
     throw std::runtime_error("invalid minutes"); 
} 
float military_to_decimal(float a) { 
    int t = (int)a; 
    return t + (a-t)/.6; 
} 
float decimal_to_military(float a) { 
    int t = (int)a; 
    return t + (a-t)*.6; 
} 
0
float t = 15.45; 
int h = (int) t; 
float m = 100 * (t - h); 
printf("%f", h + m/60); 

出力が得られます。15.750000

チェックをh023mの間であれば059の間にあります。

0

MilTimeクラスを作成して算術演算子をオーバーロードしたくない理由はありますか?それは、あなたがいつでも/に変換する必要がなくなり、より明確にあなたの意図を述べるでしょう。

関連する問題