实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
#include<iostream>
#include<iomanip>
using namespace std;
struct Process//定义进程控制块
{
char name[10];// 进程名
int priority; //进程优先级
float arive; //进程到达时间
float run; //进程运行时间
float start;//进程开始时间
float finish; //进程完成时间
float zz; //进程周转时间
float dqzz; //进程带权周转时间
bool IsRun; //进程是否运行标志
};
float finish = 0.0f;
int count=0;
void print(Process pro[],int n)//显示进程
{
cout<<"原输入进程信息:"<<endl;
cout<<setw(14)<<"进程编号"<<setw(10)<<"进程名"<<setw(10)<<"优先级"<<setw(10)<<"到达时间"<<setw(10)<<"运行时间"<<endl;
for(int i=0;i<=n-1;i )
{
cout<<setw(10)<<"进程"<<i 1<<setw(10)<<pro[i].name<<setw(10)<<setw(10)<<pro[i].priority
<<setw(10)<<pro[i].arive<<setw(10)<<pro[i].run<<endl;
}
}
void fcfs(Process pro[],int n1)//先来先服务法
{
//先按照提交时间从小到大排列
for(int i = 0 ; i <=n1-2;i )
{
int min = i;
for(int j = i 1;j<n1;j )
{
if(pro[j].arive < pro[min].arive)
{
min = j;
}
}
Process tmpPrp;
memcpy(&tmpPrp,&pro[i],sizeof(Process));
memcpy(&pro[i],&pro[min],sizeof(Process));
memcpy(&pro[min],&tmpPrp,sizeof(Process));
}
/////////////////
int n;
cout<<"进程调度顺序为:";
for(n = 0;n <= n1-1;n )
cout<<pro[n].name<<" ";
cout<<endl;
pro[0].finish = pro[0].arive pro[0].run;
pro[0].start=pro[0].arive;
pro[0].zz = pro[0].finish - pro[0].arive;
pro[0].dqzz = pro[0].zz/pro[0].run;
for(n=1;n <= n1;n )
{
if(pro[n].arive<pro[n-1].finish)
{
pro[n].finish = pro[n].run pro[n-1].finish;
pro[n].start=pro[n-1].finish;
pro[n].zz = pro[n].finish-pro[n].arive;
}
else
{
pro[n].finish=pro[n].run pro[n].arive;
pro[n].start=pro[n].arive;
pro[n].zz=pro[n].run;
}
}
cout<<"调度过程:"<<endl;
cout<<setw(14)<<"进程编号"<<setw(10)<<"进程名"<<setw(10)<<"优先级"<<setw(10)<<"到达时间"<<setw(10)<<"运行时间"<<setw(10)<<"开始时间"<<setw(10)<<"完成时间"<<endl;
for( i=0;i<=n1-1;i )
{
cout<<setw(10)<<"进程"<<i 1<<setw(10)<<pro[i].name<<setw(10)<<setw(10)<<pro[i].priority
<<setw(10)<<pro[i].arive<<setw(10)<<pro[i].run<<setw(10)<<pro[i].start<<setw(10)<<pro[i].finish<<endl;
}
float avezz,avedqzz;
avezz=0;
avedqzz=0;
for(n=0;n<=n1-1;n )
{
avezz =pro[n].zz;
}
avezz=avezz/n1;
cout<<"平均周转时间为:"<<avezz<<endl;
for(n=0;n<=n1-1;n )
{
pro[n].dqzz=pro[n].zz/pro[n].run;
avedqzz = pro[n].dqzz;
}
avedqzz=avedqzz/n1;
cout<<"带权平均周转时间为:"<<avedqzz<<endl;
}
int FindShouldBeRun(Process pro[],int n)//判定优先级并返回在进程表中索引
{
int index = -1;
//sort(pro,n) ;
for(int i = 0 ; i < n; i )
{
if(pro[i].arive <= finish && pro[i].IsRun == false)
{
index = i;
if(i < n-1)
{
for(i = i 1; i <= n-1;i )
{
if(pro[i].arive <= finish &&pro[i].priority > pro[index].priority && pro[i].IsRun == false)
{
index = i;
}
}
return index;
}
return index;
}
}
return index;
}
void pri(Process pro[],int n)//优先级法
{
int i,j;
for(i = 0 ; i <=n-2;i )
{
int min = i;
for( j = i 1;j<n;j )
{
if(pro[j].arive < pro[min].arive)
{
min = j;
}
if(pro[j].arive==pro[min].arive&&pro[j].priority>pro[min].priority)
{
min=j;
}
}
Process tmpPrp;
memcpy(&tmpPrp,&pro[i],sizeof(Process));
memcpy(&pro[i],&pro[min],sizeof(Process));
memcpy(&pro[min],&tmpPrp,sizeof(Process));
}
cout<<"进程调度顺序为:";
cout<<pro[0].name<<" ";
pro[0].finish = pro[0].arive pro[0].run;
pro[0].start=pro[0].arive;
pro[0].zz = pro[0].finish - pro[0].arive;
pro[0].dqzz = pro[0].zz/pro[0].run;
pro[0].IsRun = true;
finish = pro[0].finish;
for(i = 1;i <= n-1; i )
{
int index = FindShouldBeRun(pro,n);
if(index == -1)
{
for(i=0;i<n;i )
{
if(pro[i].IsRun==false) break;
}
cout<<pro[i].name<<" ";
pro[i].IsRun = true;
pro[i].finish=pro[i].arive pro[i].run;
pro[i].start=pro[i].arive;
pro[i].zz=pro[i].run;
finish=pro[i].finish;
pro[i].dqzz = pro[i].zz /pro[i].run;
}
else
{
cout<<pro[index].name<<" ";
pro[index].IsRun = true;
pro[index].finish = finish pro[index].run;
pro[index].start=finish;
pro[index].zz = pro[index].finish - pro[index].arive;
finish = pro[index].run;
pro[index].dqzz = pro[index].zz /pro[index].run;
}
}
cout<<endl;
for(i = 0 ; i <=n-2;i )//按开始时间排序
{
int min = i;
for( j = i 1;j<n;j )
{
if(pro[j].start < pro[min].start)
{
min = j;
}
}
Process tmpPrp;
memcpy(&tmpPrp,&pro[i],sizeof(Process));
memcpy(&pro[i],&pro[min],sizeof(Process));
memcpy(&pro[min],&tmpPrp,sizeof(Process));
}
cout<<"调度过程:"<<endl;
cout<<setw(14)<<"进程编号"<<setw(10)<<"进程名"<<setw(10)<<"优先级"<<setw(10)<<"到达时间"<<setw(10)<<"运行时间"<<setw(10)<<"开始时间"<<setw(10)<<"完成时间"<<endl;
for(i=0;i<=n-1;i )
{
cout<<setw(10)<<"进程"<<i 1<<setw(10)<<pro[i].name<<setw(10)<<setw(10)<<pro[i].priority
<<setw(10)<<pro[i].arive<<setw(10)<<pro[i].run<<setw(10)<<pro[i].start<<setw(10)<<pro[i].finish<<endl;
}
float zzTime = 0.0f;
float dqzzTime = 0.0f;
for(j = 0 ; j < n ; j )
{
zzTime = pro[j].zz;
dqzzTime = pro[j].dqzz;
}
zzTime /= n;
dqzzTime /= n;
cout<<"平均周转时间:"<<zzTime<<endl;
cout<<"平均带全周转时间:"<<dqzzTime<<endl;
return ;
}
int main()
{
int i,j;
int n;
cout<<"请输入进程个数:";
cin>>n;
Process *pro = new Process[n];
Process *pro1 = new Process[n];
Process *pro2 = new Process[n];
for(i = 0 ; i < n; i )
{
memset(&pro[i],0,sizeof(Process));
memset(&pro1[i],0,sizeof(Process));
memset(&pro2[i],0,sizeof(Process));
}
cout<<"请输入进程名:";
for(i=0;i<=n-1;i )
cin>>pro[i].name;
cout<<"请输入进程优先级:";
for(i=0;i<=n-1;i )
cin>>pro[i].priority;
cout<<"请输入各进程到达时间:";
for(i=0;i<=n-1;i )
cin>>pro[i].arive;
cout<<"请输入各进程运行时间:";
for(i=0;i<=n-1;i )
cin>>pro[i].run;
for(i=0;i<n;i )
{
pro1[i]=pro[i];
pro2[i]=pro[i];
}
system("pause");
system("cls");
while(true)
{
cout<<"\t\t"<<"********进程调度模拟算法********"<<endl;
cout<<"\t\t\t"<<"1.先来先服务法:"<<endl;
cout<<"\t\t\t"<<"2.优先法:"<<endl;
cout<<"\t\t\t"<<"其他.exit:"<<endl;
cin>>j;
if(j==1)
{
print(pro,n);
fcfs(pro1,n);
}
else if(j==2)
{
print(pro,n);
pri(pro2,n);
}
else
{
return 0;
}
system("pause");
system("cls");
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论