//随机生成磁道数
//打印输出数组 Pri
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
void CopyL(int Sour[],int Dist[] ,int x); //数组 Sour 复制到数组 Dist,复制到 x 个数
void SetDI(int DiscL[]);
void Print(int Pri[],int x);
void DelInq(int Sour[],int x,int y);
y 后的数保持不变(即会出现 2 个 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; //输入寻找的范围磁道数 i
int Jage;
float Aver=0;
//先来先服务算法(FCFS)
//最短寻道时间优先算法(SSTF)
//扫描算法(SCAN)
//循环扫描算法(CSCAN)
//数组 Sour 把 x 位置的数删除,并把 y 前面的数向前移动,
//N 步扫描算法(NStepScan)
int main()
{
//声明准备要生成的随机磁道号的数组
//磁道数
int i;
int DiscLine[10];
int Hand;
int Con=1;
int n;
while(Con==1)
{
Jage=0;
printf(" 请输入初始的磁道数(065536){
printf("超出范围!");
}
else{
printf("
printf("
\n");
\n");
╭ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ╮
║
操 作 系 统 课 程 实 验
║
printf(" ╭═════┤
磁盘调度算法
├═════╮
\n");
\n");
\n");
\n");
\n");
\n");
\n");
\n");
\n");
\n");
\n");
\n");
\n");
\n");
\n");
printf(" ║
║
║
╰═══════════════╯
1.先来先服务算法(FCFS)
2.最短寻道时间优先算法(SSTF)
3.扫描算法(SCAN)
4.循环扫描算法(CSCAN)
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
║
║
║
║
║
║
║
║
║
║
║
printf(" ║ ╭───────────────────────╮ ║
printf(" ╰═┤
请输入你的选择的算法(输入 0 离开)
├═╯
printf("
╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
scanf("%d",&n);
if(n==0) exit(0);
printf(" ");
switch(n)
{
case 1:
//随机生成磁道数
SetDI(DiscLine);
FCFS(Hand,DiscLine); //先来先服务算法(FCFS)
break;
case 2:
//随机生成磁道数
SetDI(DiscLine);
SSTF(Hand,DiscLine); //最短寻道时间优先算法(SSTF)
break;
case 3:
SetDI(DiscLine);
//随机生成磁道数
SCAN(Hand,DiscLine,0,9);
break;
//扫描算法(SCAN)
case 4:
//随机生成磁道数
SetDI(DiscLine);
CSCAN(Hand,DiscLine); //循环扫描算法(CSCAN)
break;
}
printf(" + 是否继续(按 0 结束,按 1 继续)?");
scanf("%5d",&Con);
}
}
}
//数组 Sour 复制到数组 Dist,复制到 x 个数
void CopyL(int Sour[],int Dist[] ,int x)
{
int i;
for(i=0;i<=x;i++)
{
Dist[i]=Sour[i];
}
}
//打印输出数组 Pri
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;//随机生成 10 个磁道号
}
printf("+ 需要寻找的磁道号:");
Print(DiscL,9);
printf(" \n");
//输出随机生成的磁道号
}
//数组 Sour 把 x 位置的数删除,并把 y 前面的数向前移动,y 后的数保持不变(即会出现 2
个 y)
void DelInq(int Sour[],int x,int y)
{
int i;
for(i=x;i ",All);printf("\n");
printf(" + 平均寻道长度:*%0.2f* \n",Aver);printf("\n");
}
//冒泡排序
int* Bubble(int pArr[],int nFirst,int nEnd)
{
int nTemp=0;
for(int i=nFirst;i
pArr[j])
{
nTemp=pArr[i];
pArr[i]=pArr[j];
pArr[j]=nTemp;
}
}
}
return pArr;
}
//最短寻道时间优先算法(SSTF)
void SSTF(int Han,int DiscL[])
{
int temp;
int k=1,n=10;
int l,r;
int i,j,all=0;
//将磁道号按递增排序
DiscL=Bubble(DiscL,0,10);
printf("\n+ 按照 SSTF 算法磁道的访问顺序为::");
//判断标志位 Han 左、右两边的偏移量大小
if(DiscL[n-1]<=Han)//当前磁头位置大于最外围欲访问磁道
{
for(i=n-1;i>=0;i--)
{
printf("%d ",DiscL[i]);
}
all=Han-DiscL[0];
}
else
if(DiscL[0]>=Han)//当前磁头位置小于最里欲访问磁道
{
for(i=0;i}
all=DiscL[n-1]-Han;
}
else
{
while(DiscL[k]=0)&&(r-1;j--) //访问磁头位置里侧的磁道
{
}
printf("%d ",DiscL[j]);
all+=DiscL[n-1]-DiscL[0];
}
}
}
printf("\n + 移动磁道数:<%5d> \n",all);
printf(" + 平均寻道长度:*%0.2f* \n",all/10.0);
//扫描算法(SCAN)
int SCAN(int Han,int DiscL[],int x,int y)
{
int temp;
int k=1,n=10;
int l,r;
int i,j,all=0;
DiscL=Bubble(DiscL,x,y);
//printf("按递增顺序排好的磁道为:");
//for( i=0;i
=0;i--)
printf("%d ",DiscL[i]);
all=Han-DiscL[0];
{
}
else
if(DiscL[0]>=Han) //磁头位置小于最里欲访问磁道
{
for(i=0;iscanf("%d",&d);
//确定磁头访问的方向
printf("按照 SCAN 算法访问顺序为:");
if(d==0||d==1)
{
if(d==0)
{
//磁头向内
for(j=l;j>=0;j--)
{
printf("%d ",DiscL[j]);
}
for(j=r;j=0;j--)
{
printf("%d ",DiscL[j]);
}
}
all=2*DiscL[n-1]-Han-DiscL[0];
}
else
}
printf("请输入 0 或 1!");
printf("\n + 移动磁道数:<%5d> \n",all);
printf(" + 平均寻道长度:*%0.2f* \n",all/10.0);
return 0;
}
//循环扫描算法(CSCAN)
void CSCAN(int Han,int DiscL[])
{
int temp;
int
l,r;
int i,j,all=0;