打印机队列.docx
《打印机队列.docx》由会员分享,可在线阅读,更多相关《打印机队列.docx(12页珍藏版)》请在冰豆网上搜索。
打印机队列
课程设计报告
设计题目:
打印机任务队列
学生姓名:
专业:
计算机科学与技术
班级:
学号:
指导教师:
完成日期:
合肥工业大学
计算机与信息学院
一.需求和规格说明
题目:
打印机任务队列
要求:
打印机的打印队列中,每一个打印任务都有一个优先级,为1~9的一个整数(9的优先级最高,1的优先级最低),打印按如下方法进行.
(1)取出打印队列中队首的打印任务J;
(2)如果打印队列中存在优先级高于J的打印任务,则将J移动到打印队列的队尾;否则,打印J.
现在的问题是,要确定你要打印的文件何时打印完毕。
给定当前打印队列(一个优先级队列)和你的打印任务在当前打印队列中的位置,确定你的打印任务完成时需要多长时间。
为了简化问题,假定没有新的打印任务加入到打印队列中;并且,假定完成任何一个打印任务均需要1min时间,向打印队列中加入一个打印任务或从打印队列中移除一个打印任务不需要时间。
例如,当前打印队列为“119111”且你的打印任务在队首时,需要5min.
二.设计
1.设计思想:
根据要求,可采用队列结构存储打印队列,因此,设计出一个打印队列类printqueue来存储数据并实现相关操作。
为了读入打印队列,需设计一个函数createqueue();为了判断打印队列中的优先级,需设计一个函数priority();为了记录打印任务在打印队列中所在位置,可定义一个标识符flag来标记位置;为了算出打印所费时间,可定义一个变量time.
确定何时打印结束:
当执行打印时要打印任务在打印队列的队头即flag=1时打印结束。
类图:
printqueue()
intcount;
intfront;
intrear;
intdata[];
intflag;
inttime;
error_codecreatequeue(intx);
boolempty()const;
boolfull()const;
error_codeget_front(int&x)const;
error_codeappend(constintx);
error_codeserve();
boolpriority();
error_codeprint(constintx);
2.设计表示:
属性和方法定义:
类名
成员类别
类型
成员名
描述
printqueue
属性
int
count
当前打印队列中的打印任务数private
int
front
打印队列的队头指针private
int
rear
打印队列的队尾指针private
int
data[]
存储打印队列的数组private
int
flag
标识符,标记要打印的任务在打印队列中的位置public
int
time
打印完成所需时间public
方法
printqueue()
构造函数public
error_code
createqueue()
输入并构造打印队列public
bool
empty()
判断打印队列是否为空public
bool
full()
判断打印队列是否已满public
error_code
get_front()
取打印队列的队头元素public
error_code
append()
出队public
error_code
serve()
入队public
bool
priority()
判断队头打印任务是否优先级最高public
error_code
print()
打印函数public
三.用户手册
1,使用时先输入打印队列,注意打印队列为优先级队列,优先级为1~9,输入-1作为打印队列的输入结束符,且打印队列长度不能超过98。
2,输入打印任务在打印队列中的位置,用数字表示,位置不能超出打印队列长度。
之后计算机便可自行执行打印任务并计算时间。
四.调试及测试
此次设计的程序基本实现了题目中的要求。
程序运行的时空效率分析:
空间消耗:
需要空间存储打印队列,front,rear,count,flag,time及其他中间变量的值,空间消耗较少。
时间性能:
若队列长度为n,则最多需要移动元素n!
次,最多需要打印n次。
时间性能较佳。
测试数据集;
打印队列
打印任务所在位置
运行结果
正确输入
119111-1
1
所用时间为5min
打印任务位置错误
12345-1
6
所用时间为0min
打印队列输入错误
1122410921-1
--
输入错误
打印队列输入错误
cabe123-1
--
输入错误
打印队列超长
123456789….(共99个数)
--
所用时间为0min
打印队列为空
-1
--
--
运行实例截图;
改进设想:
为了简化问题,本实验中假定没有新的打印任务加入到打印队列中,向打印队列中加入一个打印任务或从打印队列中移除一个打印任务不需要时间。
可以设计在打印过程中有新任务加入,且移动元素需要时间情况下的程序。
经验和体会:
通过本课程设计,我掌握队列的基本方法和基本原理,运用语言编程及调试的能力得到提升,学会了用数据结构解决简单的实际问题,对日后的进一步学习大有益处。
附录
源程序清单:
#include
#include
usingnamespacestd;
enumerror_code{success,overflow,underflow,errorinput};
classprintqueue{ //队列类
public:
printqueue(); //构造函数
error_codecreatequeue(intx);
boolempty()const; //判断队列是否为空
boolfull()const; //判断队列是否满
error_codeget_front(int&x)const; //取队头元素
error_codeappend(constintx); //x入队
error_codeserve(); //队尾元素出队
boolpriority(); //判断队头打印任务是否优先级最高
error_codeprint(constintx); //打印函数
intflag; //指示打印任务在打印队列中的位置
inttime; //完成打印任务所需时间
//假定完成任何一个打印任务均需要1min时间
//向打印队列中加入一个打印任务或从打印队列中移除一个打印任务不需要时间
private:
intcount; //队列中元素个数
intfront; //队头指针
intrear; //队尾指针
intdata[100];//存储队列中元素数据的数组
};
printqueue:
:
printqueue(){
count=0;
front=rear=0;
flag=0;
time=0;
}
error_codeprintqueue:
:
createqueue(intx){
if(x<-1||x>9){
cout<<"输入错误!
"<count=0;
front=rear=0;
flag=0;
time=0;
returnerrorinput;
}
if(x!
=-1)
{
rear=(rear+1)%100;
data[rear]=x;
count++;
if(full())returnoverflow;
intm;
cin>>m;
createqueue(m);
}
returnsuccess;
}
boolprintqueue:
:
empty()const{
if(count==0)returntrue;
returnfalse;
}
boolprintqueue:
:
full()const{
if(count==98)returntrue; //除头尾指针外共有99个位置能存储数据
//队尾必须留一个空位将对头任务插入到队尾,所以count=98时规定队列满
returnfalse;
}
error_codeprintqueue:
:
get_front(int&x)const{
if(empty())returnoverflow;
x=data[(front+1)%100];
returnsuccess;
}
error_codeprintqueue:
:
append(constintx){
if(full())returnoverflow;
rear=(rear+1)%100;
data[rear]=x;
count++;
returnsuccess;
}
error_codeprintqueue:
:
serve(){
if(empty())returnunderflow;
front=(front+1)%100;
count--;
returnsuccess;
}
boolprintqueue:
:
priority(){
intx;
x=data[(front+1)%100];
for(intn=1;n{
if(x}
returntrue;
}
error_codeprintqueue:
:
print(constintx){
if(empty())returnunderflow;
if(full())returnoverflow;
if(x>count){
cout<<"输入错误!
"<returnerrorinput;
}
flag=x;
if(priority())
{
cout<time++;
if(flag==1)returnsuccess;
}
else
{
append(data[(front+1)%100]);
if(flag==1)flag=count;
}
serve();
flag--;
print(flag);
}
intmain()
{
printqueueQ;
intx;
cout<<"请输入打印队列(一个优先级队列),以-1为结束符"<cout<<"优先级为1~9的一个整数,9的优先级最高,1的优先级最低),"<cin>>x;
Q.createqueue(x);
if(Q.empty())return-1;
inti;
cout<<"请输入打印任务在打印队列中的位置"<cin>>i;
Q.print(i);
cout<<"打印任务完成,所用时间为"<return1;
}
磁盘文件:
printqueue.cpp