为什么价值不断变化?

时间:2018-03-09 14:10:44

标签: c++ while-loop

我在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更改为0currMinutes会增加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

3 个答案:

答案 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,其中包括自开始以来经过的秒数,并从中计算小时数和分钟数