实验三 模拟饭堂排队打饭管理软件(顺序队列、多线程)

实验内容:

     设计一个模拟饭堂排队打饭管理软件,实现“先来先打饭”的排号叫号管理。

实验分析:

     本次实验模拟饭堂排队打饭管理软件,排队的特点是“先来先出”,所以顺理成章地选用顺序队列,作为处理数据的数据结构。

     在实际生活中,出队和入队的行为的发生是互不干扰的,出队的速度取决于饭堂阿姨的手速,入队的速度则取决于学生的人数。既然两种行为是相互独立的,因此单线程难以模拟出现实情况。所以我采用了多线程的方式,开启两个线程,独立处理入队和出队的行为。


实验源代码:

#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++中的一个类,只要我们去了解一下它如何使用、如何传入参数,就能信手拈来地使用,这点和其他类并无太大区别。

     在学习中,我们不能因为对它陌生而畏惧它,相反只要孜孜不倦地求索,就会发现,其实也不过如此。

     在编程中,只有有想法,就会有现实它的算法。前提是需要我们不断地尝试。


存在的问题:

     在本次的实验中,也存在许多不足。由于出队和入队的信息是打印在同一个控制台上的,导致在入队输入的同时,有可能会输出出队信息,二者信息混在一起,影响观看。尝试过通过“加锁”的方式以解决问题,但效果并不理想。

      目前能想到的解决方法是,让程序打开两个窗口,分别是出队窗口和入队窗口,分别打印出队和入队信息,但这涉及到图形化界面的技术。由于本程序已达到“模拟饭堂排队打饭管理”的实验要求,就不再改写了。

     

阅读更多
换一批

没有更多推荐了,返回首页