Professional Documents
Culture Documents
Input : Algorithm selection, Max Cyclinder, Initial Position, Number of Requests, Request string
#include<stdio.h>
#include <stdlib.h>
int fcfs()
int queue[20],n,head,i,j,k,seek=0,max,diff;
float avg;
scanf("%d",&max);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&queue[i]);
scanf("%d",&head);
queue[0]=head;
for(j=0;j<=n-1;j++)
diff=abs(queue[j+1]-queue[j]);
seek+=diff;
}
printf("Total seek time is %d\n",seek);
avg=seek/(float)n;
return 0;
#include<stdbool.h>
int request[50];
int SIZE;
bool flag[50];
int dist(int,int);
struct max{
int data;
int dis;
int dat;
}kate[50],kat;
int i;
int j=0;
for(i=0;i<n;i++)
if(flag[i]==0){
kate[j].dis=dist(head,request[i]);
kate[j].data=request[i];
kate[j].dat=i;
j++;
n=j;
int temp=kate[j].data;
kate[j].data=kate[j+1].data;
kate[j+1].data=temp;
temp=kate[j].dis;
kate[j].dis=kate[j+1].dis;
kate[j+1].dis=temp;
temp=kate[j].dat;
kate[j].dat=kate[j+1].dat;
kate[j+1].dat=temp;
return kate[0];
if(a>b){
return a-b;
return b-a;
void stsk(int n)
int head,i;
int seekcount=0;
for(i=0;i<n;i++)
if(request[i]<SIZE-1)
printf("%d ",head);
kat=check(head,n);
seekcount=seekcount+kat.dis;
head=kat.data;
flag[kat.dat]=true;
int sstf()
int n,i;
scanf("%d",&SIZE);
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&request[i]);
flag[i]=0;
stsk(n);
int absoluteValue(int x)
{
if(x>0)
return x;
else
return x*-1;
void scanfn()
difference,temp,queue1[20],queue2[20],temp1=0,temp2=0;
float averageSeekTime;
scanf("%d",&maxrange);
scanf("%d",&n);
scanf("%d",&headposition);
if(temp>headposition)
temp2++;
for(i=0;i<temp1-1;i++)
for(j=i+1;j<temp1;j++)
if(queue1[i]>queue1[j])
temp=queue1[i];
queue1[i]=queue1[j];
queue1[j]=temp;
}
}
for(i=0;i<temp2-1;i++)
for(j=i+1;j<temp2;j++)
if(queue2[i]<queue2[j])
temp=queue2[i];
queue2[i]=queue2[j];
queue2[j]=temp;
for(i=1,j=0;j<temp1;i++,j++)
queue[i]=queue1[j];
queue[i]=maxrange;
//Copying second array queue2[] after that first one is copied, into queue[]
for(i=temp1+2,j=0;j<temp2;i++,j++)
queue[i]=queue2[j];
}
//Setting queue[i] to 0. Because that is the innermost cylinder.
queue[i]=0;
//At this point, we have the queue[] with the requests in the
queue[0]=headposition;
for(j=0; j<=n; j++) //Loop starts from headposition. (ie. 0th index of queue)
difference = absoluteValue(queue[j+1]-queue[j]);
printf("Disk head moves from position %d to %d with Seek %d \n", queue[j], queue[j+1],
difference);
averageSeekTime = seek/(float)n;
}
void lookfn()
difference,temp,queue1[20],queue2[20],temp1=0,temp2=0;
float averageSeekTime;
scanf("%d",&maxrange);
scanf("%d",&n);
scanf("%d",&headposition);
if(temp>headposition)
temp2++;
for(i=0;i<temp1-1;i++)
for(j=i+1;j<temp1;j++)
if(queue1[i]>queue1[j])
temp=queue1[i];
queue1[i]=queue1[j];
queue1[j]=temp;
for(i=0;i<temp2-1;i++)
for(j=i+1;j<temp2;j++)
if(queue2[i]<queue2[j])
temp=queue2[i];
queue2[i]=queue2[j];
queue2[j]=temp;
for(i=1,j=0;j<temp1;i++,j++)
queue[i]=queue1[j];
//Copying second array queue2[] after that first one is copied, into queue[]
for(i=temp1+1,j=0;j<temp2;i++,j++)
queue[i]=queue2[j];
//At this point, we have the queue[] with the requests in the
queue[0]=headposition;
for(j=0; j<n; j++) //Loop starts from headposition. (ie. 0th index of queue)
difference = absoluteValue(queue[j+1]-queue[j]);
printf("Disk head moves from position %d to %d with Seek %d \n", queue[j], queue[j+1],
difference);
averageSeekTime = seek/(float)n;
void cscanfn()
difference,temp,queue1[20],queue2[20],temp1=0,temp2=0;
float averageSeekTime;
scanf("%d",&maxrange);
scanf("%d",&n);
scanf("%d",&headposition);
// Reading disk positions to be read in the order of arrival
if(temp>headposition)
temp2++;
for(i=0;i<temp1-1;i++)
for(j=i+1;j<temp1;j++)
if(queue1[i]>queue1[j])
temp=queue1[i];
queue1[i]=queue1[j];
queue1[j]=temp;
}
for(i=0;i<temp2-1;i++)
for(j=i+1;j<temp2;j++)
if(queue2[i]>queue2[j])
temp=queue2[i];
queue2[i]=queue2[j];
queue2[j]=temp;
for(i=1,j=0;j<temp1;i++,j++)
queue[i]=queue1[j];
queue[i]=maxrange;
//Moving Disk head to the inner most cylinder, because this is Circular Scan.
queue[i+1]=0;
//Copying second array queue2[] after that first one is copied, into queue[]
for(i=temp1+3,j=0;j<temp2;i++,j++)
queue[i]=queue2[j];
//At this point, we have the queue[] with the requests in the
queue[0]=headposition;
for(j=0; j<=n+1; j++) //Loop starts from headposition. (ie. 0th index of queue)
difference = absoluteValue(queue[j+1]-queue[j]);
printf("Disk head moves from position %d to %d with Seek %d \n", queue[j], queue[j+1],
difference);
averageSeekTime = seek/(float)n;
void clookfn()
difference,temp,queue1[20],queue2[20],temp1=0,temp2=0;
float averageSeekTime;
scanf("%d",&maxrange);
scanf("%d",&n);
scanf("%d",&headposition);
if(temp>headposition)
temp2++;
for(i=0;i<temp1-1;i++)
for(j=i+1;j<temp1;j++)
if(queue1[i]>queue1[j])
temp=queue1[i];
queue1[i]=queue1[j];
queue1[j]=temp;
for(i=0;i<temp2-1;i++)
for(j=i+1;j<temp2;j++)
if(queue2[i]>queue2[j])
temp=queue2[i];
queue2[i]=queue2[j];
queue2[j]=temp;
for(i=1,j=0;j<temp1;i++,j++)
queue[i]=queue1[j];
queue[i]=queue2[0];
//Copying second array queue2[] after that first one is copied, into queue[]
for(i=temp1+1,j=0;j<temp2;i++,j++)
queue[i]=queue2[j];
//At this point, we have the queue[] with the requests in the
queue[0]=headposition;
for(j=0; j<n; j++) //Loop starts from headposition. (ie. 0th index of queue)
{
// Finding the difference between next position and current position.
difference = absoluteValue(queue[j+1]-queue[j]);
averageSeekTime = seek/(float)n;
int main()
int num;
scanf("%d", &num);
if(num==1)
fcfs();
else if(num==2)
sstf();
}
else if(num==3)
scanfn();
else if(num==4)
lookfn();
else if(num==5)
cscanfn();
else if(num==6)
clookfn();
Alternate code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<assert.h>
#include<limits.h>
for(int i=0;i<request_n;i++){
assert(inp[i]<=cy_max);
}
void print_op(int total){
printf("seek operations:%d",total);
validate(inp,request_n,cy_max);
int total=0;
for(int i=0;i<request_n;i++){
total+=abs(inp[i]-posi);
posi=inp[i];
print_op(total);
int n=0;
n++;
int m=inp[n]-posi;
for(int i=0;i<request_n;i++){
m=inp[i]-posi;
n=i;
return n;
validate(inp,request_n,cy_max);
int total=0,rem=request_n,n;
int used[request_n];
for(int i=0;i<request_n;i++){
used[i]=0;
while(rem>0){
n=find_closest(inp,request_n,posi,used);
used[n]=1;
total+=abs(inp[n]-posi);
posi=inp[n];
rem--;
print_op(total);
int n=0;
for(int i=0;i<request_n;i++){
if(inp[i]>inp[n]){
n=i;
return n;
//diretcionn?
validate(inp,request_n,cy_max);
int total=0;
if(inp[find_max(inp,request_n)]<posi){
print_op(posi);
else{
total+=inp[find_max(inp,request_n)]+posi;
print_op(total);
}
}
int m=0;
for(int i=0;i<request_n;i++){
if(inp[m]>inp[i]){
m=i;
return m;
//direction?
validate(inp,request_n,cy_max);
int total=0;
int n=find_max(inp,request_n);
int m=find_min(inp,request_n);
total=abs(inp[m]-posi);
total+=abs(inp[n]-inp[m]);
if(inp[n]<posi){
total=abs(posi-inp[m]);
if(inp[m]>posi){
total=abs(posi-inp[n]);
print_op(total);
//direction?
int i=0;
i++;
}
if(i==request_n){
return 0;
for(int j=0;j<request_n;j++){
i=j;
return inp[i];
validate(inp,request_n,cy_max);
int total=0;
int n=find_max(inp,request_n);
int m=find_min(inp,request_n);
total=cy_max-posi+cy_max+find_max_less_posi(inp,request_n,posi)-2;
if(inp[m]>posi){
total=inp[n]-posi;
if(inp[n]<posi){
total=posi-inp[m];
print_op(total);
//direction?
validate(inp,request_n,cy_max);
int total=0;
int n=find_max(inp,request_n);
int m=find_min(inp,request_n);
total=inp[n]-posi+inp[n]-inp[m]+find_max_less_posi(inp,request_n,posi)-inp[m];
if(inp[m]>posi){
total=inp[n]-posi;
if(inp[n]<posi){
total=posi-inp[m];
print_op(total);
int main(){
int choice,cy_max,posi,request_n;
scanf("%d %d %d %d",&choice,&cy_max,&posi,&request_n);
for(int i=0;i<request_n;i++){
scanf("%d",&inp[i]);
switch(choice){
case 1:
fcfs(cy_max,posi,inp,request_n);
break;
case 2:
sstf(cy_max,posi,inp,request_n);
break;
case 3:
scan(cy_max,posi,inp,request_n);
break;
case 4:
look(cy_max,posi,inp,request_n);
break;
case 5:
cscan(cy_max,posi,inp,request_n);
break;
case 6:
clook(cy_max,posi,inp,request_n);
break;
default:
printf("invalid choice");
return 0;
}
Alternate code output: