📄 磁盘移臂.cpp
字号:
#include <iostream>
using namespace std;
void fcfs(int *p,int n,int c);
void print(int i);
void sstf(int *p,int n,int c);
void scan(int *p,int n,int c);
void main()
{
int i;
cout<<" ╭═══════════════╮ "<<endl;
cout<<" ║ 操作系统课程设计 ║ "<<endl;
cout<<" ╭═════┤ 磁盘调度算法 ├═════╮ "<<endl;
cout<<" ║ ║ ║ ║ "<<endl;
cout<<" ║ ╰═══════════════╯ ║ "<<endl;
cout<<" ║ ║ "<<endl;
cout<<" ║ 1.先来先服务算法 FCFS ║ "<<endl;
cout<<" ║ ║ "<<endl;
cout<<" ║ ║ "<<endl;
cout<<" ║ 2.最短寻道时间优先算法 SSTF ║ "<<endl;
cout<<" ║ ║ "<<endl;
cout<<" ║ ║ "<<endl;
cout<<" ║ 3.扫描算法 SCAN ║ "<<endl;
cout<<" ║ ║ "<<endl;
cout<<" ║ ╭───────────────────────╮ ║ "<<endl;
cout<<" ╰═┤ 请输入你的选择的算法 输入0离开 ├═╯ "<<endl;
cout<<" ╰───────────────────────╯ "<<endl;
cout<<"请输入您的选择(0-3):";
cin>>i;
switch(i)
{
case 0:
break;
case 1:
print(i);break; //错误1:不可用fcfs(*p,now,count);行参和实参不对应;menu(i);break;
case 2:
print(i);break;
case 3:
print(i);break;
}
}
void print(int m)
{
int i=-1;
int count=-1;
int now;
char n;
int *p;
int a[20];
p=a;
cout<<endl;
cout<<"请输入当前磁头号(1-200):";
cin>>now;
while(now<=0||now>=200)
{
cout<<"超出范围!请重新输入:";
cin>>now;
}
cout<<endl;
cout<<"请输入磁盘访问请求的磁道号 <0结束>:"<<endl;
do
{
i++;
count++; //错误4:初值必须为-1,否则1000也算是其中的磁道访问号
cin>>p[i];
}while (p[i]!=0); //错误2:若先 cin>>p[i]; 再i++; 则程序无止境。p[i]始终为下一个数的值,不成立。 因此while (p[i]!=0)无用;
if(m==1) fcfs(p,now,count);
if(m==2) sstf(p,now,count);
if(m==3) scan(p,now,count);
cout<<endl;
cout<<"是否继续执行操作<Y/N>";
cin>>n;
if(n=='Y'||n=='y') main();
}
void fcfs(int *p,int n,int c)
{
int i;
int sum=0;
cout<<"先来先服务调度算法(fcfs):"<<endl;
cout<<"磁盘移动顺序为:"<<endl;
for(i=0;i<c;i++)
{
cout<<p[i]<<" ";
if(n>p[i]) sum=sum+n-p[i];
else sum=sum+p[i]-n;
n=p[i];
}
cout<<endl;
cout<<"取臂移动总量:"<<sum<<endl;
}
void sstf(int *p,int n,int c)
{
int i,j,k,s,temp;
int min;
int b[20];
int sum=0;
cout<<endl;
cout<<"最短查找时间优先算法(sstf):"<<endl;
for(i=0;i<c;i++)
{
min=10000; //错误5:若不写,则可能发生错误。因为上次留下的最近磁道距可能比这次都小,所以就会沿用上次的结果
for(j=0;j<c-i;j++) //寻找最近磁道
{
if(p[j]-n>=0)
temp=p[j]-n;
else
temp=n-p[j];
if(temp<min) //记录最近磁道距的下标
{
min=temp;
k=j;
}
}
b[i]=p[k]; //如果距当前磁道最近,这将该磁道赋给新的数组
sum=sum+min;
n=p[k]; //错误6,若将此写为n=p[j];则结果显示错误,因为for语句中j已经无效,故须h来跟踪j;
//将当前磁道设置为已找到的最近磁道
for(j=k;j<c-i-1;j++) //重置磁道数组,剔除已找到的最近磁道
p[j]=p[j+1];
}
cout<<endl;
cout<<"磁盘移动顺序为:"<<endl;
for(i=0;i<c;i++)
cout<<b[i]<<" ";
cout<<endl;
cout<<"取臂移动总量:"<<sum<<endl;
}
void scan(int *p,int n,int c)
{
int i,j;
char b;
int sum=0;
int temp;
cout<<endl;
cout<<"电梯算法(scan):"<<endl;
for(i=0;i<c-1;i++)
for(j=0;j<c-i-1;j++)
{
if(p[j]>p[j+1])
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
cout<<"磁道从小到大的顺序为:"<<endl;
for(i=0;i<c;i++)
cout<<p[i]<<" ";
cout<<endl;
cout<<"当前磁道号为:";
cout<<n<<endl;
cout<<endl;
cout<<"请输入磁盘访问方向(L/R):";
cin>>b;
i=0;
while(n>p[i])
i++;
j=i;
if(b=='L'||b=='l')
{
cout<<"磁盘移动顺序为:"<<endl;
for(i=j-1;i>=0;i--)
cout<<p[i]<<" ";
for(i=j;i<c;i++)
cout<<p[i]<<" ";
sum=p[c-1]+n-2*p[0];
}
if(b=='R'||b=='r')
{
cout<<"磁盘移动顺序为:"<<endl;
for(i=j;i<c;i++)
cout<<p[i]<<" ";
for(i=j-1;i>=0;i--)
cout<<p[i]<<" ";
sum=2*p[c-1]-p[0]-n;
}
cout<<endl;
cout<<"取臂移动总量:"<<sum<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -