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

实验内容:

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

实验分析:

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

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


实验源代码:

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

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

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


存在的问题:

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

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

     

大一java 编程题目 排队打饭

01-14

题目描述rn问题描述:rnrn每天中午下课铃一打,同学们为了能尽早吃上饭,不要排那么长时间的队,都像狼一样冲向食堂,校领导看到这种情况很是担忧,因为学生们这样狂奔很危险,所以就要求必须等所有同学都来到食堂才能开始打饭,并且把排队打饭的顺序固定下来,这样谁都不用抢了。rnrn学校里一共有N(1<=N<=100)个学生,每个学生打饭所需时间也是已知的,为了不让学生排队等得心烦,要求设计一个排队顺序使得所有学生的等待时间之和最小,等待时间为从开始排队到开始打饭所需的时间,所以第一个学生的等待时间为0。rnrn为了给同学们新鲜感,领导想在保证等待时间之和最小的情况下尽可能多地改变排队顺序,所以想知道一共有多少种排队顺序?你能帮忙吗?rnrn输入rn输入格式:rnrn第一行输入一个整数N(1<=N<=100),表示学生人数。rnrn第二行输入N个正整数(在1到100之间),中间用空格隔开,表示每个学生打饭所需要的时间。rnrn输出rn输出格式:rnrn 一行输出两个整数,第一个数表示最小的等待时间之和,第二个整数表示在保证等待时间之和最小的前提下的排队方案数,第二个数可能很大,所以输出方案总数对2011的余数。rnrn样例输入rn4rn1 2 1 2rn样例输出rn7 4rn提示rnrn样例解释:rnrnrn 有4种排队方案分别是1 3 2 4、3 1 2 4、1 3 4 2、3 1 4 2,等待时间为7.

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

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试