资源描述
专业设计汇报
课程名称: C 语 言 程 序 设 计
课题名称: 医院信息管理系统
专业班别: 12本计算机科学和技术二班
姓 名:
学 号:
指导老师:
设计日期: -5-25
老师评语:
等级
项目
优
良
中
及格
差
专业设计目标
设计基础要求
算法分析
源程序代码
源程序代码测试
设计总结
成绩评定:
指导老师署名:
日期: 年 月 日
课程设计题目 医院信息管理程序
作者姓名:
同组组员:
摘要 利用结构体存放每个病人信息和每种药品信息,并使用链表存放全部病人信息;能完成对医院内全部病人信息注册、查询、删除和修改等操作,同时又能对药房内库存药品进行查询;能够将链表中病人信息保留在文件中,而且能够对文件中病人信息进行读取和显示
1.专业设计目标
1、掌握链表操作,包含链表节点创建、释放还有链表遍历
2、掌握对二进制文件创建、增添等基础操作。
3、熟悉C语言函数使用方法,学会模块化处理问题和多个源文件处理方法
2.设计基础要求(
1、使用结构体来存放病人信息,结构体中包含病id号码、姓名、病历和消费信息,并用链表将全部病人信息整合。
2、用文件来存放链表信息方便下次再使用该程序时载入病人信息
3、能够实现病人信息注册、病人信息查询、病人消费统计、保留链表信息、载入链表信息、查询库存等几项功效。
4、要求用四个源文件main.c、link.c、find.c、save_load.c
5、系统完成后应实现类似下面所表示界面
3、算法分析
1、数据结构
设计链表中一个节点存放一个病人信息,使用下面结构体类型定义:
struct patient{
char id[10];
char name[10];
char casehist[200];
int cost[3];
int transfusion;
int surgery;
struct patient *next;
};
其中cost数组用来存放病人卖药个数(总共三种药),casehist存放病历内容,transfusion用来存放病人输液花费,surgery存放手术花费。Struct patient *next用来指向下一个病人结构体起始地址从而形成一个链表。
另外还要用到一个结构体来存放库存中目前药品情况。
struct storage{
int amount[3];
int price[3];
};
2、函数定义
程序代码有main.c、link.c、find.c、save_load.c四个源文件组成,使用头文件head.h把四个源文件连接起来,四个文件中所包含函数说明如表所表示。
源文件
函数原型
功效说明
Main.c
void test()
检测有没有存放病人二进制文件
void init(struct storage *temp)
初始化库存中药品,参数为指向struct storage类型指针
void printmenu()
打印提醒菜单
Void liststock(struct storage temp)
列出库存中药品
struct patient *enroll()
注册新病人信息
void freeall(struct patient *temp)
清除链表内容,参数为指向struct patient类型指针
Find.c
void search(struct patient *temp)
查询单个病人信息,参数为指向struct patient类型指针
void listall(struct patient *temp)
列出全部病人信息,参数为指向struct patient类型指针
Link.c
struct patient *insert(struct patient *head,struct patient *rea
加入新节点,参数为指向struct patient类型指针
void modify(struct patient *temp)
修改病人病历,参数为指向struct patient类型指针
void buy(struct patient *temp,struct storage *s)
/用于病人消费处理,参数为指向struct patient类型指针和指向struct storage指针
Save_load.c
void save(struct patient *head)
将链表信息保留到文件中,参数为指向struct patient类型指针
struct patient *load(struct patient *head)
将文件信息写入到链表中,参数为指向struct patient类型指针
3、处理过程
(1)检验存放病人信息文件是否存在,若不存在则创建一个新文件并设置flag值为1,以标识现在能够对链表进行操作。
(2)初始化库存令巴米尔、感冒灵、病毒唑3种药数量分别为20、20、10,价格分别为5、9、16。
(3)输出提醒菜单让用户悬着要操作项目.
1)写病历前先检验是否有可用链表(此标识为flag值,若为1则代表能够修改病历,不然要求用户重新做出选择)。确定有可用链表以后进入modify函数。要求用户输入病人id号码,然后在链表中寻求该病所对应节点,若无此病人id则直接输出提醒信息后返回:若找到后,先输出原来病历内容,然后提醒用户输入目前日期和新添加病历内容,调用strcmp函数将新内容追加到原来casehist字符串数组中。
printf("原有病历: %s\n",temp->casehist);
printf("输入目前日期 年份");
gets(a);
printf("输入目前月份");
gets(b);
printf("输入目前日子");
gets(c);
strcat(temp->casehist,a);
strcat(temp->casehist,"/");
strcat(temp->casehist,b);
strcat(temp->casehist,"/");
strcat(temp->casehist,c);
strcat(temp->casehist,":");
printf("请输入新病历内容\n");
gets(d);
strcat(temp->casehist,d);
········
2)载入链表信息是首先定义一个文件指针,然后以只读方法打开文件。若失败则输出提醒信息返回,成功后调用malloc函数来申请一块内存,用read函数将文件内容写入到节点中,随即调用insert函数将节点加入链表,如此循环下去直到fread函数返回0值,即文件已经读到了末尾时,再将链表头指针返回给主函数即可。Flag值置为1,用来代表已经有可用链表。
if((fp=fopen("data","r"))==0){
printf("文件不存在!");
return head;
}
while(1){
rear=(struct patient *)malloc(sizeof(struct patient));
if(fread(rear,sizeof(struct patient),1,fp))
head=insert(head,rear);
}
else{
free(rear);
flag=1;
break;
}
}
4、源程序代码
/*head.h*/
#ifndef FIRST
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
struct patient{ //存放一个病人信息
char id[10]; //id数组存放病人号码
char name[10]; //name数组存放病人姓名
char casehist[200]; //casehist存放病历内容
int cost[3]; //cost数组存放病人买药个数(总共三种)
int transfusion; //transfusion存放病人输液花费
int surgery; //surgery存放手术花费
struct patient *next;
//struct patient *next用来指向下一个病人结构体起始地址从而形成一个链表
};
struct storage{ //存放库存中目前药品情况
int amount[3];
int price[3];
};
int flag;
void search(struct patient *temp); //查询单个病人信息,参数为指向struct patient类型指针
void listall(struct patient *temp); //列出全部病人信息,参数为指向struct patient类型指针
struct patient *insert(struct patient *head,struct patient *rear);
//加入新节点,参数为指向struct patient类型指针
void modify(struct patient *temp); //修改病人病历,参数为指向struct patient类型指针
void buy(struct patient *temp,struct storage *s);
//用于病人消费处理,参数为指向struct patient类型指针和指向struct storage指针
struct patient *load(struct patient *head);
//将文件信息写入到链表中,参数为指向struct patient类型指针
void save(struct patient *head);
//将链表信息保留到文件中,参数为指向struct patient类型指针
#define FIRST
#endif
/*find.c*/
#include "head.h"
void search(struct patient *temp){ //定义search函数,查询单个病人信息
char t[10]; //定义字符数组
int sum; //定义整型变量sum
printf("请输入病人id\n");
gets(t); /输入字符串
while(temp&&strcmp(temp->id,t)){
//比较字符串temp->id和t,其值和temp逻辑和运算,结果为非0时,实施循环体
temp=temp->next;
}
if(temp){ //temp值为非0时,实施下列步骤
printf("id: %s\n",temp->id);
printf("\n姓名: %s",temp->name);
printf("\n病历: \n%s",temp->casehist);
printf("\n消费统计:\n");
if(temp->cost[0]){
printf("巴米尔 %d个\n",temp->cost[0]);
}
if(temp->cost[1]){
printf("感冒灵 %d个\n",temp->cost[1]);
}
if(temp->cost[2]){
printf("病毒唑 %d个\n",temp->cost[2]);
}
if(temp->transfusion){
printf("输液费 %d\n",temp->transfusion);
}
if(temp->surgery){
printf("手术费 %d\n",temp->surgery);
}
sum=temp->cost[0]*5+temp->cost[1]*9+temp->cost[2]*16+temp->transfusion+temp->surgery;
//计算sum值
printf("总费用 %d元",sum);
}
else{
printf("无该病人信息!\n");
}
}
void listall(struct patient *temp){ //定义listall函数,列出全部病人信息
printf("id 姓名\n");
while(temp){
printf("%s %s\n",temp->id,temp->name);
temp=temp->next;
}
}
/*link.c*/
#include "head.h"
struct patient *insert(struct patient *head,struct patient *rear){ /*!!!!!!能够出现反复id*/
struct patient *temp;
if(head){
temp=head;
while(temp->next){
temp=temp->next;
}
temp->next=rear;
rear->next=0;
}
else{
head=rear;
rear->next=0;
}
return head;
}
void modify(struct patient *temp){ //修改病人病历
char t[10],d[200]; //定义字符组
char a[4],b[2],c[2]; //定义字符组
printf("请输入病人id\n");
gets(t); //输入病人id
while(temp&&strcmp(temp->id,t)){ //自动查找病人id
temp=temp->next;
}
if(temp){
printf("原有病历: %s\n",temp->casehist);
printf("输入目前日期 年份");
gets(a); //输入年份
printf("输入目前月份");
gets(b); //输入月份
printf("输入目前日子");
gets(c); //输入日期
strcat(temp->casehist,a); //把字符串a接到temp->casehist后面
strcat(temp->casehist,"/"); //把字符“/”接到temp->casehist后面
strcat(temp->casehist,b); //把字符串b接到temp->casehist后面
strcat(temp->casehist,"/"); //把字符“/”接到temp->casehist后面
strcat(temp->casehist,c); //把字符串c接到temp->casehist后面
strcat(temp->casehist,":"); //把字符“:”接到temp->casehist后面
printf("请输入新病历内容\n");
gets(d); //输入新病历内容
strcat(temp->casehist,d); //把字符串d接到temp->casehist后面
strcat(temp->casehist,"\n"); //把字符"\n"接到temp->casehist后面
}
else{
printf("无此病人信息!\n");
}
}
void buy(struct patient *temp,struct storage *s){ //病人消费处理
char t[10];
int a,b,c,d,e;
int flag1;
printf("请输入病人id\n");
gets(t); //输入病人id
while(temp&&strcmp(temp->id,t)){ //自动查找病人id
temp=temp->next;
}
if(temp){
flag1=0;
do{
printf("请输入买入巴米尔个数:\n");
scanf("%d",&a);
flag1=0;
if(a>s->amount[0]){ //若输入值大于库存值,则提醒"库存不足"
printf("库存不足!\n");
flag1=1;
}
}while(flag1); //flag1=1时,实施循环体
flag1=0;
do{
printf("请输入买入感冒灵个数:\n");
scanf("%d",&b);
flag1=0;
if(b>s->amount[1]){ //若输入值大于库存值,则提醒"库存不足"
printf("库存不足!\n");
flag1=1;
}
}while(flag1); //flag1=1时,实施循环体
flag1=0;
do{
printf("请输入买入病毒唑个数:\n");
scanf("%d",&c);
flag1=0;
if(c>s->amount[2]){ //若输入值大于库存值,则提醒"库存不足"
printf("库存不足!\n");
flag1=1;
}
}while(flag1); //flag1=1时,实施循环体
temp->cost[0]+=a; //temp->cost[0]和a值相加后赋给temp->cost[0]
temp->cost[1]+=b; //temp->cost[1]和b值相加后赋给temp->cost[1]
temp->cost[2]+=c; //temp->cost[2]和c值相加后赋给temp->cost[2]
printf("请输入输液费\n");
scanf("%d",&d);
temp->transfusion+=d; //temp->transfusion和d值相加后赋给temp->transfusion
printf("请输入手术费\n");
scanf("%d",&e);
temp->surgery+=e; //temp->surgery和e值相加后赋给temp->surgery
s->amount[0]-=a; //s->amount[0]减去a值后赋给s->amount[0]
s->amount[1]-=b; //s->amount[1]减去b值后赋给s->amount[1]
s->amount[2]-=c; //s->amount[2]减去c值后赋给s->amount[2]
printf("\n购置成功!\n");
}
else{
printf("无此病人信息!\n");
}
}
/*main.h*/
#include "head.h"
void test(); //检测有没有存放病人二进制文件
void init(struct storage *temp);
//初始化库存中药品,参数为指向struct storage类型指针
void printmenu(); //打印提醒菜单
void liststock(struct storage temp); //列出库存中药品
struct patient *enroll(); //注册新病人信息
void freeall(struct patient *temp); //清除链表内容,参数为指向struct patient类型指针
void main(){
struct patient *head=0,*rear;
struct storage stock;
char ch;
printf("欢迎使用医院管理系统\n");
test();
init(&stock);
while(1) {
printmenu();
fflush(stdin);
ch=getchar();
fflush(stdin);
switch(ch){
case '1':
if(flag){ //检验是否有可用链表
rear=enroll();
head=insert(head,rear); //调用insert函数将节点加入链表
printf("注册成功!\n");
}
else {
printf("您没有载入信息不能注册!\n");
}
break;
case '2':
if(flag){ //检验是否有可用链表
search(head); //查询病人信息
}
else {
printf("您没有载入信息不能进行查询!\n");
}
break;
case '3':
if(flag){ //检验是否有可用链表
modify(head); //修改病人病历
}
else {
printf("您没有载入信息不能修改病历!\n");
}
break;
case '4':
if(flag){ //检验是否有可用链表
buy(head,&stock); //病人消费
}
else {
printf("您没有载入信息不能进行消费!\n");
}
break;
case '5':
if(flag){ //检验是否有可用链表
listall(head); //列出全部病人信息
}
else {
printf("您没有载入信息!\n");
}
break;
case '6':
freeall(head); //清除链表内容
head=0;
head=load(head); //文件信息写入到链表
break;
case '7':
if(flag){ //检验是否有可用链表
save(head); //链表信息保留到病历中
}
else {
printf("您没有载入信息!\n");
}
break;
case '8':
liststock(stock); //库存中药品列表
break;
case '9':
printf("谢谢使用!\n");
exit(0);
break;
default:
printf("输入有误!\n");
break;
}
}
}
void printmenu(){ //打印提醒菜单
printf("\n");
printf("******************************\n");
printf("1.注册新病人信息\n");
printf("2.查询单个病人信息\n");
printf("3.写病历\n");
printf("4.病人消费\n");
printf("5.列出全部病人信息\n");
printf("6.载入全部病人信息\n");
printf("7.保留现有信息\n");
printf("8.查询库存\n");
printf("9.退出\n");
printf("******************************\n");
}
void test(){ //检测病人有没有存放病人二进制文件
FILE *fp;
if((fp=fopen("data","r"))==0){
printf("这是您第一次使用该系统,在退出时不要忘了保留信息\n");
fp=fopen("data","w"); //打开外部文件
flag=1;
fclose(fp); //文件实施后返回fp
}
}
void init(struct storage *temp){ //初始化库存中药品,参数为指向struct storage类型指针
temp->amount[0]=20; //初始化库存令巴米尔数量为20
temp->amount[1]=20; //初始化库存令感冒灵数量为20
temp->amount[2]=10; //初始化库存令病毒唑数量为10
temp->price[0]=5; //初始化库存令巴米尔价格为5
temp->price[1]=9; //初始化库存令感冒灵价格为9
temp->price[2]=16; //初始化库存令感冒灵价格为16
}
void liststock(struct storage temp){ //列出库存中药品
int i;
printf("药品名 数量 单价\n"); //输出库存中各药品数量、价格
for(i=0;i<3;i++){
switch(i) {
case 0:
printf("巴米尔 %d %d\n",temp.amount[i],temp.price[i]);
//输出巴米尔数量、单价
break;
case 1:
printf("感冒灵 %d %d\n",temp.amount[i],temp.price[i]);
//输出感冒灵数量、单价
break;
case 2:
printf("病毒唑 %d %d\n",temp.amount[i],temp.price[i]);
//输出病毒唑数量、单价
break;
}
}
}
struct patient *enroll(){ //注册新病人信息
struct patient *rear;
rear=(struct patient *)malloc(sizeof(struct patient));
printf("请输入病人id:\n");
scanf("%s",rear->id); //取得病人id号码
printf("请输入病人姓名\n");
scanf("%s",rear->name); //取得病人姓名
strcpy(rear->casehist,""); //将注册信息存放进病历
rear->cost[0]=0; //初始化令购置巴米尔花费为0
rear->cost[1]=0; //初始化令购置感冒灵花费为0
rear->cost[2]=0; //初始化令购置病毒唑花费为0
rear->surgery=0; //初始化令手术花费为0
rear->transfusion=0; //初始化令病人输液花费为0
return rear;
}
void freeall(struct patient *temp){ //清除链表内容,参数为指向struct patient类型指针
struct patient *t;
while(temp) {
t=temp;
temp=temp->next;
free(t);
}
}
/*save_load.c*/
#include "head.h"
struct patient *load(struct patient *head){ //将文件信息写入到链表中
FILE *fp; //定义一个指向文件指针变量fp
struct patient *rear;
if((fp=fopen("data","r"))==0){ //以r指定方法打开输入文件datd
printf("文件不存在!");
return head;
}
while(1){
rear=(struct patient *)malloc(sizeof(struct patient));
if(fread(rear,sizeof(struct patient),1,fp)){ //从datd文件中读数据
head=insert(head,rear);
}
else{
free(rear);
flag=1;
break;
}
}
fclose(fp);
return head;
}
void save(struct patient *head){ //将链表信息保留到文件中
FILE *fp; //定义一个指向文件指针变量fp
struct patient *temp;
temp=head;
if((fp=fopen("data","w"))==0){ //以w指定方法打开输入文件datd
printf("文件已损坏!\n");
}
else{
while(temp){
fwrite(temp,sizeof(struct patient),1,fp); //把数据写进datd文件中
temp=temp->next;
}
}
fclose(fp);
}
5、源程序代码测试
输入1,界面以下:
输入4,界面以下:
输入3,界面以下:
输入2,界面以下:
6、结束语
7、参考文件:
谭浩强.C程序设计(第四版).北京:清华大学出版社,
谭浩强.C程序设计(第四版)学习教导.北京:清华大学出版社,
李丹程.C语言程序设计案例实践. 北京:清华大学出版社,
……
……
展开阅读全文