1. 排班系統的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、關於自動偵測員工當天班次。自動偵測員工當天班次,作為一個功能存在,做成「偵測可能的排班錯誤」,並提供對應的可能班次。用以方便檢測排班錯誤。還是不贊成用自動檢測到的班次來替代排班的方案。因為那不能回答:當天員工是否應該出勤?(不用出勤也就沒有曠工缺席了。)關於考勤有很多很多的話題與規則,因為其復雜與易變,考勤軟體走的是螺旋上升的發展道路,程序員的每一次努力都讓軟體更強壯易用,所以最好用面向對象的方法來開發考勤軟體。至於資料庫表設計及具體程序對象介面代碼,我沒准備這方面的內容,至於用戶操作界面如何才易用,那又是另一個話題了。思想與解決方案說出,代碼就是次要的了。
2. C語言課程設計-保安值班系統
這個像排列組合多點:
c:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
char*week[7]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
char*names[7]={"趙","錢","孫","李","周","吳","陳"};
intplan[7]={-1};
intplanNum=0;
voiddoPlan(intn,int*len,intaccept[7][3]){
if(n>6){
planNum++;
for(inti=0;i<n;++i){
printf("%s ",names[plan[i]]);
}
printf(" ");
}else{
for(inti=0;i<len[n];++i){
if(plan[accept[n][i]]>=0){
continue;
}
plan[accept[n][i]]=n;
doPlan(n+1,len,accept);
plan[accept[n][i]]=-1;
}
}
}
intmain(){
intlen[7]={2,2,2,1,3,2,3};//這里的數字對應accept[i]的長度
intaccept[7][3]={{2,4},{1,6},{0,3},{5},{1,4,6},{2,
5},{0,3,6}};
for(inti=0;i<7;i++){
printf("%s ",week[i]);
plan[i]=-1;
}
printf(" ");
doPlan(0,len,accept);
printf("總共%d個方案 ",planNum);
return0;
}
3. 排班系統。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中方案。
4. C語言編程 值班安排
少年 說實話你這演算法很繁瑣!
透過現象看本質,這其實是個七元一次方程組或者n元n次方程組的求解問題。
(1)A大夫比C大夫晚1天值班; C-A=1
(2)D大夫比E大夫晚1天值班; E-D=1
(3)E大夫比B大夫早2天值班 B-E=2
(4)B大夫比G大夫早4天值班; G-B=4
(5)F大夫比B大夫晚1天值班; F-B=1
(6)F大夫比C大夫早1天值班; C-F=1
(7)F大夫星期四值班。 F=4
n個未知數n個方程,解出這n個值根據值的大小不就輕易排出了順序!!!
且以上各個方程就能一眼看出各大夫值班的關系。
解出來ABCDEF為1234567中的一一對應的一個值,1+2+...+7=28,實際上那七個方程就可以組合出A+B+C+D+E+F=28
5. 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]='