【在校整理-03 排班系统】(注:仅供参考学习使用)

  • 一、课题内容和要求
    • 1、问题描述
    • 2、功能要求
  • 二、源程序代码
  • 三、其他

一、课题内容和要求

1、问题描述

某单位有 7 名保安人员,要求每个人在一星期中可以休息一天。每名保安可以自行选择自己想要的休息日,而对于休息日的选择既可以是某一天,也可以是某几天中的其中一天。当 7 名保安依次输入自己想要的休息日后,系统将会给出可能的值班安排。若系统给出的值班安排是 0 种,证明系统对 7 名保安的选择无法作出排班,需要重新输入。
要求打印轮休的所有可能方案。当然使每个人都满意,例如每人可以选择的休息日如下:
赵:星期二、星期四
钱:星期一、星期六
孙:星期三、星期日李:星期五
周:星期一、星期四、星期六吴:星期二、星期五
陈:星期三、星期六、星期日运行结果:
排班表: 1

赵 钱 孙 李 周 吴 陈
星期四 星期一 星期五 星期六 星期三 星期二 星期日

排班表: 2

赵 钱 孙 李 周 吴 陈
星期四 星期一 星期日 星期五 星期六 星期二 星期三

排班表: 3

赵 钱 孙 李 周 吴 陈
星期四 星期六 星期三 星期一 星期五 星期二 星期日

排班表: 4

赵 钱 孙 李 周 吴 陈
星期四 星期六 星期日 星期五 星期一 星期二 星期三

2、功能要求

代码要能提供以下几个基本功能。
(1) 用户登录:
·新用户可以注册,旧用户直接登录。

(2) 排班表:
· 实现选择并存储排班表到排班表文件中。

· 维护排班表文件基本信息,实现增加、修改、查询、删除排班表记录的功能。

·由于排班表的特殊性,注意增加、修改、删除时备注操作时间和操作人员信息。

· 在系统无法排班时,判断周几没有值班人员。

二、源程序代码

// 代码很烂,轻喷。注:仅供参考学习使用。
//头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
#include<windows.h>//全局变量与宏定义
#define USER_FILE "user.txt"
#define RECORD_FILE "record.txt"
#define TEMP_FILE "temp.txt"
#define OPERATE_FILE "operate.txt"
#define CONSOLE "CON"
#define BUFLEN 255
int n = 0;
int rest[7][7];//用户信息结构体
struct User{char id[20];        //卡号char name[20];      //姓名char password[20];  //密码
};
typedef struct User user; // 重命名为user(目的:使用简便;下同)
//排班信息结构体
struct Arrange {char num[5];char zhao[10];char qian[10];char sun[10];char li[10];char zhou[10];char wu[10];char chen[10];
};
typedef struct Arrange arrange;//函数声明
int main(void);
void rerun(void);
void init(user* use,arrange* arrangement);
void read_user(user* use);
void top_menu(user* use,arrange* arrangement);
void user_login(user* use,arrange* arrangement);
void user_regist();
void swap(int* a, int* b);
void perm(int list[], int k, int m);
void add_arrage(arrange* arrangement,char* id);
void user_menu(user* use,arrange* arrangement,char* id);
void read_temp(arrange* arrangement);
void change_arrange(user* use, arrange* arrangement,char* id);
void check_arrange(user* use, arrange* arrangement,char* id);
void del_arrange(user* use,arrange* arrangement,char* id);//初始化用户信息结构体
void init(user* use ,arrange* arrangement) {for(int i = 0; i <50 ; i++){strcpy(use[i].id, "");strcpy(use[i].name, "");strcpy(use[i].password, "");}for(int i = 0; i <50 ; i++){strcpy(arrangement[i].num, "");strcpy(arrangement[i].zhao, "");strcpy(arrangement[i].qian, "");strcpy(arrangement[i].sun, "");strcpy(arrangement[i].li, "");strcpy(arrangement[i].zhou, "");strcpy(arrangement[i].wu, "");strcpy(arrangement[i].chen, "");}
}
//读入用户信息
void read_user(user* use) {freopen(USER_FILE, "r", stdin);  //输入重定向,将文件作为数据输入的主体,向控制台输入信息//读入数据for(int i = 0; i < 50; i++){scanf("%s%s%s", use[i].id, use[i].name, use[i].password);}freopen("CON", "r", stdin); //输入重定向返回,把输入主体返回到控制台。
}
//读入temp数据
void read_temp(arrange* arrangement) {freopen(TEMP_FILE, "r", stdin);  //输入重定向,将文件作为数据输入的主体,向控制台输入信息//读入数据for(int i = 0; i < 50; i++){scanf("%s%s%s%s%s%s%s%s", arrangement[i].num, arrangement[i].zhao, arrangement[i].qian, arrangement[i].sun, arrangement[i].li, arrangement[i].zhou, arrangement[i].wu, arrangement[i].chen);}freopen("CON", "r", stdin); //输入重定向返回,把输入主体返回到控制台。
}
//显示temp数据
void temp_display(arrange* arrangement) {read_temp(arrangement);for(int i = 0; i < 50; i++){if(strlen(arrangement[i].num) != 0) //将预约信息格式化输出printf(" 编号%s: 赵:%s, 钱:%s, 孙:%s, 李:%s, 周:%s, 吴:%s, 陈:%s\n", arrangement[i].num, arrangement[i].zhao, arrangement[i].qian, arrangement[i].sun, arrangement[i].li, arrangement[i].zhou, arrangement[i].wu, arrangement[i].chen);  }
}
//读入排班信息
void read_record(arrange* arrangement) {freopen(RECORD_FILE, "r", stdin);  //输入重定向,将文件作为数据输入的主体,向控制台输入信息//读入数据for(int i = 0; i < 50; i++){scanf("%s%s%s%s%s%s%s", arrangement[i].zhao, arrangement[i].qian, arrangement[i].sun, arrangement[i].li, arrangement[i].zhou, arrangement[i].wu, arrangement[i].chen);}freopen("CON", "r", stdin); //输入重定向返回,把输入主体返回到控制台。
}
//显示排班信息
void record_display(arrange* arrangement) {read_record(arrangement);for(int i = 0; i < 50; i++){if(strlen(arrangement[i].zhao) != 0) //将预约信息格式化输出printf(" 赵:%s, 钱:%s, 孙:%s, 李:%s, 周:%s, 吴:%s, 陈:%s\n", arrangement[i].zhao, arrangement[i].qian, arrangement[i].sun, arrangement[i].li, arrangement[i].zhou, arrangement[i].wu, arrangement[i].chen);  }
}
//初始菜单
void top_menu(user* use,arrange* arrangement) {int ret = 0;//用于接收用户输入选项printf("========== 欢迎进入排班系统 ==========\n");printf(" [----- Press 1 :注册账号-----]\n"); //printf(" [----- Press 2 :用户登录-----]\n"); //printf(" [----- Press 0 :退出系统-----]\n"); //printf(" 请输入您的选择:");scanf("%d", &ret);if(ret >= 0 && ret <3){switch (ret){//fflush(stdin)用来清空缓冲区,避免输入粘连带来的麻烦case 1:fflush(stdin); user_regist(); break;case 2:fflush(stdin); user_login(use,arrangement); break;case 0:fflush(stdin); exit(0); break;//输入0直接退出}} else {printf(" 输入有误!!\n\n");fflush(stdin);//清空缓冲区top_menu(use,arrangement);}
}
//实现用户登录功能函数
void user_login(user* use,arrange* arrangement){//载入用户账户信息read_user(use);int flag = -1;  //用于判断是否存在该账号,进行标记char id[20]; //接受用户输入的卡号char keyword[20];//接收用户输入的密码printf("\n 请输入您的卡号:");scanf("%s",id);printf(" 请输入您的密码:");scanf("%s",keyword);printf("\n");for(int i = 0; i < 50-1; i++){ if(strcmp(use[i].id, id) == 0){  //判断是否存在该卡号flag=i;if (strcmp(use[i].password, keyword) == 0) {user_menu(use,arrangement,id); //存在则调用用户菜单              }else {printf(" 您输入的密码有误,请确认后重试!\n\n");user_login(use,arrangement);}}   }if(flag == -1) {printf(" 查无此卡,请先注册!\n\n");top_menu(use,arrangement);}}
//实现用户注册功能函数
void user_regist() {char id[20]; //接收用户输入的卡号char name[20]; //接收用户输入的姓名char password[20]; //接收用户输入的密码printf(" 输入卡号:");scanf("%s",id);printf(" 输入姓名:");scanf("%s",name); printf(" 输入密码:");scanf("%s",password);// 构建文件指针  FILE* fp = fopen(USER_FILE, "a+");  // 将用户输入的信息输出到文件  fputs(id, fp);  fputs(" ", fp);  fputs(name, fp);  fputs(" ", fp); fputs(password, fp);  fputs("\n", fp);  // 关闭文件  fclose(fp);printf(" 注册成功!\n");rerun();}
//用户功能菜单
void user_menu(user* use,arrange* arrangement,char* id){int ret = 0;//接收用户输入printf("========== 欢迎来到用户菜单 ==========\n");printf(" [----- Press 1 :进行排班---------]\n"); //printf(" [----- Press 2 :修改排班---------]\n"); //printf(" [----- Press 3 :查询排班-----]\n"); //printf(" [----- Press 4 :删除排班-----]\n");printf(" [----- Press 0 :退出系统-----]\n");printf(" 请输入您的选择:");scanf("%d", &ret);if(ret >= 0 && ret <5){switch (ret){//fflush(stdin);它用来清空缓冲区,避免输入粘连带来的麻烦case 1:fflush(stdin); add_arrage(arrangement,id); break;case 2:fflush(stdin); change_arrange(use,arrangement,id); break;case 3:fflush(stdin); check_arrange(use,arrangement,id); break;case 4:fflush(stdin); del_arrange(use,arrangement,id); break;case 0:printf("您已退出系统!\n"); fflush(stdin); break;}} else {printf(" 输入有误!!\n\n");fflush(stdin);//清空缓冲区user_menu(use,arrangement,id);}
}
//实现排班
void swap(int* a, int* b) {int m;m = *a;*a = *b;*b = m;
}
void perm(int list[], int k, int m) {FILE* fp = fopen(TEMP_FILE, "a+");int i;int j;if (k > m) {for (i = 0;i < 7;i++) {for (j = 0;j < 7;j++) {if (rest[i][j]==-1)return;        if (rest[i][j] != list[i])continue;if (rest[i][j]==list[i])break;}}n++;printf("%d ",n);//printf("赵     钱     孙     李     周     吴     陈\n");for (i = 0;i <= m;i++) {switch (list[i]) {case 1:printf("星期一");printf(" ");break;case 2:printf("星期二");printf(" ");break;case 3:printf("星期三");printf(" ");break;case 4:printf("星期四");printf(" ");break;case 5:printf("星期五");printf(" ");break;case 6:printf("星期六");printf(" ");break;case 7:printf("星期日");printf(" ");break;default:break;}printf("\n");}}else {for (i = k;i <= m;i++) {swap(&list[k],&list[i]);perm(list,k+1,m);swap(&list[k],&list[i]);}}}
void add_arrage(arrange* arrangement, char* id) {int list[]={1,2,3,4,5,6,7};int i,j;char num[10];char ss[7][20]={"赵","钱","孙","李","周","吴","陈"};printf(" 请输入下列人所选择休息的可能时间:\n");for (i = 0;i < 7;i++) {printf(" %s:",ss[i]);for (j = 0;j < 7;j++) {scanf("%d",&rest[i][j]);if(rest[i][j]==-1)break;}}printf("\n");freopen(TEMP_FILE, "w", stdout);perm(list,0,6);//printf("total:%d\n",n);freopen(CONSOLE, "w", stdout);temp_display(arrangement);if (n == 0) {int flag_xq[7] = { 0,0,0,0,0,0,0 };for (int i = 0;i < 7;i++) {for (int j = 0;j < 7;j++) {if (rest[j][i] == 1)flag_xq[0] += 1;if (rest[j][i] == 2)flag_xq[1] += 1;if (rest[j][i] == 3)flag_xq[2] += 1;if (rest[j][i] == 4)flag_xq[3] += 1;if (rest[j][i] == 5)flag_xq[4] += 1;if (rest[j][i] == 6)flag_xq[5] += 1;if (rest[j][i] == 7)flag_xq[6] += 1;}}for (int i = 0; i < 7; i++) {if (flag_xq[i] > 1 && flag_xq[i] <= 6) {if (i==6){printf(" 星期日无法排班!");}else printf(" 星期%d无法排班!",i+1);}}}else {printf(" 请输入需要增加的排班编号:");scanf("%s",num);for(int i =0;i<50-1;i++){if(strcmp(arrangement[i].num,num)==0){        freopen(RECORD_FILE, "w", stdout);printf("%s %s %s %s %s %s %s\n", arrangement[i].zhao, arrangement[i].qian, arrangement[i].sun, arrangement[i].li, arrangement[i].zhou, arrangement[i].wu, arrangement[i].chen);  freopen(CONSOLE, "w", stdout); printf(" 排班成功!\n");}}freopen(OPERATE_FILE, "a+", stdout);//获取时间 time_t t = time( 0 );char tmpBuf[BUFLEN];strftime(tmpBuf, BUFLEN, "%Y-%m-%d-%H:%M:%S", localtime(&t)); //格式化时间 printf("用户%s于%s执行排班操作\n",id,tmpBuf);freopen(CONSOLE, "w", stdout);}rerun();
}
//修改排班
void change_arrange(user* use,arrange* arrangement,char* id){record_display(arrangement);printf("\n 以上是本周排班信息(若无信息则没有排班。),请输入修改后的排版信息:\n");char zhao[10],qian[10], sun[10], li[10], zhou[10], wu[10], chen[10];printf("\n # 输入示例 # 请输入赵的工作日:星期一\n");printf(" 请输入赵的工作日:");scanf("%s",zhao);printf(" 请输入钱的工作日:");scanf("%s",qian); printf(" 请输入孙的工作日:");scanf("%s",sun);printf(" 请输入李的工作日:");scanf("%s",li);printf(" 请输入周的工作日:");scanf("%s",zhou);printf(" 请输入吴的工作日:");scanf("%s",wu);printf(" 请输入陈的工作日:");scanf("%s",chen);freopen(OPERATE_FILE, "a+", stdout);//获取时间 time_t t = time( 0 );char tmpBuf[BUFLEN];strftime(tmpBuf, BUFLEN, "%Y-%m-%d-%H:%M:%S", localtime(&t)); //格式化时间 printf("用户%s于%s执行更改操作\n",id,tmpBuf);freopen(CONSOLE, "w", stdout);// 文件指针  FILE* fp = fopen(RECORD_FILE, "w");  // 输出到文件  fputs(zhao, fp);  fputs(" ", fp);  fputs(qian, fp);  fputs(" ", fp); fputs(sun, fp);  fputs(" ", fp);  fputs(li, fp);  fputs(" ", fp); fputs(zhou, fp);  fputs(" ", fp); fputs(wu, fp);  fputs(" ", fp); fputs(chen, fp);  fputs("\n", fp); // 关闭文件  fclose(fp);printf(" 修改成功!");rerun();
}
//查询排班
void check_arrange(user* use,arrange* arrangement,char* id){record_display(arrangement);printf("\n 以上是为您查到的本周排班信息!(若无信息则没有排班。)\n");rerun();
}
//删除排班
void del_arrange(user* use,arrange* arrangement,char* id){freopen(OPERATE_FILE, "a+", stdout);//获取时间数据time_t t = time( 0 );char tmpBuf[BUFLEN];strftime(tmpBuf, BUFLEN, "%Y-%m-%d-%H:%M:%S", localtime(&t)); //格式化时间 printf("用户%s于%s执行删除操作\n",id,tmpBuf);freopen(CONSOLE, "w", stdout);printf(" 删除成功!");rerun();
}
//重复运行
void rerun(){//判断是否重新运行本系统char re_star[2];printf("\n 目前程序已运行完毕,是否重新启动本程序?(y or else): ");scanf("%s",re_star);if (strcmp(re_star,"y")==0){main();} else {system("pause");exit(0);}
}
//主函数
int main(void){user use[50];arrange arrangement[50];//构建用户信息结构体,访用户信息init(use,arrangement);//初始化用户信息fflush(stdin); //清空缓冲区top_menu(use,arrangement);//调用函数主菜单system("pause"); //防止程序结束后闪退return 0;
}

三、其他

以上以及博客中含有在校整理字样的博客内容,均是本人本科在校学习期间所写的代码,源文件以及数据文件等在个人主页资源区可以获取。本人水平很低,大佬轻喷。整理出来是为了帮助初学者学习的过程中,在有需要的情况下能够有所参考。再次声明:仅供学习交流使用。大家有什么问题,欢迎留言~

程序设计-在校整理-03 排班系统相关推荐

  1. JAVA医护人员排班系统计算机毕业设计Mybatis+系统+数据库+调试部署

    JAVA医护人员排班系统计算机毕业设计Mybatis+系统+数据库+调试部署 JAVA医护人员排班系统计算机毕业设计Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

  2. 【原创】python语言实现半自动排班系统

    python语言实现半自动排班系统 这里写目录标题 python语言实现半自动排班系统 0. 为什么要做这个软件? 1. 本软件要实现哪些功能? 2. 具体功能实现 2.1 识别文本中的格式不一的时间 ...

  3. 基于JAVA医院医护人员排班系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA医院医护人员排班系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA医院医护人员排班系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: ...

  4. 基于规则引擎实现规则可配置的机场地勤人员排班系统

    规则引擎是一种软件工具,能够在规则库中存储.管理和自动执行规则以快速决策.机场地勤人员排班系统需要根据多种因素进行自动排班. 基于规则引擎实现规则可配置的机场地勤人员排班系统的功能设计如下: 规则库管 ...

  5. c语言排班系统设计报告,C语言课程设计关于排班系统的一些问题

    已结贴√ 问题点数:10 回复次数:5 C语言课程设计关于排班系统的一些问题 小女大一,课程设计是百度排班系统(虽然不知老师干嘛现在布置类似小系统的作业),在论坛中找到个代码,其实只要交了代码就好,但 ...

  6. 智能排班系统、班次、班表、考勤、年假、调休、审批、请假、培训、值班、换班、加班、工时、自动排班、智能预测、人力需求预测、授权、团队、锁定量排、规则权重设置、菜单、角色、数据监控、工作台、axure

    智能排班系统.班次.班表.考勤.年假.调休.审批.请假.培训.值班.换班.加班.工时.自动排班.智能预测.人力需求预测.授权.团队.锁定量排.规则权重设置.菜单.角色.数据监控.工作台.axure原型 ...

  7. 微信小程序-医护人员排班系统

    本系统是基于B/S架构的网站系统,设计的功能结构图如下图所示: 三.管理员模块 3.1医护类型管理 医护人员排班系统的系统管理员可以对医护类型添加修改删除以及查询操作.具体界面的展示如图 3.2排班类 ...

  8. PHP自动排班系统 源码+说明

    PHP自动排班系统 下载源码时请将"PHP排班系统代码"整个文件夹下载 资源下载链接: https://github.com/Mrjx-best/JX_OPEN. 使用须知 在下图 ...

  9. java企业排班系统企业考勤人脸识别考勤系统源码企业批量排班网站

    java实现的企业批量排班系统,出差请假打卡统计,排班,设置部长,发布公告等功能.人脸识别考勤打卡. 新增角色:部长(管理员指定部长) ,由部长对自己部门的员工进行分组,然后按分组进行排班,比如:张三 ...

最新文章

  1. 多路复用 I/O 模型详解, 为什么他能支持更高的并发
  2. Linux修改文件/目录权限
  3. 笔记-项目范围管理-确认范围与控制范围的区别
  4. mysql decimal型转化为float_5分钟搞懂MySQL数据类型之数值型DECIMAL类型
  5. YbtOJ#763-攻城略池【线段树合并】
  6. Android 线程池对象-ThreadPoolExecutor浅析
  7. MySQL--pymysql模块
  8. 盒模型bug的解决方法
  9. 创建一个TCP服务器端通信程序的步骤
  10. linux下dhcp配置(二)
  11. MySql 5.6 Packet for query is too large
  12. 国内多家视频下载网站关闭:或为暂避风头
  13. java gui容器_中国大学MOOC: (GUI容器)容器类java.awt.container的父类是_______。
  14. 虚拟机主机服务器出现SSH已启用,ESXi去掉 SSH已经启用的警告信息
  15. php转义和反转,PHP转义,反转义
  16. 有参构造方法的作用和无参构造方法的作用
  17. Linux SWAP 交换分区配置说明(转)
  18. java基于ssm的道路求援车队管理系统
  19. 模拟登录淘宝并拍下购物车商品
  20. 开启编程之旅——什么是编程

热门文章

  1. 创建bbs mysql语句怎么写_MySQL常用语句 | 小灰灰博客
  2. 夺命雷公狗—玩转SEO---2---什么是关键词词库
  3. 使用图片服务器https://sm.ms
  4. 【MATLAB】几种求矩阵伪逆的方法
  5. Batch与Patch 代表什么
  6. 基于TIA西门子博途的触摸屏HMI脚本入门学习(一)
  7. WRF学习笔记之四:撰写WPS intermediate file添加海冰场/NCL学习/WRF进阶:如何向WRF添加额外气象场?
  8. 压缩文件 密码破解 FCrackZip
  9. [考研]考研倒计时第2天
  10. 玩游戏的时候怎么没觉得补刀这么难…