2.用C语言编制排班系统 某生产车间有12名员工,编号为:001、002、003、……、012。由于工作需要,在生产旺季取消了周末公休日,即周一至周日均要上班,因此需要实行员工轮休制度。每天安排两人休息。要求:一星期中每人只能休息一天!且每个员工可以预先自行选择一个自认为合适的休息日!请编制程序,打印轮休的所有可能方案。尽可能做到使每个人都满意,保证排班的公平性。
时间: 2024-02-25 10:54:34 浏览: 145
以下是用C语言编写的排班系统程序,实现了上述要求:
```c
#include <stdio.h>
#define EMPLOYEE_NUM 12
#define REST_DAY_NUM 2
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_day1 = rest_days[i];
int rest_day2 = (rest_days[i] + 1) % 7; // 取下一个日期作为第二个休息日
if (rest_day1 > rest_day2) { // 保证rest_day1 <= rest_day2
int temp = rest_day1;
rest_day1 = rest_day2;
rest_day2 = temp;
}
// 在rest_day1和rest_day2中选择一个当前休息人数最少的日期
int selected_rest_day;
if (rest_day_count[rest_day1] <= rest_day_count[rest_day2]) {
selected_rest_day = rest_day1;
} else {
selected_rest_day = rest_day2;
}
// 将当前员工安排在selected_rest_day休息
schedule[i][0] = selected_rest_day;
schedule[i][1] = (selected_rest_day + 3) % 7; // 取下三个日期作为下一个休息日
rest_day_count[selected_rest_day]++;
rest_day_count[schedule[i][1]]++;
}
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的休息日:1 4
员工002的休息日:2 5
员工003的休息日:3 6
员工004的休息日:4 7
员工005的休息日:5 1
员工006的休息日:6 2
员工007的休息日:7 3
员工008的休息日:4 7
员工009的休息日:5 1
员工010的休息日:6 2
员工011的休息日:7 3
员工012的休息日:1 4
```
阅读全文