2017-10-15 5 views
-1

私は時間をオーバーランしようとしているコンストラクタを持っています。したがって、ユーザーが63秒を入力すると、1分に63秒を持つことができないため、60秒が1分に渡されます。これは私が持っているものです。私はコメント欄で助けが必要です。コンストラクタの時間をオーバーランしようとしています

Time::Time(int hours, int minutes, int seconds, int millis) { 

     /*int add_millis = millis; 
     minutes -= add_millis*60000 ; 
     millis += add_millis;*/ 

     int add_seconds = millis/1000; 
     millis -= add_seconds * 1000; 
     seconds += add_seconds; 

     int add_minutes = seconds/60; 
     seconds -= add_minutes * 60; 
     minutes += add_minutes; 

     int add_hours = minutes/60; 
     minutes -= add_hours * 60; 
     hours += add_hours; 

     hours %= 24; 
+0

をC++での剰余演算子があります。 ... – StoryTeller

+0

私はそれに精通していますが、私はそれがこの状況で役立つとは思わない。 –

+0

コメントアウトされたセクションにはどんな種類の助けが必要ですか?関数が正しく処理していない入力がありますか? –

答えて

0

まず、時間が「もの」であるかどうかを判断する必要があります。それはあなたの例ではないようです。オブジェクトの代わりにあなたが望むものは関数です。これは、あなたが「もの」に対して実行する「アクション」のより良い表現です。

コンストラクタは、値渡しの変数(メンバー変数も参照もありません)にのみ作用するように見えます。これは、2番目のポイントになります。パラメータに対する変更はローカルでのみ表示されます。参照渡しや別の方法で格納する必要があります(メンバー変数など)。

第3に、小さな単位から大きな単位に変更をカスケードしたいので、それぞれを1回だけラップするだけです。これにより

を念頭に置いて、あなたの機能は、参照によって渡されたパラメータを持つ関数として実装:

#include <cassert> 

void ValidateTime(int& hours, int& minutes, int& seconds, int& ms) 
{ 
    assert(ms >= 0); 
    assert(seconds >= 0); 
    assert(minutes >= 0); 
    assert(hours >= 0); 

    int add_seconds = ms/1000; 
    ms %= 1000; 

    seconds += add_seconds; 
    int add_minutes = seconds/60; 
    seconds %= 60; 

    minutes += add_minutes; 
    int add_hours = minutes/60; 
    minutes %= 60; 

    hours += add_hours; 
    // TODO: exercise for the reader: roll your hours into days. 
} 

使用例:

int main() 
{ 
    int hours = 1; 
    int minutes = 125; 
    int seconds = 63; 
    int ms = 54100; 
    ValidateTime(hours, minutes, seconds, ms); 

    std::cout << "hours: " << hours << ", minutes: " << minutes << ", seconds: " << seconds << ", ms: " << ms; 
} 

プリントhours: 3, minutes: 6, seconds: 57, ms: 100

関連する問題