计算工作日的方法

时间:2016-07-12 21:37:42

标签: c++ algorithm c++builder

我有一个练习,我遇到了一些麻烦。

我必须创建一个带有两个参数的计算器:开始添加的日期和天数(星期六和星期日除外,只有工作日,从星期一到星期五)。另一件事是总和必须包括开始日期。

E.g。让我们从2016年7月12日开始,增加8天,相当于2016年7月21日(星期六和星期日除外,2016年7月21日星期二被计为一天)。

我希望我很清楚。

我尝试编写代码,但它无效。

// rStringGridEd1->IntCells[3][row] is a custom stringgrid 
// and correspond to the number of days to add, j is the 
// counter for the loop
while (j < rStringGridEd1->IntCells[3][row]) 
{
    if (DayOfWeek(date) != 1 || DayOfWeek(date) !=7)
    {
        // if current date (TDate date = "12/07/16") is not Saturday or Sunday increment date by one day
        date++;
    }
    else if(DayOfWeek(date) == 1)
    {
        //If date correspond to sunday increment the date by one and j the counter by one
        date=date+1;
        j++;
    }
    else if(DayOfWeek(date) == 7)
    {
        //If date correspond to saturday increment the date by two days and j the counter by one
        date=date+2;
        j++;
    }
    j++;
}

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

Lee Painton使用<chrono>建立在#include "date.h" #include <iostream> date::year_month_day get_end_job_date(date::year_month_day start, date::days length) { using namespace date; --length; auto w = weeks{length / days{5}}; length %= 5; auto end = sys_days{start} + w + length; auto wd = weekday{end}; if (wd == sat) end += days{2}; else if (wd == sun) end += days{1}; return end; } 之上的free, open-source C++11/14 date library,这是date library的优秀(以及更多投票)答案。

int
main()
{
    using namespace date::literals;
    std::cout << get_end_job_date(12_d/jul/2016, date::days{8}) << '\n';
}

你可以像这样运动:

2016-07-21

哪个输出:

start

这个简单的计算器有一个前提条件start不在周末。如果这不是一个理想的前提条件,那么你可以在计算之前检测到这一点并在内部将days增加一两天。

shown and described here会处理weeksdays之间的关系,以及如何将var test = new Test(); test.extend("example", function() { console.log("First Method"); }); test.extend("example", function() { console.log("Second Method"); }); 添加到日期。它基于非常高效(非迭代)算法the docs

答案 1 :(得分:1)

如果您不需要使用循环,那么您可能需要考虑使用更简单的计算来重构您的解决方案。例如,考虑每五个工作日自动添加七天。因此,使用要添加的天数和剩余天数应该告诉您在不诉诸暴力循环的情况下添加到date变量的总天数。

由于这是一项练习,我不会深入了解代码的具体细节,但需要考虑的一些事情可能就是如何在知道您开始的那一天知道一周的哪一天结束上。此外,如果你在星期五结束,紧接其后的周末会发生什么。