请大家给个自动排班的思路,谢谢

zc0001 2007-09-13 05:55:51
情况是这样的:共分四个班,但是三班倒,早、中、晚,其中早班和同一天的晚班是同一个人上,上完晚班可以休息2天半,例如:

早班:张三
中班:李四
晚班:张三

次日的早班:李四
次日的中班:赵五
次日的晚班:李四

第三天的早班:赵五
第三天的中班:王六
第三天的晚班:赵五

第四天的早班:王六
第四天的中班:张三
第四天的晚班:王六

第五天的早班:张三
。。。
要求能够输入起始日期和结束日期自动生成排班表,想了几天都不知道该如何做,请大家给个思路,谢谢!
...全文
479 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
喝口水 2007-10-01
  • 打赏
  • 举报
回复
点管理贴子
zc0001 2007-10-01
  • 打赏
  • 举报
回复
谢谢大家了,可怎么给分呀,我点贴子加分,说我没有权限
wangxuelid 2007-09-15
  • 打赏
  • 举报
回复
基本思路是那样,,,我个人感觉首先要判断是多少人,,,在判断多少是一个循环,,在增加响应的算法进去才可以,,,
jhldelphi 2007-09-14
  • 打赏
  • 举报
回复
顶下
喝口水 2007-09-14
  • 打赏
  • 举报
回复
刚才我把这个想法试了一下,现发给你源码:
在窗口上加一个memo控件memo1,两个DateTimePicker控件,一个测试按钮,在测试按钮双击事件中添加如下代码即可:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,DateUtils, ComCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
DateTimePicker1: TDateTimePicker;
DateTimePicker2: TDateTimePicker;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
str:string;
begin
for i:=0 to DaysBetween(self.DateTimePicker1.Date,self.DateTimePicker2.Date) do
begin
str:=datetostr(self.DateTimePicker1.Date+i)+ ': '+#10#13;
case i mod 4 of
0:str:=str+ ' 早班:张三 '+#10#13+ '中班:李四 '+#10#13+ '晚班:张三 ';
1:str:=str+ '早班:李四 '+#10#13+ '中班:赵五 '+#10#13+ ' 晚班:李四 ';
2:str:=str+ '早班:赵五 '+#10#13+ '中班:王六 '+#10#13+ '晚班:赵五 ';
3:str:=str+ '早班:王六 '+#10#13+ '中班:张三 '+#10#13+ '晚班:王六 ';
end;
memo1.lines.add(str);
end;

end;

end.
喝口水 2007-09-14
  • 打赏
  • 举报
回复
刚才看了一下你的问题,感觉可以这样
你先安排前4天的顺序,就像你举的例子:
早班:张三
中班:李四
晚班:张三

次日的早班:李四
次日的中班:赵五
次日的晚班:李四

第三天的早班:赵五
第三天的中班:王六
第三天的晚班:赵五

第四天的早班:王六
第四天的中班:张三
第四天的晚班:王六

然后按组刚才的样子分一下组,例如:
第1组: 早班:张三
中班:李四
晚班:张三

第2 组: 早班:李四
中班:赵五
晚班:李四
第3组:
早班:赵五
中班:王六
晚班:赵五
第4组
早班:王六
中班:张三
晚班:王六

然后我们就可以,按照9月1号第1组,9月2号第2组,9月3号第3组,9月4号第4组,9月5号第1组......依次类推就可以了
当然用程序的话可以这样:
例如我们输入了起始日期是9月1号,结束日期是9月21号,并且在窗口中有一个memo控件,那么
anow:=strtodate('2007-9-1');
athen:=strtodate('2007-9-21');
for i:=0 to DaysBetween(anow,athen) do
begin
str:=datetostr(anow+1)+':'+#10#13;
case i mod 4 of
0:str:=str+' 早班:张三'+#10#13+'中班:李四'+#10#13+'晚班:张三';
1:str:=str+'早班:李四'+#10#13+'中班:赵五'+#10#13+' 晚班:李四 ';
2:str:=str+'早班:赵五'+#10#13+'中班:王六'+#10#13+'晚班:赵五';
3:str:=str+'早班:王六'+#10#13+'中班:张三'+#10#13+'晚班:王六 ';
end;
memo1.lines.add(str);
end;

好了,加分吧!
hushu02 2007-09-14
  • 打赏
  • 举报
回复
哈哈,我以前也遇到过这个问题,倒班的问题 后来解决的办法基本思路就和 hys_427 差不多

LZ可以试一下
喝口水 2007-09-14
  • 打赏
  • 举报
回复
给你又修改了一下:把分组的过程也程序化了:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,DateUtils, ComCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
DateTimePicker1: TDateTimePicker;
DateTimePicker2: TDateTimePicker;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure madegroup(a,b,c,d:string);
private
{ Private declarations }
group1,group2,group3,group4:string;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.madegroup(a,b,c,d:string);
begin
group1:='早班:'+a+' 中班:'+b+' 晚班:'+a;
group2:='早班:'+b+' 中班:'+c+' 晚班:'+b;
group3:='早班:'+c+' 中班:'+d+' 晚班:'+c;
group4:='早班:'+d+' 中班:'+a+' 晚班:'+d;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
str:string;
begin
memo1.Clear;
madegroup('张三','李四','赵五','王六');
for i:=0 to DaysBetween(self.DateTimePicker1.Date,self.DateTimePicker2.Date) do
begin
str:=datetostr(self.DateTimePicker1.Date+i)+ ': '+#10#13;
case i mod 4 of
0:str:=str+ group1;
1:str:=str+ group2;
2:str:=str+ group3;
3:str:=str+ group4;
end;
memo1.lines.add(str);
end;

end;

end.

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧