数据结构 python 队列 完成学生打印任务

"""
问题描述:
实验室有10个学生 ,一个小时每人可以打印两次(用来计算一秒的打印概率)
一个学生每次大概打印1-20页(打印任务的页数)
打印机每分钟可以打印页数为 pagePerminute(注意分钟与秒的转换)
问:numseconds(一段时间)内实验室学生要执行一次打印任务平均的等待时间为多少 averages_waittime

输入:
    numseconds(一段时间) pagePerminute(打印机每分钟打印页数)
输出:
    average_waittime(平均等待时间)
"""

第一、计算每秒的打印事件发生的概率
第二、如果有打印发生,则创建打印任务,将其加入等待队列中
第三、如果打印机空闲并且打印队列中有任务等待,则将队列头位置打印任务拿出,计算其等待时间,将结果放入等待时间列表中,确认可以开启打印任务
第四、执行打印任务
第五、计算平均等待时间(所有任务等待时间之和 / 总任务个数)

主代码:

"""
打印机:
输入--》 总时间,打印机每分钟打印的页数
输出--》 学生的平均等待时间
平均等待时间 = 所有任务的等待时间 /总任务数
"""
import random
import queue
from Task1 import Task
from Printer1 import Priter


def createPtask():
    num = random.randrange(1, 181)
    if num == 180:
        return True
    else:
        return False


def simulationTime(numseconds, pageaPerminutes):
    wait_time = []
    waitQueue = queue.Queue()
    labPriter = Priter(pageaPerminutes)
    # 等待时间 = 开始打印时间 - 进入等待队列时间
    for currentSeconds in range(numseconds):
        # 判断是否有打印任务产生
        if createPtask():
            # 定义task类 加入等待队列中
            task = Task(currentSeconds)
            waitQueue.put(task)
        # 如果当前打印机空闲并且队列中有值:
        if not waitQueue.empty() and not labPriter.busy():
            # 把等待队列中的头元素拿去打印
            currenttask = waitQueue.get()
            wait_time.append(currenttask.waittime(currentSeconds))
            labPriter.startPrint(currenttask)
        labPriter.runPrint()
    averagetime = sum(wait_time) / len(wait_time)
    print(' 平均等待时间为 %d 秒,剩余打印任务为 %d' % (averagetime, waitQueue.qsize()))


for i in range(10):
    simulationTime(3600, 5)

Task类:


"""
Task 完成任务:
1、记录任务进入等待队列的时间
2、记录当前打印的页数
3、根据任务开始打印时间 与 任务进入等待队列时间得到任务的等待时间

"""

import random


class Task:
    def __init__(self, time):
        # 任务进入队列时间
        self.inQtime = time
        # 任务的打印页数
        self.pages = random.randrange(1, 21)
    # 任务的等待时间
    def waittime(self, currentseconds):
        return currentseconds - self.inQtime
    # 任务的页数
    def getpages(self):
        return self.pages

打印机类:

"""
实现功能:
   当前打印机是否处于工作状态
   添加打印任务(将打印机置于工作状态,计算当前任务需要打印时间)
    执行打印任务(根据当前任务所需时间来进行)

"""

class Priter:
    def __init__(self, ppm):
        self.currenttask = None
        self.remainingtime = 0
        self.ppm = ppm

    def busy(self):
        if self.currenttask != None:
            return True
        else:
            return False

    def startPrint(self, task):
        self.currenttask = task
        self.remainingtime = task.getpages() * 60 / self.ppm

    def runPrint(self):
        if self.currenttask != None:
            self.remainingtime -= 1
            if self.remainingtime < 0:
                self.currenttask = None

结果:

 平均等待时间为 89 秒,剩余打印任务为 0
 平均等待时间为 167 秒,剩余打印任务为 2
 平均等待时间为 176 秒,剩余打印任务为 2
 平均等待时间为 30 秒,剩余打印任务为 0
 平均等待时间为 70 秒,剩余打印任务为 1
 平均等待时间为 32 秒,剩余打印任务为 0
 平均等待时间为 196 秒,剩余打印任务为 0
 平均等待时间为 65 秒,剩余打印任务为 0
 平均等待时间为 36 秒,剩余打印任务为 1
 平均等待时间为 85 秒,剩余打印任务为 1

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值