⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 磁盘移臂.cpp

📁 磁盘移臂调度过程模拟系统的设计——先来先服务法、最短寻道时间优先算法、电梯算法
💻 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 + -