⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 操作系统课程设计,有问题可以联系我!C++代码的实先,OS课设!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -