情况是这样的:共分四个班,但是三班倒,早、中、晚,其中早班和同一天的晚班是同一个人上,上完晚班可以休息2天半,例如:早班:张三
中班:李四
晚班:张三次日的早班:李四
次日的中班:赵五
次日的晚班:李四第三天的早班:赵五
第三天的中班:王六
第三天的晚班:赵五第四天的早班:王六
第四天的中班:张三
第四天的晚班:王六第五天的早班:张三

要求能够输入起始日期和结束日期自动生成排班表,想了几天都不知道该如何做,请大家给个思路,谢谢!

解决方案 »

  1.   

    刚才看了一下你的问题,感觉可以这样
       你先安排前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;好了,加分吧!
      

  2.   

    刚才我把这个想法试了一下,现发给你源码:
    在窗口上加一个memo控件memo1,两个DateTimePicker控件,一个测试按钮,在测试按钮双击事件中添加如下代码即可:
    unit Unit1;interfaceuses
      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.
      

  3.   

    给你又修改了一下:把分组的过程也程序化了:
    unit Unit1;interfaceuses
      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.
      

  4.   

      哈哈,我以前也遇到过这个问题,倒班的问题  后来解决的办法基本思路就和 hys_427 差不多  LZ可以试一下