本文主要是介绍实验三 模拟饭堂排队打饭管理软件(顺序队列、多线程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
实验内容:
设计一个模拟饭堂排队打饭管理软件,实现“先来先打饭”的排号叫号管理。
实验分析:
本次实验模拟饭堂排队打饭管理软件,排队的特点是“先来先出”,所以顺理成章地选用顺序队列,作为处理数据的数据结构。
在实际生活中,出队和入队的行为的发生是互不干扰的,出队的速度取决于饭堂阿姨的手速,入队的速度则取决于学生的人数。既然两种行为是相互独立的,因此单线程难以模拟出现实情况。所以我采用了多线程的方式,开启两个线程,独立处理入队和出队的行为。
实验源代码:
#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;elsereturn 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++中的一个类,只要我们去了解一下它如何使用、如何传入参数,就能信手拈来地使用,这点和其他类并无太大区别。
在学习中,我们不能因为对它陌生而畏惧它,相反只要孜孜不倦地求索,就会发现,其实也不过如此。
在编程中,只有有想法,就会有现实它的算法。前提是需要我们不断地尝试。
存在的问题:
在本次的实验中,也存在许多不足。由于出队和入队的信息是打印在同一个控制台上的,导致在入队输入的同时,有可能会输出出队信息,二者信息混在一起,影响观看。尝试过通过“加锁”的方式以解决问题,但效果并不理想。
目前能想到的解决方法是,让程序打开两个窗口,分别是出队窗口和入队窗口,分别打印出队和入队信息,但这涉及到图形化界面的技术。由于本程序已达到“模拟饭堂排队打饭管理”的实验要求,就不再改写了。
这篇关于实验三 模拟饭堂排队打饭管理软件(顺序队列、多线程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!