#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define maxn 100
int time=0; //定义时间,为全局变量,第一个进程到达时为0;
typedef struct{
char name[20];
int arrivetime;
int servetime;
float rp;
}producer; //进程结构体
float rep(producer s,int time) //计算优先权函数
{
float k;
k=(float)(time-s.arrivetime)/s.servetime;
return k;
}
int n; //n为全局变量,表示进程的总数量
producer p[maxn]; // 定义进程队列数组
void initp(producer p[]) //进程数组的初始化
{
// FILE *fp;
// if ((fp=fopen("数据.txt","r"))==NULL){printf("cannot open file\n");exit(0);}
cout<<"请输入需要加入的进程数量:"<<endl;
cin>>n;
// fscanf(fp,"%d",&n);
int i;
for(i=0;i<n;i++)
{
// fscanf(fp,"%d%s%d",p[i].arrivetime,p[i].name,p[i].servetime);
p[i].rp=0.0;
cout<<"请输入进程"<<i+1<<"的相关参数"<<endl;
cout<<"请输入进程到达的时间: ";
cin>>p[i].arrivetime;
cout<<"请输入进程名: ";
cin>>p[i].name;
cout<<"请输入服务时间: ";
cin>>p[i].servetime;
}
// fclose(fp);
}
int compare(producer p1,producer p2)
{
return p1.rp<p2.rp;
}
int main()
{
FILE *fp;
initp(p);
int i,j;
for(i=0;i<n-1;i++) //排序,求第一个到达的进程
{
for(j=i+1;j<n;j++)
{
if(p[j-1].arrivetime>p[j].arrivetime)
{
producer pp;
pp=p[j-1];
p[j-1]=p[j];
p[j]=pp;
}
}
}
time+=p[0].servetime; //进程完成后的时刻
cout<<"第一个执行进程: "<<p[0].name<<endl;
if ((fp=fopen("进程调度.txt","w"))==NULL){printf("cannot open file\n");exit(0);}
fprintf(fp,"第一个执行进程: %s\n",p[0].name);
cout<<"进程完成后的时刻为:"<<time<<endl;
fprintf(fp,"进程完成后的时刻为:%d\n",time);
int k=0,count=n-1; //count表示剩余进程;
while(count--)
{
k++; //进程执行完一个,k加一,表示从队列第k个开始计算
for(i=k;i<n;i++) //计算优先权
{
p[i].rp=rep(p[i],time);
cout<<"进程 "<<p[i].name<<" 优先权为: "<<p[i].rp<<endl;
fprintf(fp,"进程 %s 优先权为:%f\n",p[i].name,p[i].rp);
}
for(i=k;i<n-1;i++) //对优先权进行排序
{
for(j=i+1;j<n;j++)
{
if(p[j-1].rp<p[j].rp)
{
producer pp;
pp=p[j-1];
p[j-1]=p[j];
p[j]=pp;
}
}
}
time+=p[k].servetime;
cout<<"第"<<k+1<<"个执行: "<<p[k].name<<endl;
cout<<"进程完成后的时刻为:"<<time<<endl;
//printf("第%d个执行:%s\n进程完成后的时刻为:%d\n",k+1,p[k].name,time);
fprintf(fp,"第%d个执行:%s\n进程完成后的时刻为:%d\n",k+1,p[k].name,time);
}
fclose(fp);
return 0;
}
优先权调度算法
最新推荐文章于 2021-04-20 20:48:08 发布