#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define N 8
int *Init(int arr[]) //随机产生磁道
{
int i;
srand((unsigned int)time(0));
for (i = 0; i < N; i++)
{
arr[i] = rand() % 200 + 1;
printf("%d ", arr[i]);
}
printf("\n");
return arr;
}
void two_part(int arr[]) //把产生产生的随机磁道分为从小到大 从大到小两个部分排序
{
int i;
int j;
int k = 0;
int sum = 0;
int a[N];
int b[N];
int num = 100; //定义当前磁头在100号磁道上
a[0] = 100;
b[0] = 100;
for (i = 0; i < N; i++) //冒泡排序算法 将所有磁道从小大排序
{
for (j = 1; j < N - i; j++)
{
if (arr[j] < arr[j - 1])
{
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
}
}
}
j = 0;
for (i = 0; i < N; i++)
{
if (arr[i] >= num) //比磁头大的放在a数组
{
a[j+1] = arr[i];
j++;
}
else
{
b[k+1] = arr[i]; //比磁头小的放在b数组
k++;
}
}
printf("\n电梯算法访问序列:\n");
for (i = 1; i <= j; i++) //循环输出从大到小的磁道
{
printf("%d->", a[i]);
}
for (i = k; i >0; i--) //循环输出从小到大的磁道
{
printf("%d", b[i]);
if(i!=1){
printf("->");
}
}
printf("\n");
sum = ((a[j]-100)*2+(100- b[1]));
printf("移动的磁道总数:%d\n",sum);
printf("平均寻道长度:%d\n", sum/N);//计算平均寻到长度
}
void sstf(int arr[]){//最短寻道时间优先
int i;
int j;
int tmp;
int num=100;
int x;
int sum=0;
printf("\n最短寻道优先算法访问排序:\n");
for(i=0;i<N;i++){
tmp = abs(arr[0]-num); //初始化tmp值
x = 0;
for(j=1;j<N-i;j++){
if(abs(arr[j]-num)<tmp){
x = j;
tmp = abs(arr[j]-num);
}
}
printf("%d",arr[x]);
if(i!=N-1){
printf("->");
}
num = arr[x]; //当前磁头改变
sum =sum +tmp;
for(j=0;j<N-x-i;j++){
arr[x+j]=arr[x+j+1];
}
}
printf("\n移动的磁道总数:%d",sum);
printf("\n平均寻道长度:%d\n",sum/N);
}
void main()
{
int arr[N] = { 0 };
int i,s=0;
printf("--------------------------------\n");
printf("- 磁盘调度算法 -\n");
printf("--------------------------------\n");
printf("显示随机生产的磁道:\n");
int *ret=Init(arr);
printf("\n-------------------------------------\n");
two_part(ret);
printf("\n*************************************\n");
sstf(ret);
getchar();
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define N 8
int *Init(int arr[]) //随机产生磁道
{
int i;
srand((unsigned int)time(0));
for (i = 0; i < N; i++)
{
arr[i] = rand() % 200 + 1;
printf("%d ", arr[i]);
}
printf("\n");
return arr;
}
void two_part(int arr[]) //把产生产生的随机磁道分为从小到大 从大到小两个部分排序
{
int i;
int j;
int k = 0;
int sum = 0;
int a[N];
int b[N];
int num = 100; //定义当前磁头在100号磁道上
a[0] = 100;
b[0] = 100;
for (i = 0; i < N; i++) //冒泡排序算法 将所有磁道从小大排序
{
for (j = 1; j < N - i; j++)
{
if (arr[j] < arr[j - 1])
{
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
}
}
}
j = 0;
for (i = 0; i < N; i++)
{
if (arr[i] >= num) //比磁头大的放在a数组
{
a[j+1] = arr[i];
j++;
}
else
{
b[k+1] = arr[i]; //比磁头小的放在b数组
k++;
}
}
printf("\n电梯算法访问序列:\n");
for (i = 1; i <= j; i++) //循环输出从大到小的磁道
{
printf("%d->", a[i]);
}
for (i = k; i >0; i--) //循环输出从小到大的磁道
{
printf("%d", b[i]);
if(i!=1){
printf("->");
}
}
printf("\n");
sum = ((a[j]-100)*2+(100- b[1]));
printf("移动的磁道总数:%d\n",sum);
printf("平均寻道长度:%d\n", sum/N);//计算平均寻到长度
}
void sstf(int arr[]){//最短寻道时间优先
int i;
int j;
int tmp;
int num=100;
int x;
int sum=0;
printf("\n最短寻道优先算法访问排序:\n");
for(i=0;i<N;i++){
tmp = abs(arr[0]-num); //初始化tmp值
x = 0;
for(j=1;j<N-i;j++){
if(abs(arr[j]-num)<tmp){
x = j;
tmp = abs(arr[j]-num);
}
}
printf("%d",arr[x]);
if(i!=N-1){
printf("->");
}
num = arr[x]; //当前磁头改变
sum =sum +tmp;
for(j=0;j<N-x-i;j++){
arr[x+j]=arr[x+j+1];
}
}
printf("\n移动的磁道总数:%d",sum);
printf("\n平均寻道长度:%d\n",sum/N);
}
void main()
{
int arr[N] = { 0 };
int i,s=0;
printf("--------------------------------\n");
printf("- 磁盘调度算法 -\n");
printf("--------------------------------\n");
printf("显示随机生产的磁道:\n");
int *ret=Init(arr);
printf("\n-------------------------------------\n");
two_part(ret);
printf("\n*************************************\n");
sstf(ret);
getchar();
}