📄 8.cpp
字号:
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
class table
{
private:
string Pro;//定义进程名称
int Team;//定义柱面号
int Ci;//定义磁道面号
int Rec;//定义记录号
public:
static int count;
table(){Pro="0";Team=0;Ci=0;Rec=0;}
void init(string pro,int team,int ci,int rec)
{Pro=pro;Team=team;Ci=ci;Rec=rec;count++;}
void del(){count--;}
void add(){count++;}
string get_Pro(){return Pro;}
int get_Team(){return Team;}
int get_Ci(){return Ci;}
int get_Rec(){return Rec;}
void show()
{
cout<<setw(9)<<Pro<<setw(7)<<Team<<setw(7)<<Ci<<setw(7)<<Rec<<endl;
}
void show2()
{
cout<<setw(9)<<Pro<<setw(7)<<Team<<setw(7)<<Ci<<setw(7)<<Rec;
}
};
int table::count=0;
main()
{
table io[20]; // 请求I/O表
table out[20]; // 选中的进程表
int k=1; // 已选中的进程个数
int i;
int record=0; // 记录选中的柱号
int yi=0; // 初始当前移臂方向为里移
// 用0代表里移UP-向柱号199方向,1代表外移DOWN-向柱号0方向
int flag=0;
int d[20]; // 记录调用的进程方向
d[0]=0;
int m=1; // 已选中的进程方向个数
char R='y';
io[0].init("p1",100,10,1);
io[1].init("p2",30,5,5);
io[2].init("p3",40,2,4);
io[3].init("p4",85,7,3);
io[4].init("p5",60,8,4); // 预先设置部分请求I/O表内容
out[0].init("p0",0,0,0);
out[0].del();
cout<<"** 初始化: **"<<endl;
cout<<"-----------------------------------------"<<endl;
cout<<" ---------- 请求I/O表 ---------- "<<endl;
cout<<" 进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<endl;
for(i=0;i<table::count;i++)
io[i].show();
cout<<endl;
cout<<" -------- 当前进程信息 --------- "<<endl;
cout<<" 进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<endl;
out[0].show();
cout<<endl;
cout<<" --- 电梯的当前移臂方向是: UP --- "<<endl;
cout<<"-----------------------------------------"<<endl;
while(1)
{
float t;
while(R=='y'){
cout<<endl;
cout<<"请随机输入一个介于0~1的数"<<endl;
cout<<"如输入2则显示当前请求I/O表"<<endl;
cin>>t;
if(t==2)
{
cout<<"-----------------------------------------"<<endl;
cout<<" -------- 当前请求I/O表 -------- "<<endl;
cout<<" 进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<endl;
for(i=0;i<table::count;i++)
io[i].show();
cout<<"-----------------------------------------"<<endl;
}
;
if(t<=0.5)
{
cout<<endl;
cout<<"** 接收请求: **"<<endl;
string pro;
int team,ci,rec;
cout<<"请输入进程名: ";
cin>>pro;
cout<<"该进程柱面号(0-199):";
cin>>team;
cout<<"该进程磁道号(0-19):";
cin>>ci;
cout<<"该进程物理记录号(0-7):";
cin>>rec;
io[table::count].init(pro,team,ci,rec);
cout<<endl;
cout<<"-----------------------------------------"<<endl;
cout<<" ------ 新的请求I/O表 -------- "<<endl;
cout<<" 进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<endl;
for(i=0;i<table::count;i++)
io[i].show();
cout<<"-----------------------------------------"<<endl;
cout<<"是否继续?y:继续,n:退出"<<endl;
cin>>R;
}
;
if(t>0.5&&t<=1)
{
cout<<endl;
cout<<"** 驱动调度: **"<<endl;
if(table::count==0)
cout<<"*** I/O请求表为空。***"<<endl;
else
{
for(i=0;i<table::count;i++) //找到相同的柱号
{
if(io[i].get_Team()==out[k-1].get_Team())
{
flag=-1; //标志符置-1
record=i;
if(i==table::count-1)
i=i+2;
break;
}
}
if(i==table::count) //柱号不相同
{
io[table::count]=out[k-1];
io[table::count].add();
int min;
min=io[0].get_Team();
for(int si=0;si<table::count-1;si++) //进行排序
for(i=0;i<table::count-1;i++)
{
if(io[i].get_Team()>io[i+1].get_Team())
{
table temp;
temp=io[i];
io[i]=io[i+1];
io[i+1]=temp;
}
}
cout<<"-----------------------------------------"<<endl;
for(i=0;i<table::count;i++) //在请求I/O表中查找当前调度的进程
{
if(io[i].get_Team()==out[k-1].get_Team())
{
if(i==0&&yi==0)
{flag=i;record=i+1;break;}
else if(i==0&&yi==1)
{flag=i;record=i+1;yi=0;break;}
else if(i==(table::count-1)&&yi==0)
{flag=i;record=i-1;yi=1;break;}
else if(i==(table::count-1)&&yi==1)
{flag=i;record=i-1;break;}
else if(i>0&&i<(table::count-1)&&yi==0)
{flag=i;record=i+1;break;}
else if(i>0&&i<(table::count-1)&&yi==1)
{flag=i;record=i-1;break;}
else
;
}
}
}
cout<<"电梯的当前移臂方向是:";
if(yi==0)
cout<<"UP"<<endl;
else
cout<<"DOWN"<<endl;
d[m]=yi;
m++;
cout<<endl;
cout<<"调度的进程是:"<<endl;
cout<<" 进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<endl;
io[record].show(); //显示调度的进程
out[k]=io[record];
k++;
io[record]=io[table::count-1]; //进程被调度,从I/O表删除
io[0].del();
if(flag!=-1)
{
io[flag]=io[table::count-1]; //无相同柱面时,将加入请求表的进程删除
io[0].del();
}
cout<<"-----------------------------------------"<<endl;
cout<<"是否继续?y:继续,n:退出"<<endl;
cin>>R;
}
}
}
}
cout<<endl;
cout<<"** 程序结束: **"<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<" ---------- 驱动调度过程 ---------- "<<endl;
cout<<" 进程"<<setw(8)<<"柱面号"<<setw(8)<<"磁道号"<<setw(8)<<"记录号"<<setw(6)<<"方向"<<endl;
for(i=0;i<k;i++)
{
if(d[i]==0)
{out[i].show2();cout<<" UP"<<endl;}
else
{out[i].show2();cout<<" DOWN"<<endl;}
}
cout<<"----------------------------------------------"<<endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -