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

📄 haha.cpp

📁 操作系统课程设计,有问题可以联系我!C++代码的实先,OS课设!
💻 CPP
字号:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>

typedef struct
//定义序列的结构体,其中data为序列数据,flag为数据状态标记
{
	int data;
	int flag;
}node;

void sort(node *a,int num)
//将序列从小到大排列
{
    int tmp;
    for (int i = 0; i <num; i++)
    {
       for(int j = 0; j < num - i - 1; j++)
       {
           if(a[j+1].data < a[j].data)
           {
               tmp = a[j+1].data;
               a[j+1].data = a[j].data;
               a[j].data = tmp;
           }
       }
    } 
}

void fcfs(int num,int location,node *serial)
//先来先服务算法
{
	printf("\n磁臂调度算法之先来先服务:\n");
	printf("----------------------------------------------\n");
	printf("当前磁道:%d\n",location);
	int i,s,count=0;
	printf("\n----------------------------------------------\n");
	printf("磁道请求队列(磁道数为%d个):\n",num);
	for(i=0;i<num;i++)
	{
	s=abs(serial[i].data-location);
	count+=s;
	location=serial[i].data;
	printf("%d,",serial[i].data);
	}
	printf("\n----------------------------------------------\n");
	printf("\n磁臂调度访问序列:\n");
	for(i=0;i<num;i++)
		 printf("%d,",serial[i]);
	printf("\n----------------------------------------------\n");
    printf("\n移动磁道数:%d\n",count);
    printf("\n----------------------------------------------\n");
}
void scan(int cl,int num,node *a)
//电梯(扫描)算法
{
	int i,t;
	sort(a,num);
	printf("\n磁道调度序列为:\n\n");
	for (i=0;i<num;i++)//磁头向右扫描
	{
		if(a[i].data>cl)
		{ 
			if(a[i].flag==0) 
		  {
			  printf("%d-->",a[i].data);
			  if(i%10==0) printf("\n");//每十个数为一行输出
			  a[i].flag=1;
		  }
		  
		}
	}
	t=abs(cl-a[num-1].data);
	for(i=num-1;i>=0;i--)//磁头向左扫描
	{
		int f=0;f++;
		if(a[i].data<cl)
		{
			if(a[i].flag==0)
			{
				printf("%d-->",a[i].data);
                
				if(f%10==0) printf("\n");//每十个数为一行输出
				a[i].flag=1;
			}
			
		}
	}
	t=t+a[num-1].data-a[0].data;//移动的磁道数
	printf("\n\n移动磁道数为:%d\n",t);
}
void sstf(node *a,int num,int location)
//最短路径优先算法
{
	int i,j,min,tmp,k=num;
	printf("\n磁臂调度算法之最短路径优先算法:\n");
	printf("----------------------------------------------\n");
	printf("\n当前磁道:%d\n",location);
	printf("\n----------------------------------------------\n");
	printf("磁道请求序列(磁道数为%d个):\n",num);
	sort(a,num);
	for(i=0;i<num;i++)
		printf("%d,",a[i].data);//打印输出待访问的磁道序列
	printf("\n");
	for(i=0;i<num;i++)
	{
		tmp=location-a[0].data;
		for(j=1;j<k;j++)
		{
			if(a[j].flag!=1&&tmp>(location-a[j].data))
			{
				tmp=(location-a[j].data);
				min=a[j].data;
				a[j].flag=1;
			}
		}
		printf("%d->",min);
	}
}

main(int argc,char *argv[])
{
  FILE *fp;
  char temp[20];
  int i,j,num,location;
  if(argc!=2)
  {
	  printf("Usage:haha.exe datafile\n");
	  return 0;
  }
  if((fp=fopen(argv[1],"r"))==NULL)
  {
	  printf("Cannot open this file!");
	  return 0;
  }
  fscanf(fp,"%14s%d",temp,&num);
  fscanf(fp,"%17s%d",temp,&location);
  fscanf(fp,"%s",temp);
  node *serial=(node *)malloc(num*sizeof(node));
  for(i=0;i<num;i++)
	  fscanf(fp,"%d",&(serial[i].data));
  for(i=0;i<num;i++)
  {
	  serial[i].flag=0;
  }
  while(1)
  {
	  system("cls");
	  printf("This is an Access arm Simulation Scheduler\n微琳龙三人组制作\n");
	  printf("\nUsage of this program:\nChoose options below:\n[1]To see the FCFS Scheduling;\n[2]To see the SCAN Scheduling;\n[3]To see the SSTF Scheduling.\n[4]Quit this program\n");
	  printf("\n[Choice @ Scheduler] $ ");
	  scanf("%d",&j);
	  switch(j)
	  {
	  case 1:fcfs(num,location,serial);break;
	  case 2:scan(location,num,serial);break;
	  case 3:sstf(serial,num,location);break;
	  case 4:return 0;
	  default:printf("\nYou entered an invalid choice!\n");
	  }
	  printf("\nAccess arm simulation scheduled completely!\n");
	  system("pause");
  }
  fclose(fp);
  return 0;
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -