当前位置:文档之家› C语言课程设计报告

C语言课程设计报告

XX大学课程设计报告课程设计名称:C语言课程设计课程设计题目:排班系统院(系):XX学院专业:XX班级:XX学号:XXXXXXXXXXXXX姓名:XX指导教师:XXX完成日期:XX年X月X日沈阳航空航天大学课程设计报告目录第1章需求分析与概要设计 (1)1.1需求分析 (1)1.2概要设计 (1)第2章详细设计 (2)2.1排班系统基本结构 (2)2.1.1 排班系统细节剖析 (2)2.2程序详细介绍(算法实现) (3)第3章调试分析 (5)3.1我的调试: (5)3.2运行结果 (5)第4章用户手册及结束语 (8)4.1用户手册 (8)4.2结束语 (8)参考文献 (9)附录(程序清单) (10)沈阳航空航天大学课程设计报告第1章需求分析与概要设计第1章需求分析与概要设计1.1 需求分析1.题目要求:为多名保安设计一个排班系统,每人可以自行预先选出一天为休息日,系统打印可能的轮班方案并存储结果。

尽可能做到令所有人满意,保排班方案的公平性。

2.题目分析:本题的重点和难点在于保安的人数是不确定的,且他们可能选择的休息日也无法确定,所以方案的结果也就不仅仅有一种。

由此可以看出只有解决好这两个问题,才能够符合该题目的要求,完成保安的排班工作。

1.2 概要设计1.总体思路:对于这道题目,我的思路是采用二维数组的方式来解决。

大概过程是先假设所有人都上班,即没有休息日。

然后再让每个人进行选择自己希望的休息日。

先每个人选择出一天,然后系统进行排班,输出其所输入数据的对应方案。

然后在第一次所输数据的基础上,若还有其他选择,则进行二次输入,以此更改初始数据,重新设计可能的排班方案。

2.细节实现:因为题目的要求是打印可能的方案,那么如何来实现打印呢?我采用了通过对二位数组中的每一个值用阿拉伯数字0和1来标记,以1来表示工作,0来表示休息。

3.功能作用:本系统系保安的排班系统,可以完成基本的排班功能,在此基础上,还为用户设计了二次输入的选项,以此来解决当所输数据不满足要求,无法完成排班的问题,同时也可以为用户提供更多的可行方案,而不是仅仅局限于一种。

第2章详细设计2.1 排班系统基本结构图2.1 排班系统基本结构此排班系统主要分为:显示欢迎界面、排班界面及选择界面。

该系统各部分间有序衔接,各尽其责,如图2.1所示,充分展现了该系统的协调性与整体性。

2.1.1 排班系统细节剖析此排班系统的重点在于每次对二维数组的赋值操作,最开始时是将所有的初值都赋为1,然后以0来赋给选择对应日期、对应人的对应数值。

这样一来,便可以将每个人的每天上班与否进行标记(1是工作,0是休息),这道题目的另一个难点在于对每个人有比较公平的方案,所以该问题在设计时,我就将含有小于规定数量工作人数的方案标记为不可行方案,同时在屏幕输出该方案排出的结果,以供操作人员查阅该方案到底哪里不可行,利于下次输入数据地改动。

2.2 程序详细介绍(算法实现)我的这套程序大致可以分为三个部分:1.数据输入部分即第一次输入数据(每个人的选择),该部分是通过二位数组来实现的,以第几个人来控制数组的第一个下标,以周几来控制该数组的第二个下标,这样就可以将所有的人所有的天数看做一个二维表来实现选择信息的数字化,如表2.1、2.2所示。

表2.1 每个人的工作选择表2.2 对应的数组2.数据转化为方案:该部分是以for循环为工具手段,对每一个数据进行扫描判断,然后将工作的人打印出来,即保安工作排班表。

这样一个方案就完成了。

3.方案的更改:此部分则是以更改个别数据为主,其他数据依然参照之前的数据,其实现的方法就是用第二次输入的数据,对第一次的数据进行覆盖,在这个覆盖的过程中,我们不仅要将二次选择的人及选择的天对应的数据更改为0,同时还要对原数组中此人的选择对应的数值恢复为零,我最开始设计时,就忽略了这一点,造成输出的方案有的人一周休息一天,有的人休息了两天,失去了设计方案的公平性。

以此造成很多困扰,后来经过详细分析、查找,我采用了每次只覆盖数组中的数值,而将二次选择的人的首选数字进行保留,这样就实现了公平排班的理念。

第3章调试分析3.1 我的调试:1.在刚刚完成编译时,程序中有很多语法错误,如将“;”打成了中文输入法,甚至是干脆忘记打的情况,还有比如将for循环下面的括号只打了一半等,这些语法错误给我造成了许多困扰,后经逐条更改,最后终于得以运行。

2.除了一些语法错误,在运行的过程中还出现了许多其他的错误。

如上文提到的由于没有将初次选择更改回为工作,造成方案的不公平等,这个问题我在初期一直没有弄懂,后经单步调试,对数组中的逐个数字进行跟踪,终于发现了这个问题,并想出方案解决3.2 运行结果该软件运行时会出现以下几种情况:1.正常进行排班,显示出对应的排班方案,如图3.1所示:图3.1 正常排班2.更改其中一个人的选择,输出第二方案,如图3.2:图3.2 其他选择3.无其他选择,保存方案至文件“保安排班方案”,如下图:图3.3 存储的方案4.当用户输入的选择对应的方案不可行时,软件会给出提示,如图3.4所示:图3.4 方案不可行5.这时我们对选择进行二次调整,如图3.5所示:图3.5 调整方案沈阳航空航天大学课程设计报告第4章用户手册及结束语第4章用户手册及结束语4.1 用户手册本软件用户请注意以下几点:1.当打开本软件时,会出现欢迎使用界面,同时出现输入提示,请您按照提示依次进行操作;2.值得注意的是,本软件采用的是输入数字进行选择,每次输入数字后,请输入回车键;3.当电脑屏幕提示更改选择时,在输入两个数字时,请以空格隔开。

4.2 结束语本系统是我经过两周时间冥思苦想得来的结果。

在设计该系统时我也遇到了许多困难。

如最开始时我想采用的是想将所有数组同时赋值,然后同时进行扫描,可是后来发现这样的方法是行不通的(或许以后学的多了能够解决,但目前来说知识量还很有限),因为在进行两个for循环时,会出现交叉限制的情况,无法完成扫描,所以我最终想出了一次只对一个二维表赋值、扫描。

对于其他方案则是以二次输入数据的方式进行更改初值,以达到排班的目的。

当然,可能该系统在功能上还存在一些弊端,但至少这也是我两周来的辛苦成果。

我以后一定会继续努力,对该系统进行进一步的完善。

参考文献[1] 谭浩强著. C程序设计(第三版).清华大学出版社,2009[2] Harvey M.Deitel,Paul J.Deitel编著聂雪军、贺军译. C程序设计经典教程.清华大学出版社,2006[3] 王敬华、林萍、张清国编著. C语言程序设计教程(第二版). 清华大学出版社,2013[4] 谭浩强著. C程序设计题解与上机指导(第三版). 清华大学出版社,2008[5] 温海、张友、童伟等编著. C语言精彩编程百例. 中国水利水电出版社,2004附录(程序清单)程序源代码:#define N 10#include<stdio.h>struct guard{char name[20];int choice;}gu[N];void main(){int i,j,k,m,total,x,y;int a[N][7],b[7]={0,0,0,0,0,0,0};FILE *fp;fp=fopen("d:\\保安排班方案.txt","w");printf("\n\n**********欢迎使用微微排班软件,本软件代表制作人祝您工作顺利,阖家欢乐**********\n\n**********下面就让我们一起开启排班的旅程吧!**********\n\n");printf("请输入保安总人数:\n");scanf("%d",&total);for(i=0;i<total;i++) //将所有值初始化为一for(j=0;j<7;j++)a[i][j]=1;for(i=0;i<total;i++) //以每个人为线索进行循环{printf("请输入保安的姓名:\n");scanf("%s",gu[i].name);printf("他的选择是:1.周一;2周二;3.周三;4.周四;5.周五;6.周六;7.周日\n"); scanf("%d",&gu[i].choice);if(gu[i].choice==1){a[i][0]=0;b[0]++;}if(gu[i].choice==2){a[i][1]=0;b[1]++;}if(gu[i].choice==3){a[i][2]=0;b[2]++;}if(gu[i].choice==4){a[i][3]=0;b[3]++;}if(gu[i].choice==5){a[i][4]=0;b[4]++;}if(gu[i].choice==6){a[i][5]=0;b[5]++;}if(gu[i].choice==7){a[i][6]=0;b[6]++; //赋值0 }}for(k=0;;k++){for(j=0;j<7;j++)if(b[j]>=total-1){ //判断方案是否可行printf("方案不可行!如下:\n");fprintf(fp,"\n您所输入的数据派出的方案不可行!如下:\n");}fprintf(fp,"\n周一:");printf("\n周一:");for(i=0;i<total;i++)if(a[i][0]==1){printf("%s\t",gu[i].name);fprintf(fp,"%s\t",gu[i].name);}fprintf(fp,"\n周二:");printf("\n周二:");for(i=0;i<total;i++)if(a[i][1]==1){printf("%s\t",gu[i].name);fprintf(fp,"%s\t",gu[i].name);}fprintf(fp,"\n周三:");printf("\n周三:");for(i=0;i<total;i++)if(a[i][2]==1){printf("%s\t",gu[i].name);fprintf(fp,"%s\t",gu[i].name);}fprintf(fp,"\n周四:");printf("\n周四:");for(i=0;i<total;i++)if(a[i][3]==1){printf("%s\t",gu[i].name);fprintf(fp,"%s\t",gu[i].name);}fprintf(fp,"\n周五:");printf("\n周五:");for(i=0;i<total;i++)if(a[i][4]==1){printf("%s\t",gu[i].name);fprintf(fp,"%s\t",gu[i].name);}fprintf(fp,"\n周六:");printf("\n周六:");for(i=0;i<total;i++)if(a[i][5]==1){printf("%s\t",gu[i].name);fprintf(fp,"%s\t",gu[i].name);}fprintf(fp,"\n周日:");printf("\n周日:");for(i=0;i<total;i++)if(a[i][6]==1){printf("%s\t",gu[i].name);fprintf(fp,"%s\t",gu[i].name);} //完成一次printf("\n请问还有其他选择吗?\n1.有;2,没有\n");fprintf(fp,"\n\n\n其他选择:\n");scanf("%d",&m);if(m==1){printf("\n请问是第几个人?他的选择是?");scanf("%d %d",&x,&y);x--;y--;a[x][gu[x].choice-1]=1;a[x][y]=0;b[gu[x].choice-1]--;b[y]++;}else{fprintf(fp,"无");break;}}fclose(fp);}沈阳航空航天大学课程设计报告。

相关主题