我正在处理的一个问题是需要以24h00格式输入两个时间值(以小时,分钟和秒为单位)。我已经声明了关于我的主程序的变量,输入和输出语句。我正在使用我的void语句CalcDiff来计算两次输入的差异。所有值都已声明为int类型。是否应首先比较输入(例如秒和秒2)以查看在计算差异之前哪个更大?我假设变量的顺序也很重要(计算分钟之前,秒之前的小时数差异)?我是C ++的新手,所以如果我错过任何明显的东西,我会道歉。
<my-daydetail [showMePartially]="showVar"
(close)="isHidden = true" (open)="isHidden = false"></my-daydetail>
<div [hidden]="isHidden">
答案 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;
}