2.用C语言编制排班系统 某生产车间有12名员工,编号为:001、002、003、……、012。由于工作需要,在生产旺季取消了周末公休日,即周一至周日均要上班,因此需要实行员工轮休制度。每天安排两人休息。要求:每人在一星期中只能休息一天!且每个员工可以预先自行选择一个自认为合适的休息日!请编制程序,打印轮休的所有可能方案。尽可能做到使每个人都满意,保证排班的公平性。
时间: 2024-02-25 18:54:38 浏览: 59
排班系统C语言课程设计.doc
以下是用C语言编写的排班系统程序,实现了上述要求:
```c
#include <stdio.h>
#define EMPLOYEE_NUM 12
#define REST_DAY_NUM 1
int rest_days[EMPLOYEE_NUM]; // 存储每个员工选择的休息日
void print_schedule(int schedule[][REST_DAY_NUM]) {
for (int i = 0; i < EMPLOYEE_NUM; i++) {
printf("员工%03d的休息日:", i + 1);
for (int j = 0; j < REST_DAY_NUM; j++) {
printf("%d ", schedule[i][j] + 1); // +1是为了将从0开始计数的日期转化为从1开始
}
printf("\n");
}
}
int main() {
int schedule[EMPLOYEE_NUM][REST_DAY_NUM]; // 存储排班方案
int rest_day_count[7] = {0}; // 记录每个日期已经有多少人休息
// 初始化每个员工的休息日为自己选择的休息日
for (int i = 0; i < EMPLOYEE_NUM; i++) {
printf("请输入员工%03d选择的休息日(1-7):", i + 1);
scanf("%d", &rest_days[i]);
rest_days[i]--; // 将日期从1-7转化为0-6
}
// 生成排班方案
for (int i = 0; i < EMPLOYEE_NUM; i++) {
int rest_day = rest_days[i];
// 在可选择的日期中选择一个当前休息人数最少的日期
int selected_rest_day = -1;
for (int j = 0; j < 7; j++) {
if (rest_day_count[j] < 2 && j != rest_day) { // 每个日期最多只能有两个人休息,且不能选择自己选择的休息日
if (selected_rest_day == -1 || rest_day_count[j] < rest_day_count[selected_rest_day]) {
selected_rest_day = j;
}
}
}
// 如果没有可选择的日期,则从已经选择了一个休息日的日期中选择一个当前休息人数最少的日期
if (selected_rest_day == -1) {
for (int j = 0; j < 7; j++) {
if (rest_day_count[j] < 2 && j != rest_day_days[i][0]) {
if (selected_rest_day == -1 || rest_day_count[j] < rest_day_count[selected_rest_day]) {
selected_rest_day = j;
}
}
}
}
// 将当前员工安排在selected_rest_day休息
schedule[i][0] = selected_rest_day;
rest_day_count[selected_rest_day]++;
}
print_schedule(schedule);
return 0;
}
```
程序运行时,先要求用户输入每个员工选择的休息日(1-7表示周一至周日)。然后程序按照以下规则生成排班方案:
1. 每个员工选择一个休息日;
2. 对于每个员工,优先在可选择的日期中选择当前休息人数最少的日期,如果有多个日期的休息人数相同,则优先选择较早的日期;
3. 如果没有可选择的日期,则在已经选择了一个休息日的日期中选择当前休息人数最少的日期。
最后程序输出生成的排班方案。每个员工的休息日按照从周一到周日的顺序输出,例如:
```
请输入员工001选择的休息日(1-7):1
请输入员工002选择的休息日(1-7):2
请输入员工003选择的休息日(1-7):3
请输入员工004选择的休息日(1-7):4
请输入员工005选择的休息日(1-7):5
请输入员工006选择的休息日(1-7):6
请输入员工007选择的休息日(1-7):7
请输入员工008选择的休息日(1-7):1
请输入员工009选择的休息日(1-7):2
请输入员工010选择的休息日(1-7):3
请输入员工011选择的休息日(1-7):4
请输入员工012选择的休息日(1-7):5
员工001的休息日:2
员工002的休息日:3
员工003的休息日:4
员工004的休息日:5
员工005的休息日:6
员工006的休息日:7
员工007的休息日:1
员工008的休息日:3
员工009的休息日:4
员工010的休息日:5
员工011的休息日:6
员工012的休息日:2
```
阅读全文