二、实验内容
本任务主要的功能:
- 能实现挂号功能,提示用户在一行内输入姓名、年龄和性别,自动生成就诊号码;
- 能实现叫号功能,显示排在队列中第一位患者姓名、挂号单编号,并将其从挂号序列中删除;
- 根据病人的性别与年龄,能实现诊室的分配;
- 能按队列顺序显示各个诊室排队人的姓名、挂号单编号及所在诊室。
- 按性别进行统计和按任意年龄区段进行统计,并打印输出;
- 完成每个步骤之后都能重新显示此选择菜单。
- 头文件及全局变量的定义
在头文件“hospital.h”中定义的全局变量有:
int count=0; //全局变量,挂号总人数;
int S1=0; //全局变量,第一诊室人数;
int S2=0; //全局变量,第二诊室人数;
int S3=0; //全局变量,第三诊室人数;
int j=0; //全局变量,挂号顺序;要求初始编号10000起
int m=0; //全局变量,已叫号人数;
int l=0; //全局变量,判定患者是否分配完毕;
int h[10000]; //全局变量,日志功能中记录操作痕迹;
int a=0; //全局变量,日志功能中操作痕迹总量;
time_t now[10000]; //全局变量,日志功能中显示时间;
d=0; //全局变量,日志功能中时间顺序的下标;
还有统一定义的变量,如结构体数组“struct hospital hos[ ]”中的姓名name、年龄age、性别sex以及诊室room等。//表示医院的人
- 各模块的函数定义及相关变量的使用
模块一、主界面:
函数原型:void introduce( )
参数:无 返回值:void 模块的具体实现:直接采用printf函数将主界面打印出来。见图3-2。
模块二、挂号函数:
函数原型:void guahao(struct hospital hos[ ])
参数:hos[ ] 用来存入挂号者的信息
返回值:void
函数的具体设计:定义变量i,用do—while循环输入每个挂号病人的信息(编号已经预先制定),再将病人编号信息定为J(10000)每循环一次全局变量count自加一次,在循环的结尾提示病人编号为J且给出选择0或1(将其赋给i,若i=0结束输入;若i=1继续输入),这样在输完病人的信息后,系统会自动分配编号给病人。当i=0时,停止采集数据,并清屏、暂停以及引用introduce( )函数返回主界面。
模块三、叫号函数:
函数原型: void jiaohao(struct hospital hos[ ])
参数:hos[ ] 输出存入的病人信息
返回值:void
函数的具体设计:先清屏,再定义局部变量i (用于循环控制),利用结构体数组输出被叫号病人的各项信息,同时m++(m表示被叫号的人数);if : m == count则显示叫号完毕,else :显示剩余挂号人数(count-m),然后利用for循环(i = 0 ; i < count ; i ++)输出每个等待叫号病人的信息,最后清屏、暂停,并引用introduce( )函数返回主界面
模块四、分诊室函数:
函数原型:void fenzhen(struct hospital hos[ ])
参数:hos[ ] 利用结构数组存入的病人信息将其分类
返回值:void
函数的具体设计:先清屏,定义局部变量k=m-l,先用if函数判断m = 0 ?(若是,则显示“还未进行叫号!”;若否,则执行下一步),使用if – else函数连续两次判断年龄age与35岁的关系,以及是否为man,再根据题意分配到各个诊室,分配到的诊室,对应的变量(S1、S2、S3)自加;然后显示此病人(被叫号之后的患者)的所有信息(包括所分配的诊室)。最后清屏、暂停,并引用introduce( )函数返回主界面。
模块五、显示函数:
函数原型: void xianshi(struct hospital hos[ ])
参数:hos[ ] 将已叫号的病人信息显示出来,并显示各分诊室的病患信息
返回值:void
函数的具体设计:定义局部i, 利用for函数,for(i = 0 ; i < m ; i ++)以及在for函数中使用if – else函数分别判断各个病人所属的诊室编号,if hos[i].room=1/2/3,则以诊室为单位输出各个以叫号病人的信息,以上步骤重复三次;然后分别输出各诊室的患者总人数S1、S2、S3。最后清屏、暂停,并引用introduce( )函数返回主界面。
模块六、统计函数:
函数原型: void tongji(struct hospital hos[ ])
参数:hos[ ] 利用存入的数据进行统计,分性别统计和按任意年龄统计
返回值:void
函数具体设计:先定义局部变量man、woman、X(任意年龄)、up(高于此年龄的人数)、down(低于此年龄的人数)、n(循环控制)。先在for (n = 0 ; n < c ount ; n++)循环中利用strcmp( )函数进行性别判定(若为man,则man++,否则woman++);然后再提示输入年龄界限X,在for ( n = 0 ; n < count ; n ++)循环中判断年龄hos[ ].age与X的大小(若X大则down++,否则up++)。将就诊人数m以及man、woman、up、down的相关数据打印输出,最后清屏、暂停,并引用introduce( )函数返回主界面。
模块七、系统日志功能:
函数原型:void rizhi( )
参数:无
返回值:void
函数具体实现:引用记录数组h[ ],在需要记录的函数里进行记录,每记录一次,数组h[ ]的下标自加;再用同样方法用数组now[ ]记录每次操作对应的时间。然后,将相关记录按顺序打印输出。最后清屏、暂停,并引用introduce( )函数返回主界面。
- #include<stdio.h>
- #include<stdlib.h>
- #include<time.h>
- #include <string.h>
- #include<malloc.h>
- #define MaxSize 100
- #define CLS {system("cls");}
- int count = 0; //全局变量,挂号总人数;
- int S1 = 0; //全局变量,第一诊室人数;
- int S2 = 0; //全局变量,第二诊室人数;
- int S3 = 0; //全局变量,第三诊室人数;
- int j = 0; //全局变量,初始挂号编号;
- int m = 0; //全局变量,已叫号人数;
- int l = 0; //全局变量,判定患者是否分配完毕;
- int h[10000]; //全局变量,日志功能中记录操作痕迹;
- int a = 0; //全局变量,日志功能中操作痕迹总量;
- time_t now[10000]; //全局变量,日志功能中显示时间;
- int d = 0; //全局变量,日志功能中时间顺序的下标;
- typedef int ElemType;
- typedef struct {
- ElemType data[MaxSize];
- int front, rear;
- }SqQueue;
- SqQueue* p, * yj;
- typedef struct {
- int num;
- char name[9];
- int age;
- char sex[6];
- int room;
- } hospital;
- hospital hos[MaxSize];
- void InitQueue(SqQueue*& q);
- void DestroyQueue(SqQueue*& q);
- bool QueueEmpty(SqQueue* q);
- void enQueue(SqQueue*& q, ElemType e);
- void deQueue(SqQueue*& q, ElemType& e);
- void introduce();
- void InitQueue(SqQueue*& q) //初始化队列
- {
- q = (SqQueue*)malloc(sizeof(SqQueue));
- q->front = q->rear = 0;
- }
- void DestroyQueue(SqQueue*& q) //销毁队列
- {
- free(q);
- }
- bool QueueEmpty(SqQueue* q) //队列是否为空
- {
- return(q->front == q->rear);
- }
- void enQueue(SqQueue*& q, ElemType e) //进队列
- {
- q->rear++;
- q->data[q->rear] = e;
- };
- void deQueue(SqQueue*& q, ElemType& e) //出队列
- {
- q->front++;
- e = q->data[q->front];
- }
- void TrsTime(time_t t) {
- char* wday[] = { "周日","周一","周二","周三","周四","周五","周六" };
- struct tm* p;
- p = gmtime(&t);
- printf("%d年%02d月%02d日 %s %02d:%02d:%02d:", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday , wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
- return;
- }
- void guahao(hospital hos[]) //挂号函数
- {
- CLS;
- int i = 1, t;
- do {
- printf("请输入姓名 年龄 性别(M/F):");
- scanf("%s %d %s", hos[j].name, &hos[j].age, hos[j].sex);
- count++;
- enQueue(p, j);
- hos[j].num = j+10000;
- printf("病人的编号为:%d\n", j+10000);
- j++;
- printf("是否继续输入?\n");
- printf("0 否,1 是");
- scanf("%d", &i);
- } while (i);
- h[a] = 1;
- now[a] = time(NULL);
- a++;
- introduce();
- }
- void jiaohao(hospital hos[]) //叫号函数
- {
- CLS;
- int i, w;
- if (m == count)
- {
- printf("叫号完毕\n");
- introduce();
- }
- deQueue(p, w);
- enQueue(yj, w);
- printf("%d %s %d %s\n", hos[w].num, hos[w].name, hos[w].age, hos[w].sex);
- m++;
- printf("剩余叫号人数%d\n", count - m);
- for (i = m; i < count; i++)
- {
- printf("%s %d %s\n", hos[i].name, hos[i].age, hos[i].sex);
- }
- h[a] = 2;
- now[a] = time(NULL);
- a++;
- introduce();
- }
- void fenzhen(hospital hos[])
- {
- CLS;
- int k = m - l, w;
- while (k--)
- {
- if (m == 0)
- printf("还未进行叫号\n");
- else
- {
- deQueue(yj, w);
- if (hos[w].age > 35)
- {
- hos[w].room = 1;
- S1++;
- }
- else
- {
- if (strcmp(hos[w].sex, "man") == 0)
- {
- hos[w].room = 2;
- S2++;
- }
- else if (strcmp(hos[w].sex,"woman")==0)
- {
- hos[w].room = 3;
- S3++;
- }
- }
- printf("%d %s %d %s %d\n", hos[w].num, hos[w].name, hos[w].age, hos[w].sex, hos[w].room);
- }
- l++;
- }
- h[a] = 3;
- now[a] = time(NULL);
- a++;
- introduce();
- }
- void xianshi(hospital hos[]) //显示函数
- {
- CLS;
- int i;
- for (i = 0; i < count; i++)
- {
- if (hos[i].room == 1)
- {
- printf("number:%d name:%s age:%d sex:%s room:S%d\n", hos[i].num, hos[i].name, hos[i].age, hos[i].sex, hos[i].room);
- }
- }
- for (i = 0; i < count; i++)
- {
- if (hos[i].room == 2)
- {
- printf("number:%d name:%s age:%d sex:%s room:S%d\n", hos[i].num, hos[i].name, hos[i].age, hos[i].sex, hos[i].room);
- }
- }
- for (i = 0; i < count; i++)
- {
- if (hos[i].room == 3)
- {
- printf("number:%d name:%s age:%d sex:%s room:S%d\n", hos[i].num, hos[i].name, hos[i].age, hos[i].sex, hos[i].room);
- }
- }
- printf("S1:%d人\nS2:%d人\nS3:%d人\n", S1, S2, S3);
- h[a] = 4;
- now[a] = time(NULL);
- a++;
- introduce();
- }
- void rizhi() //系统日志函数
- {
- CLS;
- int i;
- for (i = 0; i < a; i++)
- {
- TrsTime(now[i]);
- printf("进行步骤%d\n", h[i]);
- }
- introduce();
- }
- void tongji(hospital hos[]) //统计函数
- {
- CLS;
- int man = 0, woman = 0, X, up = 0, down = 0, n;
- for (n = 0; n < count; n++)
- {
- if (strcmp(hos[n].sex, "man") == 0)
- man++;
- else
- woman++;
- }
- printf("请输入年龄界限\n");
- scanf("%d", &X);
- for (n = 0; n < count; n++)
- {
- if (hos[n].age < X)
- down++;
- else
- up++;
- }
- printf("就诊人数:%d man:%d woman:%d up:%d down:%d\n", count, man, woman, up, down);
- h[a] = 5;
- now[a] = time(NULL);
- a++;
- introduce();
- }
- void introduce() {
- int choice;
- printf("\n\n\n\n\n");
- printf("\t\t\t\t医 院 操 作 程 序 \n");
- printf("\n\t\t\t******************************");
- printf("\n\t\t\t* 1.挂号 *");
- printf("\n\t\t\t* 2.叫号 *");
- printf("\n\t\t\t* 3.分诊室 *");
- printf("\n\t\t\t* 4.显示各诊室的信息 *");
- printf("\n\t\t\t* 5.当前人数统计 *");
- printf("\n\t\t\t* 6.系统日志 *");
- printf("\n\t\t\t* 7.退出程序 *");
- printf("\n\t\t\t******************************");
- printf("\n\t\t\t请选择菜单号(1--7):");
- scanf("%d", &choice);
- getchar();
- switch (choice)
- {
- case 1:guahao(hos); break;
- case 2:jiaohao(hos); break;
- case 3:fenzhen(hos); break;
- case 4:xianshi(hos); break;
- case 5:tongji(hos); break;
- case 6:rizhi(); break;
- case 7:
- default:
- exit(0);
- }
- }
- int main()
- {
- InitQueue(p);
- InitQueue(yj);
- introduce();
- }