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

📄 diaodu.cpp

📁 磁盘调度设计
💻 CPP
字号:
#include "stdio.h"
#include "stdlib.h"
#include <iostream.h>
void CopyL(int Sour[],int Dist[] ,int x);
void SetDI(int DiscL[]);
void Print(int Pri[],int x);
void DelInq(int Sour[],int x,int y);
void FCFS(int Han,int DiscL[]);
void SSTF(int Han,int DiscL[]);
int SCAN(int Han,int DiscL[],int x,int y);
void CSCAN(int Han,int DiscL[]);
void N_Step_SCAN(int Han1,int DiscL[]);
void PaiXu();
void Pri();
int NAll=0;
int Best[5][2];
int Limit=0;
int Jage;
int Aver=0;
void main()
{
	int i;
	int DiscLine[10];
	int Hand;
	int Con;
	while(Con!=0)
	{
		Jage=0;
		printf("\n+ 请输入初始的磁道数(0<n<65000):");
	    cin>>Hand;
        printf("\n+ 输入寻找的范围:");
		cin>>Limit;
		if(Limit>65000)
			break;
		cout<<"    选择如下算法:  "<<endl;
		cout<<"    1.先来先服务算法"<<endl;
	    cout<<endl;
     	cout<<"    2.最短寻道时间优先算法"<<endl;
	    cout<<endl;
    	cout<<"    3.SCAN算法"<<endl;
    	cout<<endl;
    	cout<<"    4.循环扫描算法"<<endl;
    	cout<<endl;
    	cout<<"    5.N_Step_SCAN算法"<<endl;
    	cout<<endl;
    	cout<<"    6.各类算法的比较"<<endl;
		
	int n;
	cin >>n;
	switch(n)
	{
	case 1:
		SetDI(DiscLine);
		FCFS(Hand,DiscLine); 
		break;
	case 2:
SetDI(DiscLine);
		SSTF(Hand,DiscLine);
		break;
	case 3:
SetDI(DiscLine);
		SCAN(Hand,DiscLine,0,9);
		break;
	case 4:
        SetDI(DiscLine);
		CSCAN(Hand,DiscLine);	
		break;
	case 5:
        SetDI(DiscLine);
		N_Step_SCAN(Hand,DiscLine);
		break;
	case 6:
       SetDI(DiscLine);
       FCFS(Hand,DiscLine);
       SSTF(Hand,DiscLine);
       SCAN(Hand,DiscLine,0,9);
       CSCAN(Hand,DiscLine);
       N_Step_SCAN(Hand,DiscLine);
		PaiXu();
		printf("\n+ 寻道长度由低到高排序      :");
		for(i=0;i<5;i++)
		{
			printf("%4d ",Best[i][0]);
		}
		break;
	}
		
		printf("\n+ 是否继续(0 or 1)?");
		scanf("%5d",&Con);
	
	}
}
void CopyL(int Sour[],int Dist[] ,int x)
{
	int i;
	for(i=0;i<=x;i++)
	{
		Dist[i]=Sour[i];
	}
}
void Print(int Pri[],int x)
{
	int i;
	for(i=0;i<=x;i++)
	{
		printf("%5d",Pri[i]);
	}
}
void SetDI(int DiscL[])
{
	int i;
	for(i=0;i<=9;i++)
    {
		DiscL[i]=rand()%Limit;
	}
	printf("+ 需要寻找的磁道号  :");
	Print(DiscL,9);
}
void DelInq(int Sour[],int x,int y)
{
	int i;
	for(i=x;i<y;i++)
	{
		Sour[i]=Sour[i+1];
		x++;
	}
}
void FCFS(int Han,int DiscL[])
{
	int RLine[10];
	int i,k,All,Temp;
	All=0;
	k=9;
	CopyL(DiscL,RLine,9);
    printf("\n+ 按照FCFS算法磁道的访问顺序为   :");
	for(i=0;i<=9;i++)
	{
		Temp=RLine[0]-Han;
		if(Temp<0)
			Temp=(-Temp);
		printf("%5d",RLine[0]);
		All=Temp+All;
		DelInq(RLine,0,k);
		k--;
	}
	Best[Jage][1]=All;
	Best[Jage][0]=1;
	Jage++;
	Aver=All/10;
	printf("\n+ 移动磁道数    :<%5d> ",All);
	printf("\n+ 平均寻道长度     :*%5d* ",Aver);
}
void SSTF(int Han,int DiscL[])
{
	int i,j,k,h,All;
	int Temp;
	int RLine[10];
	int Min;
	All=0;
	k=9;
	CopyL(DiscL,RLine,9);
    printf("\n+ 按照SSTF算法磁道的访问顺序为   :  ");
	for(i=0;i<=9;i++)
	{
        Min=64000;
		for(j=0;j<=k;j++)
		{			
			if(RLine[j]>Han)
				Temp=RLine[j]-Han;
			else
				Temp=Han-RLine[j];
			if(Temp<Min)
			{
				Min=Temp;
				h=j;
			}
		}
		All=All+Min;
		printf("%5d",RLine[h]);
		Han=RLine[h];
		DelInq(RLine,h,k);
		k--;
	}
	Best[Jage][1]=All;
	Best[Jage][0]=2;
	Jage++;
	Aver=All/10;
	printf("\n+ 移动磁道数    :<%5d> ",All);
	printf("\n+ 平均寻道长度     :*%5d* ",Aver);
}
int SCAN(int Han,int DiscL[],int x,int y)
{
    int j,n,k,h,m,All;
	int Temp;
	int Min;
	int RLine[10];
	int Order; 
	Order=1;
	k=y;
	m=2;
	All=0;
	CopyL(DiscL,RLine,9);
    printf("\n+ 按照SCAN算法磁道的访问顺序为   :");
	Min=64000;
	for(j=x;j<=y;j++)
	{			
		if(RLine[j]>Han)
			Temp=RLine[j]-Han;
		else
			Temp=Han-RLine[j];
		if(Temp<Min)
		{
			Min=Temp;
			h=j;
		}
	}
	All=All+Min;
    printf("%5d",RLine[h]);
	if(RLine[h]>=Han)
		Order=0;
	Han=RLine[h];
	DelInq(RLine,h,k);
	k--;
	while(m>0)
	{
		if(Order==1)
		{
			for(j=x;j<=y;j++)
			{
				h=-1;
				Min=64000;
				for(n=x;n<=k;n++)
				{
					if(RLine[n]<=Han)
					{
						Temp=Han-RLine[n];
	 		            if(Temp<Min)
						{
							Min=Temp;
			            	h=n;
						}
					}
				}
				if(h!=-1)
				{
					All=All+Min;
					printf("%5d",RLine[h]);
					Han=RLine[h];
					DelInq(RLine,h,k);
					k--;
				}
			}
			Order=0;
		    m--;
		}
		else
		{			
			for(j=x;j<=y;j++)
			{
				h=-1;
				Min=64000;
				for(n=x;n<=k;n++)
				{
					if(RLine[n]>=Han)
					{
						Temp=RLine[n]-Han;
	 		            if(Temp<Min)
						{
							Min=Temp;
			       	        h=n;
						}
					}
				}
				if(h!=-1)
				{
					All=All+Min;
					printf("%5d",RLine[h]);
					Han=RLine[h];
					DelInq(RLine,h,k);
					k--;
				}
			}
			Order=1;
		    m--;
		}
	}
	NAll=NAll+All;
	if((y-x)>5)
	{
		Best[Jage][1]=All;
		Best[Jage][0]=3;
		Jage++;
		Aver=All/10;
		printf("\n+ 移动磁道数    :<%5d> ",All);
		printf("\n+ 平均寻道长度     :*%5d* ",Aver);
	}
	return(Han);
}
void CSCAN(int Han,int DiscL[])
{

	int j,h,n,Temp,m,k,All,Last;
	int RLine[10];
	int Min;
	m=2;
	k=9;
	All=0;
	Last=Han;
	CopyL(DiscL,RLine,9);
	printf("\n+ ");
    printf("按照CSCAN算法磁道的访问顺序为    :");
	while(k>=0)
	{
		for(j=0;j<=9;j++)
		{
			h=-1;
			Min=64000;
			for(n=0;n<=k;n++)
			{
				if(RLine[n]>=Han)
				{
					Temp=RLine[n]-Han;
	 		        if(Temp<Min)
					{
						Min=Temp;
			       	    h=n;
					}
				}
			}
			if(h!=-1)
			{
				All=All+Min;
				printf("%5d",RLine[h]);
				Han=RLine[h];
				Last=RLine[h];
				DelInq(RLine,h,k);
				k--;
			}
		}
		m--;
		Han=0;
		if(k>=0)
		{
			Temp=Last-Han;
			All=All+Temp;
		}
	}
	Best[Jage][1]=All;
	Best[Jage][0]=4;
	Jage++;
	Aver=All/10;
	printf("\n+ 移动磁道数   :<%5d> ",All);
	printf("\n+ 平均寻道长度     :*%5d* ",Aver);
}
void N_Step_SCAN(int Han1,int DiscL[])
{
	int i,m,k;
	int RLine1[10];
    NAll=0;
	m=2;
	k=9;
	i=-1;
	CopyL(DiscL,RLine1,9);
	printf("\n+ ");
    printf("按照N_Step_SCAN算法磁道的访问顺序为   ::");
	for(m=0;m<2;m++)
	{
		Han1=SCAN(Han1,RLine1,i+1,i+5);
		i=i+5;
	}
	Best[Jage][1]=NAll;
	Best[Jage][0]=5;
	Aver=NAll/10;
	printf("\n+ 移动磁道数    :<%5d> ",NAll);
	printf("\n+ 平均寻道长度     :*%5d* ",Aver);
}
void PaiXu()
{
	int i,j,Temp;
	for(i=0;i<5;i++)
	{
		for(j=0;j<4;j++)
		{
			if(Best[j][1]>Best[j+1][1])
			{
				Temp=Best[j+1][1];
				Best[j+1][1]=Best[j][1];
				Best[j][1]=Temp;
				Temp=Best[j+1][0];
				Best[j+1][0]=Best[j][0];
				Best[j][0]=Temp;
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -