在C ++中计算两次的差异

时间:2017-07-26 09:37:53

标签: c++

我正在处理的一个问题是需要以24h00格式输入两个时间值(以小时,分钟和秒为单位)。我已经声明了关于我的主程序的变量,输入和输出语句。我正在使用我的void语句CalcDiff来计算两次输入的差异。所有值都已声明为int类型。是否应首先比较输入(例如秒和秒2)以查看在计算差异之前哪个更大?我假设变量的顺序也很重要(计算分钟之前,秒之前的小时数差异)?我是C ++的新手,所以如果我错过任何明显的东西,我会道歉。

<my-daydetail [showMePartially]="showVar" 
    (close)="isHidden = true" (open)="isHidden = false"></my-daydetail>
  <div [hidden]="isHidden">

6 个答案:

答案 0 :(得分:1)

使用<chrono> an existing library

#include "date.h"
#include <iostream>

int
main()
{
    std::chrono::seconds t1, t2;
    std::cout << "Enter the first time [h]h:mm:ss: ";
    std::cin >> date::parse("%T", t1);
    if (std::cin.fail())
        return 1;
    std::cout << "Enter the second time [h]h:mm:ss: ";
    std::cin >> date::parse(" %T", t2);
    if (std::cin.fail())
        return 1;
    std::cout << date::format("Difference in times: %T\n", t1 - t2);
}

上述库是免费的,开源的,并且被提议用于标准化。

答案 1 :(得分:1)

我遇到了同样的问题,我的解决方案是这段代码,我的观点是在几秒钟内获得两次,然后减去它们以了解差异。时间计算在 IF 语句中进行。剩下的代码就是打印结果,我添加了很多变量,试图让它更清晰易懂。

#include <iostream>

using namespace std;

int main()
{
    int h1,h2,m1,m2,s1,s2;
    long TotalSeconds = 0;

    cout << "Enter the first time." << endl;
    cout << "Enter hours, minutes and seconds: ";
    cin >> h1 >> m1 >> s1;

    cout << "Enter the second time." << endl;
    cout << "Enter hours, minutes and seconds: ";
    cin >> h2 >> m2 >> s2;

    // Difference Between Times IN Seconds
    // this code must be in your function
    if( h1 > h2 ){
        TotalSeconds += 86400 - ((h1*3600)+(m1*60)+(s1));
        TotalSeconds +=  ((h2*3600)+(m2*60)+(s2));
    }else{
        //                Time 2            -        Time 1
        TotalSeconds = ((h2*3600)+(m2*60)+(s2)) - ((h1*3600)+(m1*60)+(s1));
    }
    
    cout << "Total Seconds: " << TotalSeconds << endl;
    cout << "Time Difference :\t";
    long hours, minutes, seconds;
    hours = TotalSeconds / 3600;
    cout  << hours << ":";
    TotalSeconds -= hours*3600;

    minutes = TotalSeconds / 60;
    cout  << minutes << ":";
    TotalSeconds -= minutes*60;

    seconds = TotalSeconds;
    cout  << seconds << endl;
    return 0;
}

另一个使用 C' 风格的例子,在这个例子中你必须输入这样的时间字符串 01:23:11

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int h1,h2,m1,m2,s1,s2;
    long segundos = 0;

    // Hora Inicial
    scanf("%i : %i : %i",&h1,&m1,&s1);
    // Hora Final
    scanf("%i : %i : %i",&h2,&m2,&s2);

    // HORAS
    if( h1 > h2 ){
        segundos += 86400 - ((h1*3600)+(m1*60)+(s1));
        segundos +=  ((h2*3600)+(m2*60)+(s2));
    }else{
        //                Tiempo 2         -        Tiempo 1
        segundos = ((h2*3600)+(m2*60)+(s2)) - ((h1*3600)+(m1*60)+(s1));
    }
        printf("%ld",segundos);
        return 0;
}

答案 2 :(得分:0)

除了已经存在的类来处理这个问题之外,这里有一个解释的解决方案。

首先,sec, sec2, min, min2 ...这是一个不同变量的列表。如果你有这么长的清单,这表明有些不对劲。这是C ++,所以使用OOP。也就是说,使用类。

此类的一个标题可以是

class Time {

private:
        unsigned char seconds;
        unsigned char minutes;
        unsigned char hours;

public:
        Time(const unsigned char _seconds, const unsigned char _minutes,
          const unsigned char __hours);
        Time(const unsigned int _seconds);

        Time difference(const Time& other) const;

        unsigned int to_total_seconds() const;
}

这是一种更清晰的方法 - 您在使用它时并不需要所有代码。实现:

Time Time::difference(const Time& other) const {

    int difference_seconds = (int) this.to_total_seconds() - (int) other.to_total_seconds();
    return Time((unsigned int) std::abs(difference_seconds));
}

unsigned int Time::to_total_seconds() const{
    return seconds + 60.*minutes + 60*60*hours;
}
Time::Time(const unsigned int _seconds){

    seconds = _seconds % (60*60);
    minutes = (_seconds / 60) % 60;
    hours = _seconds / (60*60);
}
Time::Time(const unsigned char _seconds, const unsigned char _minutes,
          const unsigned char __hours) :
    seconds(_seconds), minutes(_minutes), hours(_hours) {
    assert(seconds < 60);
    assert(minutes < 60);
}

另一种方法是直接存储总秒数。

我的意思是,你可以做一些事情,比如做实际的减法,比如做差异6:12到4:50,从12分钟减去50分钟,得到38个余数,然后6减去(4 +余数)= 1 - &GT; 1:38差异。但是为什么当你可以简单地减去秒数并取其绝对值时呢?

但更重要的是,保持你的主要清洁。大程序代码是一个缺少类的明确标志。

(当然,您必须在获取值的代码中添加一些内容,最好是打印机。由于存在不一致的可能性,因此不建议公开成员。)

答案 3 :(得分:0)

尝试使用std :: chrono

void calcDiff(int h1, int m1, int s1, int h2, int m2, int s2){
  std::chrono::seconds d = std::chrono::hours(h2-h1) 
                           + std::chrono::minutes(m2-m1)
                           + std::chrono::seconds(s2-s1);

  std::cout << std::chrono::duration_cast<std::chrono::hours>(d).count() << "h" <<
    std::chrono::duration_cast<std::chrono::minutes>(d % std::chrono::hours(1)).count() << "m" <<
    std::chrono::duration_cast<std::chrono::seconds>(d % std::chrono::minutes(1)).count() << "s" << std::endl;
}


int main(){
    calcDiff(13, 30, 45, 18, 40, 20); // 5h9m35s
    calcDiff(20, 30, 45, 18, 40, 20); // -1h-50m-25s
    return 0;
}

否定的结果可能有点奇怪,但我相信你能以任何你想要的方式使它发挥作用。

答案 4 :(得分:-1)

首先,函数调用的语法应该是

 CalcDiff( sec,  sec2,  min,  min2,  hr,  hr2);       

而不是

CalcDiff(int sec, int sec2, int min, int min2, int hr, int hr2, 
        diff);

在主要部分

函数定义代码应该是

void CalcDiff(int seconds, int seconds2, int minutes, int minutes2, int 
    hour, int hour2, diff)
{
  \\ write the code for subtraction here

}

答案 5 :(得分:-1)

我决定将分钟和小时转换为秒,并通过我称为CalcDiff的void函数来处理时间段的差异。在将新的DiffSec转换为新值之后,我使用了三个引用的变量FinSec,FinMin和FinHr来存储差异。 我的void语句程序是:

void CalcDiff(int seconds, int seconds2, int minutes, int minutes2, int 
hour, int hour2, int& FinSec, int& FinMin, int& FinHr)
{
   int TotalSec1, TotalSec2, DiffSec, tempMin;

   TotalSec1= (hour*3600)+(minutes*60)+seconds;
   TotalSec2= (hour2*3600)+(minutes2*60)+seconds2;

    if(TotalSec1>TotalSec2)
        DiffSec = TotalSec1 - TotalSec2;
    else
        DiffSec = TotalSec2 - TotalSec1;

    FinSec = DiffSec%60;
    tempMin = DiffSec/60;
    FinMin = tempMin%60;
    FinHr = FinMin/60;

}