当前位置:首页 » 编程语言 » c语言12人排班系统的代码
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言12人排班系统的代码

发布时间: 2022-05-06 01:11:22

‘壹’ 帮我设计一个关于员工排班的c语言程序

给你个c++版本做参考:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
int main(int argc,char *argv[])
{
std::vector<int> arr[7];
std::vector<std::vector<int>> resolution;
for(int i=0;i!=7;++i)
{
int temp;
std::cout<<"please input number "<<i+1
<<" person's all rest days he wanted(1-7):\n";
while(std::cin.peek()!='\n')
{
std::cin>>temp;
arr[i].push_back(temp);
}
::getchar();
}
int arr1[]={1,2,3,4,5,6,7};
do
{
for(int i=0;i!=7;++i)
{
std::vector<int>::iterator iter=
std::find(arr[i].begin(),arr[i].end(),arr1[i]);
if(iter==arr[i].end())
{
break;
}
if(i==6)
{
std::vector<int> temp(arr1,arr1+7);
resolution.push_back(temp);
}
}
}while(std::next_permutation(arr1,arr1+7));
size_t cnt=resolution.size();
std::cout<<"可用的方案如下,按职员A-G的休息日排列:\n";
for(int i=0;i!=cnt;++i)
{
size_t temp=resolution[i].size();
std::cout<<"方案 "<<i+1<<":\n";
for(int j=0;j!=temp;++j)
std::cout<<resolution[i][j]<<" ";
std::cout<<"\n";
}
::system("pause");
return 0;
}

‘贰’ 用c语言编写排班系统

打开这个网络文库链接,里面有您需要的答案。
https://wenku..com/view/5b97eafb52d380eb63946de2.html?from=search

‘叁’ c语言编程,实验楼值班排班系统。

代码来自编程论坛http://bbs.bccn.net/thread-329752-1-1.html

structst
{
char*a[7];
charb[7][8];
intc;
};
voidpanan(structst*s);//函数声明

intmain(void)
{
structsts[7];
inti=0;
intj=0;
chark;
for(i=0;i<7;i++)
for(j;j<7;j++)
s[i].b[j][0]='';
//定义每个人的名
s[0].a[0]="赵";
s[1].a[1]="钱";
s[2].a[2]="孙";
s[3].a[3]="李";
s[4].a[4]="周";
s[5].a[5]="吴";
s[6].a[6]="陈";

printf("请输入每个人的轮休选择: ");
for(i=0;i<7;i++)//写一个循环,依次输入理想的休息时间
{
printf("%s: ",s[i].a[i]);
for(j=0;j<7;j++)
{
s[i].c=j;
printf("请输入:");
scanf("%s",s[i].b[j]);
printf("%s还有其他的理想的休息日期吗?输入N来完成此输入 >",s[i].a[i]);
fflush(stdin);
k=getchar();//获取键入的值
if(k=='N'||k=='n')
break;//跳出
fflush(stdin);//清空缓冲区(清屏)
}//...跳到了这
system("cls");//清屏
}
system("cls");//清屏
printf("开始判断! ");
panan(s);//判断!
return0;
}
voidpanan(structst*s)
{
inti,j,k,l,m,n,z;//循环用数!
//嵌套循环,寻找可能的解决方案
for(i=0;i<=s[0].c;i++)
{
for(j=0;j<=s[1].c;j++)
{

if(strcmp(s[1].b[j],s[0].b[i])==0)
//strcmp比较两个字符串
//设这两个字符串为str1,str2,
//若str1==str2,则返回零;
//若str1>str2,则返回正数;
//若str1<str2,则返回负数。
{
continue;
}
//如果无相同的,就继续执行
for(k=0;k<=s[2].c;k++)
{
if(strcmp(s[2].b[k],s[1].b[j])==0)
continue;
if(strcmp(s[2].b[k],s[0].b[i])==0)
continue;
//同理,继续执行
for(l=0;l<=s[3].c;l++)
{
if(strcmp(s[3].b[l],s[0].b[i])==0)
continue;
if(strcmp(s[3].b[l],s[1].b[j])==0)
continue;
if(strcmp(s[3].b[l],s[2].b[k])==0)
continue;
//循环套起来真的是很烧脑
for(m=0;m<=s[4].c;m++)
{
if(strcmp(s[4].b[m],s[0].b[i])==0)
continue;
if(strcmp(s[4].b[m],s[1].b[j])==0)
continue;
if(strcmp(s[4].b[m],s[2].b[k])==0)
continue;
if(strcmp(s[4].b[m],s[3].b[l])==0)
continue;
//同理,继续执行
for(n=0;n<=s[5].c;n++)
{
if(strcmp(s[5].b[n],s[0].b[i])==0)
continue;
if(strcmp(s[5].b[n],s[1].b[j])==0)
continue;
if(strcmp(s[5].b[n],s[2].b[k])==0)
continue;
if(strcmp(s[5].b[n],s[3].b[l])==0)
continue;
if(strcmp(s[5].b[n],s[4].b[m])==0)
continue;
//我猜你也想到了!写完上面的一部分可以粘到下面来嘛!
for(z=0;z<=s[6].c;z++)//最后一层判断。
{
if(strcmp(s[6].b[z],s[0].b[i])==0)
continue;
if(strcmp(s[6].b[z],s[1].b[j])==0)
continue;
if(strcmp(s[6].b[z],s[2].b[k])==0)
continue;
if(strcmp(s[6].b[z],s[3].b[l])==0)
continue;
if(strcmp(s[6].b[z],s[4].b[m])==0)
continue;
if(strcmp(s[6].b[z],s[5].b[n])==0)
continue;
//输出结果!!
printf("%-4s,%-4s,%-4s,%-4s,%-4s,%-4s,%-4s ",s[0].a[0],s[1].a[1],s[2].a[2],s[3].a[3],s[4].a[4],s[5].a[5],s[6].a[6]);
printf("============================================================= ");
printf("%s,%s,%s,%s,%s,%s,%s ",s[0].b[i],s[1].b[j],s[2].b[k],s[3].b[l],s[4].b[m],s[5].b[n],s[6].b[z]);
//千万千万千万不要漏了括号!!
//不然死不瞑目!╭( ̄m ̄*)╮
}//for(z=0;z<=s[6].c;z++)
}//for(n=0;n<=s[5].c;n++)
}//for(m=0;m<=s[4].c;m++)
}//for(l=0;l<=s[3].c;l++)
}//for(k=0;k<=s[2].c;k++)
}//for(j=0;j<=s[1].c;j++)
}//for(i=0;i<=s[0].c;i++)

}//voidpanan(structst*s)

‘肆’ 排班系统的c语言程序

考勤排班规则班次在考勤,班次定义,就是员工上下班的标准,就是考勤的标准,其重要性不言而喻。企业中存在着各色各样的班次,而且不同的企业对班次的定义及习惯说法也不一样,理清班次的定义及其相关联的术语含义就非常有意义。下面分几个方面来描述班次及其在企业中的常见表现。一、基本班次的组成:班次定义了员工一天的上下班时间及规则,班次是由多个班段组成的,了解班次之前先了解班段。下面先说明一下相关的术语,这些术语可以辅助我们更好地交流。就类似于我们谈软件的“设计模式”一样。1、固定班段指上下班时间固定的班段。例:指定上下班时间为8:00-12:00.2、自由班段是指上下班时间是由员工自由掌握的。例:允许员工7:00-9:00之间的任一时刻上班,11:00-13:00的任一时刻下班,但要保障上满4小时。这类型的班段可称为自由班段。3、休息时段在一个班段内部,允许存在多个休息时段。4、用餐时段同休息时段类似。用餐时段可分为两类:固定用餐和自由用餐,举例说:规定中午用餐11:30-12:30,叫固定用餐,允许中午11:00-13:00之间用餐,但规定用餐时间只能是1个小时,叫自由用餐。如果规定了员工可以自由选择11:00-12:0011:15-12:1511:30-12:30之间的一个时段用餐,则可称为浮动用餐。由上面4个基本元素组合而成的班次,称为基本班次,其中休息时段或用餐时段是从属于某个班段的,这样组成的班次,能够适应大部分的情况。班次除了规定上下班时间规则外,还要定义该班次中,怎样才算迟到早退,怎样才算缺席旷工,还有其它什么异常等等,如含用餐时段的班次,就有用餐超时的异常。(每个班次都定义迟到早退缺席旷工等设定,会比较啰嗦,可做个全局默认值,如果班次中没有设定就使用默认值)二、特殊班次1、休息:休息作为一个特殊的班次指明了当天不用上班。注意指定休息并非指定当天是周日或节假日,这由其它地方定义。指定休息仅仅是指定当天不用上班。2、自由上下班:例:规定员工当天7:00-19:00可自由上下班(多个班段),只要保障上足8小时即可,或者上了多少小时班算多少。周六周日自由加班就是属于这种情况。3、互斥班组:将多个互斥的基本班次组合在一起,构成一个互斥班组。所谓互斥的,是指各个班次其上下班时间相互不交叉。计算考勤时由系统自动识别匹配是哪个基本班次。这对于两班倒或三班倒的情况下可以有效地减少排班的工作量。不建议使用互斥班组来进行排班,因为在员工多打卡或少打卡的情况下,同时加班,请假会让班次是的刷卡点改变,这都使得智能匹配过程容易产生错误。明确排班则没有这类错误。考勤应是非常严肃的,哪怕是0.0001%的错误,都会给你的考勤软件蒙上污点。4、动态班次这是一种非常特殊的班次。正常情况下,班次的定义是预先定义的,而动态班次的班次定义是由程序动态生成的。好像这不好理解,举例说,学校老师按课程表上下班,上课前30分钟要签到,下课后即可下班,没课可以不来。此时可依据课程表动态生成一个基本班次来参与考勤计算。如果不使用动态班次,则需要预定义很多个基本班次,而且也加大了排班的难度。很明显,这种班次需要二次开发定制才能使用。三、“工作天”在班次中的重要性班次解决了员工当天该如何上下班,排班指定了员工当天上哪个班次。这个天并非我们时常说的24小时的一天,而是“工作天”。一个工作天可能不止24小时。班次中定义工作天的起止时间点,加班可能会改变该时间点,从而使得一个工作天实际上不止24小时。“休息”作为一个特殊的班次,其不用指定工作天起止点。班次中如果不定义工作天,那么对于跨天加班及连续上班36小时的现象就不好处理。这里说一下员工连续工作36小时的现象(变态吧),例如:两班倒时,1号上夜班,一直加班到2号,然后接着上白班,2号下班后又加班。好像说,这不可能吧!我说说我知道的比较合理的解析。一种情况是下班后安排几个员工到医院守护病人,然后第二天继续上班,自然得付给员工加班费了。其实并不是那名员工强壮得变态,他们可以睡觉的。另一种情况是,安排员工24小时待命,机器一好就开始生产,自然这也是得给员工加班费的。所以,面对异常现象时,不要盲目下结论,调查分析后更有发言权。对于该异常,应该将加班时间分配到相应的工作天去,这也需要工作天定义。定义了工作天,考勤体系更为完整。四、用面向对象的类来因应企业班次的发展以上所说的班次,能对应企业中的普遍情况,但就能适应企业中的全部情况了吗?那肯定是不行的,随着企业的发展与需求的变化,班次也将随着变化,但无论如何变化,总要规定员工是如何上下班的,如何打卡的,怎样才算是异常等等信息,对于考勤计算来说,这个班次又是如何匹配刷卡的,如何匹配工作天的,等等信息总要在班次中定义,排班也一样,无论采用何种排班方法,总得给出当天排的是什么班次。用写SQL过程来计算考勤过程的方法,因为其对模块化及面向对象均不支持,在需求发生变更时,改动代码或看别人的代码都将变得无比艰难。用面向对象的软件方法可以在企业有新的班次类型出现时,轻松面对,而无须对软件大动干戈。用面向对象的方法则需要建立一个正确的考勤模型体系,只要考勤模型不变,变化就尽在掌握中。四公休作息日作息是每个人所必需的,五调休考勤排班班次及排班对于考勤有着重要的意义,是计算考勤的基准。考勤软件是否好用,排班是否好用就占了很大的比重。1、群组排班与个人排班的关系。不同的软件其排班实现不大一样,一般分为群组排班及个人排班,排班逻辑是个人排班优先于群组排班。对于群组的概念,有些软件直接用部门替代有些则有专门的考勤班组概念,无论如何做,都是一个员工集合也就是Group这个概念,个人排班作为特殊情况对待。其当天排班过程则是这样:如果当天有做个人排班,则以个人排班为准,否则以群组排班作为当天班次,如果群组排班也没排,那么就依全局设定来处理这个异常,没排班的可以设定一个默认班次,或者设一个部门默认班次或者直接发出异常,总之在考勤计算前要确认当天所上班次,我是反对智能匹配班次这个概念的,因为考勤是个很严肃的话题,就算你做到了99.99%成功匹配,但就是出现一个错误,就需要人工来做全部检查。2、异动与历史记录对排班的影响。一个例子就是:员工从排班组A调入排班组B,那么其班次也会跟着改变,计算时得考虑这些因素。类似这样的例子有:员工部门调动对于统计部门每天人数的影响,薪资异动对于每月薪资计算的影响。3、数据的来拢去脉能够展示出来给用户看,回答为什么员工当天上的是这个班次,打了这些卡后,为什么得到如此计算结果。4、个人月排班查询:数据来源是群组排班与、个人排班、加班、请假及异动记录,依据预定的规则计算出员工当天排班然后展示出来给用户看,"加"表示当天有安排加班,"假"表示当天有请假,"离"表示当天已离职,"未"表示当天尚未入职,并提供快捷的方式查找到相应的记录,以做到有理可依有据可查。个人排班与群组排班具有类似的界面及批量排班功能,目的是减少排班工作量,让软件更人性化一些。5、个人考勤明细:考勤计算结果与相关考勤数据展示出来,让用户明白刷了什么卡,得到什么样的结果,力求做到数据透明化。解决几个问题:1)当天该员工是否应上班?这由排班系统来排定。2)应该什么时候上下班?这由班次定义指定。3)打了什么卡?这通过自动采集考勤机数据得到。4)计算结果是什么样的?为什么是这样?将计算结果显示出来,并支持相应的分组统计。能方便地过滤出每一天的异常人员,并提供方便的途径回答员工的考勤疑问。排班系统与考勤计算的关系排班系统与考勤计算其实关系不大,也就是考勤计算只需要排班系统告诉员工当天排的是哪个班次就行了,具体如何排班,如何倒班则与考勤计算无关。理解这一点就可以将排班系统与考勤计算独立开来。排班系统的目标是更好地真实地反映企业中排班的实际情况,企业中排班的主要对象是:1、人。2、班次。3、倒班规则。下面分开来说:1、人,要解决多人同时排班的问题。最简单方法是手工进行每人每天的排班,加一个批量处理功能来解决多人同时排班的问题。这里说另一种方法:将人归入群组,然后对群组进行每天排班,特殊的人员进行个人每天排班。也就有群组排班与个人排班同时存在,匹配逻辑是个人排班优先于群组排班。同时群组排班及个人排班都应该有批量处理功能。对人分群组进行群组排班的方法比较贴近千人以上的企业的实际情况,能清楚地反映当前群组的班次。其带来的问题是员工归属群组的历史记录问题,这个问题要处理。2、班次,班次的种类及具体班次的定义请看另一个文章,这里只是提出排班时,要对所排班次的合理性做出检测并警告,主要是相邻天的上下班时间交叉问题,特别是1号上夜班,2号上白班这种情况。当班次很多时,一般会对班次进行分类,常有以下分类:1、按部门分。2、按使用性质分:常用班次,临时班次,一次性班次等。分类后能很容易就能找到相应的班次,不用记住班次的名称或编号。3、倒班规则,如果做好了群组排班与个人排班,就算没做倒班规则,对千人左右的厂也够用了。但要应付的员工时,倒班规则可以帮助HR人员很快地生成当月排班表。常见的倒班规则有:两班倒,三班倒,倒班时间则有:按月倒及按周倒,或者自定义倒班日期。倒班规则挂在员工考勤群组中,不同的考勤群组指定不同的倒班规则,这样就可以快速生成群组排班表。快速生成一个群组排班表,再由HR人员手工做少少修改或不用修改就可以完成排班,这可以减轻排班难度。4、员工排班表的生成。排班表决定员工最终排定班次,注意:该表不一定存在于数据库中,至少在我的设计里,该表没有存在于数据库表中。它是排班系统动态依据“群组排班表”“个人排班表”“个人历史记录”计算而得出的。目前我设计中“倒班规则”则是用来快速生成群组排班表,减轻排班工作量的,与排班表生成逻辑无关。如果要做得更复杂一些,也可以在将“倒班规则”考虑到排班表的生成中去,那样的排班表生成逻辑就复杂很多了。我认为:将“倒班规则”只用作快速生成群组排班表,不计入排班表生成逻辑中是一个足够好用的方案,系统不需要再复杂化。5、关于自动侦测员工当天班次。自动侦测员工当天班次,作为一个功能存在,做成“侦测可能的排班错误”,并提供对应的可能班次。用以方便检测排班错误。还是不赞成用自动检测到的班次来替代排班的方案。因为那不能回答:当天员工是否应该出勤?(不用出勤也就没有旷工缺席了。)关于考勤有很多很多的话题与规则,因为其复杂与易变,考勤软件走的是螺旋上升的发展道路,程序员的每一次努力都让软件更强壮易用,所以最好用面向对象的方法来开发考勤软件。至于数据库表设计及具体程序对象接口代码,我没准备这方面的内容,至于用户操作界面如何才易用,那又是另一个话题了。思想与解决方案说出,代码就是次要的了。

‘伍’ 用c语言给员工排班编程

好难啊!矩阵横竖都要约束。现在只想到一部分代码,以供参考。
希望能对你有所帮助。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define FIRST 1//1班
#define SECOND 2//2班
#define THIRD 4//3班
#define FOURTH 8//4班

class people
{
public:
int m_currentmode;
int m_canusemode;
people(){
m_currentmode=0;
m_canusemode=0;
}
int GetCurrentMode();
int HaveUseMode(int mode);
int SetMode(int mode,int usemode);
};
int people::GetCurrentMode()
{
return m_currentmode;
}
int people::HaveUseMode(int mode)
{
int result=0;
switch(mode)
{
case FIRST:
result=FIRST+SECOND+THIRD+FOURTH;
break;
case SECOND:
result=SECOND+THIRD+FOURTH;
break;
case THIRD:
result=THIRD+FOURTH;
break;
case FOURTH:
result=FIRST+SECOND+THIRD+FOURTH;
break;
default:
break;

}
return result;
}
int people::SetMode(int mode,int usemode)
{
m_currentmode=0;
if((mode&usemode)==0)//与操作……
{
return 0;
}
m_currentmode=mode;
m_canusemode=HaveUseMode(m_currentmode);

return m_currentmode;
}
int* randmode(int *pint);//随机函数
void init();//初始化
people man[10][7];//全局对象
int m_pn[10];//无意义
void output(int mode);//打印
void main( void )
{
srand((unsigned)time(NULL));

init();
printf("\t星期一\t二\t三\t四\t五\t六\t日");
for(int i=0;i<10;i++)
{
printf("\n %dman",i+1);
for(int j=0;j<7;j++)
output(man[i][j].m_currentmode);
}
printf("\n");
printf("\n");
return ;
}
void output(int mode)
{
switch(mode)
{
case FIRST:
printf("\t1班");
break;
case SECOND:
printf("\t2班");
break;
case THIRD:
printf("\t3班");
break;
case FOURTH:
printf("\t4班");
break;
default:
printf("\t错误");
break;

}
}
int* randmode(int *pint)
{

memset(pint,0,sizeof(pint));

{
int k=1;
pint[0]=rand()%10;

while(k<10)
{
pint[k]=rand()%10;
for(int i=0;i<k;i++)
{
if(pint[i]==pint[k])
break;
}
if(i==k)
k++;
}
}

return pint;
}
void init()
{
int test[10];
randmode(test);
for(int i=0;i<3;i++)
{
man[test[i]][0].m_currentmode=FIRST;
}
for(;i<6;i++)
{
man[test[i]][0].m_currentmode=SECOND;
}
for(;i<8;i++)
man[test[i]][0].m_currentmode=THIRD;
for(;i<10;i++)
man[test[i]][0].m_currentmode=FOURTH;
int m=1;
while(m<7)
{
randmode(test);
for( i=0;i<3;i++)
man[test[i]][m].m_currentmode=1;
for(;i<6;i++)
man[test[i]][m].m_currentmode=2;
for(;i<8;i++)
man[test[i]][m].m_currentmode=4;
for(;i<10;i++)
man[test[i]][m].m_currentmode=8;
for(i=0;i<10;i++)
{
if(!man[i][m].SetMode(man[i][m].m_currentmode,man[i][m-1].HaveUseMode(man[i][m-1].m_currentmode)))
break;
}
if(i==10)
{
m++;
}
}
}

‘陆’ C语言实现排班系统。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

structPerson
{
intcnDay;
intday[7];//开的足够大,假设某个人可能7天都忙--.
charpName[10];
};

charname[7][10];//7个人,每人名字不超过10
Personp[7];//7个人的信息
boolisEmpty[7]={false};//标记7天已占用情况

voidsetTable(inti)
{
if(i==7)
{
printf("星期一星期二星期三星期四星期五星期六星期日 ");
for(intk=0;k<7;++k)
{
printf("%s",name[k]);
}
printf(" ");
return;
}
intk=0;
for(;k<p[i].cnDay;++k)
{
if(isEmpty[p[i].day[k]]==false)
{
isEmpty[p[i].day[k]]=true;
strcpy(name[p[i].day[k]],p[i].pName);
setTable(i+1);
isEmpty[p[i].day[k]]=false;
}
}
}

intmain()
{
intday;
intcount;
for(inti=0;i<7;++i)
{
printf("输入第%d个人的名字,然后依次输入每个人的繁忙日,输入0结束此人信息录入! ",i+1);
count=0;
scanf("%s",p[i].pName);
scanf("%d",&day);
while(day!=0)
{
p[i].day[count]=day-1;
++count;
scanf("%d",&day);
}
p[i].cnDay=count;
}
setTable(0);
return0;
}

‘柒’ C语言编程排班系统

#include <stdio.h>

int n = 0;
int rest[7][7];

void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}

void perm(int list[], int k, int m)
{
int i;
int j;
if(k > m)
{
for (i=0; i<7; i++)
{
for (j=0; j<7; j++)
{
if (rest[i][j] == 0)
return;
if (rest[i][j] != list[i])
continue;
if (rest[i][j] == list[i])
break;
}
}

n++;
printf("Solution: %d\n", n);
printf("赵 钱 孙 李 周 吴 陈\n");
printf("=============================================================\n");
for(i = 0; i <= m; i++)
{
switch (list[i])
{
case 1: printf("星期一 ");
break;
case 2: printf("星期二 ");
break;
case 3: printf("星期三 ");
break;
case 4: printf("星期四 ");
break;
case 5: printf("星期五 ");
break;
case 6: printf("星期六 ");
break;
case 7: printf("星期日 ");
break;
default:
break;
}
}
printf("\n\n\n");
}

else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}

int main()
{
printf("\n");
printf("注意:\n");
printf(" 1.请按钱、赵、孙、李、周、吴、陈的顺序输入休息每个人的时间。\n");
printf(" 2.输入星期时,请直接输入数字,如要输入'星期一',就用'1'代替,以此类推。\n");
printf(" 3.星期与星期之间用空格隔开,每输入完一个人的休息日,在其后输入0,再按回车继续下一人。\n");
printf("\n");
int list[] = {1, 2, 3, 4, 5, 6, 7};
int i, j;
for(i = 0; i < 7; i++)
{
printf("请输入第 %d 个人的休息时间:\n", i+1);
for(j = 0; j < 7; j++)
{
scanf("%d", &rest[i][j]);
if(rest[i][j] == 0)
break;
}
}
printf("\n\n\n");
perm(list, 0, 6);
getchar();
getchar();
printf("输出完毕,按回车键结束!\n");
return 0;
}

‘捌’ 怎么用c语言编制一个12人排班,一天2人,一星期中每人只能休息一天。每个员工可以预先自行选择一个天

#include <stdio.h>
#include <stdlib.h>

int sum = 0;

void restSort(int* staffs_ptr,int staff_size,int* rest_staffs_ptr,int rest_staff_size);

void print(int* rest_ptr, int rest_size);

int main() {
int init_size = 12;
int *staffs_ptr = (int*)malloc(sizeof(int) * init_size);
if (staffs_ptr != NULL) {
for (int i = 0; i < init_size; i++) {
*(staffs_ptr + i) = i + 1;
}
restSort(staffs_ptr,init_size,NULL,0);
free(staffs_ptr);
printf("sum = %d\n",sum);
}
return 0;
}

void restSort(int* staffs_ptr, int staff_size, int* rest_staffs_ptr, int rest_staff_size) {
if (staff_size <= 2) {
if (rest_staffs_ptr != NULL && rest_staff_size > 0) {
int yet_rest_staff_size = rest_staff_size + staff_size;
int* yet_rest_staffs_ptr = (int*)malloc(sizeof(int) * yet_rest_staff_size);
if (yet_rest_staffs_ptr != NULL) {
for (int rest_index = 0; rest_index < rest_staff_size; rest_index++) {
yet_rest_staffs_ptr[rest_index] = rest_staffs_ptr[rest_index];
}
for (int index = rest_staff_size; index < yet_rest_staff_size; index++) {
yet_rest_staffs_ptr[index] = staffs_ptr[index - rest_staff_size];
}
print(yet_rest_staffs_ptr,yet_rest_staff_size);
free(yet_rest_staffs_ptr);
}
}
else {
print(staffs_ptr,staff_size);
}
return;
}
for (int i = 0; i < staff_size - 1; i++) {
for (int j = i + 1; j < staff_size; j++) {
int* resie_staff_ptr = (int*)malloc(sizeof(int) * (staff_size - 2));
if (resie_staff_ptr != NULL) {
int resie_size = 0;
for (int index = 0; index < staff_size; index++) {
if (index == i || index == j)
continue;
resie_staff_ptr[resie_size] = staffs_ptr[index];
resie_size++;
}
int yet_rest_staff_size = rest_staff_size + 2;
int* yet_rest_staffs_ptr = (int*)malloc(sizeof(int) * yet_rest_staff_size);
if (yet_rest_staffs_ptr != NULL) {
if (rest_staffs_ptr != NULL && rest_staff_size > 0) {
for (int rest_index = 0; rest_index < rest_staff_size; rest_index++) {
yet_rest_staffs_ptr[rest_index] = rest_staffs_ptr[rest_index];
}
}
yet_rest_staffs_ptr[rest_staff_size] = staffs_ptr[i];
yet_rest_staffs_ptr[rest_staff_size + 1] = staffs_ptr[j];
restSort(resie_staff_ptr, resie_size,yet_rest_staffs_ptr,yet_rest_staff_size);
free(yet_rest_staffs_ptr);
}
free(resie_staff_ptr);
}
}
}
}

void print(int* rest_ptr, int rest_size) {
for (int i = 1; i <= 7; i++) {
int day = 1;
for (int j = 0; j < rest_size;) {
if (day == i) {
printf("星期 %d: 无 ",day);
}
else {
printf("星期 %d: %d ",day,rest_ptr[j]);
j++;
if (j < rest_size) {
printf("%d ", rest_ptr[j]);
j++;
}
}
day++;
}
if (day == 7) {
printf("星期 7: 无");
}
printf("\n");
sum++;
}
}

‘玖’ 排班系统。c语言

我先说说思路:用一个7*7的二维数组pb存储一周中每天是谁休息,数组行标0-6表示人员(钱-陈),列标0-6表示星期(日-六),初始值存储为每人的休息日意愿,比如钱想休息周一、六,即置pb[0][1]和pb[0][6]为1,其余为0(表示不情愿休息),依次类推,初始化其他人员的休息意愿。接下来就对这个数组中为1的元素进行筛选修改,比如将pb[i][j]=1改为pb[i][j]=2,即表示让人员i在星期j休息,当然人员i不能又在其它天休息了,其他人员也不能在星期j这天休息了,也就是i行、j列都只能有一个为2的值,经过7次设置,即可得到一种方案。可以考虑用递归算法实现。

#include<stdio.h>
#include<conio.h>
#defineT7//排班周期
#defineN7//人员数目
#defineX1//每人每周期可以休息X天,X<T
#defineY1//每天最多可以有Y人休息,Y>=N*X/T
inttotal=0;
voidPrint(intpb[][T]){
inti,j;
printf(" XiuXiFangAn%d: ",++total);
for(i=0;i<N;++i){
printf("%d:",i);
for(j=0;j<T;++j){
if(pb[i][j]==2)printf("%d",j);
}
printf(" ");
}
getch();
}
intKeXing(intpb[][T],intk,intj){//检验k人员在j日期休息是否可行
ints=0,i;
for(i=0;i<T;++i)s+=(pb[k][i]==2);
if(s>X)return0;
for(s=0,i=0;i<N;++i)s+=(pb[i][j]==2);
if(s>Y)return0;
return1;
}
voidPaiBan(intpb[][T],intk){//给第k位人员安排休息日
inti,j;
for(j=0;j<T;++j){
if(pb[k][j]==1){//k人员愿意在j日期休息
pb[k][j]=2;
if(KeXing(pb,k,j)){
if(k==N-1){//找到一个方案
Print(pb);//输出休息方案
}else{
PaiBan(pb,k+1);
}
}
pb[k][j]=1;//准备更换下一个休息意愿日测试
}
}
}
intmain(){
inti,j,pb[N][T]={0};
printf("====PaiBanXiTong==== ");
printf("XiuXiYiYuani,j(RenYuani=0~%d,RiQij=0~%d,JieShu-1,-1): ",N-1,T-1);
do{
scanf("%d,%d",&i,&j);
if(i>=0&&i<N&&j>=0&&j<T){
pb[i][j]=1;
}else{
break;
}
}while(1);
PaiBan(pb,0);
printf(" GongYou%dZuFangAn.",total);
printf(" Finished! ");
getch();
return0;
}

根据你的休息意愿设置,可以得到4中方案。

‘拾’ c语言程序设计,排班问题

/*
B A C C A
B A C B B
C A A C B
B C A A B
A : 7(天)
B : 7(天)
C : 6(天)
Press any key to continue
*/
#include <stdio.h>
#include <string.h>
#define N 3 // 人数
#define M 4 // 周数

int main() {
int ID[N] = {0,1,2}; // 管理员编号
int work[N][5] = {{0,1,1,1,1},{1,0,0,1,1},{1,1,1,1,0}}; // 三位管理员可否值班表
int days[N] = {0}; // 已值班天数
int list[5]; // 周值班表
int week,weekday,who,i,j,k,t;

for(week = 0; week < M; ++week) { // 仅排M个周
memset(list,0,sizeof(list)); // 值班表清零
for(weekday = 0; weekday < 5; ++weekday) { // 每周5个工作日
for(i = 0; i < N - 1; ++i) { // 以值班天数增排序
k = i;
for(j = i + 1; j < N; ++j)
if(days[k] > days[j]) k = j;
if(k != i) {
t = days[k]; days[k] = days[i]; days[i] = t;
t = ID[k]; ID[k] = ID[i]; ID[i] = t; // 同时交换编号
}
}
for(who = 0; who < N; ++who) { // 从排位靠前的开始安排值班
if(work[ID[who]][weekday]) { // 只要该人上班就可以安排
list[weekday] = ID[who];
++days[who];
break;
}
}
}
for(weekday = 0; weekday < 5; ++weekday) // 本周值班表
printf("%c ",list[weekday] + 'A');
printf("\n");
}
for(i = 0; i < N - 1; ++i) { // 以编号增排序
k = i;
for(j = i + 1; j < N; ++j)
if(ID[k] > ID[j]) k = j;
if(k != i) {
t = days[k]; days[k] = days[i]; days[i] = t;
t = ID[k]; ID[k] = ID[i]; ID[i] = t;
}
}
for(who = 0; who < N; ++who) // 最近N周值班天数统计
printf("%c : %d(天)\n",ID[who] + 'A',days[who]);
return 0;
}