我正在尝试为某人创建一个“轮班”日历,我知道该模式从哪一天开始,并且我知道该模式的上下班时间。但我在将其翻译成代码时遇到困难。
他们周日至周四工作,周五和周六休息。除了每个月的第二周,他们周一至周三工作,周日和周四休息。每第三周,他们从周五到周四工作,接下来的周五和周六休息。然后循环重复。我想从 2024 年 1 月 1 日开始为他们创建一个日历。
我正在尝试为某人创建一个“轮班”日历,我知道该模式从哪一天开始,并且我知道该模式的上下班时间。但我在将其翻译成代码时遇到困难。
他们周日至周四工作,周五和周六休息。除了每个月的第二周,他们周一至周三工作,周日和周四休息。每第三周,他们从周五到周四工作,接下来的周五和周六休息。然后循环重复。
但我似乎无法成功创建这个。
你的问题很困惑!
为什么两个段落相同?
为什么“第三”周有9天?
为什么一个月只有三个星期?
无论如何,我想知道这是否是您正在寻找的东西
Mo Tu We Th Fr Sa Su Jan
W W W W . . W week A
W W W . W W . week B
W . . W W W W week C
W W W W . . W week A
W W W
Mo Tu We Th Fr Sa Su Feb
. W W . week B
W . . W W W W week C
W W W W . . W week A
W W W . W W . week B
W . . W
我使用您规范的合理化版本构建了这个:
There are three different shift patterns for a week: A, B, and C.
The shift pattern changes each week, starting on Monday, cycling through A,B,C and repeating
A has Fri & Sat off
B has Thus & Sun off
C has Tues & Wed off
这是生成日历的 C++ 代码
#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <vector>
#include <time.h>
struct tm firstday()
{
struct tm day = {0};
day.tm_year = 2024 - 1900;
day.tm_mon = 0;
day.tm_mday = 1;
day.tm_hour = 12;
auto t = mktime(&day);
day = *localtime(&t);
return day;
}
void incDay(struct tm &day)
{
auto t = mktime(&day) + 24 * 60 * 60;
day = *localtime(&t);
}
void incCycle(struct tm &day, int &cycle)
{
if (day.tm_wday != 1)
return;
cycle++;
if( cycle > 3 )
cycle = 1;
}
bool isWork(struct tm &day, int &cycle)
{
switch (cycle)
{
case 1:
// off fri & Sat
if (day.tm_wday == 5 ||
day.tm_wday == 6)
return false;
return true;
case 2:
// off thu & sun
if (day.tm_wday == 0 ||
day.tm_wday == 4)
return false;
return true;
case 3:
// off tues and wed
if (day.tm_wday == 2 ||
day.tm_wday == 3)
return false;
return true;
}
return true;
}
void displayDay(struct tm day, int &cycle)
{
const std::vector<char> wid { 'A', 'B', 'C' };
if (isWork(day, cycle))
std::cout << " W ";
else
std::cout << " . ";
if (day.tm_wday == 0)
std::cout << " week " << wid[cycle-1] << "\n";
}
void displayMonth(const struct tm &day)
{
if (day.tm_mday != 1)
return;
// first day of month
std::cout << "\n\n Mo Tu We Th Fr Sa Su";
switch( day.tm_mon ) {
case 0: std::cout << " Jan\n";
break;
case 1: std::cout << " Feb\n";
break;
}
int empty = day.tm_wday - 1;
if (empty == -1)
empty = 6;
for (int k = 0; k < 3 * empty; k++)
std::cout << " ";
}
main()
{
static int cycle = 1;
struct tm day = firstday();
for (int k = 0; k < 60; k++)
{
displayMonth(day);
displayDay(day, cycle);
incDay(day);
incCycle(day, cycle);
}
return 0;
}