尝试找到安排工作模式的代码

问题描述 投票:0回答:1

我正在尝试为某人创建一个“轮班”日历,我知道该模式从哪一天开始,并且我知道该模式的上下班时间。但我在将其翻译成代码时遇到困难。

他们周日至周四工作,周五和周六休息。除了每个月的第二周,他们周一至周三工作,周日和周四休息。每第三周,他们从周五到周四工作,接下来的周五和周六休息。然后循环重复。我想从 2024 年 1 月 1 日开始为他们创建一个日历。

我正在尝试为某人创建一个“轮班”日历,我知道该模式从哪一天开始,并且我知道该模式的上下班时间。但我在将其翻译成代码时遇到困难。 他们周日至周四工作,周五和周六休息。除了每个月的第二周,他们周一至周三工作,周日和周四休息。每第三周,他们从周五到周四工作,接下来的周五和周六休息。然后循环重复。
但我似乎无法成功创建这个。

time calendar scheduled-tasks scheduling schedule
1个回答
0
投票

你的问题很困惑!

  1. 为什么两个段落相同?

  2. 为什么“第三”周有9天?

  3. 为什么一个月只有三个星期?

无论如何,我想知道这是否是您正在寻找的东西

 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.