我在c ++中有一个简单的天文台/秒表。这是源代码:
#include<iostream>
#include <ctime>
#include <cstdlib>
int main(){
using namespace std;
//int hours,minutes,seconds=0;
int currHours=0,currMinutes=0,currSeconds=0;
clock_t startTime = clock();
while(true){
currSeconds = (clock() - startTime) / CLOCKS_PER_SEC;
std::cout<<currHours<<":"<<currMinutes<<":"<<currSeconds<<endl;
if(currSeconds==60){ //Make currSeconds to 10 to avoid waiting
currSeconds=0;
currMinutes++;
}
if(currMinutes==60){
currMinutes=0;
currHours++;
}
}
return 0;
}
但是,不是将currMinutes
递增1并将currSeconds
更改为0
,currMinutes
会增加36
。我认为这是因为while循环。我该如何解决这个问题。
输出更改的部分是:
0:0:9
0:0:9
0:0:9
0:0:9
0:0:10
0:1:10
0:2:10
0:3:10
0:4:10
0:5:10
0:6:10
0:7:10
0:8:10
0:9:10
0:10:10
0:11:10
0:12:10
0:13:10
0:14:10
0:15:10
答案 0 :(得分:3)
你的循环运行速度比每秒一次快得多。这意味着你将评估
currSeconds = (clock() - startTime) / CLOCKS_PER_SEC;
每秒多次,因为你使用的是第二个分辨率,所以if语句每次都是真的。
你需要使用更高的分辨率,检查你是否已经打印了第二个,或者在循环中添加一些等待时间,这样它就不会每秒运行多次。
答案 1 :(得分:1)
如果您展开while循环,您会发现它就像这样
set currSeconds to time since start
check currSeconds
set curr seconds to 0
set currSeconds to time since start
check currSeconds
set curr seconds to 0
set currSeconds to time since start
check currSeconds
set curr seconds to 0
你可能会发现每次检查时,currSeconds都是从秒开始的时间。这就是为什么currSeconds似乎没有重置的原因。 此外,您的程序运行速度超过每秒一次,因此currSeconds将在您的情况下检查36次,而它是60。
一种解决方案是创建另一个变量来存储自上一分钟过去以来的秒数。每次更新分钟时重置此计数器,并在几分钟到几小时内创建另一个分钟。
答案 2 :(得分:1)
这样的事情有助于解决您的问题:
#include<iostream>
#include <ctime>
#include <cstdlib>
int main(){
using namespace std;
int currHours=0,currMinutes=0,currSeconds=0;
long long seconds = 0;
clock_t startTime = clock();
while(true){
seconds = (clock() - startTime) / CLOCKS_PER_SEC;
currSeconds = seconds % 60;
currMinutes = seconds / 60 % 60;
currHours = seconds / 3600 % 24;
std::cout<<currHours<<":"<<currMinutes<<":"<<currSeconds<<endl;
}
return 0;
}
而不是检查秒数或分钟数达到60,在这种情况下获取一个变量seconds
,其中包括自开始以来经过的秒数,并从中计算小时数和分钟数