学号
武汉华夏理工学院
课程设计
课程名称C语言课程设计
题目保安值班排班系统设计
专业软件工程
班级
姓名
成绩
指导教师
2017年2月27日至2017年3月3日
课程设计任务书
学生姓名:专业班级:
指导教师:工作单位:信息工程学院
设计题目:保安值班排班系统设计
要求完成的主要任务:
1.任务描述
学校实验楼有7名保安人员:钱、赵、孙、李、周、吴、陈。由于工作需要进行轮休制度,一星期中每人休息一天。预先让每一个人选择自己认为合适的休息日。请编制程序,打印轮休的所有可能方案。
当然使每个人都满意,例如每人选择的休息日如下:
钱:星期一、星期六、赵:星期二、星期四
孙:星期三、星期日、李:星期五
周:星期一、星期四、星期六、吴:星期二、星期五
陈:星期三、星期六、星期日
2.本课程涉及的知识点
变量的定义、输入和输出函数、循环语句、数组、结构体等。
3.要求完成的任务
⑴完成整个规定任务的设计及调试,且一定要画出程序流程图,最后得出正确结果,并经教师检查及答辩;
⑵写出规范的课程设计说明书;
⑶课程设计结束后交设计说明书等文档和设计内容:
⑷从2月27日起,学生每天至少要到设计教室半天以上;
设计报告撰写格式要求:
设计报告的主要内容是详细写出在设计过程中所用到的主要技术或方法;
课程设计报告按国际通用格式书写,具体格式要求请见资料:“课程设计说明书的书写内容与格式”
时间安排:
第一天:学生先在实验室集中,由指导教师介绍课程设计的目的、布置任务后选题;
第二天-第四天:学生在实验室完成设计,经教师检查并回答提问,确认设计完成;
第五天:教师在计算机上先检查设计报告、学生修改后打印提交
指导教师签字:2017年2月24日系主任签字:2017年2月24日
目录
设计内容 (1)
1 设计题目 (1)
2 开发环境 (1)
3 开发工具 (1)
4 完成时间 (1)
5 设计思想 (1)
6 设计过程及设计步骤 (1)
7 测试运行 (7)
8 评价与修订 (10)
9设计体会 (10)
10 参考文献 (10)
附录: (12)
1源程序 (12)
2流程图 (16)
2.1打印所有值班方案的流程图 (16)
2.2主函数流程图 (17)
2.3打印保安愿意休息的日期的流程图 (17)
设计内容
1 设计题目
保安值班排班系统设计
2 开发环境
硬件环境:微机系列,内存在1G以上,软件环境:Microsoft Windows XP
3 开发工具
Visual C++6.0
4 完成时间
2017-2 –27----2017.3.3
5 设计思想
设计一个保安排班系统,分为5个模块,分别0-退出系统!1-打印所有值班方案! 2-打印所有保安名字!3-显示保安人数! 4-打印某名保安合适的休息时间。设计这个程序希望可以把保安轮休的所有可能方案打印出来,同时添加了相应的查询模块.第1个模块是实现退出功能的一个模块;第2个模块是打印所有可能轮休方案的一个模块;第3个模块是浏览所有保安姓名的一个模块;第4个模块是显示保安人数的一个模块;第5个模块选项可以对想要查询的保安进行查询(查询不同保安的合适休息时间),该查询选项可以通过输入保安姓名将对应保安的信息打印到屏幕上.使用c++6.0制作。
6 设计过程及设计步骤
1.先制作整个系统的功能模块图。保安值班排班系统的功能模块图如图1-1所示。
图1-1保安值班排班系统的功能模块图
2.然后制作菜单,为使界面更好看,多使用一些符号,例如*,-,完成后保存在函数menu
中,菜单程序代码如图1-2所示。
图1-2菜单的程序代码图
3.再制作打印菜单,使用一个do while循环,循环条件设置为a<0||a>4,确保在输入
0-4的时候程序开始运行,否则返回a。打印菜单程序代码如图1-3所示。
图1-3打印菜单的程序代码图
4.主函数制作,输入c后使用switch语句进行判断,case0为退出程序,case1为打印
所有值班情况,case2打印保安名字,case3打印保安数量,case4打印保安愿意休息的日期。主函数流程图如图1-4-1所示,主函数程序代码如图1-4-2所示。
图1-4-1主函数流程图
图1-4-2主函数内容的程序代码图
5.打印保安愿意休息的日期,输入保安名字后进行判断,使用if else语句,若输入的
字符是7个保安中的任意一个则给b赋一个值,然后使用switch语句进行输出。打印保安愿意休息日期的流程图如图1-5-1所示,打印保安愿意休息日期的程序代码如图1-5-2所示。
图1-5-1打印保安愿意休息的日期的流程图
图1-5-2打印保安愿意休息的日期的程序代码图
6.case1的内容制作,先记录每天可以休息的人,再打印方案。打印所有值班方案的流程
图如图1-6-1所示,用于记录每天可以休息的人的程序代码如图1-6-2所示,打印方案的程序代码如图1-6-3所示。
图1-6-1打印所有值班方案的流程图
图1-6-2记录每天可以休息的人的程序代码图
图1-6-3打印方案的程序代码图
7 测试运行
1.欢迎界面运行图如图1-1所示。
图1-1欢迎界面运行图
2.选项1打印所有值班方案执行图如图1-2所示
图1-2选项1打印所有值班方案执行图
3.选项2打印所有保安名字执行图如图1-3所示。
图1-3选项2打印所有保安名字执行图4.选项3显示保安人数执行图如图1-4所示
图1-4选项3显示保安人数执行图
5.选项4打印某名保安合适的休息时间(以周为例)执行图如图1-5所示
图1-5选项4打印某名保安合适的休息时间执行图(以周为例)6.选项4打印某名保安合适的休息时间(输入不符要求)如图1-6所示
图1-6选项4打印某名保安合适的休息时间图(输入不符要求)
8 评价与修订
程序整体较好,只不过用时较长,打印方案处加上对应的星期会显得更加明显,菜单的排版较为美观,尝试下使用不同颜色的字体会是使用者更加喜欢,另外给程序加上一个有色背景的话亦可使人赏心悦目。
9设计体会
程序设计是一次让我们综合自己所学习的知识,把他应用到实际的一次机会,平常我们学的编程语言总显得那么的不灵活,很多时候我们一本书学下来了,仍编不出一个简单的程序,通过对一个小项目功能的实现,我们不仅重温了平时所学的知识点,还增强了自己的动手能力。对于一个程序,在我看来,最重要的莫过于思路,同一个程序可以由多个思路来实现,然而我们所要做的就是通过多次的编码调试找出最简,最优思路。好的思路能无疑能使一个程序员实现事半功倍的效果。接着就要根据自己的思路为该程序设计算法,只有轮廓形成后才能开始编码,编写的过程中还应搜索记忆中的语言基础,找到最简便的
表达方式,增加程序的可读性,代码编写完成后,经过多次编译后无错误了也不代表程序就完成了,运行程序时还应通过多组不同情况,看能否实现。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。通过这次课程设计之后,让我养成了编程的好习惯,就是先列清自己的思路,写清自己的算法,必要时还要画流程图,编写程序时也不是依次由上而下写,而是先把主要函数列出来再一一编写。
10 参考文献
1.《C语言编程常见问题解答》,[美]Paul S. R. Chishohm等著,张芳妮吕波译,清华大学出版社,2013年12月。
2.《C语言程序设计题解与上机指导》,谭浩强编,清华大学出版社,2011年11月。与教材配套的上机指导。
3.《C程序设计(第二版)》,谭浩强编,清华大学出版社,2014年12月。
设计过程中现场提问(或答辩)记载:
Q:制作过程中使用了哪些学过的知识?
A:数组,循环结构等。
Q:打印所有方案的原理是什么?
A:使用switch语句遍历查找。
学生Q:如何制作一个菜单的选项?
教师A:使用switch语句制作。
Q:制作过程中如何克服知识点不足的问题?
A:通过查找资料或百度。
指导教师评语:
成绩评定等级:
指导教师(签名):
2017 年3月 6 日
附录:
1源程序
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int r[8][3]; //*不同日期可以轮休的人
int B[8]; //*记录当前日期对应人员安排
int s[8]; //*记录当前人的休息安排情况
void Menu(); //*函数声明
int choice();
void intt1();
int canplace(int n);
void print2();
void search11(int m);
void choice1();
void main() //*主函数
{
int c;
do{system("cls");
c=choice();
switch(c)
{ case 0:printf("\n\n\n\t\t\tWelcom to this program!");break;
case 1:{
intt1();
search11(9);
intt1();
search11(1);
flushall();
getchar();
};break;
case 2:{
printf("\n赵钱孙李周吴陈");
flushall();
getchar();
};break;
case 3:{
printf("共有7 名保安!");
flushall();
getchar();
};break;
case 4:{ choice1();
flushall();
getchar();
};break;
}
}while(c);
}
void Menu() //*菜单
{ printf("\n*********************Welcom to this program!***********************");
printf("\n\n*----------------请输入一个数字从0 到4 中选择-------------------*");
printf("\n\n*-----------------------------------------------------------------*");
printf("\n\n* 0 - 退出系统! *");
printf("\n\n* 1 - 打印所有值班方案! *");
printf("\n\n* 2 - 打印所有保安名字! *");
printf("\n\n* 3 - 显示保安人数! *");
printf("\n\n* 4 - 打印某名保安合适的休息时间! *");
printf("\n\n*-----------------------------------------------------------------*");
printf("\n\n\n\n\n请选择数字:");
}
int choice() //*打印菜单
{
int a;
do { Menu();
scanf("%d",&a);
}
while(a<0||a>4);
return a;
}
void choice1() //*打印保安愿意休息日期
{ int b;
char s1[10];
printf("请输入保安名字:");
scanf("%s",s1);
if(strcmp(s1,"赵")==0) b=1;
else if(strcmp(s1,"钱")==0) b=2;
else if(strcmp(s1,"孙")==0) b=3;
else if(strcmp(s1,"李")==0) b=4;
else if(strcmp(s1,"周")==0) b=5;
else if(strcmp(s1,"吴")==0) b=6;
else if(strcmp(s1,"陈")==0) b=7;
else b=0;
switch(b)
{ case 0:printf("对不起,姓名输入有误!");break;
case 1:printf("赵: 星期二, 星期四");break;
case 2:printf("钱: 星期三, 星期六");break;
case 3:printf("孙: 星期三, 星期天");break;
case 4:printf("李: 星期五"); break;
case 5:printf("周: 星期一, 星期四, 星期六");break;
case 6:printf("吴: 星期二, 星期五"); break;
case 7:printf("陈: 星期三, 星期六, 星期日");break;
}
}
void intt1()
{
{int i;
for( i=1;i<8;i++)
r[i][0]=0;
r[i][1]=0;
r[i][2]=0;
}
r[1][0]=2; r[1][1]=5;
r[2][0]=1; r[2][1]=6;
r[3][0]=3; r[3][1]=7;
r[4][0]=1; r[4][1]=5;
r[5][0]=4; r[5][1]=6;
r[6][0]=2; r[6][1]=5; r[6][2]=7; //*记录每天可以休息的人r[7][0]=3; r[7][1]=7;
{int i;
for(i=1;i<8;i++)
{
B[i]=0;
s[i]=0;
}
}
}
void print2() //*打印所有可能的值班方案{
int i;
for( i=1;i<8;i++)
{
switch(B[i])
{
case 1 : printf("赵");break;
case 2 : printf("钱");break;
case 3 : printf("孙");break;
case 4 : printf("李");break;
case 5 : printf("周");break;
case 6 : printf("吴");break;
case 7 : printf("陈");break;
}
}
printf("\n");
}
int canplace(int n) //*检查当前选择的人是否已经安排过休假{
if(s[n]==1)
return 0; //*该人已经安排休息日期return 1;
}
void search11(int m) //*扫描R数组中每天可以休假的人
{
if(m>=8) //*搜索完毕时输出
print2();
if(r[m][0]!=0&&canplace(r[m][0]))
{
B[m]=r[m][0];
s[r[m][0]]=1;
search11(m+1);
s[r[m][0]]=0;
}
if(r[m][1]!=0&&canplace(r[m][1]))
{
B[m]=r[m][1];
s[r[m][1]]=1;
search11(m+1);
s[r[m][1]]=0;
}
if(r[m][2]!=0&&canplace(r[m][2]))
{
B[m]=r[m][2];
s[r[m][2]]=1;
search11(m+1);
s[r[m][2]]=0;
}
}
2流程图
2.1打印所有值班方案的流程图
开始
Innt()初始化
找非空
Search(m)穷举
M>=8
canplace
M-1
M+1
Print()
结束
是 是
是
否
否
否
2.2主函数流程图
2.3打印保安愿意休息的日期的流程图