📄 diaodu.cpp
字号:
#include"stdio.h"
#include"stdlib.h"
#include<iomanip.h>
#include"ctype.h"
#include"string.h"
#include"iostream.h"
typedef struct
{
char name[5];//作业名称
float ddsk;//到达时刻
float yxsj;//运行时间
float kssk;//开始时刻
float wcsk;//完成时刻
float T;//周转时间
float W;//带权周转时间
float now_yxsj;//到达在进程所完成时间
// int finish;//完成标志 1表示完成
}work;
//work workobj[15];
work workobj[]={
{"A",0,4,},{"B",1,3,},{"C",2,5,},{"D",3,2,},{"E",4,4,}
};
float PT;//平均周转时间
float PW;//平均带权周转时间
void getwork()
{
// cout<<"";
}
void printwork()
{
float Tsum=0,Wsum=0;
int i5,i6;
cout<<"--------------------进程情况-----------------"<<endl;
cout<<"进 程 名 ";
for(int i=0;i<sizeof(workobj)/sizeof(work);i++)
cout<<setiosflags(ios::left)<<setw(5)<<workobj[i].name;
cout<<"平均";
cout<<endl;
cout<<"到 达 时 刻 ";
for(int i1=0;i1<sizeof(workobj)/sizeof(work);i1++)
cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i1].ddsk;
cout<<endl;
cout<<"运 行 时 间 ";
for(int i2=0;i2<sizeof(workobj)/sizeof(work);i2++)
cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i2].yxsj;
cout<<endl;
cout<<"开 始 时 刻 ";
for(int i3=0;i3<sizeof(workobj)/sizeof(work);i3++)
cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i3].kssk;
cout<<endl;
cout<<"完 成 时 刻 ";
for(int i4=0;i4<sizeof(workobj)/sizeof(work);i4++)
cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i4].wcsk;
cout<<endl;
cout<<"周 转 时 间 ";
for(i5=0;i5<sizeof(workobj)/sizeof(work);i5++)
{
cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i5].T;
Tsum=Tsum+workobj[i5].T;
}
cout<<setprecision(2)<<(float)(Tsum/i5);
cout<<endl;
cout<<"带权周转时间 ";
for(i6=0;i6<sizeof(workobj)/sizeof(work);i6++)
{
cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i6].W;
Wsum=Wsum+workobj[i6].W;
}
cout<<setprecision(2)<<(float)(Wsum/i6);
cout<<endl;
cout<<"---------------------------------------------"<<endl;
}
void menu()
{
cout<<"-------------menu--------------"<<endl;
cout<<" FCFS 先来先服务调度算法"<<endl;
cout<<" SJF 短作业优先调度算法"<<endl;
cout<<" RR 时间片轮转调度算法"<<endl;
cout<<" EXIT 退出程序"<<endl;
cout<<"-------------------------------"<<endl;
}
void FCFS()
{
for(int i=0;i<sizeof(workobj)/sizeof(work);i++)
{
if(i==0)
workobj[i].kssk=workobj[i].ddsk;
else
{
if(workobj[i-1].wcsk>=workobj[i].ddsk)
workobj[i].kssk=workobj[i-1].wcsk;
else
{
cout<<"Error: "<<workobj[i].name<<"的到达时刻小于"<<workobj[i-1].wcsk<<"的完成时刻。"<<endl;
break;
}
}
workobj[i].wcsk=workobj[i].kssk+workobj[i].yxsj;
workobj[i].T=workobj[i].wcsk-workobj[i].ddsk;
workobj[i].W=workobj[i].T/workobj[i].yxsj;
}
}
void SJF()
{
int last,now,DL[sizeof(workobj)/sizeof(work)],i2,worknum=sizeof(workobj)/sizeof(work);
float mixyxsj;
for(int i0=0;i0<worknum;i0++)
DL[i0]=i0;
for(int i=0;i<sizeof(workobj)/sizeof(work);i++)
{
if(i==0)
{
workobj[i].kssk=workobj[i].ddsk;
last=0;
now=0;
}
else
{
//求上一个完成时刻内已经到达的最短完成时间的名称号last
if(workobj[last].wcsk>=workobj[DL[0]].ddsk)
{
mixyxsj=workobj[DL[0]].yxsj;
now=DL[0];
for(int j=0;j<worknum;j++)
if((mixyxsj>workobj[DL[j]].yxsj)&&(workobj[last].wcsk>=workobj[DL[j]].ddsk))
{
mixyxsj=workobj[DL[j]].yxsj;
now=DL[j];
}
workobj[now].kssk=workobj[last].wcsk;
}
else
{
cout<<"Bug: "<<workobj[i].name<<"的到达时刻小于"<<workobj[last].wcsk<<"的完成时刻。"<<endl;
break;
}
}
workobj[now].wcsk=workobj[now].kssk+workobj[now].yxsj;
workobj[now].T=workobj[now].wcsk-workobj[now].ddsk;
workobj[now].W=workobj[now].T/workobj[now].yxsj;
last=now;
//把完成的第now个进程从队列DL[]中请出去
for(int i1=0;i1<worknum;i1++)
if(now==DL[i1])
{
for(i2=i1;i2<worknum;i2++)
DL[i2]=DL[i2+1];
worknum--;
}
}
}
void RR()
{
int q;//时间片
int i,sum=0;
int last=0;//记录上一个进程的下标.
// int time=0;
cout<<"输入时间片q=";
cin>>q;
cout<<"-------------------------进程次序--------------------------"<<endl;
cout<<"进程名 ";
workobj[0].wcsk=0;
for(int h=0;h<sizeof(workobj)/sizeof(work);h++)
workobj[h].now_yxsj=0;
for(int n=1;sum<sizeof(workobj)/sizeof(work);n++)//n记录时间片轮转的次数
{
for(i=0;i<sizeof(workobj)/sizeof(work);i++)
{
if(workobj[i].now_yxsj<workobj[i].yxsj)//判断该进程是否已经完成,完成则跳过
{
if(workobj[last].wcsk>=workobj[i].ddsk)//在上一个进程结束时下一个进程已经到来
{
if(workobj[i].now_yxsj==0)
workobj[i].kssk=workobj[last].wcsk; //给各开始时刻赋值
if((workobj[i].now_yxsj+q)<workobj[i].yxsj)
{
workobj[i].wcsk=workobj[last].wcsk+q;
for(int y=0;y<q;y++)
cout<<resetiosflags(ios::left)<<setw(3)<<workobj[i].name;
workobj[i].now_yxsj=workobj[i].now_yxsj+q;
}
else
{
workobj[i].wcsk=workobj[last].wcsk+(workobj[i].yxsj-workobj[i].now_yxsj);
for(int y=0;y<(workobj[i].yxsj-workobj[i].now_yxsj);y++)
cout<<resetiosflags(ios::left)<<setw(3)<<workobj[i].name;
workobj[i].now_yxsj=workobj[i].yxsj;
sum++;
}
last=i;
}
else ;
}
else ;//该进程已经完成不做运算
workobj[i].T=workobj[i].wcsk-workobj[i].ddsk;
workobj[i].W=workobj[i].T/workobj[i].yxsj;
}
}
cout<<setiosflags(ios::left)<<endl;
cout<<"时间轴 ";
for(int k=0;k<=workobj[last].wcsk;k++)
cout<<resetiosflags(ios::right)<<setw(3)<<k;
cout<<endl;
}
void main()
{
char caozuo[5];
getwork();
// printwork();
for(;;)
{
menu();
cout<<">";
cin>>caozuo;
for(int i=0;i<5;i++)
caozuo[i]=toupper(caozuo[i]);
if(strcmp(caozuo,"FCFS")==0)
{
FCFS();
printwork();
continue;
}
else if(strcmp(caozuo,"SJF")==0)
{
SJF();
printwork();
continue;
}
else if(strcmp(caozuo,"RR")==0)
{
RR();
printwork();
continue;
}
else if(strcmp(caozuo,"EXIT")==0)
break;
else
cout<<"Error: 无此操作命令."<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -