#include <stdio.h>
#include <stdlib.h>
#define MAX_DISK 200
#define BEGIN_DISK 100
void init(int list[], int num)
{
for (int i = 0; i < num; i++)
list[i] = -1;
}
void show_result(int list[], int num)
{ int last=BEGIN_DISK;
double move=0;
printf(" (从100磁道开始)\n");
printf("下一个磁道号 移动距离(磁道数)\n");
for(int i=0;i<num;i++)
{
printf("%10d%10d\n",list[i],abs(last-list[i]));
move+=abs(last-list[i]);
last=list[i];
}
move=move/num;
printf("平均寻道长度:%.1lf\n",move);
}
void quicksort(int num[],int count,int left,int right)
{
if (left >= right){
return ;
}
int key = num[left];
int lp = left; //左指针
int rp = right; //右指针
while (lp < rp) {
if (num[rp] < key) {
int temp = num[rp];
for (int i = rp - 1; i >= lp; i--) {
num[i + 1] = num[i];
}
num[lp] = temp;
lp ++;
rp ++;
}
rp --;
}
quicksort(num,count,left,lp - 1);
quicksort(num,count,rp + 1,right);
}
void FCFS(int list[], int disk_num,int result_list[])
{
printf("----------FCFS----------\n");
for(int i=0;i<disk_num;i++)
result_list[i]=list[i];
show_result(result_list,disk_num);
printf("----------FCFS结束----------\n");
}
void SSTF(int list[], int disk_num,int result_list[])
{ printf("----------SSTF----------\n");
int temp_list[disk_num];
init(temp_list, disk_num);
for(int i=0;i<disk_num;i++)
{
temp_list[i]=list[i];
}
int last=BEGIN_DISK; //第一次寻找从BEGIN_DISK号磁道开始
int flag[disk_num];//定义数组,标志磁道是否被访问过了
init(flag,disk_num); //初始化数组,置为-1,表示未被访问过
for (int n=0;n<disk_num;n++)
{
int distance=999;//寻找距离
int mindistance=999;
int mint=0;
for(int t=0;t<disk_num;t++)
{
if(flag[t]==-1)
{
distance=abs(last-list[t]);
if(distance<mindistance)
{
mindistance=distance;
mint=t;
}
}
}
result_list[n]=list[mint];
last=list[mint];
flag[mint]=1;//标志磁道号已经被访问过
}
show_result(result_list,disk_num);
printf("----------SSTF结束----------\n");
}
void SCAN(int list[], int disk_num,int result_list[])
{
printf("----------SCAN----------\n");
int temp_list[disk_num];
init(temp_list, disk_num);
for(int i=0;i<disk_num;i++)
{
temp_list[i]=list[i];
}
quicksort(temp_list,disk_num,0,disk_num-1);
int index=disk_num-1;
int last=BEGIN_DISK;//寻找距离100最近的磁道号
for(int i=0;i<disk_num;i++)
{
if(temp_list[i]>last)
{
index=i;
break;
}
}
int fangxiang=1;//方向变量,1为磁道号增加方向,0为减小方向。第一次使从BEGIN_DISK号开始向增加方向扫描。
int flag[disk_num];//定义数组,标志磁道是否被访问过了
init(flag,disk_num); //初始化数组,置为-1,表示未被访问过
int n=disk_num;
int result_index=0;
while(n)//如果还存在没有访问过的磁道号
{
if(fangxiang)
{
while(index<=disk_num-1&&flag[index]==-1)
{
result_list[result_index]=temp_list[index];
flag[index]=1;//标记已被访问过的磁道号
index++;
result_index++;
n--;//磁道号总体数目减1
}
if(index==disk_num)
{
fangxiang=0;//方向置为0
index--;//防止下一次访问越界
}
}else
{
while(index>=0&&flag[index]==-1)
{
result_list[result_index]=temp_list[index];
flag[index]=1;//标记已被访问过的磁道号
index--;
result_index++;
n--;
}
index--;
}
}
show_result(result_list,disk_num);
printf("----------SCAN结束----------\n");
}
void CSCAN(int list[], int disk_num,int result_list[])
{printf("----------CSCAN----------\n");
int temp_list[disk_num];
init(temp_list, disk_num);
for(int i=0;i<disk_num;i++)
{
temp_list[i]=list[i];
}
quicksort(temp_list,disk_num,0,disk_num-1);
int index=disk_num-1;
int last=BEGIN_DISK;//寻找距离100最近的磁道号
for(int i=0;i<disk_num;i++)
{
if(temp_list[i]>last)
{
index=i;
break;
}
}
int flag[disk_num];//定义数组,标志磁道是否被访问过了
init(flag,disk_num); //初始化数组,置为-1,表示未被访问过
int n=disk_num;
int result_index=0;//存放结果数组里的下标
while(n)//如果还存在没有访问过的磁道号
{
while(index<=disk_num-1&&flag[index]==-1)
{
result_list[result_index]=temp_list[index];
flag[index]=1;//标记已被访问过的磁道号
index++;
result_index++;
n--;//磁道号总体数目减1
}
index=0;
}
show_result(result_list,disk_num);
printf("----------CSCAN结束----------\n");
}
int main()
{
while (1)
{
int disk_num = 0;
printf("请输入磁道号序列长度:\n");
scanf("%d", &disk_num);
int list[disk_num];
init(list, disk_num);
int result_list[disk_num];
init(result_list, disk_num);
int choice=0;
printf("请选择: 1.自行输入页面数据 2.随机产生页面数据\n");
scanf("%d", &choice);
if(choice==1)
{
printf("请输入磁道号序列:\n");
for (int i = 0; i < disk_num; i++)
scanf("%d", &list[i]);
}else if(choice==2)
{
int flag[MAX_DISK+1];init(flag,MAX_DISK+1);
for (int i = 0; i < disk_num; i++)
{
int a = rand() % (MAX_DISK) + 1;//产生disk_num个1到200的随机数
if (flag[a]==-1)
{
list[i]=a;
flag[a]=1;
}else
{
i=i-1;
}
}
printf("磁道号序列为:\n");
for(int i=0;i<disk_num;i++)
{
printf("%d ",list[i]);
if((i+1)%10==0)
printf("\n");
}
printf("\n");
}else
{
printf("----------输入非法数字,请输入1或者2----------\n\n");
continue;
}
FCFS(list, disk_num, result_list);
init(result_list, disk_num);
SSTF(list, disk_num, result_list);
init(result_list, disk_num);
SCAN(list, disk_num, result_list);
init(result_list, disk_num);
CSCAN(list, disk_num, result_list);
init(result_list, disk_num);
printf("\n\n--------------------\n\n");
}
}
m0_64499674
- 粉丝: 7
- 资源: 3
最新资源
- Unity游戏开发:简易‘吃金币’项目的实现与解析
- 基于Vue的花店管理系统设计与实现源码(java毕业设计完整源码).zip
- 上市公司-创新能力、创新质量、创新效率数据(2006-2023年).zip
- (177731992)心电信号基于matlab GUI自适应滤波+平滑滤波+小波滤波心电信号处理【含Matlab源码 1809期】.mp4
- 有一个winform项目,需要借助一个web项目来显示,并且对web做一些操作,web项目是需要用谷歌内核,所以基于谷歌 Chromium项目的开源Web Browser控件来开发写了一个例子
- (177731996)心电信号基于matlab自适应滤波+LMS+RLS胎儿心电监护 【含Matlab源码 3077期】.mp4
- 基于vue的音乐播放系统源码(java毕业设计完整源码+LW).zip
- 基于web的食堂管理系统论文.doc
- Python 入门教程:基本概念与案例详解
- Python 入门基础知识及案例
- Python基础教程:涵盖变量、数据类型、条件判断、循环与函数
- (177732002)【心电信号去噪】基于matlab傅里叶变换+自适应滤波+平滑滤波心电信号去噪【含Matlab源码 3591期】.mp4
- Python爬虫的基础构建与实现方法
- 基于web的“畅享”黄山旅游网站的设计与实现源码(java毕业设计完整源码).zip
- 基于web的速达快递之家管理系统论文.doc
- (177941594)机器学习识别图片验证码(专门应付本科毕业设计).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页