本文附有源代码及测试数据
1.程序简介
程序主要实现了对当日挂号人数的各项数据统计,可以方便医院管理人员查看。首先,程序可以先从当日患者信息单中读取数据(包含编号、科室、姓名、年龄、类型信息),自动统计出就诊人数,然后用户可选择需要查看的数据,并且可以反复查看,直到用户想要退出程序。若用户不想在程序中查看数据,可直接按5退出程序,此时,程序会将统计的数据全部写入data.txt文本文档中,用户可根据需要查看。
2.设计思路
此程序的创新之处是将所有统计的数据写入文件,方便查看,同时又能在程序内部直接查看,实现了用户选择的自由。其次,在各处输入进行了容错设计,使程序有更稳定的运行。再次,在程序内可重复查看数据,根据用户需要退出程序,更加灵活。
3.设计难点与解决方法
1.本程序在所有需要用户键入指令的地方都设置了容错功能,防止用户错误输入导致程序崩溃,但是容错功能需要多处使用循环,在设计过程中经常导致程序错误运行,适量地采用了goto语句,使循环能够正确跳出,从而解决此问题。
2.科室排名:每个值与排名要匹配,构建两套数组,成功将就诊人数进行了排名。
以下为源代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define MAX_PATIENTS 10000
int patientCount;
int expe,norm;
int x,y,z;
char money2[30];
/*函数声明*/
void message();
void end();
void readfile();
void function_message();
void registrationfee();
void age();
void sort_patient_keshi();
void input();
void pr(char a[], int n);
void sort_patient_class();
void write_file();
/*病人信息*/
struct patient
{
char id[10]; /* 挂号单编号*/
char department[10]; /*所挂科室*/
char name[20];
char name2[10];
char gender[8]; /*性别*/
int age; /*年龄*/
char type[10]; /*挂号类型:专家或普通*/
}pa[MAX_PATIENTS];
/*主函数*/
int main()
{
/*局部变量定义*/
char cue[20];
int ra[5]={5,5,5,5,5},i=0,de[5]={0,0,0,0,0};
char fun_id[30];
char path[50];
FILE *fp;
/*首页提示*/
message();
while(1)
{
input();
gets(path);
/*退出*/
if(path[0]=='#'&&path[1]=='#'&&path[2]=='#')
goto L3;
if ((fp=fopen(path,"r"))==NULL)
{
printf("文件打开错误,请重新输入文件名\n");
continue;
}
else
{
printf("文件读取成功!\n");
printf("-------------------------------------------------------------\n");
break;
}
fclose(fp);
}
readfile(fp,path);
function_message();
L2:while(1)
{
input();
for(i=0;i<30;i++)
fun_id[i]='\0';
scanf("%s",fun_id);
if(fun_id[0]>'5'||fun_id[0]<='0'||fun_id[1]!='\0')
{
printf("输入错误,请重新输入\n");
continue;
}
switch(fun_id[0])
{
case '1':
registrationfee(pa);
printf("-------------------------------------------------------------\n");
printf("今日挂号费总收入为:%s元\n",money2);
printf("-------------------------------------------------------------\n");
break;
case '2':
printf("-------------------------------------------------------------\n");
sort_patient_keshi(pa,de,ra);
printf("内科就诊人数:%d 排名为%d\n",de[0],ra[0]);
printf("外科就诊人数:%d 排名为%d\n",de[1],ra[1]);
printf("牙科就诊人数:%d 排名为%d\n",de[3],ra[3]);
printf("骨科就诊人数:%d 排名为%d\n",de[4],ra[4]);
printf("皮肤科就诊人数:%d 排名为%d\n",de[2],ra[2]);
printf("-------------------------------------------------------------\n");
break;
case '3':
printf("-------------------------------------------------------------\n");
age(pa);
printf("内科年龄比例(14岁以下,14至25岁,25岁以上)为:%d:%d:%d\n",x,y,z);
printf("-------------------------------------------------------------\n");
break;
case '4':
printf("-------------------------------------------------------------\n");
sort_patient_class(pa);
printf("-------------------------------------------------------------\n");
break;
case '5':
goto L1;
}
printf("还想继续查看吗?(输入yes/no)\n");
input();
while(1)
{
for(i=0;i<20;i++)
cue[i]='\0';
scanf("%s",cue); /*cue是代表yes/no的字符数组*/
if(strcmp(cue,"yes")==0)
{
for(i=0;i<5;i++)
cue[i]='\0';
goto L2;
}
else if(strcmp(cue,"no")==0)
{
goto L1;
}
else
{
printf("输入错误,请重新输入\n");
input();
}
}
}
L1:end();
x=y=z=0;
registrationfee(pa);
age(pa);
sort_patient_keshi(pa,de,ra);
write_file(pa,money2,de,ra);
L3:return 0;
}
/*读取文件*/
void readfile(FILE *fp,char path[])
{
int i;
fp=fopen(path,"r");
for(i=0;feof(fp)==0;i++)
{
fscanf(fp,"%s%s%s%s%d%s%s",pa[i].id,pa[i].department,pa[i].name,pa[i].name2,&pa[i].age,pa[i].gender,pa[i].type);
}
patientCount=i-1; /*当日就诊人数*/
fclose(fp);
}
/*1.统计一天挂号费收入*/
void registrationfee(struct patient *p)
{
int money=0,i;
for(i=0;i<30;i++)
money2[i]='\0';
for(p=pa;p<pa+patientCount;p++)
{
if(strcmp("expert",p->type)==0)
money+=10;
else
money+=5;
}
pr(money2,money);
}
/*4.分别统计出挂各类号(专家or普通)的人数排序*/
void sort_patient_class(struct patient *p)
{
expe=norm=0;
for(p=pa;p<pa+patientCount;p++)
{
if(strcmp("normal",p->type)==0)
norm++;
else
expe++;
}
printf("挂专家号%d人\n",expe);
printf("挂普通号%d人\n",norm);
}
/*2.对各科就诊人数由大到小进行排序*/
void sort_patient_keshi(struct patient *p,int de[],int ra[])
{
int i,j,k;
for(i=0;i<5;i++)
{de[i]=0;ra[i]=5;}
for(p=pa;p<pa+patientCount;p++)
{
if(strcmp(p->department,"nei")==0)
de[0]++;
else if(strcmp("wai",p->department)==0)
de[1]++;
else if(strcmp("pifu",p->department)==0)
de[2]++;
else if(strcmp("ya",p->department)==0)
de[3]++;
else if(strcmp("gu",p->department)==0)
de[4]++;
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(de[i]>de[j])
ra[i]--;
}
}
}
/*首页界面提示语*/
void message()
{
printf("-------------------------------------------------------------\n");
printf("****************欢迎使用大连医院挂号管理系统*****************\n");
printf("-------------------------------------------------------------\n");
printf("退出程序请输入“###”\n");
printf("请输入挂号信息文件名称\n");
}
/*结束页面*/
void end()
{
printf("-------------------------------------------------------------\n");
printf("需查看的数据已写入data.txt文件,请及时查看\n");
printf("-------------------------------------------------------------\n");
printf("****************************程序已退出***********************\n");
printf("***************************欢迎下次使用!********************\n");
printf("-------------------------------------------------------------\n");
}
/*输入提示OK*/
void input()
{
printf("在此处键入:");
}
/*功能页界面提示语OK*/
void function_message()
{
printf("请输入要查看的数据(填写数据前面的编号)\n");
printf("1.挂号费收入\n2.各科就诊人数排序\n3.不同年龄层就诊比例顺序\n4.挂号类别(专家或普通)\n5.退出程序\n");
}
/*内科年龄比例*/
void age(struct patient *p)
{
x=0,y=0,z=0;
for(p=pa;p<pa+patientCount;p++)
{
if(strcmp(p->department,"nei")==0)
{
if(p->age<=14)
x++;
if(p->age>14&&p->age<25)
y++;
else
z++;
}
}
}
/*数字转字符串加分隔符OK*/
void pr(char a[], int n)
{
char temp;
int i = 0, k = 0, len;
while (n > 0)
{
a[i++] = n % 10 + '0';
n = n / 10;
if (++k % 3 == 0 && n != 0)
a[i++] = ',';
}
a[i] = '\0';
len = i;
for (i = 0; i < len / 2; i++)
{
temp = a[i];
a[i] = a[len - i - 1];
a[len - i - 1] = temp;
}
}
/*将数据写文件*/
void write_file(struct patient *p,char money2[],int de[],int ra[])
{
FILE *writefile;
writefile=fopen("data.txt","w");
norm=expe=0;
for(p=pa;p<pa+patientCount;p++)
{
if(strcmp("normal",p->type)==0)
norm++;
else
expe++;
}
fprintf(writefile,"今日挂号总人数为%d人\n今日挂号费收入为%s元\n\
内科就诊人数%d人,排名为%d\n\
外科就诊人数%d人,排名为%d\n\
皮肤科就诊人数%d人,排名为%d\n\
牙科就诊人数%d人,排名为%d\n\
骨科就诊人数%d人,排名为%d\n\n\
专家号%d人,普通号%d人\n\
内科年龄比例(14岁以下,14至25岁,25岁以上)为:%d:%d:%d\n",patientCount,money2,de[0],ra[0],de[1],ra[1],de[2],ra[2],de[3],ra[3],de[4],ra[4],expe,norm,x,y,z);
fclose(writefile);
}