用C语言编制排班系统
#include
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语言排班算法问题
首先,由于是排每周的班,所以理想情况下,应该有7*(n+m+h)/N是一个整数,这样才能每周班次均等.如果不是整数,则要每周换班次(余数个周一个循环),这种做法在实际中几乎没人采用.所以,如果不是整数,我们要假设,均衡的标准是,排到班次最多的人和最少的人之间的差距不超过1.在以上假设的前提下,给出算法.把7天3个班排成一个广义循环表,然后建立员工类,创建员工对象数组.最后用递归回溯法解出可能的一种排班方式.由于大多数员工是等价的,所以排班方式很多,只需解出一种的话,用递归方法很快,也很好写.关于那些排班条件,你可以写在员工类里,也可以写在递归算法的判断里.
c ++编写飞机排班算法
private static String execute(HttpClient client, HttpRequestBase request,String url, String encoding) throws HttpProcessException {
String body = “”;
HttpResponse response =null;
try {
//执行请求操作,并拿到结果(同步阻塞)
response = client.execute(request);
//获取结果实体
HttpEntity entity = response.getEntity();
if (entity != null) {
//按指定编码转换结果实体为String类型
body = EntityUtils.toString(entity, encoding);
logger.debug(body);
}
EntityUtils.consume(entity);
} catch (ParseException | IOException e) {
throw new HttpProcessException(e);
} finally {
close(response);
}
return body;
}
急寻:高效的机组排班算法??!!
搜一下:急寻:高效的机组排班算法??!!
排班系统。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 #include #define T 7 //排班周期 #define N 7 //人员数目 #define X 1 //每人每周期可以休息X天,X #define Y 1 //每天最多可以有Y人休息,Y>=N*X/T int total=0; void Print(int pb[][T]){ int i,j; printf(“\nXiuXi FangAn %d:\n”,++total); for(i=0;i printf(“%d:”,i); for(j=0;j if(pb[i][j]==2)printf(“%d “,j); } printf(“\n”); } getch(); } int KeXing(int pb[][T],int k,int j){//检验k人员在j日期休息是否可行 int s=0,i; for(i=0;i if(s>X)return 0; for(s=0,i=0;i if(s>Y)return 0; return 1; } void PaiBan(int pb[][T],int k){//给第k位人员安排休息日 int i,j; for(j=0;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;//准备更换下一个休息意愿日测试 } } } int main(){ int i,j,pb[N][T]={0}; printf(“====PaiBan XiTong====\n”); printf(“XiuXi YiYuan i,j( RenYuan i=0~%d, RiQi j=0~%d, JieShu -1,-1 ):\n”,N-1,T-1); do{ scanf(“%d,%d”,&i,&j); if(i>=0&&i=0&&j pb[i][j]=1; }else{ break; } }while(1); PaiBan(pb,0); printf(“\nGong You %d Zu FangAn.”,total); printf(“\nFinished!\n”); getch(); return 0; }根据你的休息意愿设置,可以得到4中方案。
连续排班用那个函数
展开全部
快速选定Excel区域使用自定义序列排序 在Excel排序对话框中选择主要关键字后单击选项,可以选择自定义序列作为排序次序,使排序方便快捷且更易于控制。顺便说一下,排序可以选择按列或按行,我以前如果排行的顺序都是选择性粘贴转置,排完序后再转置。自定义排序只应用于“主要关键字”框中的特定列。在“次要关键字”框中无法使用自定义排序次序。若要用自定义排序次序对多个数据列排序,则可以逐列进行排序。例如,如果要根据列A或 列B进行排序,可先根据列B排序,然后通过“排序选项”对话框确定自定义排序次序。下一步就是根据列 A 排序。在Excel中输入人名时使用“分散对齐”在Excel表格中输入人名时为了美观,我们一般要在两个字的人名中间空出一个字的间距。按空格键是一个办法,但是我们这里有更好的:我们以一列为例,将名单输好后,选中该列,点击“格式—单元格—对齐”,在“水平对齐”中选择“分散对齐”,最后将列宽调整到最合适的宽度,整齐美观的名单就做好了。 本技巧给出了一个很好的例子,同时还带出了一个原则:永远不应使用空格或空行来调整对象的位置,因为它很难控制,且适应性差,可能导致意想不到的结果。在本例中,如果名字中间有空格,查找时若忘了这个空格则会很麻烦快速选定Excel区域在Excel中,要想在工作簿中快速选定某块区域,只需单击想选定的区域的左上角单元格,同时按住Shift键不放,再单击想选定的区域的右下角单元格即可。另:按住Ctrl键再用鼠标可任意选定多个不相邻的区域事实上选定区域和顺序无关,只需首先选定矩形区域的一个角的单元格,再按下Shift的同时单击对角单元格。此2种选定方法同样适用于Word 2002,但Word 2002以前的版本不支持选定多个不连续区域Excel自带的示例文件在:\ProgramFiles\Microsoft Office\Office10\Samples 文件夹中有两个EXCEL示例文件SAMPLES:主要包含工作表函数,条件格式,数据有效性,图标标志,重复任务,数组,API示例,事件,自动化,ADO等演示数据,对学习Excel使用很有帮助SOLVSAMP:是用来学习加载宏”规划求解”的一个示例文件,当中包含6个方面的应用:产品组合、货物传送、排班组合、最大收益、投资方案和电路设计 无论您是初学者,还是熟练用户,这两个文件都会对您有很大的帮助。注意:要使用规划求解,需要先加载规划求解加载宏。方法是从工具菜单中选择加载宏命令,在对话框中选中规划求解即可Excel 2000中选定超级链接文本技巧如果需要在Excel 2000中选定超级链接文本而不跳转到目标处,可采用如下操作方法,单击包含超级链接文本的单元格,按住鼠标左键至少一秒钟,然后释放鼠标,这时就可以选定超级链接文本。 在Excel 2002中,当指向该单元格时,除了会提示链接地址外,也会提示单击一次可跟踪链接;单击并按住可用于选定单元格。不过在Word中,默认需要Ctrl+单击来跟踪链接;而PowerPoint中,则是在播放时单击才能跟踪链接。如何消除缩位后的计算误差有时我们输入的数字是小数点后两位数,但是在精度要求上只要一位,缩位后显示没问题,但其计算结果却是有误差的。解决方法是“工具-选项-重新计算”中,勾选“以显示值为准”。这样计算结果就没有误差了。专家点评:事实上并不是计算上有误差,而是显示设置的四舍五入。采用本技巧提供的方法,可以解决显示中的问题,但同时会改变数值的精度,在使用前Excel会给您一个警告。快速清除所有工作表格式这里是在您的Excel工作表中清除所有格式的一条捷径:在Excel 2002中:单击工作表中的任一单元格,按下CTRL+A以选中工作表中的所有单元格。 在编辑菜单上,指向清除,然后单击格式。 在Excel中隐藏整个工作表您可以隐藏Excel工作表以减少屏幕上表的数量并避免不必要的更改。当您隐藏部分工作簿时,数据从视图中消失,但并没有被从工作簿中删除。选定需要隐藏的工作表。 在格式菜单上,指向工作表,再单击隐藏。 注意如果工作表已经被保护,您将无法隐藏它。注意对文本到语音的使用校对工作表是一个耗时累眼的工作,尤其当您把您的工作表与其它文档中的数据进行比较时更是如此。但Excel 2002中的文本到语音特性
排班系统的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、关于自动侦测员工当天班次。自动侦测员工当天班次,作为一个功能存在,做成“侦测可能的排班错误”,并提供对应的可能班次。用以方便检测排班错误。还是不赞成用自动检测到的班次来替代排班的方案。因为那不能回答:当天员工是否应该出勤?(不用出勤也就没有旷工缺席了。)关于考勤有很多很多的话题与规则,因为其复杂与易变,考勤软件走的是螺旋上升的发展道路,程序员的每一次努力都让软件更强壮易用,所以最好用面向对象的方法来开发考勤软件。至于数据库表设计及具体程序对象接口代码,我没准备这方面的内容,至于用户操作界面如何才易用,那又是另一个话题了。思想与解决方案说出,代码就是次要的了。
上下班打卡机怎么计算
1.比如说我早上八点用卡刷了一下,然后八点半刷了一下,算哪个? 2.比如说我晚上6点刷了一下,7点刷了一下,算哪个? 3.比如说我早上没刷,晚上刷了,怎么算? 以上问题,不同的考勤软件算法不同.提问者没有说明使用的何种考勤软件. 机器怎么知道你是上班还是下班???————-除个别类型考勤机外,机器大多都只是记录打卡时间,根本不管你是上班和下班.所有的判断都是考勤软件来处理的,跟你安排的班次有关.
自动生成排班软件app有哪些?
市面上有很多的,而且大部分也都带有排班功能,不过其中也就喔趣科技的排班app做的比较好,你可以参考一下看看喔趣科技排班管理系统基于业务预测,算法引擎持续优化用工结构,实现科学用工规划.
排班软件app有哪些?
喔趣专门从事企业智能排班软件,功能清晰,节省人力,节省时间,同比其它同类app功能更为强大,值得您的选择喔趣科技排班管理系统基于业务预测,算法引擎持续优化用工结构,实现科学用工规划.