📄 haha.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 + -