C语言大作业(医院挂号系统 统计信息 黑框 命令行程序)(附有测试数据)

本文附有源代码及测试数据

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值