首页 > 编程语言 >【C++ Primer Plus习题】12.6

【C++ Primer Plus习题】12.6

时间:2024-09-08 16:25:37浏览次数:3  
标签:const temp two Queue Plus 习题 Primer line wait

1

大家好,这里是国中之林!
❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←

问题:

在这里插入图片描述

解答:
main.cpp

#include <iostream>
#include <cstdlib>
#include <ctime>
#include "queue.h"

using namespace std;

const int MIN_PER_HR = 60;
const int MIN_SIM_HOURS = 150;

bool newcustomer(double x);

int main()
{
	srand(time(0));
	cout << "研究案例:Heather银行自动柜员机\n";
	cout << "请输入队列的最大人数: ";
	int qs;
	cin >> qs;
	Queue line_one(qs);
	Queue line_two(qs);

	cout << "模拟时间要大于等于100." << endl;
	int hours = MIN_SIM_HOURS;//这里就固定为150;
	long cyclelimit = MIN_PER_HR * hours;

	double perhour = 0;
	double min_per_cust;
	Item temp;
	long turnaways;
	long customers, customers_one, customers_two;
	long served;
	long sum_line_one, sum_line_two;
	int wait_time_one, wait_time_two;
	long line_wait;
	double average_wait = 0;

	while (average_wait<1.0)
	{
		turnaways = 0;
		customers = customers_one = customers_two = 0;
		served = 0;
		sum_line_one = sum_line_two = 0;
		wait_time_one = wait_time_two = 0;
		line_wait = 0;
		perhour++;
		min_per_cust = MIN_PER_HR / perhour;
		while (!line_one.isempty())line_one.dequeue(temp);//下次进入前清空队列
		while (!line_two.isempty())line_two.dequeue(temp);//下次进入前清空队列

		for (int cycle = 0; cycle < cyclelimit; cycle++)
		{
			if (newcustomer(min_per_cust))
			{
				if (line_one.isfull()&&line_two.isfull())turnaways++;
				else
				{
					customers++;
					temp.set(cycle);
					if (line_one.queuecount() < line_two.queuecount())
					{
						line_one.enqueue(temp);
						customers_one++;
					}
					else
					{
						line_two.enqueue(temp);
						customers_two++;
					}
				}
			}
			if (wait_time_one <= 0 && !line_one.isempty())
			{
				line_one.dequeue(temp);
				wait_time_one = temp.ptime();
				line_wait += cycle - temp.when();
				served++;
			}
			if (wait_time_two <= 0 && !line_two.isempty())
			{
				line_two.dequeue(temp);
				wait_time_two = temp.ptime();
				line_wait += cycle - temp.when();
				served++;
			}
			
			if (wait_time_one > 0)wait_time_one--;
			if (wait_time_two > 0)wait_time_two--;
			sum_line_one += line_one.queuecount();
			sum_line_two += line_two.queuecount();

		}

		average_wait = (double)line_wait / served;
		if (average_wait < 1)
		{
			if (customers > 0)
			{
				cout << "接受顾客数为:" << customers << endl;
				cout << "服务顾客数为:" << served << endl;
				cout << "turnaways:" << turnaways << endl;
				cout << "平均每分钟的队列长度: ";
				cout.precision(2);
				cout.setf(ios_base::fixed, ios_base::floatfield);
				cout << (double)(sum_line_one+sum_line_two) / cyclelimit << endl;
				cout << "每个顾客平均排队等待时间: " << average_wait << " 分钟\n";
			}
			else
				cout << "No customers!\n";
			cout << "The average " << perhour << " of arrival per hour,and average wait time is" << average_wait << endl<<endl;
		}

	}

	cout << "Done!" <<endl;
	return 0;
}

bool newcustomer(double x)
{
	return (rand() * x / RAND_MAX < 1);
}

queue.h

#pragma once
class Customer
{
private:
	long arrive;//顾客到达的时间
	int processtime;//顾客办事的时间
public:
	Customer() { arrive = processtime = 0; }

	void set(long when);
	long when()const { return arrive; }
	int ptime()const { return processtime; }
};

typedef Customer Item;

class Queue
{
private:
	struct Node { Item item; struct Node* next; };
	enum {Q_SIZE=10};

	Node* front;
	Node* rear;
	int items;
	const int qsize;
	Queue(const Queue&q):qsize(0){}
	Queue& operator=(const Queue& q) { return *this; }

public:
	Queue(int qs=Q_SIZE);
	~Queue();
	bool isempty()const;
	bool isfull()const;
	int queuecount()const;
	bool enqueue(const Item& item);
	bool dequeue(Item& item);
};




queue.cpp

#include "queue.h"
#include <cstdlib>


Queue::Queue(int qs):qsize(qs)
{
	front = rear = NULL;
	items = 0;
}
Queue::~Queue()
{
	Node* temp;
	while (front!=NULL)
	{
		temp = front;
		front = front->next;
		delete temp;
	}
}
bool Queue::isempty()const
{
	return items == 0;
}
bool Queue::isfull()const
{
	return items == qsize;
}
int Queue::queuecount()const
{
	return items;
}
bool Queue::enqueue(const Item& item)
{
	if (isfull())return false;
	Node* node = new Node;
	node->item = item;
	node->next = NULL;
	items++;
	if (front == NULL)
	{
		front = node;
	}
	else
	{
		rear->next = node;
	}
	rear = node;
	return true;
}
bool Queue::dequeue(Item& item)
{
	if (isempty())return false;
	item = front->item;
	items--;
	Node* temp = front;
	front = front->next;
	delete temp;
	if (items == 0)
	{
		rear == NULL;
	}
	return true;
}

void Customer::set(long when)
{
	processtime = rand() % 3 + 1;
	arrive = when;
}

运行结果:
在这里插入图片描述

考查点:

  • 自己看吧…

2024年9月8日16:21:37

标签:const,temp,two,Queue,Plus,习题,Primer,line,wait
From: https://blog.csdn.net/qq_74047911/article/details/142028691

相关文章

  • 【C++ Primer Plus习题】12.5
    大家好,这里是国中之林!❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←问题:解答:main.cpp#include<iostream>#include<cstdlib>#include<ctime>#include"queue.h......
  • 【C++ Primer Plus习题】12.1
    大家好,这里是国中之林!❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←问题:解答:main.cpp#include<iostream>#include"Cow.h"usingnamespacestd;intmain(){ Cowc1; ......
  • C语言程序与设计第四版课后习题 - 1~8章大合集
    前言本文章是一个大合集,按照课后习题的命名方式命名,方便寻找,只需要在目录上点相对应的题号即可在这里插入图片描述第一章课后习题1.1编写一个C程序题目概述:请参照本章例题,编写一个C程序,输出一下信息:*****************************Verygood!*************......
  • 【C++算法全真练习题】迷宫问题
    目录题目描述思路AC解答题目描述‌题目描述‌:‌给定一个二维迷宫,‌其中 0 表示可以走的路,‌1 表示障碍物。‌起点坐标为 (0,0),‌终点坐标为 (m-1,n-1),‌其中 m 和 n 分别是迷宫的行数和列数。‌你需要使用广度优先搜索(‌BFS)‌找到从起点到终点的一条路径......
  • 1.Java基础变量和数据类型练习题
    我写的都是键盘录入,运行没结果,不妨按几下试试 1.输出个人简历packagecom.hz.test01;publicclassZuoye{ publicstaticvoidmain(String[]args){ //inti=0;整形 //byteb=0;字节类型 //shorts=0;短整型 //longl=20l;长整型 //floatf=3.33F;单精度......
  • E31.【C语言】练习:指针运算习题集(上)
    Exercise1求下列代码的运行结果#include<stdio.h>intmain(){ inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1); printf("%d",*(ptr-1)); return0;}答案速查:分析:Exercise2 求下列代码的运行结果//在x86环境下//假设结构体的大小是20个字节......
  • mybatis-plus打印完整sql
     importlombok.extern.slf4j.Slf4j;importorg.apache.ibatis.cache.CacheKey;importorg.apache.ibatis.executor.Executor;importorg.apache.ibatis.mapping.BoundSql;importorg.apache.ibatis.mapping.MappedStatement;importorg.apache.ibatis.mapping.Paramet......
  • 字符数组练习题
    1、下列对 C语言字符数组的描述中错误的是( D ) A.字符数组可以存放字符串B.字符数组中的字符串可以整体输入、输出C.不可以用关系运算符对字符数组中的字符串进行比较D.可以在赋值语句中通过赋值运算符"="对字符数组整体赋值解析:D:不可以在赋值语句中通过赋......
  • java集合基础练习题
    List集合.ArrayList,LinkedList,Vector三者的相同点与不同点?(“Vector”可百度)【面试题】共同点:他们都实现了List接口,意味着他们具有相同的基本操作,如添加、删除、获取元素有序性和可重复性,他们都是有序的,即插入顺序和迭代顺序相同,都允许存储重复的元素都可以动态调整大......
  • 深入探讨 MyBatis-Plus 的 LambdaQueryWrapper (方法使用大全+案例)
    个人名片......