📄 shiyan2.cpp
字号:
#include<iostream>
#include<string>
using namespace std;
/*默认前提:
a、等待队列都采用先来先得(FIFO)的占用策略。
b、初始时,占用资源的先后顺序和输入的程序顺序相同
*/
//定义step结构来表示程序每步对资源的需要。
struct step //通过step结构,可以获得在多道程序中所需要用到的占用资源时间,即end-start.
{
int start; //起始时间
int end; //结束时间
int resID; //需要的资源ID
};
//程序对应的数据结构
struct task
{
int taskTime;// 任务执行时间
char taskName[5];//要输入的任务名称
int taskID; //任务ID
int nextStep; //下一个要执行的步骤,为queue的下标。
struct step queue[10]; //执行步骤。
}allTask[5];//5个任务数组
//表示资源的使用状态
struct resource
{
int resTime;//资源释放时间
char resName[5];//要输入的资源名称数组
int resID; //资源ID
int curTask; //当前占用资源的程序,为-1表示没有被占用。
int releaseTime; //当前资源释放的时间
int wait[10]; //等待队列,里面记录的等待程序所对应的ID值。
//wait中用-1表示空闲位置,全为-1队列为空。
}allResource[5]; //5个资源数组
int timer=0; //定义全局时钟
void main()
{
int count=0;
int task_c;//输入的任务数
int resource_c;//输入的资源数
int id;//中间变量
int start;//记录开始占用资源时间
int end;//记录资源占用结束时间
int i;//循环变量
int temp=0;//记录资源释放时间最小的中间变量
int flag=1;//循环终止条件
cout<<"****welcome****"<<endl;
cout<<"please input the names of 3 tasks"<<endl;
cout<<"please read this order:@@this programe you should input 3 taskss@@"<<endl;
while(count<3)//输入3个任务的名称
{
cout<<"taskName"<<count<<":";
cin>>allTask[count].taskName;//输入任务名称
allTask[count].taskID=count;//输入的任务ID
allTask[count].nextStep=0;//初始化所有任务的nextstep=0
count++;
}
task_c=count;//总的任务数
count=0;//count重新置0
cout<<"Please input the names of 3 resources"<<endl;
cout<<"please read this order:@@this programe you should input 3 resources@@"<<endl;
while(count<3)//给资源resID赋值
{
cout<<"rescourceName"<<count<<":";
cin>>allResource[count].resName;//输入资源名称
allResource[count].resID=count;
allResource[count].curTask=-1;//所有资源都没有被占用
for(i=0;i<3;i++)
allResource[count].wait[i]=-1;//将所有资源的wait,初始标记为-1
count++;
}
i=0;
resource_c=count;//记录所输入的资源数
for(count=0;count<resource_c;count++)
cout<<"resourceName:"<<allResource[count].resName<<" resourceID:"<<allResource[count].resID<<endl;//打印出所输入的资源ID和资源name
count=0;
cout<<"Please input the steps of every task."<<endl;
while(count<task_c)
{
i=0;
cout<<"give resources:"<<"task:"<<count<<endl;
do//ly:在这里出现了一个小小的运行时错误,你以前是直接while,那么id还没有被输入时,就要判断他的值,这不是语法错误,但是一个变量声明以后还没有进行赋值就要判断其大小,是一个小小的错误,改用do..while先让id被赋值,就没问题啦~~@_@
{
//cout<<"give resources:"<<"task:"<<count<<endl;
cout<<"id:";//输入id,开始和结束时间
cin>>id;
cout<<"startTime:";
cin>>start;
cout<<"endTime:";
cin>>end;
cout<<endl;
if(start>=end)//开始时间大于结束时间,程序报错
cout<<"error!stratTime must be less than endTime!"<<endl;
else if(id<0||id>resource_c)//id小于0或者大于所有的资源数。程序报错
cout<<"this resourceId is not exist!"<<endl;
//else if(start<allTask[count].queue[i-1].end&&i!=0)//??
//cout<<"error!stratTime must be more than the front's endTime!"<<endl;
else
{
allTask[count].queue[i].resID=id;//第几个任务的第几步所占用的资源是什么,用资源ID表示
allTask[count].queue[i].start=start;//第几个任务的第几步的开始时间
allTask[count].queue[i].end=end;//第几个任务的第几步的结束时间
i++;
}
}while(i<3&&id!=3);
//allTask[count].queue[i].resID=0;//对于任务的资源分配已经完成,ID=0意味着已经不占用资源
count++;
}
cout<<"for single track"<<endl;//计算单线程资源使用率
for(count=0;count<task_c;count++)
{
cout<<"taskName:"<<allTask[count].taskName<<" taslID:"<<allTask[count].taskID<<endl;//打印任务ID和任务名称
for(i=0;i<3&&allTask[count].queue[i].resID!=3;i++)
{
cout<<"resourceID:"<<allTask[count].queue[i].resID<<" startime---endtime :"<<allTask[count].queue[i].start<<"---"<<allTask[count].queue[i].end<<endl;//第几个任务的第几个步骤的资源ID和开始结束时间
allResource[allTask[count].queue[i].resID].resTime+=allTask[count].queue[i].end-allTask[count].queue[i].start;//某种资源的释放总时间
}
allTask[count].taskTime=allTask[count].queue[i-1].end;//某个任务的执行时间等于该任务的最后一个步骤的结束时间
timer=timer+allTask[count].taskTime;//计算总用时
cout<<endl;
}
for(count=0;count<resource_c;count++)
cout<<"resourceName:"<<allResource[count].resName<<" resourceID:"<<allResource[count].resID<<" resTime:"<<allResource[count].resTime<<" efficiency:"<<allResource[count].resTime*100/timer<<endl;//计算单道资源使用率
//开始进行多道资源使用率的运算
cout<<"for multitrack"<<endl;
timer=0;//将全局时钟重新置0
count=0;
i=0;
while(count<task_c)
{
if(allResource[allTask[count].queue[allTask[count].nextStep].resID].curTask==-1)//资源是否闲置,闲置就执行下述操作
{
allResource[allTask[count].queue[allTask[count].nextStep].resID].curTask=allTask[count].taskID;//占用资源。将资源的curtask的值赋值为当前使用它的任务的ID
start=allTask[count].queue[allTask[count].nextStep].start;//任务开始的时间
end=allTask[count].queue[allTask[count].nextStep].end;//结束时间
allResource[allTask[count].queue[allTask[count].nextStep].resID].releaseTime=end-start+timer;//资源释放时间
allTask[count].queue[allTask[count].nextStep].start=timer;
allTask[count].queue[allTask[count].nextStep].end=end-start+timer;
allTask[count].nextStep++;//下一个步骤
}
else
{
while(allResource[allTask[count].queue[allTask[count].nextStep].resID].wait[i]!=-1&&i<3)
i++;
if(i<3)
allResource[allTask[count].queue[allTask[count].nextStep].resID].wait[i]=allTask[count].taskID;//资源的等待队列设置为使用它的任务的ID
}
count++;
}
while(1)
{
count=0;
i=0;
flag=1;//循环终止条件
while(count<resource_c)
{
if(allResource[count].curTask!=-1)//如果资源不闲置,查找releasetime最小的那个任务ID
{
if(temp==0)//比较releasetime大小,找出最小的,把它的releasetime赋给timer
{
temp=allResource[count].releaseTime;
i=count;
}
else
{
if(allResource[count].releaseTime<temp)
{
temp=allResource[count].releaseTime;
i=count;
}
}
}
count++;
}
timer=temp;
temp=0;
if(allTask[allResource[i].curTask].nextStep<3)//ly:你要判断当前任务是否已经结束了,我采用的是检查该任务下一步的resID的值。你自己规定了一个任务只有三个步骤,那么在执行任务的下一步时要检查nextStep的值是不是小于3,大于3代表任务结束了,你以前没有加这个判断,导致程序错误。以后注意咯,一定要控制住循环,在想停的时候停下来
{
if(allResource[allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].resID].curTask==-1)//如果当前任务所要使用的下一个资源闲置
{
allResource[allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].resID].curTask=allTask[allResource[i].curTask].taskID;//当前任务就可以把下一个资源占用
start=allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].start;//下个步骤的开始时间
end=allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].end;//结束时间
allResource[allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].resID].releaseTime=end-start+timer;//该段资源所使用的时间
allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].start=timer;//当前任务的开始时间
allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].end=end-start+timer;//当前任务的结束时间
allTask[allResource[i].curTask].nextStep++;
}
else
{
while(allResource[allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].resID].wait[temp]!=-1&&temp<3)//如果下一个步骤的资源不闲置
temp++;
if(temp<3)
allResource[allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].resID].wait[temp]=allTask[allResource[i].curTask].taskID;//将释放时间最短的那个任务的ID赋给资源的wait
}
}//ly:加的那个if的回括号在这里哦~
temp=0;
if(allResource[i].wait[0]!=-1)//资源的等待队列的wait0不闲置
{
id=allResource[i].wait[0];
allResource[i].curTask=id;
start=allTask[id].queue[allTask[id].nextStep].start;
end=allTask[id].queue[allTask[id].nextStep].end;
allResource[allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].resID].releaseTime=end-start+timer;
allTask[id].queue[allTask[id].nextStep].start=timer;
allTask[id].queue[allTask[id].nextStep].end=end-start+timer;
id=allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].resID;
while(allResource[allTask[allResource[i].curTask].queue[allTask[allResource[i].curTask].nextStep].resID].wait[temp]!=-1)
{
allResource[id].wait[temp]=allResource[id].wait[temp+1];
temp++;
}
allTask[allResource[i].curTask].nextStep++;
}
else
allResource[i].curTask=-1;
temp=0;
i=0;
count=0;
while(count<resource_c)
{
if(allResource[count].curTask!=-1)//如果资源不闲置
flag=0;
count++;
}
if(flag==1) break;
}
for(count=0;count<task_c;count++)//ly:直接帮你写好了,copy你单道的格式*_*
{
cout<<"taskName:"<<allTask[count].taskName<<" taslID:"<<allTask[count].taskID<<endl;//打印任务ID和任务名称
for(i=0;i<3;i++)
{
cout<<"resourceID:"<<allTask[count].queue[i].resID<<" startime---endtime :"<<allTask[count].queue[i].start<<"---"<<allTask[count].queue[i].end<<endl;
}
}
//for(count=0;count<resource_c;count++)
//cout<<allResource[count].resTime*100/timer;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -