移动臂调度算法

#include<stdio.h>
#include<string.h>
#include<math.h>
#include <time.h>


#define N 200
#define begin 125
#define before 100
#define NUM 9


void init(int arr[],int n);
int isdif(int arr[],int n);
int alldif(int arr[],int n);
void fcfs(int arr[]);
void sstf(int arr[]);


void elevator(int arr[]);
void elevator_before(int arr[]);
void elevator_later(int arr[]);


void uni_scan(int arr[]);
void uni_scan_later(int arr[]);
void uni_scan_before(int arr[]);


void sort_uni(int a[]);
void sort_uni_before(int a[]);
void sort_elevator(int a[]);
void sort_elevator_before(int a[]);


int main()
{
int arr[NUM] = {86,147,91,177,94,150,102,175,130};

init(arr,NUM);
printf("调度算法\t\t作业调度次序\t\t\t\t\t\t移动臂的移动距离\n\n");
fcfs(arr);
sstf(arr);
uni_scan(arr);
elevator(arr);

return 0; 
 } 
 
 int isdif(int arr[],int n)
 {
  int i;
  for(i = 0;i < n;i++)
  {
  if(arr[i] == arr[n])
  {
  return 1;
}
}
return 0;
 }
 
 void init(int arr[],int n)
 {
  int i;
  srand(time(NULL));
 
int j;
for(i = 0;i < NUM;i++)
{
do
{
arr[i] = rand()%N;
}
while(isdif(arr,i) ==1);
}
printf("刚刚访问过的柱面为%d\n",before);
printf("当前柱面位置:%d\n\n",begin);
printf("等待服务的请求有:");
for(i = 0;i < NUM;i++)
{
printf("%d ",arr[i]);
}
printf("\n\n");
 }
 
 int alldif(int arr[],int n)
 {
  int i = 0,j = 1;
 
  for(i = 0;i < n-1;i++)
  {
  for(j = i+1;j < n;j++)
  {
  if(arr[i] ==arr[j])
  {
  return 0;
}
}
}
return 1;
 }
 
 void fcfs(int arr[])
 {
  int i = 0,j = 0;
  int len = 0;
  int a[10] = {0};
 
  printf("先来先服务\t",begin);
  do
  {
  printf("%3d->",arr[i++]);
}
while(i != NUM-1);
printf("%3d\t",arr[NUM-1]);

for(j = 0;j < NUM;j++)
{
if(j == 0)
{
a[j] = abs(arr[0] - begin);
}
else
{
a[j] = abs(arr[j] - arr[j-1]);
}
len += a[j];
if(j != NUM-1)
{
printf("%3d+",a[j]);
}
else
{
printf("%3d=%d",a[j],len);
}
}
printf("\n\n");
 }
 
 void sstf(int arr[])
 {
  int i,j;
  int a[NUM],slen[NUM];
  int len = 0,tmp = begin,tmp_i;
 
  for(i = 0;i < NUM;i++)
  {
  a[i] = arr[i];
}

printf("最短寻找时间优先");
for(i = 0;i < NUM;i++)
{
slen[i] = abs(a[i] - tmp);
tmp_i = i;
for(j = i+1;j < NUM;j++)
{
if(slen[i] > abs(a[j]-tmp))
{
slen[i] = abs(a[j]-tmp);
tmp_i = j;
}
}
tmp = a[tmp_i];
a[tmp_i] = a[i];
a[i] = tmp;
if(i != NUM-1)
{
printf("%3d->",tmp);
}
else
{
printf("%3d\t",tmp);
}
}

for(i = 0;i < NUM;i++)
{
len += slen[i];
if(i != NUM-1)
{
printf("%3d+",slen[i]);
}
else
{
printf("%3d=%d",slen[i],len);
}
}
printf("\n\n");
 }
 
 void uni_scan(int arr[])
 {
  if(begin > before)
  {
  uni_scan_later(arr);
}
else
{
uni_scan_before(arr);
}
 }
 
 void uni_scan_later(int arr[])
 {
  int i;
  int a[NUM],len[NUM];
  int sumlen = 0;
 
  for(i = 0;i < NUM;i++)
  {
  a[i] = arr[i];
}
sort_uni(a); 

printf("单向扫描\t");
for(i = 0;i < NUM;i++)
{
if(i != NUM-1)
{
printf("%3d->",a[i]);
}
else
{
printf("%3d\t",a[i]);
}
}

for(i = 0;i < NUM;i++)
{
if(i ==0)
{
len[i] = a[0]-begin;
}
else if(a[i] > a[i-1])
{
len[i] = a[i] - a[i-1];
}
else
{
len[i] = a[i]+N-a[i-1];
}

sumlen += len[i];
if(i != NUM-1)
{
printf("%3d+",len[i]);
}
else
{
printf("%3d=%d",len[i],sumlen);
}
}
  printf("\n\n");
 }
 void uni_scan_before(int arr[])
 {
  int i;
  int a[NUM],len[NUM];
  int sumlen = 0;
 
  for(i = 0;i < NUM;i++)
  {
  a[i] = arr[i];
}
sort_uni_before(a); 

printf("单向扫描\t");
for(i = 0;i < NUM;i++)
{
if(i != NUM-1)
{
printf("%3d->",a[i]);
}
else
{
printf("%3d\t",a[i]);
}
}

for(i = 0;i < NUM;i++)
{
if(i ==0)
{
len[i] = abs(a[0]-begin);
}
else if(a[i] < a[i-1])
{
len[i] = abs(a[i] - a[i-1]);
}
else
{
len[i] = a[i-1]+N-a[i];
}

sumlen += len[i];
if(i != NUM-1)
{
printf("%3d+",len[i]);
}
else
{
printf("%3d=%d",len[i],sumlen);
}
}
  printf("\n\n");
 }
 
 void sort_uni_before(int a[])
 {
  int i,j,tmp;
 
  for(i = 0;i < NUM;i++)
  {
  if(a[i] > begin)
  {
  a[i] -= N;
}
}

for(i = 0;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] < a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}

for(i = 0;i < NUM;i++)
{
if(a[i] <= 0)
{
a[i] += N;
}
//printf("%d ",a[i]);
}
 }
 
 void sort_uni(int a[])
 {
  int i,j,tmp;
 
  for(i = 0;i < NUM;i++)
  {
  if(a[i] < begin)
  {
  a[i] += N;
}
}

for(i = 0;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] > a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}

for(i = 0;i < NUM;i++)
{
if(a[i] >= N)
{
a[i] -= N;
}
//printf("%d ",a[i]);
}
 }
 
 void elevator(int arr[])
 {
  if(begin > before)
  {
  elevator_later(arr);
}
else
{
elevator_before(arr);
}
 }
 
 void elevator_later(int arr[])
 {
  int i;
  int a[NUM];
  int len[NUM],sumlen = 0; 
 
  for(i = 0;i < NUM;i++)
  {
  a[i] = arr[i];
}
sort_elevator(a);

printf("电梯调度\t");
for(i = 0;i < NUM;i++)
{
if(i != NUM-1)
{
printf("%3d->",a[i]);
}
else
{
printf("%3d\t",a[i]);
}
}

for(i = 0;i < NUM;i++)
{
if(i ==0)
{
len[i] = a[0]-begin;
}
else if(a[i] > a[i-1])
{
len[i] = a[i] - a[i-1];
}
else
{
len[i] = a[i-1]-a[i];
}

sumlen += len[i];
if(i != NUM-1)
{
printf("%3d+",len[i]);
}
else
{
printf("%3d=%d",len[i],sumlen);
}
}

printf("\n\n");
 }
 
 void elevator_before(int arr[])
 {
  int i;
  int a[NUM];
  int len[NUM],sumlen = 0; 
 
  for(i = 0;i < NUM;i++)
  {
  a[i] = arr[i];
}
sort_elevator_before(a);

printf("电梯调度\t");
for(i = 0;i < NUM;i++)
{
if(i != NUM-1)
{
printf("%3d->",a[i]);
}
else
{
printf("%3d\t",a[i]);
}
}

for(i = 0;i < NUM;i++)
{
if(i ==0)
{
len[i] = abs(a[0]-begin);
}
else if(a[i] < a[i-1])
{
len[i] = a[i-1] - a[i];
}
else
{
len[i] = a[i]-a[i-1];
}

sumlen += len[i];
if(i != NUM-1)
{
printf("%3d+",len[i]);
}
else
{
printf("%3d=%d",len[i],sumlen);
}
}

printf("\n\n");
 }
 
 void sort_elevator(int a[])
 {
  int i,j,tmp,tmp_i;
 
  for(i = 0;i < NUM;i++)
  {
  if(a[i] < begin)
  {
  a[i] += N;
}
}

for(i = 0;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] > a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}

for(i = 0;i < NUM;i++)
{
if(a[i] >= N)
{
a[i] -= N;
}
}
i = 0 ;
while(a[i]>begin)
{
i++;
}
tmp_i = i;
for(i = tmp_i;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] < a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}
 }
 
 void sort_elevator_before(int a[])
 {
  int i,j,tmp,tmp_i;
 
  for(i = 0;i < NUM;i++)
  {
  if(a[i] > begin)
  {
  a[i] -= N;
}
}

for(i = 0;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] < a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}

for(i = 0;i < NUM;i++)
{
if(a[i] < 0)
{
a[i] += N;
}
}

i = 0 ;
while(a[i]<begin)
{
i++;
}

tmp_i = i;
for(i = tmp_i;i < NUM-1;i++)
{
for(j = i+1;j < NUM;j++)
{
if(a[i] > a[j])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}



 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值