目录
一、题目和要求 „„„„„„„„„„„„„„„„„„„„„ 1
二、系统总体设计 „„„„„„„„„„„„„„„„„„„„ 1
1、需求分析 „„„„„„„„„„„„„„„„„„„„„„„„„„ 1
2、系统功能模块划分 „„„„„„„„„„„„„„„„„„„„„„ 1
三、详细设计 „„„„„„„„„„„„„„„„„„„„„„ 2
1、数据结构设计 „„„„„„„„„„„„„„„„„„„„„„„„ 2
2、函数规划设计 „„„„„„„„„„„„„„„„„„„„„„„„ 3
四、程序运行演示 „„„„„„„„„„„„„„„„„„„„ 16
1、登陆 „„„„„„„„„„„„„„„„„„„„„„„„„„„ 16
2、查询信息 „„„„„„„„„„„„„„„„„„„„„„„„„ 17
3、账单信息 „„„„„„„„„„„„„„„„„„„„„„„„„ 18
4、增加信息 „„„„„„„„„„„„„„„„„„„„„„„„„ 19
五、总结反思 „„„„„„„„„„„„„„„„„„„„„„ 20
六、源代码 „„„„„„„„„„„„„„„„„„„„„„„ 20
一、题目和要求
1、题目:“诊所信息管理系统设计”
2、问题描述:
完成小型诊所的简单信息管理程序,掌握类的设计以及继承和派生的应用。
二、系统总体设计
1、需求分析
1.1 功能要求
设计人类(Person 类)和医生类(Doctor 类),在此基础上,通过增加患者和账单,使它们公用于表示一家诊所的信息管理。
(1)在一条医生记录中,包括医生的专业说明(specialty ),如内科医生(surgeon )、儿科医生(pediatrician ) 、产科医生(obstetrician )及全科医生(general practitioner)。
(2)Doctor 记录还含有诊费(office_vist_fee)。
(3)在一条患者记录中,包括该患者产生的药费(drug_fee) ,患者的诊费(即医生的诊费)。
(4)在一条账单记录中,包括一条患者对象、该患者对应得主治医生、该患者产生的诊费和药费。
(5)应用程序能够显示出诊所中每个患者的信息和对应主治医生的信息。
(6)能够统计出所有患者的总费用。
1.2 问题的解决方案
根据系统功能要求,可以将问题解决分为以下步骤:
(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
(2)分析系统中的各个实体及它们之间的关系;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述;
(5)完成类中各个成员函数的定义;
(6)完成系统的应用模块;
(7)功能调试;
(8)完成系统总结报告。
2、系统功能模块划分
三、详细设计
1、数据结构设计
1.1 类设计
分别定义了person 人类、doctor 医生类、HuanZhe 患者类以及zhangdan 帐单类;在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()用于统计该系统中所有患者的总费用,addzhangdan()增加账单信息,
zhangdanKind()按姓名查询账单信息。
1.1.1 person人类
{protected :
}; string name; string sex; int age; double office_vist_fee;
1.1.2 doctor医生类
{public:
void input(); //增加医生信息
void zhangdanKind() ; //按姓名查询医生信息
private:
string speicialty;
};
1.1.3 HuanZhe患者类
{public:
void zhangdanKind(); //按姓名查询患者信息
void input(); //增加患者信息
private:
double drug_fee;
};
1.1.4 zhangdan账单类
{public:
void totl_pay(); // 增加账单信息 //按姓名查询账单信息 void addzhangdan(); void zhangdanKind();
private:
}; string name; double drug_fee; double office_vist_fee; double totl_fee;
1.2 类之间的关系
在该系统中医生与患者都有数据成员姓名(name )、性别(sex )、年龄(age )以及诊费
(office_vist_fee);所以把这些数据成员定义在基类person 人类中,doctor 医生类与HuanZhe 患者类公有继承于基类person 人类。
2、 函数规划设计
在doctor 医生类中,包含了成员函数input()增加医生信息,zhangdanKind()按姓名查询医生信息;在HuanZhe 患者类中,包含了成员函数input()增加患者信息,zhangdanKind()按姓名查询患者信息;在zhangdan 帐单类中,包含了成员函数totl_pay()用于统计该系统中所有患者的总费用,addzhangdan()增加账单信息,zhangdanKind()按姓名查询账单信息。在该系统中,还包含了普通函数adding()实现增加信息界面,search()实现查询信息界面,zhangdanxinxi()实现账单信息界面,landing()验证用户登陆, 登陆成功显示欢迎信息,surface()实现诊所信息管理系统主界面。
其中adding()增加信息界面包括了1、增加医生信息2、增加患者信息0、返回上一页;select()查询信
息界面包括了1、查询医生信息2、查询患者信息0、返回上一页;zhangdanxinxi() 账单信息界面包括了1、增加账单信息2、查询账单信息3、统计总费用0、返回上一页;surface()诊所信息管理系统主界面包括了1、查询信息2、账单信息3、增加信息4、统计总费用0、退出系统;main()主函数界面包括了
1、用户登录0、退出系统。在这些界面的实现中用switch()语句做选择。
2.1增加医生信息
void doctor::input()
{
cout>name;outdoctor>sex;outdoctor
cout
} } cin>>age;outdoctoroffice_vist_fee;outdoctor>speicialty;outdoctor
2.2按姓名查询医生信息
void doctor::zhangdanKind()
{
fstream indoctor("医生.txt",ios::in); //以读方式打开文件
if(!indoctor) { cout
return;
}
int line=0;
string arr[100][5]; //定义一个string 类型的二维数组, 用来保存从文本内读取的信息 memset(arr,0,sizeof(arr)); //将数组清空
while(!indoctor.eof()) //文件不为空的条件设置 { cout>arr[line][0]>>arr[line][1]>>arr[line][2]>>arr[line][3]>>arr[line][4]; line++;
}
string mz;
cout
cin>>mz; for(int i=0;i龄:"
} cout
char t;
cin>>t;
if(t=='y')
} zhangdanKind(); else return;
2.3 增加患者信息
void HuanZhe::input()
{
cout>name; outH>sex;outH
cout
cin>>age; outHoffice_vist_fee; outH>drug_fee; outH>t; if(t=='y')
} input(); else return;
2.4 按姓名查询患者信息
void HuanZhe::zhangdanKind()
{
fstream inH("患者.txt",ios::in); //以读方式打开文件 if(!inH) { cout
memset(arr,0,sizeof(arr)); ////将数组清空 while(!inH.eof()) //文件不为空的条件设置 { inH>>arr[line][0]>>arr[line][1]>>arr[line][2]>>arr[line][3]>>arr[line][4]; //文件流读取数据
} string mz; cout>mz; for(int i=0;i龄:"return;
}
}
cout
cout
char t;
cin>>t;
if(t=='y')
zhangdanKind();
else
return;
}
2.5 增加账单信息
void zhangdan::addzhangdan()
{
fstream outfile1("账单.txt",ios::out|ios::app); //
if(!outfile1)
cout
else
{
cout
cin>>name;
outfile1
cout
cin>>name;
outfile1
cout
cin>>office_vist_fee;
outfile1
cout
以写方式打开文件
cin>>drug_fee;
outfile1
cout
cin>>totl_fee;
outfile1
outfile1.close();
}
char t;
cout
cin>>t;
if(t=='y')
addzhangdan();
else
return;
}
2.6 查询账单信息
void zhangdan::zhangdanKind()
{
fstream infile1("账单.txt",ios::in); //以读方式打开文件
if(!infile1)
{
cout
return ;
}
string arr[100][5]; //定义一个string 类型的二维数组, 用来保存从文本内读取的信息 int line=0;
memset(arr,0,sizeof(arr)); //将数组清空
while(!infile1.eof()) //文件不为空的条件设置
{
infile1>>arr[line][0]>>arr[line][1]>>arr[line][2]>>arr[line][3]>>arr[line][4]; //取数据
line++;
}
string mz;
cout
cin>>mz;
for(int i=0;i
文件流读
{ if(arr[i][0]==mz) { string xm; xm=arr[i][1]; coutarr[l][0]>>arr[l][1]>>arr[l][2]>>arr[l][3]>>arr[l][4]; //文件流读取数据 memset(arr,0,sizeof(arr)); //将数组清空 l++; for(int j=0;jarr[lin][0]>>arr[lin][1]>>arr[lin][2]>>arr[lin][3]>>arr[lin][4]; //文件流读取lin++; 数据 } { if(arr[i][0]==mz) {
for(int z=0;z
cout}
}
return;
}
}
cout
cout
char t;
cin>>t;
if(t=='y')
zhangdanKind();
else
return;
}
2.7 统计总费用
void zhangdan::totl_pay()
{
fstream infile1("账单.txt",ios::in); //以读方式打开文件
if(!infile1)
{
cout
return ;
}
double arr[100][3]; //定义一个double 类型的二维数组, 用来保存从文本内读取的信息
string arrs[100][2];//定义一个string 类型的二维数组, 用来保存从文本内读取的信息
memset(arr,0,sizeof(arr)); //将数组清空
int line=0;
while(!infile1.eof()) //文件不为空的条件设置
{
infile1>>arrs[line][0]>>arrs[line][1]>>arr[line][0]>>arr[line][1]>>arr[line][2]; //读取数据
line++;
}
double a;
double z=0.0;
for(int i=0;i
{
a=arr[i][2];;
z=z+a;
}
cout
infile1.close();
}
文件流
2.8 登陆
void landing()
{
} string name,code; cout>name; if(name!="yangqing") { } else { } cout>code; if("123456789"==code) { } else { } cout>code; cout
2.9 增加信息界面
void adding()
{
int a; doctor d; HuanZhe w; cout
cout
} cin>>a; { case 1: d.input(); break; case 2: w.input(); break; case 0: break; } default: cout
2.10 查询信息界面
void search()
{
} int b; doctor d; HuanZhe w; cout>b; switch(b) { case 1:d.zhangdanKind();break; case 2:w.zhangdanKind();break; case 0:break; } default:cout:";
2.11 账单信息界面
void zhangdanxinxi()
{
int c; zhangdan z; cout
} cout>c; switch(c) { } case 1:z.addzhangdan();break; case 3:z.totl_pay();break; case 0:break; default: cout:";
2.12 主界面
void surface()
{
landing(); //登陆 int choice; cout:"; cin>>choice; switch(choice) { case 1:search(); break;
} case 0:cout
2.13 主函数
void main()
{
int w; cout:"; cin>>w; switch(w) { case 1:surface();break;
case 0:exit(0);
}
} } default: cout
四、程序运行演示
1、登陆
2.1查询医生信息
2.2 查询患者信息
3.1 查询账单信息
3.2 统计总费用
4.1 增加医生信息
4.2 增加患者信息
五、总结反思
经过几个星期的C++课程设计的训练,我学到了很多,最主要的一点是怎样去运用自己学过的知识,怎样去找到你所需要的资料,并在短时间把它运用到具体的实践中, 运用到你所需要的方面。这个过程是很艰难的,要花费很多的时间和精力,但是,在事情过后,自己就会发现自己已经在这个过程中学到了自己想要的东西,这种获得是更深刻的。
在做这个C++课程设计的时候,我原先也是学的不怎么好,什么是输入输出流, 如何对文件进行操作,什么是继承与派生,等等,可以说是忘得差不多了。然而,在这门课程设计中, 这些方面却是特别重要的,可以说,掌握了这个, 你就完全可以完成自己的任务。这就要求我们要自己去学,自己去探索。当然, 看书、问同学是必不可少的,还有, 身边有非常丰富的网络资源给我们好好利用, 百度就是个很不错的地方。这样就从另一方面锻炼了我们检索知识获取信息的能力,在这个过程中, 可以学到的是一种提升自我的能力。
在本次课程设计中,我发现我对知识的运用不是那么准确,也就是说我对知识掌握的不够熟练。课本上有的知识却不会运用,虽然在本次C++课程设计中,显示出一些我知识上的漏洞,经过这次编写诊所信息管理系统,我发现我熟练掌握了类的定义以及继承与派生,并对文件操作有了初步的掌握,课下还应该继续努力,争取熟练掌握一门编程设计语言,在次基础上,在学习多种编程语言,以便以后可以用到工作中去。当然,期间我也遇到了一些棘手的问题,在“账单.txt ”中,我希望能读取它每个患者账单的总费用并把它们求和,但是尝试了多次,检查了多次,读取文件内容的while 循环一直是死循环,无法读取,终于,我发现了问题所在,并把代码修改了一下,完美解决了问题。
通过这次的课程设计,我的诊所信息管理系统完美告终,让我进一步的了解到C++在我们日常生活中的重要性,而且,也更进一步的激发了我学习这门语言的兴趣。经过这次的训练,我相信自己以后会用更多的时间来把这门语言学好,掌握好这门必修的基础语言。
六、源代码
#include
#include
#include
using namespace std;
class person //人类
{protected:
string name;
string sex;
int age;
double office_vist_fee;};
class doctor:public person //医生类
{public:
void input(); //增加医生信息
void zhangdanKind() ; //按姓名查询医生信息
private:
string speicialty;
};
void doctor::input() //增加医生信息
{
cout
fstream outdoctor("医生.txt",ios::out|ios::app); //以写方式打开文件
if(!outdoctor)
cout
else
{
cout
cin>>name;outdoctor
cout
cin>>sex;outdoctor
cout
cin>>age;outdoctorcout
cin>>office_vist_fee;outdoctor
cout
cin>>speicialty;outdoctor
outdoctor.close();
}
}
void doctor::zhangdanKind() //按姓名查询医生信息
{
fstream indoctor("医生.txt",ios::in); //以读方式打开文件
if(!indoctor)
{
cout
return;
}
int line=0;
string arr[100][5]; //定义一个string 类型的二维数组, 用来保存从文本内读取的信息 memset(arr,0,sizeof(arr)); //将数组清空
while(!indoctor.eof()) //文件不为空的条件设置
{
indoctor>>arr[line][0]>>arr[line][1]>>arr[line][2]>>arr[line][3]>>arr[line][4]; line++;
}
string mz;
cout
cin>>mz;
for(int i=0;i
{
if(arr[i][0]==mz)
{
cout}
}
cout
cout
char t;
cin>>t;
if(t=='y')
zhangdanKind();
else
return;
}
class HuanZhe:public person //患者类
{public:
void zhangdanKind(); //按姓名查询患者信息
void input(); //增加患者信息
private:
double drug_fee;
};
void HuanZhe::input()
{
cout
fstream outH("患者.txt",ios::out|ios::app); //以写方式打开文件
if(!outH)
cout
else
{
cout
cin>>name; outH
cout
cin>>sex;outH
}
cout
cin>>age; outHcout
cin>>office_vist_fee; outH
cout
cin>>drug_fee; outH
outH.close();
cout
char t;
cin>>t;
if(t=='y')
input();
else
return;
}
void HuanZhe::zhangdanKind()
{
fstream inH("患者.txt",ios::in); //以读方式打开文件
if(!inH)
{
cout
return;
}
string arr[100][5]; //定义一个string 类型的二维数组, 用来保存从文本内读取的信息 int line=0;
memset(arr,0,sizeof(arr)); ////将数组清空
while(!inH.eof()) //文件不为空的条件设置
{
inH>>arr[line][0]>>arr[line][1]>>arr[line][2]>>arr[line][3]>>arr[line][4]; //文件流读取数据
line++;
}
string mz;
cout
cin>>mz;
for(int i=0;i
{
if(arr[i][0]==mz)
{
cout}
}
cout
cout
char t;
cin>>t;
if(t=='y')
zhangdanKind();
else
return;}
class zhangdan //帐单类
{public:
void totl_pay();
void addzhangdan(); // 增加账单信息
void zhangdanKind(); //按姓名查询账单信息
private:
string name;
double drug_fee;
double office_vist_fee;
double totl_fee;
};
void zhangdan::totl_pay()
{
fstream infile1("账单.txt",ios::in); //以读方式打开文件
if(!infile1)
{
cout
return ;
}
double arr[100][3]; //定义一个double 类型的二维数组, 用来保存从文本内读取的信息 string arrs[100][2];//定义一个string 类型的二维数组, 用来保存从文本内读取的信息 memset(arr,0,sizeof(arr)); //将数组清空
int line=0;
while(!infile1.eof()) //文件不为空的条件设置
{
infile1>>arrs[line][0]>>arrs[line][1]>>arr[line][0]>>arr[line][1]>>arr[line][2]; //文件流读取数据
line++;
}
double a;
double z=0.0;
for(int i=0;i
{
a=arr[i][2];;
z=z+a;
}
cout
infile1.close();
}
void zhangdan::addzhangdan()
{
fstream outfile1("账单.txt",ios::out|ios::app); //以写方式打开文件
if(!outfile1)
cout
else
{
cout
cin>>name;
outfile1
cout
cin>>name;
outfile1
cout
cin>>office_vist_fee;
outfile1
cout
cin>>drug_fee;
outfile1
cout
cin>>totl_fee;
outfile1
outfile1.close();
}
char t;
cout
cin>>t;
if(t=='y')
addzhangdan();
else
return;
}
void zhangdan::zhangdanKind()
{
fstream infile1("账单.txt",ios::in); //以读方式打开文件
if(!infile1)
{
cout
return ;
}
string arr[100][5]; //定义一个string 类型的二维数组, 用来保存从文本内读取的信息 int line=0;
memset(arr,0,sizeof(arr)); //将数组清空
while(!infile1.eof()) //文件不为空的条件设置
{
infile1>>arr[line][0]>>arr[line][1]>>arr[line][2]>>arr[line][3]>>arr[line][4]; 文件流读取数据
line++;
}
string mz;
cout
cin>>mz;
for(int i=0;i
//
{
if(arr[i][0]==mz)
{
string xm;
xm=arr[i][1];
coutfstream indoctor("医生.txt",ios::in); //以读方式打开文件
if(!indoctor)
{
cout
return ;
}
int l=0;
memset(arr,0,sizeof(arr)); //将数组清空
while(!indoctor.eof()) //文件不为空的条件设置
{
indoctor>>arr[l][0]>>arr[l][1]>>arr[l][2]>>arr[l][3]>>arr[l][4]; //文件流读取数据
l++;
}
for(int j=0;j
{
if(arr[j][0]==xm)
{
cout}
}
fstream inH("患者.txt",ios::in); //以读方式打开文件
if(!inH)
{
cout
return ;
}
int lin=0;
memset(arr,0,sizeof(arr)); //将数组清空
while(!inH.eof()) //文件不为空的条件设置
{
inH>>arr[lin][0]>>arr[lin][1]>>arr[lin][2]>>arr[lin][3]>>arr[lin][4]; //文件流读取数据
lin++;
}
for(int z=0;z
{
if(arr[i][0]==mz)
{
cout}
}
return;
}
}
cout
cout
char t;
cin>>t;
if(t=='y')
zhangdanKind();
else
return;
}
void landing() //登陆
{
string name,code;
cout
cin>>name;
if(name!="yangqing")
{
cout
landing();
}
else
{
cout
cin>>code;
if("123456789"==code)
{
cout
}
else
{
cout
cout
cin>>code;
}
}
}
void adding() //增加信息界面
{
int a;
doctor d;
HuanZhe w;
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cin>>a;
switch(a)
{
case 1: d.input(); break;
case 2: w.input(); break;
case 0: break;
default: cout
}
}
void search() //查询信息界面
{
int b;
doctor d;
HuanZhe w;
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout:";
cin>>b;
switch(b)
{
case 1:d.zhangdanKind();break;
case 2:w.zhangdanKind();break;
case 0:break;
default:cout
}
}
void zhangdanxinxi() //账单信息界面
{
int c;
zhangdan z;
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout:";
cin>>c;
switch(c)
{
case 1:z.addzhangdan();break;
case 2:z.zhangdanKind();break;
case 3:z.totl_pay();break;
case 0:break;
default: cout
}
}
void surface() //主界面
{
landing(); //登陆
int choice;
cout
while(1)
{
cout
cout
cout
cout
zhangdan a;
cout:";
cin>>choice;
switch(choice)
{
case 1:search(); break;
case 2:zhangdanxinxi(); break;
case 3:adding(); break;
case 0:cout
}
}
}
void main()
{
int w;
cout
cout
cout
cout
cout
cout
cout
cout
while(1)
{
cout:";
cin>>w;
switch(w)
{
case 1:surface();break;
case 0:exit(0);
default: cout
}
}
}
- 30 -