资源描述
______________________________________________________________________________________________________________
一、设计题目
编写一个程序定义行医类,反映病人到医院看病,排队看医生的情况,在病人排队过程中,主要发生两件事:
(1) 病人到达诊室,将病历本交给护士,排到等待队列中候诊。
(2) 护士从等待队列中取出一位病人的病历,该病人进入诊室就诊。
要求程序采用菜单方式,其选项及功能说明如下:
(1) 排队------输入病人的病历号,加入到病人排队队列中
(2) 就诊-------病人排队队列中最前面的病人就诊,并将其从队列中删除。
(3) 查看排队------从队首到队尾列出所有的排队病人的病历号。
(4) 下班---------退出运行。
二、需求分析
1)运行环境(软、硬件环境)
软件:Microsoft Visual Studio//Microsoft Visual C++6.0;
硬件:计算机硬件系统(包括键盘等)
2)输入的形式和输入值的范围
输入形式:通过键盘键入测试数据
输入值范围:①字符型(char) 医生,护士
②字符数组 病人病历号
3)输出的形式描述
输入通过显示计算机屏显示,医生选择相应功能之后,显示屏会显示出各种对应信息。
4)功能描述
病人到诊室,交给护士自己的病历表之后,护士登记病人的病历号,同时纳入队列中进行排队等待。当等到该病历号的病人进入诊室进行就诊时,系统删除前一位病人的病历号,同时下一位病人进入等待就诊阶段。如此反复,当时间到达下班时间之后,系统停止运行,医生操作退出系统!此过程中,医生可以随时调动系统数据,查看需要就诊的病人病历号及病人人数,此过程使用队列的遍历函数予以实现。
5)测试数据
分别选择验证相应功能的数据进行实验数据测试。
测试排队功能数据:(选择1)
病历号:100,101,102,103
测试输入错误时,系统显示:(选择12)
测试就诊功能数据:(选择2)
测试查看队列功能数据:(选择3)
测试下班功能数据:(选择4)
三、概要设计
1)抽象数据类型定义描述
(对各类的成员及成员函数进行抽象描述,参见书或ppt 及实验)
①template <class T>
class Node
{
public:
T data; //数据域
Node<T> *next; //指针域
};
②template <class T>
class LinkQueue
{
public:
LinkQueue(); //构造函数,初始化一个空的链队列
~LinkQueue(){}; //析构函数,释放链队中各结点的存储空间
void InQueue(T x); //将元素x入队
T OutQueue(); //将队头元素出队
T GetQueue(); //取链队列的队头元素
int Empty(){
if(front==NULL)
return 1;
return 0;}; //判断链队列是否为空
void Traverse(); //遍历函数
private:
Node<T> *front, *rear; //队头和队尾指针
};
2)功能模块设计(如主程序模块设计)
①头文件
②类:
第一,结点类;
第二,链队列类;
第三,行医类:
③主函数
3)模块层次调用关系图
四、详细设计
实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。
结点类:
template <class T>
class Node
{
public:
T data; //数据域
Node<T> *next; //指针域
};
链队列类:
template <class T>
class LinkQueue
{
public:
LinkQueue(); //构造函数,初始化一个空的链队列
~LinkQueue(){}; //析构函数,释放链队中各结点的存储空间
void InQueue(T x); //将元素x入队
T OutQueue(); //将队头元素出队
T GetQueue(); //取链队列的队头元素
int Empty()
{
if(front==NULL)
return 1;
return 0;
}; //判断链队列是否为空
void Traverse(); //遍历函数
private:
Node<T> *front, *rear; //队头和队尾指针
};
template <class T>
LinkQueue<T>::LinkQueue()
{
front=rear=NULL;
}
template <class T>
void LinkQueue<T>::InQueue(T x)
{
Node<T> *s;
s=new Node<T>;
s->data=x; //申请一个数据域为x的结点s
s->next=NULL;
if(front==NULL)//空队列,新结点既是队头,又是队尾
{ front=rear=s; }
else
{ rear->next=s; //将结点s插入到队尾
rear=s;
}
}
template <class T>
T LinkQueue<T>::OutQueue()
{
Node <T> *p; T x;
if (front==NULL)
{
cout<<"队空"<<endl;
exit(0);
}
p=front;
x=p->data; //暂存队头元素
front=front->next; //将队头元素所在结点摘链
if (front==NULL)
rear=front;
delete p;
return x;
}
template <class T>
void LinkQueue<T>::Traverse()
{
Node<T> *p;
p=front;
cout<<"正在排队的病人显示:"<<endl;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
行医类:
class Hospitalize
{
private:
LinkQueue <int> queue; // 病人队列
public:
Hospitalize(){}; // 无参数的构造函数
~Hospitalize(){}; // 析构函数
void StandInALine(); // 排队
void Cure(); // 就诊
void Display(); // 查看排队
};
void Hospitalize::StandInALine()
{
int num; // 病历号
cout<<"请输入病历号:";
cin>>num; // 输入排队病人
queue.InQueue(num); // 将病历号加入到病人排队队列中
}
void Hospitalize::Cure()
{
if(queue.Empty())
{
cout<<"现已没有病人在排队了!"<<endl;
}
else
{
int a;
a=queue.OutQueue(); // 病人排队队列中最前面的病人就诊,并将其从队列中删除
cout<<a<<"号病人现在就医!"<<endl;
}
}
void Hospitalize::Display()
{
queue.Traverse(); // 从队首到队尾列出所有的排队病人的病历号
cout<<endl;
}
五、调试分析
包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经
验体会。
本实验中遇到问题:
Q1:结点类中的成员设为私有导致后面的链队列类不可使用结点类的相关寒暑;
A1:将结点类中的成员变量或成员函数全部设为公有;或者是将结点类设置为链队列的友元类。
本实验的时间复杂度为0(n),
空间复杂度为0(1);
本实验经验体会:
一个良好的开端对于程序的成功运行具有至关重要的作用。第一节课上,老师说,“有的同学如果想直接在VC上编写程序,而未经过之前的算法等相关准备的话是很难写成功的!”的确,想想自己平时编写程序的时候,如果直接就在VC上编写的话,程序写得很慢,效率会很低!所以,这个实验中,我尝试着按照老师讲的,首先分析了程序的相关要求,联系自己平时所学知识,很快把程序主体架构写出来了,这大大方便了后续的相关工作。在第二节课上,按照要求把相关函数详细代码写出,所以程序第二节课就写好了。所以,这个实验之后,我逐渐明白了在程序编写之前,做好适当的准备是至关重要的。
本实验中,通过上网查找和和同学讨论等方式,这个实验增强了自学能力,有助于提高自己的实践能力,运用知识的能力。
六、用户使用说明
详细列出每一步的操作说明。
第一,病人进入诊室,护士收集病历号并输入至本系统。即选择菜单栏中的“1”,从而实现将病人纳入到队列中去。
第二,当轮到某病历号的病人就诊时,医生可以通过查看未就诊,依然在队列中的病人的病历号,然后选择“2”,实现对该病人的就诊。
第三,该病人就诊完毕,系统删除该病人的信息,即病人出队,下一位病人可以进入就诊阶段。同时,医生可以通过功能键“3”,选择查看病人队列。
第四,当病人队列已无元素,医生下班了,就可以通过选择功能键“4”,从而实现对系统的关闭,系统停止运行。
七、测试结果
菜单显示:
①排队:
②就诊:
③查看队列:
④下班退出系统:
八、附录:程序设计源代码
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
template <class T>
class Node
{
public:
T data; //数据域
Node<T> *next; //指针域
};
template <class T>
class LinkQueue
{
public:
LinkQueue(); //构造函数,初始化一个空的链队列
~LinkQueue(){}; //析构函数,释放链队中各结点的存储空间
void InQueue(T x); //将元素x入队
T OutQueue(); //将队头元素出队
T GetQueue(); //取链队列的队头元素
int Empty()
{
if(front==NULL)
return 1;
return 0;
}; //判断链队列是否为空
void Traverse(); //遍历函数
private:
Node<T> *front, *rear; //队列头指针,尾指针
};
template <class T>
LinkQueue<T>::LinkQueue()
{
front=rear=NULL; //初始化为空
}
template <class T>
void LinkQueue<T>::InQueue(T x)
{
Node<T> *s;
s=new Node<T>;
s->data=x; //申请一个数据域为x的结点s
s->next=NULL;
if(front==NULL)//空队列,新结点既是队头,又是队尾
{ front=rear=s; }
else
{ rear->next=s; //将结点s插入到队尾
rear=s;
}
}
template <class T>
T LinkQueue<T>::OutQueue()
{
Node <T> *p; T x;
if (front==NULL)
{
cout<<"队空"<<endl;
exit(0);
}
p=front;
x=p->data; //暂存队头元素
front=front->next; //将队头元素所在结点摘链
if (front==NULL)
rear=front;
delete p;
return x;
}
template <class T>
void LinkQueue<T>::Traverse()
{
Node<T> *p;
p=front;
cout<<"**正在排队的病人显示(按照病历号):"<<endl;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//医生工作
class Hospitalize
{
private:
LinkQueue <int> queue; // 病人队列
public:
Hospitalize(){}; // 无参数的构造函数
~Hospitalize(){}; // 析构函数
void StandInALine(); // 排队
void Cure(); // 就诊
void Display(); // 查看排队
};
void Hospitalize::StandInALine()
{
int num; // 病历号
cout<<"请输入病历号:";
cin>>num; // 输入排队病人
queue.InQueue(num); // 将病历号加入到病人排队队列中
}
void Hospitalize::Cure()
{
if(queue.Empty())
{
cout<<"现已没有病人在排队了!"<<endl;
}
else
{
int a;
a=queue.OutQueue(); // 病人排队队列中最前面的病人就诊,并将其从队列中删除
cout<<a<<"号病人现在就医!"<<endl;
}
}
void Hospitalize::Display()
{
queue.Traverse(); // 从队首到队尾列出所有的排队病人的病历号
cout<<endl;
}
//主函数
void main()
{
Hospitalize a;
int n;
while (n!= 4)
{
cout<<"*****************************************************************"<<endl;
cout<<"**你好!欢迎进入病人就医管理系统!"<<endl;
cout << " 1. 排队--输入病人的病历号,加入到病人队列中!" << endl;
cout << " 2. 就诊--病人排队队列中最前面的病人就诊,并将其从队列中删除!" << endl;
cout << " 3. 查看排队--从队首到队尾列出所有的排队病人的病历号!" << endl;
cout << " 4. 下班--退出运行!" << endl;
cout<<"*****************************************************************"<<endl;
cout << "--请选择:";
cin >> n;
if(n<1||n>4)
cout<<"**输入错误!请重新选择--"<<endl;
cout<<endl; // 选择功能
switch(n)
{
case 1:
a.StandInALine(); // 排队--输入病人的病历号,加入到病人队列中
break;
case 2:
a.Cure(); // 就诊--病人排队队列中最前面的病人就诊,并将其从队列中删除
break;
case 3:
a.Display(); // 查看排队--从队首到队尾列出所有的排队病人的病历号
break;
}
}
system("pause");
}
Welcome To
Download !!!
欢迎您的下载,资料仅供参考!
精品资料
展开阅读全文