实验内容:
设计一个模拟饭堂排队打饭管理软件,实现“先来先打饭”的排号叫号管理。
实验分析:
本次实验模拟饭堂排队打饭管理软件,排队的特点是“先来先出”,所以顺理成章地选用顺序队列,作为处理数据的数据结构。
在实际生活中,出队和入队的行为的发生是互不干扰的,出队的速度取决于饭堂阿姨的手速,入队的速度则取决于学生的人数。既然两种行为是相互独立的,因此单线程难以模拟出现实情况。所以我采用了多线程的方式,开启两个线程,独立处理入队和出队的行为。
实验源代码:
#include<iostream>
#include<string>
#include <windows.h>
using namespace std;
const int QueueSize = 20;
template <class T>
class CirQueue
{
public:
CirQueue() { front = rear = QueueSize - 1; } //初始化空队列
~CirQueue() {}
void EnQueue(T x);
T DeQueue();
T GetQueue();
boolean isEmpty()
{
if (front == rear)
return true;
else
return false;
}
private:
T data[QueueSize];
int front, rear;
};
template<class T>
void CirQueue<T> ::EnQueue(T x) //入队操作
{
if ((rear + 1) % QueueSize == front)
throw "上溢";
rear = (rear + 1) % QueueSize;
data[rear] = x;
}
template<class T>
T CirQueue<T>::DeQueue()
{
if (rear == front)
throw "下溢";
front = (front + 1) % QueueSize;
return data[front];
}
template<class T>
T CirQueue<T>::GetQueue()
{
if (rear == front)
return NULL;
int i = (front + 1) % QueueSize;
return data[i];
}
DWORD WINAPI deQueue(LPVOID pParam)
{
string name;
CirQueue<string> *pt = (CirQueue<string> *)pParam;
while (true) //一直等待入队
{
cout << "入队:"<<endl;
cin >> name;
pt->EnQueue(name);
}
return 0L;
}
int main()
{
string stu[20];
CirQueue<string>demo;
cout << "****************广东海洋大学饭堂欢迎你!****************" << endl;
cout << "**********************打饭请排队************************" << endl;
cout << endl;
demo.EnQueue("霜降"); //初始排队人
demo.EnQueue("冬至");
demo.EnQueue("秋分");
HANDLE hThread = CreateThread(NULL, 0, deQueue, (LPVOID)&demo, 0, NULL);
//创建线程 传入参数。
CloseHandle(hThread); //释放线程句柄
Sleep(5000); //等待人排队
while(!demo.isEmpty()) //队列不为空, 一直输出
{
cout << "出队:";
cout << demo.DeQueue() << endl;
Sleep(3000); //每三秒出队一个人
}
cout << "队列已空,欢迎下次就餐!" << endl;
return 0;
}
实验截图:
实验总结与个人心得:
在本次的实验中,我使用了多线程的技术,在此之前,我只是学过java中的多线程技术,并未接触过C++的多线程技术。因此需要不断搜索资料,最后实现了目的。其实多线程技术也不过是C++中的一个类,只要我们去了解一下它如何使用、如何传入参数,就能信手拈来地使用,这点和其他类并无太大区别。
在学习中,我们不能因为对它陌生而畏惧它,相反只要孜孜不倦地求索,就会发现,其实也不过如此。
在编程中,只有有想法,就会有现实它的算法。前提是需要我们不断地尝试。
存在的问题:
在本次的实验中,也存在许多不足。由于出队和入队的信息是打印在同一个控制台上的,导致在入队输入的同时,有可能会输出出队信息,二者信息混在一起,影响观看。尝试过通过“加锁”的方式以解决问题,但效果并不理想。
目前能想到的解决方法是,让程序打开两个窗口,分别是出队窗口和入队窗口,分别打印出队和入队信息,但这涉及到图形化界面的技术。由于本程序已达到“模拟饭堂排队打饭管理”的实验要求,就不再改写了。