📄 main.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct
{
int tracknum,current;
int *currents;//定义一个动态的数组空间,用来存放访盘的磁道总数;
}TRACK;//定义一个访盘序列结构体,其中tracknum,current分别表示总的请求访盘磁道数,当前磁头所在的磁道号,;
int min,max,i,j,k=1,temp1,minnum,p=1,localmin,a,m,b,r;//定义全局变量
char temp[80],str[2];//定义一个足够大的字符数组temp[80],用来从文件中读入字符,str[2]用来接收用户从键盘输入的字符;
char grade;
int *currents2;//定义一个动态数组,用来存放最后磁头所扫描过的路线;
int *currents1; //定义一个动态数组,用来存放访盘的磁道号,从小到大的序列;
int *currents3;//定义一个和*currents1一样大的空间,用来每次进入下一个算法时*currents1的内容;
TRACK track;//定义一个结构体;
int main(int argc,char*argv[])
{
FILE*file;//定义文件指针;
void fcfs();
void scanl();
void scanh();
void cscanl();
void cscanh();
void sstf();//对六种算法函数的申明;
if (argc!=2)
{
printf("error\n");
exit(0);
}
if((file=fopen(argv[1],"r"))==NULL)
printf("read file failed\n");
fscanf(file,"%9s%d",temp,&(track.tracknum));//从文件中读入字符串到temp中,访盘的总数到track.tracknum中;
fscanf(file,"%8s%d",temp,&(track.current));//从文件中读入字符串到temp中,最初磁头所在的磁道号到track.current中;
fscanf(file,"%12s",temp);//从文件中读入字符串到temp中;
track.currents=(int*)malloc(sizeof(int)*track.tracknum);//申请一个tracknum大的动态的数组空间,用来存放访盘的磁道;
currents2=(int*)malloc(sizeof(int)*(track.tracknum+1));//申请一个tracknum+1的动态数组空间,用来存放磁头最后移动的路线;
currents1=(int*)malloc(sizeof(int)*track.tracknum);//申请一个动态数组,用来存放访盘的磁道号,从小到大的序列;
currents3=(int*)malloc(sizeof(int)*track.tracknum);//申请一个和*currents1一样大的空间,用来每次进入下一个算法时恢复*currents1的内容;
r=track.current;//保护磁头最初所在的磁道号
for(i=0;i<track.tracknum;i++)
fscanf(file,"%d",track.currents+i);//从文件读入访盘的所有磁道;
fclose(file);//将文本文件关闭
for(i=0;i<track.tracknum;i++)
*(currents1+i)=*(track.currents+i);//把currents的内容全部复制到currents1中;
*(currents2+0)=track.current;//把磁头最初所在的磁道号存入*(currents2+0)中;
for(i=0;i<track.tracknum-1;i++)
for(j=i+1;j<track.tracknum;j++)
if(*(currents1+i)>*(currents1+j))
{ temp1=*(currents1+i);
*(currents1+i)=*(currents1+j);
*(currents1+j)=temp1;
}//对currents1进行从小到大排序,并放回currents1;
for(i=0;i<track.tracknum;i++)
*(currents3+i)=*(currents1+i);//把currents1中的内容备份到currents3中;
printf("the original track is:\n");
for(i=0;i<track.tracknum;i++)
printf("%d ",*(track.currents+i));
printf("\n");//输出按时间先后的访盘序列;
printf("the order track is:\n");
for(i=0;i<track.tracknum;i++)
printf("%d ",*(currents1+i));
printf("\n");//输出按从小到大排好序的访盘序列;
while(1)
{
printf("\n you can select 'a','b','c','d','e','f','n'\n");
printf("a->fsfc,b->scanl,c->scanh,d->cscanl,e->cscanh,f->sstf,n->break\n");//在用户界面输出相应的选择信息;
gets(str);//从键盘接收字符到数组str;
grade=str[0];//把从键盘接收的第一个字符给grade;
track.current=r;//进入下一个算法之前恢复磁头最初所在的磁道号;
*(currents2+0)=track.current;//把磁头最初所在的磁道号存放在 *(currents2+0)中;
for(i=0;i<track.tracknum;i++)
*(currents1+i)=*(currents3+i);//进入下一个算法之前对*(currents1+i)的内容进行恢复;
switch(grade)
{
case'a':fcfs();break;
case'b':scanl();break;
case'c':scanh();break;
case'd':cscanl();break;
case'e':cscanh();break;
case'f':sstf();break;
case'n':break;
default:printf("error\n");
}
if(grade=='n') break;
}
return(0);
}//实现用户对六种不同算法的选择;
void sstf() //下面是最短路径优先算法的实现;
{ int shift=0;
localmin=*(currents1+(track.tracknum-1))-*(currents1+0);//赋给localmin一个足够大的数以确保下面的算法可以进行;
k=1;
min=abs(track.current-*(currents1+0));//磁头最初所在的磁道号与*(currents1+0)的内容的距离给min;
minnum=0;
while(p<=track.tracknum)//下面是找出磁头所要扫描的一系列磁道号;
{ for(i=0;i<track.tracknum;i++)//找出磁头下一个所要扫描的磁道号;
{
if(*(currents1+i)!=-1)
{
max=abs(track.current-*(currents1+i));
if(min<=max)
continue;
else
{temp1=min; min=max; max=temp1; minnum=i;}
}
}
*(currents2+k)=*(currents1+minnum);//找到下一个要访的位置minnum,并把*(currents1+minnum)的内容给*(currents2+k);
k++;
track.current=*(currents1+minnum);//把磁头移向该磁道号;
*(currents1+minnum)=-1;//把*(currents1+minnum)的内容修改为-1;
p++;
min=localmin;//min又被赋与一个很大的数,继续找下一个要访问的磁道;
}
printf(" the SSTF liner is:\n");
for(i=0;i<track.tracknum+1;i++)
printf("%d ",*(currents2+i));//输出磁头最终所扫描过的路线;
printf("\n");
for(i=0;i<track.tracknum;i++)
shift+=abs(*(currents2+i+1)-*(currents2+i));//计算磁头所走过的路程;
printf("shift=%d",shift);//输出路程;
}
void fcfs()//下面是先来先服务算法;
{ int shift=0;
printf("the FCFS liner is:\n");
for(i=0;i<track.tracknum;i++)
{
printf(" %d",*(track.currents+i));//按文件中的顺序输出就是先来先服务的磁头所经过的路线;
}
for(i=0;i<track.tracknum;i++)
{
a=abs(track.current-*(track.currents+i));
track.current=*(track.currents+i);
shift+=a;
}//计算磁头所走过的路程;
printf("\n");
printf("shift=");
printf("%d",shift);//输出路程;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -