病人候诊系统

二、实验内容

本任务主要的功能:

  1. 能实现挂号功能,提示用户在一行内输入姓名、年龄和性别,自动生成就诊号码;
  2. 能实现叫号功能,显示排在队列中第一位患者姓名、挂号单编号,并将其从挂号序列中删除;
  3. 根据病人的性别与年龄,能实现诊室的分配;
  4. 能按队列顺序显示各个诊室排队人的姓名、挂号单编号及所在诊室。
  5. 按性别进行统计和按任意年龄区段进行统计,并打印输出;
  6. 完成每个步骤之后都能重新显示此选择菜单。
  1. 头文件及全局变量的定义

在头文件“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(  )函数返回主界面。

  1. #include<stdio.h>   
  2. #include<stdlib.h>   
  3. #include<time.h>   
  4. #include <string.h>   
  5. #include<malloc.h>   
  6. #define MaxSize 100   
  7. #define CLS {system("cls");}   
  8. int count = 0;          //全局变量,挂号总人数;   
  9. int S1 = 0;             //全局变量,第一诊室人数;   
  10. int S2 = 0;             //全局变量,第二诊室人数;   
  11. int S3 = 0;             //全局变量,第三诊室人数;   
  12. int j = 0;          //全局变量,初始挂号编号;   
  13. int m = 0;              //全局变量,已叫号人数;   
  14. int l = 0;              //全局变量,判定患者是否分配完毕;   
  15. int h[10000];           //全局变量,日志功能中记录操作痕迹;   
  16. int a = 0;              //全局变量,日志功能中操作痕迹总量;   
  17. time_t now[10000];      //全局变量,日志功能中显示时间;   
  18. int d = 0;                  //全局变量,日志功能中时间顺序的下标;   
  19. typedef int ElemType;   
  20. typedef struct {   
  21.     ElemType data[MaxSize];   
  22.     int front, rear;   
  23. }SqQueue;   
  24. SqQueue* p, * yj;   
  25.   
  26. typedef struct {   
  27.     int num;   
  28.     char name[9];   
  29.     int age;   
  30.     char sex[6];   
  31.     int room;   
  32. } hospital;   
  33. hospital hos[MaxSize];   
  34.   
  35. void InitQueue(SqQueue*& q);   
  36. void DestroyQueue(SqQueue*& q);   
  37. bool QueueEmpty(SqQueue* q);   
  38. void enQueue(SqQueue*& q, ElemType e);   
  39. void deQueue(SqQueue*& q, ElemType& e);   
  40. void introduce();   
  41. void InitQueue(SqQueue*& q)            //初始化队列   
  42. {   
  43.     q = (SqQueue*)malloc(sizeof(SqQueue));   
  44.     q->front = q->rear = 0;   
  45. }   
  46. void DestroyQueue(SqQueue*& q)      //销毁队列   
  47. {   
  48.     free(q);   
  49. }   
  50. bool QueueEmpty(SqQueue* q)           //队列是否为空   
  51. {   
  52.     return(q->front == q->rear);   
  53. }   
  54. void enQueue(SqQueue*& q, ElemType e)    //进队列   
  55. {   
  56.     q->rear++;   
  57.     q->data[q->rear] = e;   
  58. };   
  59. void deQueue(SqQueue*& q, ElemType& e)    //出队列   
  60. {   
  61.     q->front++;   
  62.     e = q->data[q->front];   
  63. }   
  64. void TrsTime(time_t t) {   
  65.         char* wday[] = { "周日","周一","周二","周三","周四","周五","周六" };   
  66.         struct tm* p;   
  67.         p = gmtime(&t);   
  68.         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);   
  69.         return;   
  70. }   
  71. void guahao(hospital hos[])       //挂号函数   
  72. {   
  73.     CLS;   
  74.     int i = 1, t;   
  75.     do {   
  76.         printf("请输入姓名 年龄 性别(M/F):");   
  77.         scanf("%s %d %s", hos[j].name, &hos[j].age, hos[j].sex);   
  78.         count++;   
  79.         enQueue(p, j);   
  80.         hos[j].num = j+10000;   
  81.         printf("病人的编号为:%d\n", j+10000);   
  82.         j++;   
  83.         printf("是否继续输入?\n");   
  84.         printf("0 否,1 是");   
  85.         scanf("%d", &i);   
  86.     } while (i);   
  87.     h[a] = 1;   
  88.     now[a] = time(NULL);   
  89.     a++;   
  90.     introduce();   
  91. }   
  92. void jiaohao(hospital hos[])               //叫号函数   
  93. {   
  94.     CLS;   
  95.     int i, w;   
  96.     if (m == count)   
  97.     {   
  98.         printf("叫号完毕\n");   
  99.         introduce();   
  100.     }   
  101.     deQueue(p, w);   
  102.     enQueue(yj, w);   
  103.     printf("%d %s %d %s\n", hos[w].num, hos[w].name, hos[w].age, hos[w].sex);   
  104.     m++;   
  105.         printf("剩余叫号人数%d\n", count - m);   
  106.         for (i = m; i < count; i++)   
  107.         {   
  108.             printf("%s %d %s\n", hos[i].name, hos[i].age, hos[i].sex);   
  109.         }   
  110.     h[a] = 2;   
  111.     now[a] = time(NULL);   
  112.     a++;   
  113.     introduce();   
  114. }   
  115. void fenzhen(hospital hos[])   
  116. {   
  117.     CLS;   
  118.     int k = m - l, w;   
  119.     while (k--)   
  120.     {   
  121.         if (m == 0)   
  122.             printf("还未进行叫号\n");   
  123.         else  
  124.         {   
  125.             deQueue(yj, w);   
  126.             if (hos[w].age > 35)   
  127.             {   
  128.                 hos[w].room = 1;   
  129.                 S1++;   
  130.             }   
  131.             else  
  132.             {   
  133.                 if (strcmp(hos[w].sex, "man") == 0)   
  134.                 {   
  135.                     hos[w].room = 2;   
  136.                     S2++;   
  137.                 }   
  138.                 else if (strcmp(hos[w].sex,"woman")==0)   
  139.                 {   
  140.                     hos[w].room = 3;   
  141.                     S3++;   
  142.                 }   
  143.             }   
  144.             printf("%d %s %d %s %d\n", hos[w].num, hos[w].name, hos[w].age, hos[w].sex, hos[w].room);   
  145.   
  146.         }   
  147.         l++;   
  148.     }   
  149.     h[a] = 3;   
  150.     now[a] = time(NULL);   
  151.     a++;   
  152.     introduce();   
  153. }   
  154. void xianshi(hospital hos[])          //显示函数   
  155. {   
  156.     CLS;   
  157.     int i;   
  158.     for (i = 0; i < count; i++)   
  159.     {   
  160.         if (hos[i].room == 1)   
  161.         {   
  162.             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);   
  163.         }   
  164.     }   
  165.     for (i = 0; i < count; i++)   
  166.     {   
  167.         if (hos[i].room == 2)   
  168.         {   
  169.             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);   
  170.         }   
  171.     }   
  172.     for (i = 0; i < count; i++)   
  173.     {   
  174.         if (hos[i].room == 3)   
  175.         {   
  176.             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);   
  177.         }   
  178.     }   
  179.     printf("S1:%d人\nS2:%d人\nS3:%d人\n", S1, S2, S3);   
  180.     h[a] = 4;   
  181.     now[a] = time(NULL);   
  182.     a++;   
  183.     introduce();   
  184. }   
  185.   
  186. void rizhi()                   //系统日志函数   
  187. {   
  188.     CLS;   
  189.     int i;   
  190.     for (i = 0; i < a; i++)   
  191.     {   
  192.         TrsTime(now[i]);   
  193.         printf("进行步骤%d\n", h[i]);   
  194.     }   
  195.     introduce();   
  196. }   
  197. void tongji(hospital hos[])                      //统计函数   
  198. {   
  199.     CLS;   
  200.     int man = 0, woman = 0, X, up = 0, down = 0, n;   
  201.     for (n = 0; n < count; n++)   
  202.     {   
  203.         if (strcmp(hos[n].sex, "man") == 0)   
  204.             man++;   
  205.         else  
  206.             woman++;   
  207.     }   
  208.     printf("请输入年龄界限\n");   
  209.     scanf("%d", &X);   
  210.     for (n = 0; n < count; n++)   
  211.     {   
  212.         if (hos[n].age < X)   
  213.             down++;   
  214.         else  
  215.             up++;   
  216.     }   
  217.     printf("就诊人数:%d man:%d woman:%d up:%d down:%d\n", count, man, woman, up, down);   
  218.     h[a] = 5;   
  219.     now[a] = time(NULL);   
  220.     a++;   
  221.     introduce();   
  222. }   
  223. void introduce() {   
  224.     int choice;   
  225.     printf("\n\n\n\n\n");   
  226.     printf("\t\t\t\t医 院 操 作 程 序 \n");   
  227.     printf("\n\t\t\t******************************");   
  228.     printf("\n\t\t\t*   1.挂号                  *");   
  229.     printf("\n\t\t\t*   2.叫号                  *");   
  230.     printf("\n\t\t\t*   3.分诊室                *");   
  231.     printf("\n\t\t\t*   4.显示各诊室的信息      *");   
  232.     printf("\n\t\t\t*   5.当前人数统计          *");   
  233.     printf("\n\t\t\t*   6.系统日志              *");   
  234.     printf("\n\t\t\t*   7.退出程序              *");   
  235.     printf("\n\t\t\t******************************");   
  236.     printf("\n\t\t\t请选择菜单号(1--7):");   
  237.     scanf("%d", &choice);   
  238.     getchar();   
  239.     switch (choice)   
  240.     {   
  241.     case 1:guahao(hos); break;   
  242.     case 2:jiaohao(hos); break;   
  243.     case 3:fenzhen(hos); break;   
  244.     case 4:xianshi(hos); break;   
  245.     case 5:tongji(hos); break;   
  246.     case 6:rizhi(); break;   
  247.     case 7:   
  248.     default:   
  249.         exit(0);   
  250.     }   
  251. }   
  252.   
  253. int main()   
  254. {   
  255.     InitQueue(p);   
  256.     InitQueue(yj);   
  257.     introduce();   
  258. }   
 如未特殊声明,文章均为原创。
 本文标题:病人候诊系统
 本文链接:https://manwish.cn/article/patientwaitingsystem.html

留下评论