资源描述
目 录
1本系统功能及特色介绍 ………………3
2 题目 ……………………………………4
3系统功能模块结构图 …………………5
4数据结构设计操作和功能说明 ………6
5程序结构(流程图) …………………10
6功能模块介绍 …………………………12
7试验结果 ………………………………12
8 体会 ……………………………………20
9参考文献…………………………………20
10附录:源代码 …………………………21
1.0本系统功能及特色介绍
l 中英文混合输出
在实现了了汉字输出与asc字符输出的基础上,对这两个功能进行了整合,是之能够输出中英文混排的字符串,,并做成头文件供调用,这给程序的界面实现带来了很大的遍历,在功能的实现中,只要提供的一个字符串数组就能实现任意的输出;而且在存储的时候也可以把不类型的字符串存储在一个数组当中。
l 格式化的输入系统
在整个程序当中,在需要用户输入信息的时候,都可以直接调用已经做成函数的简单文本编辑器,定位、编辑十分方便,而且可以实现中英文混合输入。
l 中文输入方法的实现
系统中模仿智能ABC的界面,实现了汉字输入的功能(使用拼音输入法进行输入), 整个汉字输入系统符合智能ABC的输入习惯,用户可以很快上手。
l 整洁的报表系统
可以让用户能更见简单方便的浏览数据库中的信息,根据用户指定的信息,可以在 绘制好的表格中显示详细的用户节点信息和统计信息。
l 完善的查找功能
(1)本系统可以根据用户提供的各种的编号进行精确的查找,
(2)也可以根据用户提供的字 符串对整个数据库进行字串模糊查找,并且在报表清单中显示最接近的详细信息以供用户检索,并且把修改删除功能内嵌在查找函数中,使删除等操作更加准确。
l 数据安全功能
(1)在各种数据的输入中会进纠错处理;
(2)没有用户名和密码将没有权限登陆系统;如果以非管理员的身份登陆系统将不能执行添加数据,删除数据等关键操作,保证了数据的安全。
l 系统化的设计
本系统的设计的时候就考虑了一定的实用性,因此嵌入了相对完善的帮助和提示系统,并且考虑到如果实际运用的效果,软件打开的时候就会自动加载链表,执行完了添加,修改等操作以后就会实时的进行统计,保存等操作,使随时查询到的数据都是准确的。
2题目
2.0题目:医院各科室患者药品消耗信息管理系统
2.1要处理的基础数据
医院科室基本信息参考:
中文字段名
类型及长度
举例
医院编号
char[10]
027-10010
医院名称
char[30]
湖北省协和医院
科室编号
char[10]
10010-110
科室名称
char[10]
协和医院脑外科
科室累计住院患者数
int
564
科室院患者累计药品消耗金额
float
723512
统计日期
char[11]
2008/05/21
统计员
char[10]
科室患者基本信息参考:
中文字段名
类型及长度
举例
科室编号
char[10]
10010-110
科室名称
char[10]
协和医院脑外科
科室住院患者编号
char[18]
10010-110-
科室住院患者姓名
char[8]
李四
科室住院患者身份证号
char[18]
是否出院
char[1]
Y:出院;N:住院
患者药品消耗基本信息参考:
中文字段名
类型及长度
举例
科室编号
char[10]
10010-110
科室住院患者编号
char[18]
10010-110-
药品名称
char[30]
云南白药
药品消耗数量
int
10
药品消耗金额
float
235.50
发药日期
char[11]
2008/05/21
处方员
char[10]
2.2系统功能
(1) 各种基本数据的录入
(2) 各种基本数据的修改。即:允许对以及录入的数据重新进行编辑、修改。
(3) 各种基本数据的插入。
(4) 各种基本数据的删除。
(5) 基于各种数据的查询。
(6) 基于各种基本数据的统计计算。
3系统功能模块结构图
用C语言实现的医院各科室患者药品消耗信息管理系统
图1 系统功能模块结构图示
数据文件处理
数据录入处理
图2数据文件处理结构图示 图3 数据录入模块结构图示
数据检索功能
数据删除处理
图4 数据检索功能结构图示 图5 数据删除处理结构图示
数据报表功能
帮助信息系统
图6 数据报表功能结构图示 图7 帮助信息系统结构图示
4数据结构设计及操作说明
4.1数据结构设计
typedef struct medicine /*药品结构体*/
{
char de_sn[10]; /*科室编号*/
char de_pa_sn[30]; /*病人编号*/
char medicine_name[30]; /*药品名称*/
char medicine_sn[30]; /*药品编号*/
int medicine_num; /*药品数量*/
float price; /*药品单价*/
float sum; /*药品总价格*/
char recipe_sn[11]; /*处方编号*/
char doctor[10]; /*医生姓名*/
struct medicine *next;
}medi;
typedef struct patient /*病人结构体定义*/
{
char de_name[10]; /*科室名称*/
char de_sn[10]; /*科室编号*/
char de_pa_name[18]; /*病人姓名*/
char de_pa_sn[18]; /*病人编号*/
char idcard[18]; /*身份证*/
char is_out; /*病人是否出院*/
float sum; /*病人总的花费*/
medi *head_medi; /*病人的药品消耗链表*/
struct patient *next;
}pati;
typedef struct department /*科室的结构体定义*/
{
char hosp_name[30]; /*医院名称*/
char hosp_sn[10]; /*医院编号*/
char de_name[30]; /*科室名称*/
char de_sn[10]; /*科室编号*/
int patient_sum; /*科室病人书目*/
float cash_sum; /*科室病人花费*/
char recod_date[11]; /*记录时间*/
char recoder[10]; /*记录者*/
pati *head_pati; /*科室的病人链表头指针*/
struct department *next; /*定义指向科室的指针*/
}depa;
4.2系统用法及功能说明
4.2.1系统登录
运行程序以后,会弹出一个版权声明,按任意键进入系统登陆界面。登陆系统的时候需要使用系统内置的用户名和密码才能登陆,有效的保护系统安全。系统的用户也有两种权限,管理员可以执行任何操作,但是一般的用户只能进行浏览而无法进行添加删除等操作。
图8 系统的版权声明信息
图9 登陆界面图示
4.2.2系统操作主界面
进入系统以后,就可以看界面上方的主菜单了。按F10键弹出子菜单,按方向键可以选中不同的子菜单,按enter键以选中相应的功能。
4.2.3添加节点
l 在子菜单中选中添加科室节点后,会顺序的弹出输入提示输入框提示用户输入相应的数据;
l 在子菜单中选中添加病人节点后,先弹出一个输入框要求输入科室编号。科室编号正确会顺序的弹出输入提示输入框提示用户输入相应的数据,科室编号不正确会提示用户重新输入科室编号;
l 添加药品节点的操作与添加病人的操作相近;
4.2.4查找功能
l 在子菜单中选中查找科室节点后,先弹出一个输入框要求输入科室编号。科室编号不正确会提示用户重新输入科室编号,科室编号正确会显示出科室的所有信息;然后用户按m可以对节点信息进行修改,按d可以删除节点。
l 查找病人操作同上,需要输入病人编号即可。
l 查找药品操作同上,需要输入处方编号即可。
l 选中查找任意字符串功能以后,输入想要查找的字符串,如果存在就会显示相应的节点信息,如果找不到也会显示相应信息。
4.2.5删除节点
l 在子菜单中选中删除科室节点后,输入科室编号,科室存在会删除科室节点,科室不存在会提示出错信息
l 删除病人操作同上,需要输入病人编号即可。
l 删除药品操作同上,需要输入处方编号即可。
4.2.6报表信息
l 在子菜单中选中科室报表后,系统会在表格中显示所有的科室的详细信息。
l 在子菜单中选中病人报表后,输入科室编号,科室不存在会提示出错信息 ,科室存在会显示科室所有病人的信息;
l 在子菜单中选中药品报表后,输入病人编号,病人不存在会提示出错信息 ,病人存在会显示病人所有药品的信息;
l 在子菜单中选中任意药品报表后,首先提示是否输入科室号,不输入将显示全院信息,输入只显示科室信息;然后提示输入药品名称或者药品编号,有匹配记录的话会输出所有匹配记录,无匹配记录的话会有相应的提示
4.2.7帮助信息
l 系统版权信息
显示软件作者相应的信息。
l 系统功能提示
显示简单的功能提示。
l 输入法帮助
本程序的输入法的风格是仿照智能ABC的风格的,但也有一些不同,因此通过此功能给与用户相应的帮助。
5程序结构(流程图)
开始
打开字库文件
*str='\0'?
*str>>7&1=0?
算出汉字区码zcode与位码 bcode
利用*str中存储的asc码计算出偏移地址
算出汉字在字库中的偏移地址
len=32L*(zcode*94+bcode);
利用偏移地址从字库中读取字模并在屏幕上以点阵方式显示
str=str+2;
x=x+16;
从asc码字库中读取点阵字模并在屏幕上显示
Str++;
x=x+8;
结束
Y
N
N
Y
图-10 中英文混合输出算法的流程图
图Y
-11 查找和修改科室节点算法流程图N
N
N
N
Y
N
Y
Y
Y
Y
N
N
Y
Y
输出“找不到”信息
Ch='d'
把sn复制进入节点信息
Sn为空?
读入新的科室记录员sn
把sn复制进入节点信息
Sn为空?
读入新的科室名称sn
把sn复制进入节点信息
Sn为空?
结束
Ch='m'?
findde为空?
Sn为空?
读入新的科室编号sn
删除节点
读入字符ch
在屏幕上显示科室的节点信息
对科室链表进行查找并返回指向科室节点的指针findde
读入科室编号存入sn[30]
开始
6功能模块介绍
具体介绍参见第3节(系统操作),运行结果请参见第6节(试验结果)
Ø 系统登陆
Ø 添加节点
Ø 查找功能
Ø 修改节点
Ø 删除节点
Ø 报表信息
Ø 帮助信息
7试验结果
7.1节点插入
三种节点的插入界面类似,下面两图分别是插入成功和失败时的界面提示
图Y
-12 节点插入过程界面
图Y
-12结果插入失败提示界面
7.2节点删除操作结果
节点的删除以科室、病人、药品的编号为key。
图Y
-13 科室节点删除输入界面
图Y
-14 科室节点删除成功信息提示
7.3节点查找与修改的操作结果
本系统把修改的操作内嵌在查找中,查找成功时,可以按m进行数据的修改,按回车不处理当前数据。
图Y
-15 所查找节点不存在的提示界面
图Y
-16 找到科室显示详细信息,按m键以后进入节点内容修改的界面
图Y
-17 找到病人显示详细信息,按m键以后进入节点内容修改的界面
本程序也实现了任意字符串的查找,输入字符串以后,会查找并显示与所检索关键字最相近的节点的信息。
图Y
-18 关键字的输入:可以中英文混合输入
图Y
-19 显示最相近的节点的信息
7.4信息报表操作结果
图Y
-20 科室信息报表界面
图Y
-21 科室病人信息报表界面
图-22 指定病人药品信息报表界面
图Y
-23 指定的药品检索的使用帮助信息
图Y
-24 全医院指定的药品(anti)的检索信息
图Y
-25 指定药品的检索(输入病人编号和药品名)
7.5帮助功能界面
图Y
-26 输入法的系统帮助
8 体会
实验报告的撰写标识着C语言课程设计即将告一段落,但同样也标识着新的学习历程的开始。
接触电脑已经有较长的一段时间了,接触编程也有一段时间了,但是从来没有尝试过编写过一个系统性的东西,C语言课程设计是第一次。拿到课程设计的题目后,大概确定了自己的方向,就开始看书准备的必要的知识了。通过看书,没有接触过的知识都有了一个大概的了解,一些想法(如汉字输入的算法)也有有了一个模糊的框架。
然后就开始程序的编写了,在编程的过程中,有一下几点感触颇深:
Ø 以前都是编写一些比较简单的程序没有什么特别的感觉,一旦开始编写比较大型的 程序,就开始明白代码的规范化的重要性了,无论是变量的命名还是函数的定义,甚至 小到括号的写法。而且, 代码不光是给自己看的,更要让别人能很快看懂自己的程序, 良好的编程风格和注释绝对是非常必要的。因此,明白到培养自己的良好的编程风格的 必要性可能是我本次课程设计最大的收益之处。
Ø 写程序,尤其是做系统性的东西的一定要从最基础的东西开始做起,我在做课程设 计的的时候由于准备的时间比较长,大部分的东西(如输入输出,定位,表格等)都已 经做成了函数,因此在实现课程设计题目要求的功能的时候能够快速的利用自己已经做 好的模块,大大加快了新模块编写的速度。
Ø 编写程序的过程中完成一个任务模块以后最好进行一次简单的调试,我在编程的过 程中有几次为了图快,一次编写了好几个功能,却没有注意到他们之间会产生相互的干 扰,结果在调试中的过程中浪费了大量的时间。
Ø 学习的过程中积累是最重要的,只有平时有了相应的积累,在正真需要应用的时候 才能做到得心应手。比如在课程设计实现的过程中,只有对所需要的东西都比较熟悉了 才能顺利的做下去,并且在练习的过程中得到提高。
Ø 编程一定要多加练习,很多时候设计的算法都没有问题,但是在实现的过程中却 经常被一些小问题搞得焦头烂额,如果平时多看多写程序,在真正实战的时候肯定能有 更好的效率.。
Ø 最后矫情一把:看着自己学步计算机以来的第一个小作品,勉强能给自己算一个 及格。在完成课设的过程中,自己确实是付出了一定的努力,但是更要感谢老师们辛勤 的的教诲,在这半年多的时间里,自己确实有了不少的提高。
Ø 以后的路还很长,这只是一个微不足道的milestone,加油……
9 参考文献
1. 《C语言课程设计》 曹计昌 卢萍 李开 编著 科学出版社
2. 《Turbo C_Borland C++用户界面程序设计》 周升峰 李立新 孙传俊 编著 西安交通大学出版社
3. 《C语言课程设计案例精编》 郭翠英等编著
10 附录(源程序清单)
/*主函数程序清单*/
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include<dos.h>
#include<time.h>
#include<conio.h>
#include<ctype.h>
#include<shows.h> /*显示字符串的头文件*/
#include<data.h> /*自行定义的用来进行记录创建、添加、删除的头文件*/
#include<pass.h> /*进行密码处理的头文件*/
#define size x1,y1,x2,y2 /*一个矩形区域用来简化输入的工作量*/
#define MENUL 100 /*一个单位表格的宽度*/
#define MENUH 20 /*一个表格单位的高度*/
#define MENUS 6 /*定义菜单的个数*/
#define LABLEX 20 /*所画表格x位置的起点*/
#define LABLEY 170 /*所画表格y位置的起点*/
#define LABLE 73,98,580,450 /*表格绘制区域*/
FILE *fp;
char *imagebuf,*menubuf,*tempbuf,*screenbuf;
/*用来保存屏幕的菜单缓存,屏幕缓存和临时缓存*/
char *mainmenu[]={"文件","插入","检索","删除","报表","帮助"};
/*存放菜单信息的字符数组*/
char *menu[MENUS][5]={{"载入","保存","退出","查找字符串"},{"科室","病人","药品"},{"科室","病人","药品","用药记录"},{"科室","病人","药品"},{"科室","病人","病人药品","指定药品"},{"版权声明","功能介绍","输入说明"}};
char *depalist[]={"6","医院科室信息明细表","科室名称","科室编号","住院人数","出院人数","科室收入","记录员"};
char *patilist[]={"5","科室病人信息明细表","科室","住院号","姓名","药品花费","是否出院"};
char *medilist[]={"6","病人用药信息明细表","药名","药品编号","数量","价格","处方编号","药品总价"};
char *help[]={" 医院信息管理系统"," 版权所有 翻版必究","软件作者信息","●班级:计算机0708班","●姓名:王志钢","●学号:U200714739","●电话:15827417499","","版本信息:1.9.1 final "};
char *helpfun[]={"★报表","显示您所查找的节点的信息和统计信息","★添加","在数据库中添加新的节点","★检索","根据您提供的信息查找并显示节点信息","修改和删除的功能也内嵌其中","★删除","直接检索并删除指定的节点","","按任意键返回操作"};
char *helpin[]={"★所有的信息输入都是使用输入框输入","★英文字符输入状态","可以输入任意的asc字符","★中文输入状态","1)按Ctrl+空格进入中文输入状态","2)输入拼音进入选字状态","3)按数字键选中单字","4)继续步骤2)或按Ctrl+空格返回英文","★按Enter键结束一个输入"};
char *rightless[]={"对不起","您的权限无法执行此操作","请用管理员登陆"};
int menunum[]={4,3,4,3,4,3}; /*存放每个菜单下面有多少个子菜单的数组*/
char inputbuf[100]; /*输入缓存*/
depa *findde,*prde; /*指向科室节点的全局变量,用以查找,删除等操作*/
pati *findpa,*prpa; /*指向病人节点的全局变量,用以查找,删除等操作*/
medi *findme,*prme; /*指向药品节点的全局变量,用以查找,删除等操作*/
int right=1;
int ho_pa_num=0,ho_pa_out=0;
float ho_cash_sum=0;
void graphinit(void); /*图形初始化函数*/
void quit(void); /*退出系统函数*/
int saveimage(int,int,int,int,char **); /*保存屏幕区域函数*/
int loadimge(int,int,int,int,char *); /*装载屏幕区域函数*/
void textbox(int,int,int,int,int); /*绘制一个文本框*/
void menuinit(void); /*菜单初始化*/
void menudraw(int,int); /*绘制子菜单*/
void lable(int,int); /*绘制表格*/
void messagebox(int,int,int,int,char *,char *[],int); /*绘制弹出信息窗口*/
void draw3d(int,int,int,int,int,int,int,int); /*绘制一个3d风格的窗口*/
void writetime(void); /*在屏幕的最底下显示系统时间*/
int drawcur(int,int); /*绘制一个光标*/
void showlable(int); /*报表显示函数*/
void drawlist(char **); /*绘制报表表头*/
void add(int); /*添加节点函数*/
void find(int ,char *); /*查找函数*/
void dele(int); /*节点删除函数*/
void login(void); /*登陆函数*/
void input1(int,int,int,int,int); /*显示一个输入框并且能够输入中英文混杂的字符串*/
void statis(void); /*统计函数*/
long getstring(FILE *,long,char *); /*获取一个有效的字符串*/
int checksign(FILE *,long); /*判断读到的符号是否为分号*/
int hanzi(int,char *); /*汉字输入的主函数*/
void catch(int); /*查找函数*/
void myfree(int ,char *); /*释放节点占用的内存*/
void quickshow(int,int,int,int ,char*); /*在屏幕绘制一个输出框并且输出一个字符串*/
void match_pa_me(void) ; /*查找病人是否使用过某种药品*/
void statis_medi(void) ; /*药品统计函数*/
void myfree(int ob,char *a) /*释放节点占用的内存*/
{
depa *p1,*p1t; /*用来存放有当前节点当前节点的链式节点*/
pati *p2,*p2t;
medi *p3,*p3t;
if(ob==1) /*删除科室节点*/
{
p1=(pati *)a;
p2=p1->head_pati;
while(p2)
{
p2t=p2->next;
myfree(2,(char *)p2); /*保证删除科室的时候先清除病人节点*/
p2=p2t;
}
}
if(ob==2) /*删除病人节点*/
{
p2=(pati *)a;
p3=p2->head_medi;
while(p3)
{
p3t=p3->next;
myfree(3,(char *)p3); /*删除病人节点的同时先清除药品节点*/
p3=p3t;
}
}
if(ob==3) /*当控制参数为3的时候删除病人节点*/
{
p3=(medi *)a;
free(p3);
}
}
void quickshow(int x1,int y1,int x2,int y2,char *sn)
/*在屏幕绘制一个输出框并且输出一个字符串*/
{
textbox(x1,y1,x2,y2,WHITE);
shows(x1+1,y1+1,0,CYAN,sn);
}
void match_pa_me(void) /*查找病人是否使用过某种药品*/
{
char *sn[30];
int x0=100,y0=80,c;
char *mes[]={"","★请输入您指定的病人的编号","★请输入您查询的药品的编号","★您也可以输入药品的名字进行查询"}; /*预定义的字符串,用来输出提示信息*/
char *fail[]={"","很抱歉","您输入的病人编号不存在"};
char *fail1[]={"","很抱歉","您指定的病人没有用过该药品"};
char t[100]; /*临时数组,用来存放整形数据转换成的字符串*/
findpa=NULL; /*把病人全局变量定义为空*/
menuinit();
messagebox(180,100,640-180+30,380,"帮助",mes,sizeof(mes)/4);
shows(x0+80,y0,0,RED,"病人编号");
input1(0,x0+150,y0,x0+260,y0+20);
find(2,inputbuf);
if(findpa==NULL)
/*检索完成以后,如果病人信息还是空,则说明没有找到合适的病人信息*/
{
messagebox(180,100,640-180,380,"帮助",fail,sizeof(fail)/4);
return;
}
shows(x0,y0+60,0,RED,"药品的编号或药品名");
input1(0,x0+150,y0+60,x0+260,y0+80);
strcpy(sn,inputbuf);
findme=findpa->head_medi;
while(findme) /*遍历指定的病人列表,找出指定的用药信息*/
{
if((!strcmp(findme->medicine_name,sn))||(!strcmp(findme->medicine_sn,sn)))
/*比较药品名和药品编号*/
break;
findme=findme->next;
}
if(findme==NULL)
{
messagebox(180,100,640-180,380,"帮助",fail1,sizeof(fail1)/4);
/*显示没有找到的信息*/
return;
}
shows(200,200,0,YELLOW,"恭喜您,已经找到您指定的病人用药信息");
shows(100,230,0,c,"您指定的病人-");
quickshow(240,230,320,250,findpa->de_pa_name);
quickshow(330,230,410,250,findpa->de_pa_sn);
shows(100,260,0,c,"已经使用过药品-"); /*显示药品使用信息表列*/
quickshow(240,260,320,280,findme->medicine_name);
quickshow(330,260,410,280,findme->medicine_sn); /*显示药品的编号*/
shows(100,290,0,c,"药品的处方号是");
quickshow(240,290,320,310,findme->recipe_sn);
}
void statis_medi(void) /*单个药品使用信息统计函数*/
{
int x0=100,y0=80,x=50,y=120,usednum=0,i=0,j,flag=1,dy=30,de_ture=0;
/*输出提示信息的坐标*/
float sum,price;
char sn[30],t[30],mename[30],mesn[30]; /*sn指示,临时字符串,药品名,药品编号*/
char *labletitle[]={"5","医院指定药品消耗报表","科室名称","病人姓名","病人编号","处方编号","药品数量"};
char *title[]={"5","科室指定药品消耗报表","科室名称","病人姓名","病人编号","处方编号","药品数量"};
char *mes[]={"","●查询科室药品信息","——请按任意键","——输入科室编号","——输入药品名或者药品编号","●查询医院药品信息","——请按任意键","——直接回车","——输入药品名或者药品编号"};
findde=NULL; /*把科室头指针指空*/
menuinit();
messagebox(180,100,640-180,380,"帮助",mes,sizeof(mes)/4);
shows(x0+80,y0,0,RED,"科室编号");
shows(x0+265,y0,0,YELLOW,"(如果要查询医院信息请直接回车)");
input1(0,x0+150,y0,x0+260,y0+20); /*等待输入科室编号*/
if(strlen(inputbuf)) /*科室编号为空说明统计的是科室信息*/
find(1,inputbuf); /*查找科室信息*/
shows(x0,y0+60,0,RED,"药品的编号或药品名");
input1(0,x0+150,y0+60,x0+260,y0+80);
strcpy(sn,inputbuf); /*输入科室信息*/
lable(14,6);
if(findde==NULL)
{
findde=head;
drawlist(labletitle);
}
else /*绘制不同的表头*/
{
de_ture=1;
drawlist(title);
}
while(findde)
{
findpa=findde->head_pati;
/*对链表进行遍历,查找符合的药品名或者药品编号*/
while(findpa)
{
findme=findpa->head_medi;
while(findme)
{
if((!strcmp(sn,findme->medicine_sn))||(!strcmp(sn,findme->medicine_name)))
/*验证药品名或者编号是否符合要求*/
{
j=0;
shows(LABLEX+5+j++*MENUL,LABLEY+(i+1)*MENUH+2,0,BLACK,findde->de_name);
s
展开阅读全文