1、 确定所需模块对于稍复杂的程序设计,要充分利用模块化程序设计方法,自顶向下,逐步细化,在整体思路确定的情况下,考虑所需模块数,各模块完成功能以及模块之间的数据联系和调用关系。 各子模块功能描述给出主要模块的算法描述,用流程图或伪代码表示。 模块之间的调用关系给出算法各模块之间的关系图示(3)源程序清单(草稿)为了提高工作效率,充分利用上机调试程序的时间,要求学生在上机之前给出源程序清单。(4)用测试数据去验证算法及程序的正确性正序、逆序、随机数(5)算法分析经过上机调试,源程序运行正确,并且实现算法要求的功能,解决课程设计题目中给出的问题后,分析算法的时间复杂度和空间复杂度。(6)提供的主程序
2、可以象一个应用系统一样有主窗口,通过主菜单和分级菜单调用课程设计中要求完成的各个功能模块,调用后可以返回到主菜单,继续选择其他功能进行其他功能的选择。(7)按照课程设计说明书的格式规范撰写课程设计说明书,其中正文包括: 需求分析:对系统要实现的功能进行简明扼要的描述。 概要设计:根据功能描述,建立系统的体系结构,即将整个系统分解成若干子功能模块,并用框图表示各功能模块之间的衔接关系,并简要说明各模块的功能。 详细设计:详细说明各功能模块的实现过程,算法、技巧等。重点功能部分要加上清晰的程序注释。 效果及存在问题:说明系统的运行效果(附上运行界面图片)、存在哪些不足以及预期的解决办法。 心得体会
3、:谈谈自己在课程设计过程中的心得体会。(8)课程设计说明书用A4纸统一打印,装订按学校的统一要求完成。(9)课程设计的程序以软盘形式上交,文件夹名称为学生姓名及学号的组合,上交成果中要有你的磁盘文件说明(见下图)。未经指导教师许可或无故不到者,缺勤率达50%的学生不能参加答辩。 答辩时,设计者在5分钟内阐述自己的设计过程和最终结果,突出设计中遇到的主要问题和解决方法,然后回答教师提问。每位学生答辩总时间一般不超过15分钟。4主要参考文献1 徐士良. 计算机软件技术基础M . 北京:清华大学出版社,2004.2 廖雷C程序设计实践教程M北京: 高等教育出版社,2003.3 4 5课程设计进度安排
4、起 止 日 期工 作 内 容2010年 12月25日26日2010年12月27 日2010年12月28 日2010年12月29 日2010年12月30 日2010年12月31 日 熟悉任务,设计算法,编写源程序上机调试考核验收6成绩考核办法课程设计成绩的评定:根据设计的完成情况、程序的编制质量、独立设计能力以及答辩情况综合衡量,由答辩小组讨论决定。原则上按以下公式计算:课程设计成绩工作表现30%设计成果40%考核测评30% 工作表现:独立工作能力及设计过程的表现。占总成绩的30%。设计成果:设计说明书(计算书、论文)、图纸、程序、作品等的质量。占总成绩的40%。考核测评:课程设计结束前,指导教
5、师应采用考试或答辩等形式对所指导的学生进行测评。测评成绩占总成绩的30%。有创新的同学根据具体情况适当加分。教研室审查意见:教研室主任签字:年 月 日院(系、部、中心)意见:主管领导签字:2.设计概要说明2.1功能设计要求此时,检测各队列的长度,将客户放入最短的队列,同时检查是否有某条队列的长度特别短,如果有的话,将最长的队列中的客户转到最短的队列中,而这个转移由随机数来模拟,设定VIP有专设VIP窗口,可以分为按时间模拟与按人次模拟两个方面,客户办理业务分为存款,取款,办理新卡,挂失业务,模拟结果可以查询记录并保存。2.2功能概述本程序采用用机构化模块化的设计方法,共分为两大设计模块,按人次
6、模拟和按时间模拟,和退出模块。(1) 按人次模拟按人次模拟即是输入需要模拟的人数,但是模拟的时间不确定,用户输入人次后即可运行,显示结果。(2) 按时间模拟按时间模拟即是输入的为时间,模拟的人数不固定,用户进入银行的时间固定,输入时间和初始银行款项后即可模拟。(3) 退出退出程序,有再次确认功能。2.3详细设计本程序一共有四个窗口,其中三个位普通顾客,另外一个为VIP专用窗口。共有四个长链队,用于存储从开始进入的顾客交易信息,可以比较方便的获得各个窗口的交易历史记录,还有四个链队是取长链中的一部分表示目前仍在银行的情况。流程图如上页所示按人次模拟即是根据输入的人数来模拟共有多少顾客前来办理业务
7、,通过随机函数来获得顾客到来的时间,本程序是通过在本顾客来之后通过随机函数产生的0-3min之内有顾客前来,并且判断顾客来的是普通顾客还是VIP,再通过输出函数将排队情况显示出来,延时1s后在判断是否有新的顾客来, 模拟完成后统计银行目前剩余金额,以及给多少人办理业务,以及共有多少VIP办理业务,可以根据需要查看各个窗口办理的历史记录,并且保存模拟结果。按时间模拟为输入需要模拟的时间和初始存款,通过随函数产生一个介于输入时间和两倍输入时间的数作为在这段时间进入银行的人次,并将其存入顺序表中,通过将现在时刻与顾客进入时刻比较就可以判断出顾客是否进入,判断顾客来的是普通顾客还是VIP,再通过输出函
8、数将排队情况显示出来,延时1s后在判断是否有新的顾客来, 模拟完成后统计银行目前剩余金额,以及给多少人办理业务,以及共有多少VIP办理业务,可以根据需要查看各个窗口办理的历史记录,并且保存模拟结果。2.4数据结构体设计typedef struct CQueue int cometime; 进入银行的时间 int money; 存/取款金额,+为存,-为取 int leavetime; 离开银行时间 int working; 已交易时间 int worktime; 交易时间(用随机函数) struct CQueue *next; 指向下一个结构体指针 CQ;其中当money为0时,若交易时间为5
9、则判断交易类型为挂失业务,若交易时间为6则判断交易类型为办理新卡,通过working判断顾客是否已经办理好业务需要离开,从而可以计算出等待的时间按2.5各函数功能设计int menu_select();菜单函数,用于显示菜单并且由用户输入需要执行命令的序号返回选择序号void starttime();按时间模拟函数,为时间模拟模块的主函数void startnum();按人次模拟函数,为按人次模拟的主函数void quit();退出函数,退出时,改变字体颜色,并且让用户确认,防止误操作。void gotoxy(int i,int j);光标定位函数,i表示列,j表示行void quicksor
10、t(int *p,int left,int right);快速排序函数,用于将产生的随机时间排序void add(int i,CQ *p,int j);增加队列函数,p表示增加顾客的结点,i表示插入人数最少的窗口,j为随机产生数,若为0则表示p为VIP,进入专用VIP窗口。int getminnum();判断1,2,3号窗口人数最少窗口,返回对应1,2,3int getmaxnum();判断1,2,3号窗口人数最多窗口,返回对应1,2,3void show();显示窗口,用于显示提示状态以及窗口位置void showqueue();显示队列,即显示每个窗口前排的人void leave();判断
11、是否有人结束交易离开,若有人离开则显示提示void printtotal();统计函数用于判断交易金额,交易人次等void printcq(int i);显示某个窗口交易历史void getavewait();获得平均等待时间void movequeue();判断移动队伍函数void mov(int max,int min,int flag);移动长队到短队3.程序分析3.1源代码分析/*加载所需头文件*/#include stdlib.hwindows.h/*变量*/ /进入银行的时间 /存/取款金额,+为存,-为取 /离开银行时间 /已交易时间 /交易时间(用随机函数)CQ *head4,
12、*cq4,*last4,*hlast4; /对应队列的头结点和尾结点指针int currenttime,totaltime,nexttime; /目前时间,设定按时间模拟总时间,下一个顾客来的时间int totalnum,currentnum; /总人次,目前为第几位顾客int num4; /对应四个窗口的目前人数int totalVIP; /一共有多少位VIPint *cometime; /存储顾客来的时间float avewait; /平均等待时间long int totalmoney; /目前银行总金额char *menu=*,*欢迎进入银行模拟系统*, *MENU*, 1.按输入人次模
13、拟2.按输入时间模拟3.退出;/*函数*/ /菜单函数,用于显示菜单返回选择序号 /按时间模拟函数 /按人次模拟函数 /退出函数 /光标定位函数,i表示列,j表示行 /快速排序函数 /增加队列函数,i表示窗口 /判断1,2,3号窗口人数最少窗口,返回对应1,2,3 /判断1,2,3号窗口人数最多窗口,返回对应1,2,3 /显示窗口 /显示队列 /判断是否有人结束交易离开 /统计函数用于判断交易金额,交易人次等 /显示某个窗口交易历史 /获得平均等待时间 /判断移动队伍函数 /移动长队到短队3.1.1主函数用于调用菜单函数,并执行用户输入的对应命令void main() system(cls);
14、 for(;) switch(menu_select() /返回用户选择命令 case 1:startnum();break; /对应按人次模拟 case 2:starttime(); /按时间模拟 case 3:quit(); /退出函数 3.1.2菜单函数用于显示主界面以及返回用户输入命令int menu_select() int s; int i; totalmoney=0; currenttime=0; /对数据初始化 nexttime=0; /放在菜单函数中初始化可以在重新模拟时是数据清零 totaltime=0; avewait=0; currentnum=0; totalVIP=
15、0; num0=num1=num2=0; head0=cq0=last0=head1=cq1=last1=head2=cq2=last2=NULL; head3=cq3=last3=NULL;color 06 /改变DOS窗口显示颜色 gotoxy(10,2); for(i=0;i28;i+) /显示界面最上方图案 printf(%c ,04); for(i=3;16;i+) /显示界面两旁图案 gotoxy(10,i);putchar(04); gotoxy(64,i); gotoxy(10,16);i+) /显示界面最下方图案7;i+) /显示菜单选项 gotoxy(18,i+5);%s,
16、menui); i=0; do /用户输入选项 gotoxy(25,(i+)+17);请选择(1-3): scanf(%d,&s); while(s3); return s;3.1.3按时间模拟函数用于根据用户输入的时间和初始存款进行模拟,用户输入时间和初始存款后,用随机数产生一个介于用户输入时间和2倍输入时间的数作为在这一段时间内进入的用户数,在产生对应的随机时间,经过快速排序后,即可符合生活中状况。通过判断现在时刻是否超过用户输入时间来判断是否有可能会用新的顾客进入,当有新顾客进入时,通过返回一个最短队列对应的窗口号,调用添加顾客函数将新顾客插到队列中,插入队列前先判断是否为VIP客户,若
17、是则直接插到VIP专用客户中。之后调用判断是否有顾客离开函数以及是否需要将长队客户移到短对函数。最后当现在时刻大于用户输入时刻时则不在进入新客户,银行将办理完已排队客户业务。void starttime() CQ *p; /显示用户输入界面 gotoxy(19,9); printf(* gotoxy(19,11); for(i=10;13;i+) gotoxy(19,i);* gotoxy(47,i);printf( gotoxy(19,13); gotoxy(20,10);请输入模拟运行时间: scanf(totaltime); gotoxy(20,12);请输入初始存款数:totalmon
18、ey); /获取用户输入时间 totalnum=rand()%totaltime+totaltime; /用随机数产生一个介于 totaltime和2*totaltime的数作为 cometime=(int *)malloc(sizeof(int)*totalnum);/进入银行的顾客数totalnum;i+) /产生totalnum个随机数,表示顾客进入时刻 cometimei=rand()%totaltime; quicksort(cometime,0,totalnum-1); /对产生的时刻进行排序,以符合日常时刻 while(currenttimetotaltime) /判断是否没有顾
19、客在进入银行 show(); /显示提示界面以及美化界面 while(cometimecurrentnum=currenttime¤tnumtotalnum) /判断是否此刻有顾客进入,因为有可能进入两个故用while p=(CQ *)malloc(sizeof(CQ); i=rand()%15; /当i为0时表示本顾客为VIP贵宾 add(getminnum(),p,i); /将本顾客插入到最短队列中,若为VIP则进入专用窗口 currentnum+; leave(); /判断是否有顾客交易完成,需要离开 if(num0!=0|num1!=0|num2!=0) /当无人排队时则不
20、需要从长队移到短队 movequeue(); /移动函数,用于将较长队列中的人移动到短队列中 showqueue(); /显示目前窗口前的队列情况 Sleep(1000); /延时函数,用于延时1s currenttime+; while(num0!=0|num3!=0) /当顾客全部到达,但有人未办理业务,则需要将剩余业务办理 show(); gotoxy(26,3);时间已到,不再进入新的顾客! /用于提示,表示不在有新的顾客进入银行 /移动函数,用于将较长队列中的人移动到短队列中 printtotal(); /用于显示银行办理业务的统计信息3.1.4按人次模拟函数用于根据用户输入的人次和初始存款进行模拟,用户输入时间和初始存款后,用随机数产生一个用户进入的时刻,当以进入后,则产生一个在0-3min进入的新顾客,当有新顾客进入时,通过返回一个最短队列对应的窗口号,调用添加顾客函数将新顾客插到队列中,插入队列前先判断是否为VIP客户,若是则直接插到VIP专用客户中。void startnum() /显示用户输入人次和初始存款界面* gotoxy(45,i);请输入模拟运行人数:totalnum); while(currentnumtotalnum) /判断现在进入银行
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1