C语言课程设计课程设计题目:用于医院门诊候诊的队列管理程序姓名:学号:班级:指导老师:完成日期:目录组员及其任务分配:函数调用选项void ra()statistics(统计当天就诊患者情况)分程序叫号Callnumber(叫号),分诊室CRoom(分诊室)分程序registration(挂号)菜单界面void BUI()一、设计目的数据类型、分支控制、循环控制、函数的定义及调用、结构体及数组、指针、文件操作、编译预处理等。达到系统理解、综合运用课程知识的学习目标;学会用C语言程序解决实际问题的方法;掌握程序的局部测试、调试方法,建立程序系统调试、测试的基本概念和思想,学会较大程序的系统测试和调试方法。二、需求分析方便医院门诊候诊的队列管理,采用先来先就诊的排队方式(就诊顺序与挂号单编号无关),假设挂号时编码是连续的,但由于同一个门诊科目有3个诊室,其中35(含35)岁以上的在第一诊室,35岁以下男患者进第二诊室,其它的进第三诊室,程序启动后显示下列菜单:【实现提示】1--挂号2--叫号3--分诊室4--显示各诊室队列信息5--统计当天就诊的患者情况(要求按性别进行统计和按任意年龄区段进行统计)6--结束程序选1时,提示用户在一行内输入姓名及挂号单编号;选2时,显示排在队列中第一位患者姓名、挂号单编号,并将其从挂号序列中删除选3时,进行诊室分配选4时,按队列顺序显示个诊室排队人的姓名、挂号单编号及所在诊室选5时,进行两种统计方法的选择,并进行必要的统计计算选6时,退出程序的运行要求1~5中每一个步骤完成后都能重新显示此选择菜单三、总体设计(程序设计组成框图、流程图)(1)系统功能分析:1.能实现挂号功能,提示用户在一行内输入姓名及挂号单编号,并储存;2.能实现叫号功能,显示排在队列中第一位患者姓名、挂号单编号,并将其从挂号序列中删除;3.根据病人的性别与年龄,能实现诊室的分配;4.能按队列顺序显示各个诊室排队人的姓名、挂号单编号及所在诊室。5.按性别进行统计和按任意年龄区段进行统计,并打印输出;6.完成每个步骤之后都能重新显示此选择菜单。(2)总体设计框图(3)流程图模块一、主界面调用void ra()流程图主界面模块,显示分程序模块,通过函数调用的选择项,输入相应的数字即可进入对应的功能模块,模块的运行应当是先1.挂号,2.叫号,3.分诊室,分配分诊室后就可以显示队列信息,之后也可选择输入年龄统计当天就诊患者情况,运行结束后就是可选择6结束程序。四、详细设计模块二、挂号void registration()输入需要挂号病人的人数(i):1-10人主界面BUI()i++如果i<=10挂号编号num性别sex姓名name年龄year输入挂号模块,是通过结构体数组记录患者的信息。其中需要输入患者的姓名,性别,挂号单编号(就诊顺序与挂号单编号无关),并且,先输入需要挂号几个病人,每次挂号病人最多十个,并添加判断单次是否在预先输入需要挂号的病人的范围之内,以此来控制输入。模块运行输入挂号的次数,输入完毕后,即可返回主界面。模块三、叫号void Callnumber()病人已经分配完毕显示队列第一位患者的信息,并叫号显示队列第一位患者的信息菜单界面判断病人是否分配完毕叫号模块,首先把挂号后的第一病人进行叫号,之后能实现显示之后剩余等待叫号的的病人并排在队列中第一位患者姓名、挂号单编号,然后,通过文件写入公共将已经叫号就诊的病人保存在1.txt中实现病人叫号信息的保存。叫号完毕之后将跳过已经挂号的病人,叫号模块运行完毕时,回车即可返回主菜单界面。模块四、分诊室void CRoom()分诊室在35岁以上上?男性?第一诊室第二诊室第三诊室主界面是否是否门诊科目有3个诊室,通过判断年龄其中35(含35)岁以上的在第一诊室,后再将剩余的患者进行性别判断进行第二、第三诊室的分配,35岁以下男患者进第二诊室,其它的进第三诊室模块五、显示队列信息void show()显示分诊室所匹配的诊室信息。第一诊室人数a及患者信息主界面第二诊室人数b及患者信息第三诊室人数t及患者信息显示各患者队列及诊室信息模块,并且显示每名患者的详细信息,所显示的信息分为三个部分展示。而且模块运行完毕后,按回车回到主界面。模块六、统计当天就诊患者情况void statistics()模块六、统计当天就诊患者情况void statistics()先输入年龄界限year输出高于的人数输出低于的人数输出男性患者人数输出女性患者人数主界面年龄year>=y?是否统计模块,先输出共有多少位患者叫号就诊,统计男性患者和女性患者各有多少位,然后再判断高于或等于所输入年龄分界线和低于所输入年龄分界线的人数,最后按回车回到主界面。在小组所设计分程序模块为叫号void Callnumber()以及显示分诊室模块设计void CRoom()函数调用关系:模块三、叫号函数:void Callnumber()函数的具体设计:先清屏,显示窗口标题栏分程序名称,使用全局变量e和c,e表示叫号当中的人数,判断病人是否分配完毕,然后将挂号后拍在第一位的病人叫号,之后的病人继续等待叫号,并且将叫号的病人写入到文件1.txt中,变量c自加后再用e–c判断剩余等待挂号的人数。最后按回车键回到主界面。模块四、分诊室函数:void CRoom()函数的具体设计:先判断叫号当值变量c的值是否为0,如若为0表示c并未自加,也就表示目前没有病人叫号,提示提示请先叫号!定义全局变量fe之后判断性别,年龄使之分配到各个诊室,全局变量fe可避免病人重复分配到各个诊室,引发错误,如果多个已叫号病人可一次性分配,最后按回车键回到主界面。源程序代码(分文件展示)#include<stdio.h>//头文件#include<stdlib.h>#include<ctype.h>#include<string.h>#include<time.h>#include"windows.h"int e=0,a=0,b=0,t=0,c=0,fe=0;int k;struct hos{char name[16];//病人姓名char sex[11];//病人性别char num[11];//病人挂号单编号char year[11];//病人年龄int room;//病人被分到的诊室号};struct hos h[100];struct hos*p=&h[0];void Callnumber()//叫号分系统{SetConsoleTitle("2.叫号系统");//窗口标题栏system("cls");//清屏int k;if(c==e){system("cls");printf("所有病人都已经分配完毕\n");system("pause");return;}printf("病人(%s)已前往就诊挂号号码:%s\n\n",p[c].name,p[c].num);FILE*fp=fopen("1.txt","a+");if(fp==0){printf("can’t open file\n");}fseek(fp,0,SEEK_END);int z=fgetc(fp);//从文件中获取一个字符if(z!=EOF)//查看文件是否为空{fprintf(fp,"姓名");fprintf(fp,"\t性别");fprintf(fp,"\t挂号单");fprintf(fp,"\t年龄");fprintf(fp,"\n");}fwrite(p[c].name,strlen(p[c].name),1,fp);//将姓名输出到文件中fprintf(fp,"\t");fwrite(p[c].sex,strlen(p[c].sex),1,fp);fprintf(fp,"\t");fwrite(p[c].num,strlen(p[c].num),1,fp);fprintf(fp,"\t");fwrite(p[c].year,strlen(p[c].year),1,fp);fprintf(fp,"\n\n");fclose(fp);c++;printf("\n--------------------------剩余【%d】位等待叫号的病人---------------------------\n",e-c);for(k=c;k<e;k++)printf("目前等待叫号排序第【%d位】姓名:%s挂号号码:%s\n",k+1-c,p[k].name,p[k].num);system("pause");system("cls");}void CRoom()//分配诊室:fp()函数{system("cls");SetConsoleTitle("3.诊室分配");printf("\n--------------------------诊室分配结果---------------------------\n");if(c==0){printf("Error!请先叫号!\n");}for(fe;fe<c;fe++){if(atoi(p[fe].year)>=35)//字符串转换为整数{a++;p[fe].room=1;}//其中35(含35)岁以上的患者在第一诊室else if(strcmp(p[fe].sex,"男")==0){b++;p[fe].room=2;}//35岁以下男患者进第二诊室else{t++;p[fe].room=3;}//其它的患者进第三诊室printf("\n病人(%s)性别:%s挂号编号:%s已被分配到第【%d】诊室\n",p[fe].name,p[fe].sex,p[fe].num,p[fe].room);}system("pause");system("cls");}调试测试展示:通过vc6.0进行测试;源代码:#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<string.h>#define N 100 int S1=0,S2=0,S3=0,man=0,woman=0,pl=0,g=0;//定义s为诊室,p1指针int k;struct hos{char name[15];//患者姓名char sex[10];//患者性别char num[10];//挂号单编号char year[10];//患者年龄int room;//被分到的诊室号};struct hos h[N];struct hos*p=&h[0];void introduce()//功能介绍introduce()函数{printf("\n◎功能选择◎\n");printf("┌──────────────────────────────┐\n");printf("│●1-挂号│\n");printf("│●2-叫号│\n");printf("│●3-分诊室│\n");printf("│●4-显示各诊室队列信息│\n");printf("│●5-统计当天就诊患者情况(要求按性别和任意年龄区段进行统计│\n");printf("│●6-结束程序│\n");printf("└──────────────────────────────┘\n");}void run(){void introduce();void input();void jiaohao();void fp();void statistic();void type_statistic();char function=’1’,j[10];while(function){switch(function){case’1’:input();break;case’2’:jiaohao();break;case’3’:fp();break;case’4’:statistic();break;case’5’:type_statistic();break;case’6’:exit(0);break;default:system("cls");//清屏printf("\n\terror\n\n请重新输入:");}printf("请选择功能");introduce();function=getchar();gets(j);while(isdigit(function)==0)//isdigit(function):判断function字符是不是数字{printf("您输入有误,请重新输入");function=getchar();gets(j);}}}void input(){int change(char);//int d;char i,j[8],s[15];printf("请输入需要挂号的病人人数(请输入0到9之间的数):");i=getchar();gets(j);while(isdigit(i)==0)//isdigit(i):判断i字符是不是数字{printf("您输入有误,请重新输入");i=getchar();gets(j);}printf("请输入%d位病人的个人信息\n",change(i));for(k=1;k<=change(i);k++){printf("第%2d位病人:\n",k);printf("姓名:");strcpy(p[pl].name,gets(s));printf("编号:");strcpy(p[pl].num,gets(s));/*for(d=pl;d>=0;d--){if(p[pl].num==p[d].num&&pl!=d)printf("error");}*/printf("性别:");strcpy(p[pl].sex,gets(s));printf("年龄:");strcpy(p[pl].year,gets(s));pl++;}printf("已经挂号的病人\n");for(k=g;k<pl;k++)printf("第%2d位姓名:%s挂号号码%s\n",k+1-g,p[k].name,p[k].num);system("pause");//暂停system("cls");//清屏}void jiaohao(){if(g==pl){system("cls");printf("所有病人都已经分配完毕\n");return;}printf("病人%s已前往就诊挂号号码:%5s\n\n",p[g].name,p[g].num);g++;printf("剩余%2d位等待叫号的病人\n",pl-g);for(k=g;k<pl;k++)printf("挂号排序第%2d位姓名:%s挂号号码:%5s\n",k+1-g,p[k].name,p[k].num);system("pause");system("cls");}void fp()//分配诊室:fp()函数{S1=0;S2=0;S3=0;for(k=0;k<g;k++){if(atoi(p[k].year)>=35){S1++;p[k].room=1;}//其中35(含35)岁以上的患者在第一诊室else if(strcmp(p[k].sex,"man")==0){S2++;p[k].room=2;}//35岁以下男患者进第二诊室else{S3++;p[k].room=3;}//其它的患者进第三诊室printf("病人%s被分配在第%d诊室\n",p[k].name,p[k].room,p[k].num);}system("pause");system("cls");}void statistic()//病人信息输出:statistic()函数{for(k=0;k<g;k++){printf("第%2d名患者姓名:%s挂号编号:%s诊室:第%d诊室\n",k+1,p[k].name,p[k].num,p[k].room);}printf("第一诊室%2d人\n",S1);printf("第二诊室%2d人\n",S2);printf("第三诊室%2d人\n",S3);system("pause");system("cls");}void type_statistic()//统计功能:type_statistic()函数{int year,high=0,low=0;man=0;woman=0;for(k=0;k<g;k++){if(strcmp(p[k].sex,"man")==0)man++;else woman++;}printf("请输入一个界限年龄:");scanf("%d",&year);for(k=0;k<g;k++){if(atoi(p[k].year)>=year)high++;else low++;}printf("共有%2d位患者就诊.\n",g);printf("其中男性患者有%2d位,",man);printf("女性患者有%2d位.\n",woman);printf("年纪大于等于%d的患者有%2d位,",year,high);printf("年纪小于%d的患者有%2d位.\n",year,low);system("pause");system("cls");}void main(){system("color 70");introduce();run();}int change(char ch)//将单个字符型数字转化为整形{int i;i=ch-48;return(i);}。