诊所信息管理系统C++课程设计报告(共32页).doc
精选优质文档-倾情为你奉上 课程设计成果 学院: 计算机工程学院 班 级: 学生姓名: 学 号: 设计地点(单位) B5-101 ERP实验室 设计题目: 诊所信息管理系统设计 完成日期:2016 年 6 月 25 日 指导教师评语: 成绩(五级记分制): 教师签名: 目 录1需求分析随着经济的迅速发展,人们的生活水平得到显著提高。医疗服务行业也在人们生活中占据了最重要的一环,随着医改的实施,看病难,看病贵的问题得到了解决,所以为了存储患者信息以及医生信息,为了小型诊所管理的正规化,方便化,诊所信息管理系统在此背景下诞生。面对发展的需要通过专门的管理系统来系统化、规范化以及高效地实现小型诊所管理。并且随着计算机技术的快速发展,计算机的应用逐渐普及和深入,同时计算机软件的需求特日益增长,C+语言是当前最流行的和实用的计算机程序语言。模拟诊所信息管理系统就是对存储患者信息以及医生信息在个人PC上的编程实现。本系统采用了用户身份的注册、登陆、增加信息、查询信息、帐单信息以及统计所有患者的总费用等功能。并分析在现实生活中遇到的问题并得到解决。1.1 问题描述完成小型诊所的简单信息管理程序,掌握类的设计以及继承和派生的应用。1.2 主体功能设计人类(Person类)和医生类(Doctor类),在此基础上,通过增加患者和账单,使它们公用于表示一家诊所的信息管理。(1)在一条医生记录中,包括医生的专业说明(specialty),如内科医生(surgeon)、儿科医生(pediatrician) 、产科医生(obstetrician)及全科医生(general practitioner)。(2)Doctor记录还含有诊费(office_vist_fee)。(3)在一条患者记录中,包括该患者产生的药费(drug_fee) ,患者的诊费(即医生的诊费)。(4)在一条账单记录中,包括一条患者对象、该患者对应得主治医生、该患者产生的诊费和药费。(5)应用程序能够显示出诊所中每个患者的信息和对应主治医生的信息。(6)能够统计出所有患者的总费用。1.3 问题的解决方案根据系统功能要求,可以将问题解决分为以下步骤: (1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;(2)分析系统中的各个实体及它们之间的关系; (3)根据问题描述,设计系统的类层次; (4)完成类层次中各个类的描述; (5)完成类中各个成员函数的定义; (6)完成系统的应用模块; (7)功能调试;(8)完成系统总结报告。1.4开发环境开发系统:Windows 系统,处理器要求最低奔腾处理器,内存32m,建议在i5处理器,128m内存配置下调试。编译集成软件:Microsoft Visual C+ 6.0编译器。Microsoft Visual C+ 6.0编译器。是一个强大的C/C+软件开发工具,操作简单,使用非常广泛,为很多程序员的首选开发工具。2 概要设计2.1 数据设计2.1.1 类设计分别定义了person人类、doctor医生类、HuanZhe患者类以及帐单类;在person人类中,包含了数据成员姓名(name)、性别(sex)、年龄(age)以及诊费(office_vist_fee);在doctor医生类中,增加了数据成员医生的专业说明(drug_fee),包含了成员函数input()增加医生信息,zhangdanKind()按姓名查询医生信息;在HuanZhe患者类中,增加了数据成员患者的药费(drug_fee),包含了成员函数input()增加患者信息,zhangdanKind()按姓名查询患者信息;在zhangdan帐单类中,包含了数据成员姓名(name)、诊费(office_vist_fee)、药费(drug_fee)、总费用(totl_fee),包含了成员函数totl_pay()用于把总费用从"D:bb.txt"文件移到"D:cc.txt",pay()统计该系统中所有患者的总费用,addzhangdan()增加账单信息,zhangdanKind()按姓名查询账单信息。2.1.2 类之间的关系在该系统中医生与患者都有数据成员姓名(name)、性别(sex)、年龄(age)以及诊费(office_vist_fee);所以把这些数据成员定义在基类person人类中,doctor医生类与HuanZhe患者类公有继承于基类person人类。2.1.3 函数设计在doctor医生类中,包含了成员函数input()增加医生信息,zhangdanKind()按姓名查询医生信息;在HuanZhe患者类中,包含了成员函数input()增加患者信息,zhangdanKind()按姓名查询患者信息;在zhangdan帐单类中,包含了成员函数totl_pay()用于把总费用从"D:bb.txt"文件移到"D:cc.txt",pay()统计该系统中所有患者的总费用,addzhangdan()增加账单信息,zhangdanKind()按姓名查询账单信息。在该系统中,还包含了普通函数addinfor()增加信息界面实现,select()查询信息界面实现,zhangdanxinxi() 账单信息界面实现,add_zhuce()实现注册用户,welcome()验证用户登陆,登陆成功显示欢迎信息,Please()诊所信息管理系统主界面的实现。2.2 结构设计2.2.1 系统流程图图2.1 系统流程图2.2.2 界面设计addinfor()增加信息界面包括了1. 增加医生信息2. 增加患者信息0. 退出;select()查询信息界面包括了1. 查询医生信息2. 查询患者信息0. 退出;zhangdanxinxi() 账单信息界面包括了1. 增加账单信息2. 查询账单信息0. 退出;Please()诊所信息管理系统主界面包括了1.查询信息2.账单信息3.增加信息4.统计总费用0.退出系统;main()主函数界面包括了1.用户登录2.用户注册0.退出系统。在这些界面的实现中用switch()语句做选择。3 详细设计3.1 类实现class person /人类protected:string name;char sex;int age;double office_vist_fee;public:person() person() ;class doctor : public person /医生类private:char speicialty15;public:doctor() void input(); /增加医生信息void zhangdanKind() ; /按姓名查询医生信息doctor() ;class HuanZhe : public person /患者类private:double drug_fee; public:HuanZhe()void input() ; /增加患者信息void zhangdanKind(); /按姓名查询患者信息HuanZhe() ;class zhangdan /帐单类string name;double drug_fee;double office_vist_fee;double totl_fee;public:zhangdan() void totl_pay() ; /用于把总费用从"D:bb.txt"文件移到"D:cc.txt"void pay() ; /实现统计所有患者总费用void zhangdanKind() ;/按姓名查询账单信息zhangdan() ;3.2 主函数实现void main()/主函数/system("color 3F");int w;cout<<"tt*n"cout<<"tt n"cout<<"tt n"cout<<"tt 1.用户登录 n"cout<<"tt 2.用户注册 n"cout<<"tt 0.退出系统 n"cout<<"tt n"cout<<"tt n"cout<<"tt*n"while(1)cout<<"请输入数字<0-2>:" cin>>w;switch(w)case 1:Please(); break; case 2:add_zhuce(); break; case 0:exit(0); default: cout<<"输入数字错误!"<<endl;3.3 模块设计增加医生信息如图3.1所示; 图3.1 增加医生信息函数流程图图按姓名查询医生信息如图3.2所示3.2 按姓名查询医生信息函数流程图账单类如图3.3所示图3.3 账单函数统计所有患者总费用如图3.4所示图3.4 统计所有患者总费用函数增加账单信息如图3.5所示图3.5 增加账单信息函数实现注册用户如图3.6所示图3.6 实现注册用户按姓名查询账单如图3.7所示图3.7按姓名查询账单函数验证用户登陆,登陆成功显示欢迎信息如图3.8所示图3.8 登录成功显示欢迎函数4 系统测试4.1 测试数据序号输入内容说明截图12,zhangsan,输2注册,输入姓名及密码,显示成功图4.121输1进入登录界面图4.231登录后显示诊所信息管理系统主界面图4.343在总界面输3进增加信息界面图4.451,lisi,f,32,4.5,erkeyisheng输入要增加医生的相关信息图4.562,wangfang,m,12,4.5,10输入要增加患者的相关信息图4.671在总界面输1进入查询界面图4.781,lisi输1查询医生信息界面,输入姓名得相关信息图4.892,wangfang输2查询患者信息界面,输入姓名得相关信息图4.9102主界面输2进入帐单信息界面图4.10111,wangfang,lisi,4.5,10,14.5输1进入增加账单界面,输入相关信息图4.11122,wangfang输2进入查询账单界面,输患者姓名得到查询结果图4.12134在主界面输4进入统计总费用界面图4.13140在主界面输0退出系统图4.144.2测试结果1.用户注册与登陆(1)用户注册界面如图4.1所示。图 4.1(2)用户登陆界面如图4.2所示。图 4.22诊所信息管理系统主界面如图4.3所示。图 4.33增加信息界面如图4.4所示。图 4.4(1)增加医生信息如图4.5所示。图4.5(2)增加患者信息如图4.6所示。图 4.64查询信息界面如图4.7所示。图 4.7(1)查询医生信息如图4.8所示。图 4.8(2)查询患者信息如图4.9所示。图 4.95帐单信息界面如图4.10所示。图 4.10(1)增加帐单信息如图4.11所示。图 4.11(2)查询帐单信息如图4.12所示。图 4.126统计功能实现如图4.13所示。图 4.13(7)退出系统界面如图4.14所示。图4.144.3 课程设计过程中遇到的问题(1)在switch语句中注意break和return的使用,用return会出现Press any key to coninue导致没有执行完的程序结束。(2)数据类型在类中设的与后来添加的类型不一致,导致错误。(3)写入文件与输出时出现错误。5 总结经过一个多星期的C+课程设计的训练,我学到了很多,最主要的一点是怎样去运用自己学过的知识,怎样去找到你所需要的资料,并在短时间把它运用到具体的实践中,运用到你所需要的方面。这个过程是很艰难的,要花费很多的时间和精力,但是,在事情过后,自己就会发现自己已经在这个过程中学到了自己想要的东西,这种获得是更深刻的。在做这个C+课程设计的时候,我原先也是学的不怎么好,什么是结构体数据,什么是定义类型,怎样在一个main函数中调用别的定义函数,等等,可以说是忘得差不多了。然而,在这门课程设计中,这些方面却是特别重要的,可以说,掌握了这个,你就完全可以完成自己的任务。这就要求我们要自己去学,自己去探索。当然,看书、问同学是必不可少的,还有,身边有非常丰富的网络资源给我们好好利用,百度就是个很不错的地方。这样就从另一方面锻炼了我们检索知识获取信息的能力,在这个过程中,可以学到的是一种提升自我的能力。当然,由于个人能力所限,这份课程设计有一些别的方面还是要参考人家的的资料,在读懂别人材料的同时,自己取人所长,补己之短,经过多次的调试,总结,最后交出一份自己比较满意的答卷。在本次课程设计中,我发现我对知识的运用不是那么准确,也就是说我对知识掌握的不够熟练。课本上有的知识却不会运用,虽然在本次C+课程设计中,显示出一些我知识上的漏洞,经过这次编写诊所信息管理系统,我发现我熟练掌握了类的定义以及继承与派生,并对文件操作有了初步的掌握,课下还应该继续努力,争取熟练掌握一门编程设计语言,在次基础上,在学习多种编程语言,以便以后可以用到工作中去。通过这次的课程设计,终于我的诊所信息管理系统完美告终,让我进一步的了解到C+在我们日常生活中的重要性,而且,也更进一步的激发了我学习这门语言的兴趣.经过这次的训练,我相信自己以后会用更多的时间来把这门语言学好,掌握好这门必修的基础语言。参考文献1李素若,杜华兵编,C+面向对象程序设计.中国水利水电出版社.2013年.2谭浩强编,C+面向对象程序设计.北京:清华大学出版社,2006年.3安志远,贾振华主编,C+程序设计基础.北京:高等教育出版社,2009.64王超,C+程序设计.北京:地质出版社,2006.825王继明,C+程序设计与应用开发M.北京:清华出版社,2008.附录 源程序代码#include <iostream>#include <string.h>#include <string>#include <fstream>#include <cmath>using namespace std;class person /人类protected:string name;char sex;int age;double office_vist_fee;public:person() person() ;class doctor : public person /医生类private:char speicialty15;public:doctor() void input() /增加医生信息char t;cout<<"*主治医生基本信息*"<<endl;fstream outfile("D:aa.txt",ios:out|ios:app); /以写方式打开文件if(! outfile)cout<<"打开文件失败!"<<endl;elsecout<<"姓名:" cin>>name; outfile<<name<<" "cout<<"性别:" cin>>sex;if(sex='m'|sex='M')outfile<<"男"<<" "else if(sex='f'|sex='F')outfile<<"女"<<" "elsecout<<"请重新输入性别:" cin>>sex;if(sex='m'|sex='M')outfile<<"男"<<" "else if(sex='f'|sex='F')outfile<<"女"<<" " cout<<"年龄:" cin>>age; outfile<<age<<" "cout<<"诊费:" cin>>office_vist_fee; outfile<<office_vist_fee<<" " cout<<"专业说明:" cin>>speicialty; outfile<<speicialty<<endl;outfile.close();cout<<"是否继续添加医生信息Y/N.:"<<endl; cin>>t; if(t='y')input();elsereturn;void zhangdanKind() /按姓名查询医生信息char t;fstream infile2("D:aa.txt",ios:in); /以读方式打开文件if(! infile2)cout<<"打开文件失败!"<<endl; return ; int line=0;string arr100100; /定义一个string类型的二维数组,用来保存从文本内读取的信息 memset(arr,0,sizeof(arr); /将数组清空while(!infile2.eof() /文件不为空的条件设置infile2>>arrline0>>arrline1>>arrline2>>arrline3>>arrline4;line+;string na; cout<<"请输入要查询的医生姓名:" cin>>na;for(int i=0;i<line;i+)if(arri0=na)cout <<"医生姓名:"<<arri0 <<" "<<"性别:"<<arri1<<" " <<"年龄:"<<arri2<<" "<<"诊费:"<<arri3<<"元"<<" "<<"专业:"<<arri4<<endl;return;cout<<"记录中没有此医生信息!"<<endl;cout<<"是否继续查询Y/N.:"<<endl; cin>>t; if(t='y')zhangdanKind();elsereturn;doctor() ;class HuanZhe : public person /患者类private:double drug_fee; public:HuanZhe()void input() /增加患者信息char t;cout<<"*患者基本信息*"<<endl;fstream outfile("D:ee.txt",ios:out|ios:app); /以写方式打开文件if(! outfile)cout<<"打开文件失败!"<<endl;elsecout<<"姓名:" cin>>name; outfile<<name<<" "cout<<"性别:" cin>>sex;if(sex='m'|sex='M')outfile<<"男"<<" "else if(sex='f'|sex='F')outfile<<"女"<<" "elsecout<<"请重新输入性别:" cin>>sex;if(sex='m'|sex='M')outfile<<"男"<<" "else if(sex='f'|sex='F')outfile<<"女"<<" " cout<<"年龄:" cin>>age; outfile<<age<<" "cout<<"诊费:" cin>>office_vist_fee; outfile<<office_vist_fee<<" " cout<<"药费:" cin>>drug_fee; outfile<<drug_fee<<endl;outfile.close();cout<<"是否继续添加患者信息Y/N.:"<<endl; cin>>t; if(t='y')input();elsereturn;void zhangdanKind() /按姓名查询患者信息char t;fstream infile2("D:ee.txt",ios:in); /以读方式打开文件if(! infile2)cout<<"打开文件失败!"<<endl; return ;string arr100100; /定义一个string类型的二维数组,用来保存从文本内读取的信息 int line=0; memset(arr,0,sizeof(arr); /将数组清空while(!infile2.eof() /文件不为空的条件设置infile2>>arrline0>>arrline1>>arrline2>>arrline3>>arrline4; /文件流读取数据line+;string na; cout<<"请输入要查询的患者姓名:" cin>>na;for(int i=0;i<line;i+)if(arri0=na)cout <<"患者姓名:"<<arri0 <<" "<<"性别:"<<arri1<<" "<<"年龄:"<<arri2<<" "<<"诊费:"<<arri3<<"元"<<" "<<"药费:"<<arri4<<"元"<<endl;return;cout<<"记录中没有此患者的信息!"<<endl;cout<<"是否继续查询Y/N.:"<<endl; cin>>t; if(t='y')zhangdanKind();elsereturn;HuanZhe() ;class zhangdan /帐单类string name;double drug_fee;double office_vist_fee;double totl_fee;public:zhangdan() void totl_pay() /用于把总费用从"D:bb.txt"文件移到"D:cc.txt"string a;fstream infile1("D:bb.txt",ios:in); /以读方式打开文件if(! infile1)cout<<"打开文件失败!"<<endl; return ;string arr100100; /定义一个string类型的二维数组,用来保存从文本内读取的信息 int line=0; memset(arr,0,sizeof(arr); /将数组清空while(!infile1.eof() /文件不为空的条件设置 infile1>>arrline0>>arrline1>>arrline2>>arrline3>>arrline4; /文件流读取数据line+;for(int i=0;i<line;i+)fstream outfile4("D:cc.txt",ios:out|ios:app); /以写方式打开文件if(! outfile4)cout<<"打开文件失败!"<<endl;elsea=arri4;outfile4<<a<<endl;outfile4.close();infile1.close();void pay() /实现统计所有患者总费用double a;double z=0.0;fstream infile4("D:cc.txt",ios:in); /以读方式打开文件if(! infile4)cout<<"打开文件失败!"<<endl; return ;double s100;int line=0;while(!infile4.eof() /文件不为空的条件设置 infile4>>sline; /文件流读取数据line+;for(int i=0;i<line-1;i+)a=si;z=z+a;cout<<"所有患者的总费用为:"<<z<<"元"<<endl;infile4.close();void addzhangdan() / 增加账单信息fstream outfile3("D:bb.txt",ios:out|ios:app); /以写方式打开文件if(! outfile3)cout<<"打开文件失败!"<<endl;elsecout<<"患者姓名:" cin>>name; outfile3<<name<<" "cout<<"主治医生:" cin>>na