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

本文主要是介绍实验三 模拟饭堂排队打饭管理软件(顺序队列、多线程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验内容:

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

实验分析:

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

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


实验源代码:

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

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

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


存在的问题:

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

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

     

这篇关于实验三 模拟饭堂排队打饭管理软件(顺序队列、多线程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/397520

相关文章

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi