c++实现医院检验科排班程序


1、背景:
医院急诊检验科24h×7×365值班。工作人员固定。採取轮班制度。确保24h都有人值班。

本文就通过C++实现编敲代码自己主动排班,并能够转为Excel打印。

2、急诊检验科排班概况(口头咨询后整理):
1)、检验科人数:7人。
2)、上班类型:"夜班", "起夜", "歇息", "急诊", "急值", "急诊午",共5种。
3)、上班时间:每人固定每周歇息2天,但两天为一周内的随意两天。

4)、谁来排班:主任负责排班。
5)、排班原则:新同事1人。不上夜班。新同事每周上班类型全然一致。

                          主任每周上班类型也不变。
                           除新同事和主任外的其它同事,採取轮班制。
6)、轮班原则:除主任和新同事外的四位同事上班逐周上班类型为:ABCD,BCDA,CDAB,DABC。ABCD....依次轮询,每周变化一次....

3、细化需求:
1)实现自己主动排班程序。
2)输入:年份如2015,以及一个月的基准排班表(检验科提供)。

3)输出:1年的排班表,以周为单位,包括:当前年第几周。星期几,日期,检验师名称,排班表。
     输出形式:控制台、txt文档、Excel文档(能够用来打印)。

4、自我分析:
1)因为排班存在规律性,所以能够通过程序实现。
2)以周为单位实现,仅仅须要将年份的天数统计存储下来。如2015年365天,然后逐周7天为单位打印就可以。

3)Excel本身支持txt文档,仅仅须要输出规范的txt文档。导入Excel即满足需求。

5、程序执行截图:


6、源代码实现(VS2010实现):
<pre name="code" class="cpp">// workOrderDemo.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"
#include <iostream>
using namespace std; #include <stdio.h>
#include <stdlib.h>
#include <iomanip>
#include <assert.h>
#include <vector>
#include <fstream>
#include <assert.h>
#include <string> #define EQUAL '='
#define SPACE ' '
#define STARBAR '*' typedef unsigned int UINT32;
#define MAX_NAME_LEN 100 //最大名字长度
#define MAX_SPAN_LEN 9 //间隔字符长度
#define MAX_WEEKS_CNT 52 //365/7 或者366/7 周数
#define MAX_CYC_WEEK_CNT 6 //最大循环次数
#define MAX_MONTH_CNTS_IN_YEAR 12 //1年的月份数
#define THIS_YEAR 2015 //当前的年份 const char* pszOutFile = "E:\\WorkTable.txt";
ofstream g_fOutFile(pszOutFile); //打开文件用于写。若文件不存在就创建它 //星期序列
typedef enum WEEK_DAY
{
MONDAY = 0,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATUDAY,
SUNDAY,
MAX_WORK_DAYS //计数用
}WEEKDAY; //值班检验师名称
typedef enum INSPECTOR_YANTAI
{
WANG_XIN_PING = 0,
FU_TIAN = 1,
ZHAO_JI_JUAN = 2, //0
ZHAO_YU_XIANG,
ZHANG_XIA,
WANG_XIAO_FEI,
ZHU_HONG_JING,
MAX_INSPECTOR_CNT //计数用
}INSPECTOR; //值班类型
typedef enum WORK_TYPES
{
NIGHT_WORK = 0, //夜班
AFTER_NIGHT_WORK, //起夜
SLEEP, //歇息
URGENT_DIAGNOSE, //急诊
URGENT_WORK, //急值
URGENT_DIAGNOSE_AFTERNON, //急诊午
WORK_CNTS //7 计数用
}WORK_TYPE; char g_pszInspectorArr[MAX_INSPECTOR_CNT][MAX_NAME_LEN] = {"王*平", "付*明", "赵*娟", "赵*香", "张*玉", "王*飞", "朱*静"};
char g_workTypeName[WORK_CNTS][MAX_NAME_LEN] = {"夜班", "起夜", "歇息", "急诊", "急值", "急诊午" };
char g_weekDayName[MAX_WORK_DAYS][MAX_NAME_LEN] = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"}; //暂时存储
WORK_TYPE g_TmpDayWork[MAX_WORK_DAYS] = {NIGHT_WORK};
WORK_TYPE g_WeekWorkTable[MAX_INSPECTOR_CNT][MAX_WORK_DAYS] = {NIGHT_WORK};
WORK_TYPE g_WeekWorkTableBak[MAX_INSPECTOR_CNT][MAX_WORK_DAYS] = {NIGHT_WORK}; //基准表,1月份的永恒不变 //存储格式化日期格式
vector<char* > g_DaysVector; /*
**@brief:打印字符格式化用
**@param:ch字符, num个数
**@return:空.
*/
void print_n_char(char ch , int num)
{
int count = 0;
for (count = 0 ; count < num ; count++)
{
cout << ch;
g_fOutFile << SPACE;
}
} /*
**@brief:根据年月日返回星期几
**@param:UINT32 iYear 年, UINT32 iMonth 月, UINT32 iDay 日
**@return: 星期几.
*/
int ReturnWeekDay(UINT32 iYear, UINT32 iMonth, UINT32 iDay)
{
int iWeek = 0;
UINT32 y = 0, c = 0, m = 0, d = 0; if ( iMonth == 1 || iMonth == 2 )
{
c = ( iYear - 1 ) / 100;
y = ( iYear - 1 ) % 100;
m = iMonth + 12;
d = iDay;
}
else
{
c = iYear / 100;
y = iYear % 100;
m = iMonth;
d = iDay;
} iWeek = y + y / 4 + c / 4 - 2 * c + 26 * ( m + 1 ) / 10 + d - 1; //蔡勒公式
iWeek = iWeek >= 0 ? ( iWeek % 7 ) : ( iWeek % 7 + 7 ); //iWeek为负时取模
if ( iWeek == 0 ) //星期日不作为一周的第一天
{
iWeek = 7;
} return iWeek;
}
/*
**@brief:返回月份
**@param:格式化的串
**@return: 月
*/
int GetMonthFromStr(char* pszStr)
{
string strTmp(pszStr); size_t iEnd = strTmp.find_first_of("月");
size_t iBegin = 0; string strMonth = strTmp.substr(iBegin, iEnd);
//cout << "strMonth = " << strMonth << endl; int iMonth = atoi(strMonth.c_str());
//cout << "iMonth = " << iMonth << endl;
assert(iMonth >= 1 && iMonth <= 12); return iMonth; } /*
**@brief:返回天
**@param:格式化的串
**@return: 天
*/
int GetDayFromStr(char* pszStr)
{
string strTmp(pszStr); size_t iBegin = 2 + strTmp.find_first_of("月");
size_t iEnd = strTmp.find_first_of("日"); //cout << "iBegin = " << iBegin << "\t iEnd = " << iEnd << endl; assert(iEnd > iBegin); string strDay = strTmp.substr(iBegin, iEnd - iBegin);
//cout << "strDay = " << strDay << endl; int iDay = atoi(strDay.c_str());
//cout << "iDay = " << iDay << endl;
assert(iDay >= 1 && iDay <= 31); return iDay;
} /*
**@brief:返回格式化周几
**@param:int iWeekDay 星期几
**@return: 格式化周几.
*/
char* GetWeekName(int iWeekDay)
{
assert(iWeekDay > 0);
return g_weekDayName[iWeekDay - 1];
} /*
**@brief:初始化基准工作表,以5月11号一周为基准(设定为1月1日)
**@param:空
**@return:无
*/
void InitWorkTableBakFun()
{ //0 WANG_XIN_PING
g_WeekWorkTableBak[WANG_XIN_PING][MONDAY] = URGENT_DIAGNOSE;
g_WeekWorkTableBak[WANG_XIN_PING][TUESDAY] = URGENT_WORK;
g_WeekWorkTableBak[WANG_XIN_PING][WEDNESDAY] = URGENT_DIAGNOSE_AFTERNON;
g_WeekWorkTableBak[WANG_XIN_PING][THURSDAY] = NIGHT_WORK;
g_WeekWorkTableBak[WANG_XIN_PING][FRIDAY] = AFTER_NIGHT_WORK;
g_WeekWorkTableBak[WANG_XIN_PING][SATUDAY] = SLEEP;
g_WeekWorkTableBak[WANG_XIN_PING][SUNDAY] = SLEEP; //1 FU_TIAN
g_WeekWorkTableBak[FU_TIAN][MONDAY] = URGENT_DIAGNOSE_AFTERNON;
g_WeekWorkTableBak[FU_TIAN][TUESDAY] = URGENT_DIAGNOSE;
g_WeekWorkTableBak[FU_TIAN][WEDNESDAY] = SLEEP;
g_WeekWorkTableBak[FU_TIAN][THURSDAY] = URGENT_DIAGNOSE;
g_WeekWorkTableBak[FU_TIAN][FRIDAY] = URGENT_DIAGNOSE;
g_WeekWorkTableBak[FU_TIAN][SATUDAY] = SLEEP;
g_WeekWorkTableBak[FU_TIAN][SUNDAY] = URGENT_DIAGNOSE; //2 ZHAO_JI_JUAN
g_WeekWorkTableBak[ZHAO_JI_JUAN][MONDAY] = NIGHT_WORK;
g_WeekWorkTableBak[ZHAO_JI_JUAN][TUESDAY] = AFTER_NIGHT_WORK;
g_WeekWorkTableBak[ZHAO_JI_JUAN][WEDNESDAY] = SLEEP;
g_WeekWorkTableBak[ZHAO_JI_JUAN][THURSDAY] = SLEEP;
g_WeekWorkTableBak[ZHAO_JI_JUAN][FRIDAY] = AFTER_NIGHT_WORK;
g_WeekWorkTableBak[ZHAO_JI_JUAN][SATUDAY] = URGENT_DIAGNOSE;
g_WeekWorkTableBak[ZHAO_JI_JUAN][SUNDAY] = NIGHT_WORK; //3 ZHAO_YU_XIANG
g_WeekWorkTableBak[ZHAO_YU_XIANG][MONDAY] = URGENT_WORK;
g_WeekWorkTableBak[ZHAO_YU_XIANG][TUESDAY] = NIGHT_WORK;
g_WeekWorkTableBak[ZHAO_YU_XIANG][WEDNESDAY] = AFTER_NIGHT_WORK;
g_WeekWorkTableBak[ZHAO_YU_XIANG][THURSDAY] = SLEEP;
g_WeekWorkTableBak[ZHAO_YU_XIANG][FRIDAY] = URGENT_WORK;
g_WeekWorkTableBak[ZHAO_YU_XIANG][SATUDAY] = URGENT_DIAGNOSE_AFTERNON;
g_WeekWorkTableBak[ZHAO_YU_XIANG][SUNDAY] = SLEEP; //4 ZHANG_XIA
g_WeekWorkTableBak[ZHANG_XIA][MONDAY] = SLEEP;
g_WeekWorkTableBak[ZHANG_XIA][TUESDAY] = URGENT_DIAGNOSE_AFTERNON;
g_WeekWorkTableBak[ZHANG_XIA][WEDNESDAY] = NIGHT_WORK;
g_WeekWorkTableBak[ZHANG_XIA][THURSDAY] = AFTER_NIGHT_WORK;
g_WeekWorkTableBak[ZHANG_XIA][FRIDAY] = SLEEP;
g_WeekWorkTableBak[ZHANG_XIA][SATUDAY] = URGENT_WORK;
g_WeekWorkTableBak[ZHANG_XIA][SUNDAY] = URGENT_WORK; //5 WANG_XIAO_FEI
g_WeekWorkTableBak[WANG_XIAO_FEI][MONDAY] = SLEEP;
g_WeekWorkTableBak[WANG_XIAO_FEI][TUESDAY] = SLEEP;
g_WeekWorkTableBak[WANG_XIAO_FEI][WEDNESDAY] = URGENT_WORK;
g_WeekWorkTableBak[WANG_XIAO_FEI][THURSDAY] = URGENT_DIAGNOSE_AFTERNON;
g_WeekWorkTableBak[WANG_XIAO_FEI][FRIDAY] = NIGHT_WORK;
g_WeekWorkTableBak[WANG_XIAO_FEI][SATUDAY] = AFTER_NIGHT_WORK;
g_WeekWorkTableBak[WANG_XIAO_FEI][SUNDAY] = URGENT_DIAGNOSE_AFTERNON; //6 ZHU_HONG_JING
g_WeekWorkTableBak[ZHU_HONG_JING][MONDAY] = SLEEP;
g_WeekWorkTableBak[ZHU_HONG_JING][TUESDAY] = SLEEP;
g_WeekWorkTableBak[ZHU_HONG_JING][WEDNESDAY] = URGENT_DIAGNOSE;
g_WeekWorkTableBak[ZHU_HONG_JING][THURSDAY] = URGENT_WORK;
g_WeekWorkTableBak[ZHU_HONG_JING][FRIDAY] = URGENT_DIAGNOSE_AFTERNON;
g_WeekWorkTableBak[ZHU_HONG_JING][SATUDAY] = NIGHT_WORK;
g_WeekWorkTableBak[ZHU_HONG_JING][SUNDAY] = AFTER_NIGHT_WORK; }
/*
**@brief:判定年份是否为闰年.
**@param: iYear当前年份.
**@return:true,闰年; false,平年.
*/
bool IsLeapYear(UINT32 iYear)
{
if ( (iYear%4 == 0 && iYear%100 != 0) || (iYear%400 == 0) )
{
return true;
}
else
{
return false;
}
} /*
**@brief:获取一年的总天数
**@param:iYear当前年份
**@return:无
*/
int GetTotalDaysCnt(int iYear)
{
int iTotalDaysCnt = 0;
if (IsLeapYear(iYear))
{
iTotalDaysCnt = 366;
}
else
{
iTotalDaysCnt = 365;
}
return iTotalDaysCnt;
} /*
**@brief:初始化工作表(与基准表一致)
**@param:空
**@return:无
*/
void InitWorkTableFun()
{
//与基准对齐
for (int inspector = 0; inspector < MAX_INSPECTOR_CNT; ++inspector)
{
for (int curDay = 0; curDay < MAX_WORK_DAYS; ++curDay)
{
g_WeekWorkTable[inspector][curDay] = g_WeekWorkTableBak[inspector][curDay];
}
}
} /*
**@brief: 返回vector数组中的起始位置,打印用
**@param: nCurWeek 当前第几周
**@return:返回pos
*/
int GetBeginOfDaysVector(UINT32 nCurWeek)
{
//获取第几周的日期格式
//如第一周返回:1月1, 1月2, ... 1月7
assert(nCurWeek >= 0 && nCurWeek <= 1 + MAX_WEEKS_CNT); int iBegin = (nCurWeek - 1) * 7; return iBegin;
} /*
**@brief: 打印相应周的排班表
**@param: iWeek 当前第几周
**@return:无
*/
void PrintCurWorkTable(int iWeek)
{ char szTmpFormat[MAX_NAME_LEN] = {0};
vector<int> weekVector;
#if 0
for (int curDay = 0; curDay < 1 + MAX_WORK_DAYS; ++curDay)
{
if (0 == curDay)
{
cout << std::right << std::setw(MAX_SPAN_LEN) << "";
g_fOutFile << std::right << std::setw(MAX_SPAN_LEN) << "";
}
else
{
cout << std::right << std::setw(MAX_SPAN_LEN) << g_weekDayName[curDay - 1];
g_fOutFile << std::right << std::setw(MAX_SPAN_LEN) << g_weekDayName[curDay - 1];
}
}
cout << endl;
g_fOutFile << endl;
#endif int nDaysOfYear = 0;
//打印日期第几周 格式:1-1
int iBegin = 0;
int iWeekLen = 7;
if (iWeek <= MAX_WEEKS_CNT)
{
iBegin = 4 + GetBeginOfDaysVector(iWeek);
cout << std::right << std::setw(MAX_SPAN_LEN) << "";
g_fOutFile << std::right << std::setw(MAX_SPAN_LEN) << "";
for (int i = iBegin; i < iBegin + iWeekLen; ++i)
{
if (i >= GetTotalDaysCnt(THIS_YEAR) - 1)
{
break;
}
cout << std::right << std::setw(MAX_SPAN_LEN) << g_DaysVector[i];
g_fOutFile << std::right << std::setw(MAX_SPAN_LEN) << g_DaysVector[i]; //new add by ycy 2015-6-6 pm 20:09
int iMonth = GetMonthFromStr(g_DaysVector[i]);
int iDay = GetDayFromStr(g_DaysVector[i]);
int iWeekDay = ReturnWeekDay(THIS_YEAR, iMonth, iDay);
//cout << iWeekDay;
weekVector.push_back(iWeekDay);
}
cout << endl;
g_fOutFile << endl;
}
else
{
if (IsLeapYear(THIS_YEAR))
{
nDaysOfYear = 366;
}
else
{
nDaysOfYear = 365;
} //最后一周单独处理
iWeekLen = nDaysOfYear - (MAX_WEEKS_CNT)*7;
iBegin = GetBeginOfDaysVector(1 + MAX_WEEKS_CNT);
for (int i = iBegin; i < iBegin + iWeekLen; ++i)
{
cout << std::right << std::setw(MAX_SPAN_LEN) << g_DaysVector[i];
g_fOutFile << std::right << std::setw(MAX_SPAN_LEN) << g_DaysVector[i];
}
cout << endl;
g_fOutFile << endl;
} int iWeekSize = weekVector.size();
// assert(iWeekSize == 7);
for (int curDay = 0; curDay < 1 + iWeekSize; ++curDay)
{
if (0 == curDay)
{
cout << std::right << std::setw(MAX_SPAN_LEN) << "";
g_fOutFile << std::right << std::setw(MAX_SPAN_LEN) << "";
}
else
{
int iCurWeek = weekVector[curDay - 1];
cout << std::right << std::setw(MAX_SPAN_LEN) << g_weekDayName[iCurWeek - 1];
g_fOutFile << std::right << std::setw(MAX_SPAN_LEN) << g_weekDayName[iCurWeek - 1];
}
}
cout << endl;
g_fOutFile << endl; for (int curDay = 0; curDay < 1 + MAX_WORK_DAYS; ++curDay)
{
if (0 == curDay)
{
cout << std::right << std::setw(MAX_SPAN_LEN) << "";
//g_fOutFile << std::right << std::setw(MAX_SPAN_LEN) << "";
}
for (int j = 0; j < MAX_SPAN_LEN - 1; ++j)
{
cout << '-';
//g_fOutFile << ' ';
}
}
cout << endl;
//g_fOutFile << endl; int curWorkType = 0;
for (int inspector = 0; inspector < MAX_INSPECTOR_CNT; ++inspector)
{
sprintf_s(szTmpFormat , "%d%s", inspector, g_pszInspectorArr[inspector]);
cout << std::left << std::setw(MAX_SPAN_LEN) << szTmpFormat;
g_fOutFile << std::right << std::setw(MAX_SPAN_LEN) << szTmpFormat;
for (int curDay = 0; curDay < MAX_WORK_DAYS; ++curDay)
{
curWorkType = (int)(g_WeekWorkTable[inspector][curDay]);
cout << std::right << std::setw(MAX_SPAN_LEN)<< g_workTypeName[curWorkType];
g_fOutFile << std::right << std::setw(MAX_SPAN_LEN)<< g_workTypeName[curWorkType];
}
cout << endl;
g_fOutFile << endl;
} } /*
**@brief: 測试打印日期格式
**@param: 空
**@return:无
*/
void testWeekDayOfData()
{
int iYear = 2015;
int iMonth = 6;
int iDay = 1; for (iDay = 1; iDay <= 30; ++iDay)
{
int iWeekDay = ReturnWeekDay(iYear, iMonth, iDay);
cout << iWeekDay << GetWeekName(iWeekDay) << "\t"; if (iDay % 7 == 0)
{
cout << endl;
}
}
} /*
**@brief: 以基准周为根据依照规律排班
**@param: nWeek当前第几周
**@return:无
*/
void ExchangeWork(UINT32 nWeek)
{
assert(nWeek >= 0 && nWeek <= MAX_INSPECTOR_CNT - 2); //0-5之间 //0 第1周不变: 排班顺序 0 1 2 3 4 5 6。
//1 第2周: 排班顺序 0 1 3 4 5 6 2;
//2 第3周: 排班顺序 0 1 4 5 6 2 3。
//3 第4周: 排班顺序 0 1 5 6 2 3 4。
//4 第5周: 排班顺序 0 1 6 2 3 4 5; 循环终止
//5 第6周: 排班顺序 0 1 2 3 4 5 6。 同第一周 //每次都从基准周变更
if (0 == nWeek)
{
(void)InitWorkTableFun();
}
else
{
(void)InitWorkTableFun();
//1-6 6个人,第0行始终不变无需再排班
for (int iInspector = 2; iInspector < MAX_INSPECTOR_CNT ; ++iInspector)
{
int iNewOrder = iInspector + nWeek;
if (iNewOrder > (MAX_INSPECTOR_CNT - 1))
{
iNewOrder = (iInspector + nWeek) % (MAX_INSPECTOR_CNT - 2);
} if (0 == iNewOrder)
{
iNewOrder = 5;
}
//cout << "iNewOrder = " << iNewOrder << endl;
assert(iNewOrder == 3 || iNewOrder == 4 || iNewOrder == 5 || iNewOrder == 6 || iNewOrder == 2); //周一到周日
for (int curDay = 0; curDay < MAX_WORK_DAYS; ++curDay) //0-6 7天
{ if (2 == iInspector)
{
g_TmpDayWork[curDay] = g_WeekWorkTable[nWeek][curDay]; //
} g_WeekWorkTable[iInspector][curDay] = g_WeekWorkTableBak[iNewOrder][curDay]; }//end for curDay }//end for iInspector
}//end else
} /*
**@brief: 全年中第几周的排班表
**@param: nWeek当前全年的第几周
**@return:无
*/
void CurWeekWorkOrder(UINT32 nWeek)
{
assert(nWeek <= MAX_WEEKS_CNT); //全年周转化为规律周
UINT32 nOrderWeek = nWeek % (MAX_INSPECTOR_CNT - 2);
assert(nOrderWeek >= 0 && nOrderWeek < (MAX_INSPECTOR_CNT - 2));
//cout << "nWeek = " << nWeek << "nOrderWeek = " << nOrderWeek << endl; (void)ExchangeWork(nOrderWeek);
} /*
**@brief:判定某年某月的天数.
**@param: iYear当前年份,iMonth当前月份;
**@return:当前年、月的天数.
*/
unsigned int daysInMonth(UINT32 nYear, UINT32 nMonth)
{
assert(nMonth >=1 && nMonth <= MAX_MONTH_CNTS_IN_YEAR);
int nDaysInMonth = 0;
switch(nMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
nDaysInMonth = 31;
break;
case 4:
case 6:
case 9:
case 11:
nDaysInMonth = 30;
break;
case 2:
if (IsLeapYear(nYear))
{
nDaysInMonth = 29;
}
else
{
nDaysInMonth = 28;
}
break;
default:
cout << "Error Month!!" << endl;
break;
}
return nDaysInMonth;
} /*
**@brief:构建格式化日期
**@param: nYear 当年年份
**@return:无
*/
void BuildDayOfMonth(UINT32 nYear)
{
UINT32 nDaysOfYear = 0; if (IsLeapYear(nYear))
{
nDaysOfYear = 366;
}
else
{
nDaysOfYear = 365;
} for (int iMonth = 1; iMonth <= MAX_MONTH_CNTS_IN_YEAR; ++iMonth)
{
for (int iDay = 1; iDay <= (int)(daysInMonth(nYear, iMonth)); ++iDay)
{
char *pszDataFormat = (char*)malloc(20);
memset(pszDataFormat, 0, 20);
sprintf_s(pszDataFormat, 20, "%d月%d日", iMonth, iDay);
//cout << pszDataFormat << "\t";
g_DaysVector.push_back(pszDataFormat);
}//end for iDay
//cout << endl;
}//end for iMonth
} /*
**@brief:释放内存
**@param: 空
**@return:无
*/
void ReleaseDaysVector()
{
int iVectorSize = g_DaysVector.size();
//cout << "iVectorSize = " << iVectorSize << endl;
for (int i = 0; i < iVectorSize; ++i)
{
if (NULL != g_DaysVector[i])
{
free(g_DaysVector[i]);
g_DaysVector[i] = NULL;
}
}
} /*
**@brief:測试打印全年日期格式
**@param: 当前年份
**@return:无
*/
void testPrintDaysByWeek(UINT32 nYear)
{
int iWeekLen = 7; //每周七天
int nDaysOfYear = 0;
if (IsLeapYear(nYear))
{
nDaysOfYear = 366;
}
else
{
nDaysOfYear = 365;
}
cout << endl;
int iBegin = 0;
for (int iWeek = 1; iWeek <= MAX_WEEKS_CNT; ++iWeek)
{
iBegin = GetBeginOfDaysVector(iWeek);
for (int i = iBegin; i < iBegin + iWeekLen; ++i)
{
cout << g_DaysVector[i] << "\t";
}
cout << endl;
} //最后一周单独处理
iWeekLen = nDaysOfYear - (MAX_WEEKS_CNT)*7;
iBegin = GetBeginOfDaysVector(1 + MAX_WEEKS_CNT);
for (int i = iBegin; i < iBegin + iWeekLen; ++i)
{
cout << g_DaysVector[i] << "\t";
}
cout << endl;
} void testPrintVectorDays()
{
int iVectorSize = g_DaysVector.size();
//cout << "iVectorSize = " << iVectorSize << endl;
for (int i = 0; i < iVectorSize; ++i)
{
cout << g_DaysVector[i] << "\t";
} } int _tmain(int argc, _TCHAR* argv[])
{
(void)InitWorkTableBakFun(); //基准初始化
(void)BuildDayOfMonth(THIS_YEAR);
//(void)testPrintDaysByWeek(THIS_YEAR); //初始化写文件
if (!g_fOutFile)
{
cout << "Open file" << pszOutFile << "Failed!" << endl;
} char szDateFormat[128] = {0}; //打印全年排班表
for(int iWeek = 1; iWeek <= MAX_WEEKS_CNT; ++iWeek)
{
print_n_char(STARBAR, 28);
sprintf_s(szDateFormat, " %d 年 第 %d 周", THIS_YEAR, iWeek);
cout << szDateFormat;
g_fOutFile << szDateFormat;
print_n_char(STARBAR, 28);
cout << endl;
g_fOutFile << endl; //逐月份排班
(void)CurWeekWorkOrder(iWeek - 1);
(void)PrintCurWorkTable(iWeek);
cout << endl << endl;
g_fOutFile << endl << endl;
} (void)ReleaseDaysVector();
g_fOutFile.close(); getchar(); return 0;
}



7、结束语
1)该类问题相对简单。实现中细节的逻辑比較复杂,在纸上模拟把程序多跑几遍。理顺逻辑非常重要。
2)规律是突破口,其它都是辅助完毕。
3)重复測试,对每一个接口对写相应Demo測试接口。


2015-6-6  pm18:09 思于家中床前,耗时9h

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/46390293

假设感觉本文对您有帮助,请点击‘顶’支持一下。您的支持是我坚持写作最大的动力,谢谢!

c++实现医院检验科排班程序的更多相关文章

  1. 使用.NET Core与Google Optimization Tools实现员工排班计划Scheduling

    上一篇说完<Google Optimization Tools介绍>,让大家初步了解了Google Optimization Tools是一款约束求解(CP)的高效套件.那么我们用.NET ...

  2. 使用SQL语句使数据从坚向排列转化成横向排列(排班表)

    知识重点: 1.extract(day from schedule01::timestamp)=13 Extract 属于 SQL 的 DML(即数据库管理语言)函数,同样,InterBase 也支持 ...

  3. 详解 OneAlert 排班可以帮你做什么

    排班的存在,实质是通过有序安排,降低企业/团队人力成本,提升工作效率. 阅读导航(预计2min)   1. 详解排班功能 轮班机制 工作时间 双视图展示 灵活调整 2. 利用排班如何助力运维团队 排班 ...

  4. Google Optimization Tools实现员工排班计划Scheduling【Python版】

    上一篇介绍了<使用.Net Core与Google Optimization Tools实现员工排班计划Scheduling>,这次将Google官方文档python实现的版本的完整源码献 ...

  5. Javascript:日期排班功能实现

     背景: 近期,公司的产品经常会遇到日期排班类似的功能: 需求的排班日期长短不一:有些是两周,有些是四周:要求选中的时候有一个active的状态区分,另外要提供钩子获取选中日期的形如:[2018-04 ...

  6. (排班表二)后台动态绘制Grid表格

    后台动态绘制值班表(Grid表格 列名不固定) 要求:表头除了值班人姓名,还要显示日期,及每天的星期值,用斜杠‘/’分隔.即:几号/星期几 最终实现的效果:根据查询的年月显示每个值班人查询月份每天的值 ...

  7. (排班表一)使用SQL语句使数据从坚向排列转化成横向排列

    知识重点: 1.extract(day from schedule01::timestamp)=13 Extract 属于 SQL 的 DML(即数据库管理语言)函数,同样,InterBase 也支持 ...

  8. js jquery 实现 排班,轮班,日历,日程。使用fullcalendar 插件

    如果想用fullcalendar实现排班功能,或者日历.日程功能.那么只需要简单的几步: 这里先挂官网链接: fullcalendar fullcalendar官网下载链接 一.下载及简单配置 1.这 ...

  9. 运维告警排班太复杂?试试Cloud Alert智能告警排班

    前言: 之前的几篇文章有说过,通过智能告警平台Cloud Alert,将指定条件的告警以多样化的通知方式,通知到指定的人,其中的通知的方式包含电话.短信.邮件.微信.APP.钉钉等. 本篇文章就来说下 ...

随机推荐

  1. Mysql -- 设置中国时区时间

       Mysql -- 设置中国时区时间 查看mysql的时区设置 mysql> show variables like '%time_zone%'; 修改mysql的时区设置, 注:mysql ...

  2. Android 按钮长按下去重复执行某个动作,放开后停止执行动作

    Android开发中,常遇到一种需求,即按钮长按下去重复执行某个动作,放开后停止执行动作.网上找了许多代码,都没有适合的,于是自己动手写了一个. 基本思路是:首先设置一个标识变量,用于标识是否处于按下 ...

  3. 几种OutOfMemoryError

    JAVA虚拟机OutOfMemoryError主要包括以下四类:java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryErro ...

  4. gridview 空数据绑定

    private void getDataBind() { DataTable dt = new DataTable(); dt.Columns.Add("id"); dt.Colu ...

  5. 原生+H5开发之:js交互【location方式】

    1. 交互方式总结 1Android与JS通过WebView互相调用方法,实际上是: Android去调用JS的代码 JS去调用Android的代码 二者沟通的桥梁是WebView 对于Android ...

  6. Circuit forms adjustable bipolar clamp

    The easy way to clamp a signal to a given value is to use two zener diodes, connected back-to-back. ...

  7. Wide-range regulator delivers 12V, 3A output from 16 to 100V source

    Synchronous buck regulators offer high efficiency and are popular in applications in which available ...

  8. SEAndroid安全机制简要介绍和学习计划

    与iOS相比.Android最被人诟病的是其流畅性和安全性. 然而,从4.0開始,Android不遗余力地改善其流畅性. 特别是在即将公布的L版本号中,用ART替换了Dalvik,相信会越来越流畅.至 ...

  9. EF6 MVC5译文

    Contoso大学的Web应用程序 你在本教程中将建立一个简单的大学网站. 用户可以查看和更新学生信息,当然也包括教师的.下列图表是你将创建的应用程序截屏. 本网站的UI样式来源于内置的模板,所以教程 ...

  10. Python任务调度模块 – APScheduler。动态修改调度时间间隔

    APScheduler可以把调度任务放到内存里,也可以把任务放到数据库里,那么如何交互式修改定时任务的执行时间间隔或者下次执行时间呢? 方案一:把定时任务放到数据库里,修改数据库里任务的调度时间 方案 ...