📄 cipandiaodusuanfa1.txt
字号:
磁盘调度算法(去年自考北大上机0S题)楼主pgood(没看过海)2002-12-03 14:02:49 在 软件培训/认证/考试 / 其他 提问
明天就要去考OS的上机了,在网上找了找以前的试题,觉得一点低也没有,全当练习了!
要是能把LINUX内核通读一遍,那有多好啊!都30的人了,还执迷不悟!
// t1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
/*
3、磁盘调度算法
要求:
1。实现三种算法:
1。先来先服务
2。最短寻道优先(老师会给当前磁头的位置)
3。电梯算法
2。磁道服务顺序从指定的文本文件(TXT文件)中取出
3。输出:
第一行:磁道的服务顺序
第二行:显示移动总道数
参考题目:书 P130
*/
// t1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include"math.h"
#include"stdlib.h"
#include"string.h"
struct Head
{
int nPosition;
bool bVisited;
};
void Visit(struct Head *pHead)
{
printf("visite cy:%d\n",pHead->nPosition);
pHead->bVisited=true;
}
int ReadInputKeyboard(struct Head *pHead,int *pCurrentPosition,int nMaxNumber)
{
int i;
printf("please input Current position:");
scanf("%d",pCurrentPosition);
printf("please input will visit position:");
for(i=0;i<nMaxNumber;i++)
{
scanf("%d",&pHead[i].nPosition);
pHead[i].bVisited=false;
if(pHead[i].nPosition<0)
break;
}
return i;
}
int ReadInputFile(struct Head *pHead,int *pCurrentPosition,int nMaxNumber)
{
int i;
char szFileName[256],*q,*p,szTemp[20];
printf("please input filename:");
scanf("%s",szFileName);
FILE *pFile=fopen(szFileName,"r");
if(pFile==NULL)
{
printf("open file %s error",szFileName);
return -1;
}
for(i=0;!feof(pFile) &&i<nMaxNumber;)
{
p=szFileName;
fgets(p,256,pFile);
while(q=strchr(p,','))
{
memset(szTemp,0,sizeof(szTemp)*sizeof(char));
strncpy(szTemp,p,q-p);
p=q+1;
if(i==0)
*pCurrentPosition=atoi(szTemp);
else
{
pHead[i-1].nPosition=atoi(szTemp);
pHead[i-1].bVisited=false;
}
i++;
}
memset(szTemp,0,sizeof(szTemp)*sizeof(char));
pHead[i-1].nPosition=atoi(p);
pHead[i-1].bVisited=false;
//i++;
}
fclose(pFile);
return i;
}
int FifoVisit(int nCurrentPosition,struct Head *pHead,int nNumber)
{
//先来先服务
int nHaveVisited=0;
int nMoveDistance=0;
int i;
while(nHaveVisited<nNumber)
{
for(i=0;i<nNumber;i++)
{
if(pHead[i].bVisited)
continue;
Visit(&pHead[i]);
nHaveVisited++;
nMoveDistance+=abs(nCurrentPosition-pHead[i].nPosition);
nCurrentPosition=pHead[i].nPosition;
}
}
printf("the sum of move distance:%d\n",nMoveDistance);
return nMoveDistance;
}
int SsfoVisit(int nCurrentPosition,struct Head *pHead,int nNumber)
{
// 最短寻找时间优先
int nHaveVisited=0;
int nMoveDistance=0;
int nMinDistance=0;
int nMinIndex=0;
int i;
while(nHaveVisited<nNumber)
{
nMinDistance=0xffff;
nMinIndex=0;
//找最小值
for(i=0;i<nNumber;i++)
{
if(pHead[i].bVisited)
continue;
if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition))
{
nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);
nMinIndex=i;
}
}
//访问
Visit(&pHead[nMinIndex]);
nHaveVisited++;
nMoveDistance+=nMinDistance;
nCurrentPosition=pHead[nMinIndex].nPosition;
}
printf("the sum of move distance:%d\n",nMoveDistance);
return nMoveDistance;
}
int DtVisit(int nCurrentPosition,bool bOut,struct Head *pHead,int nNumber)
{
//电梯调度算法
int nHaveVisited=0;
int nMoveDistance=0;
int nMinDistance=0;
int nMinIndex=0;
int i;
while(nHaveVisited<nNumber)
{
nMinDistance=0xffff;
nMinIndex=0;
//找最小值
for(i=0;i<nNumber;i++)
{
if(pHead[i].bVisited)
continue;
if(bOut && pHead[i].nPosition<nCurrentPosition ||
!bOut && pHead[i].nPosition>nCurrentPosition)
{
if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition))
{
nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);
nMinIndex=i;
}
}
}
if(nMinDistance==0xffff)
{
bOut=!bOut;
continue;
}
//访问
Visit(&pHead[nMinIndex]);
nHaveVisited++;
nMoveDistance+=nMinDistance;
nCurrentPosition=pHead[nMinIndex].nPosition;
}
printf("the sum of move distance:%d\n",nMoveDistance);
return nMoveDistance;
}
int DxVisit(int nCurrentPosition,struct Head *pHead,int nNumber)
{
//单向调度算法
int nHaveVisited=0;
int nMoveDistance=0;
int nMinDistance=0;
int nMinIndex=0;
int i;
while(nHaveVisited<nNumber)
{
nMinDistance=0xffff;
nMinIndex=0;
//找最小值
for(i=0;i<nNumber;i++)
{
if(pHead[i].bVisited)
continue;
if(pHead[i].nPosition>nCurrentPosition )
{
if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition))
{
nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);
nMinIndex=i;
}
}
}
if(nMinDistance==0xffff)
{
nMoveDistance+=199-nCurrentPosition;
nCurrentPosition=0;
continue;
}
//访问
Visit(&pHead[nMinIndex]);
nHaveVisited++;
nMoveDistance+=nMinDistance;
nCurrentPosition=pHead[nMinIndex].nPosition;
}
printf("the sum of move distance:%d\n",nMoveDistance);
return nMoveDistance;
}
int main(int argc, char* argv[])
{
//p114
struct Head mylist[20];//={98,false,183,false,37,false,122,false,14,false,124,false,65,false,67,false};
//int nCurrentPosition=53;
//int nRealNumber=8;
int nCurrentPosition=0;
int nRealNumber=ReadInputFile(mylist,&nCurrentPosition,20);
// FifoVisit(nCurrentPosition,mylist,nRealNumber);
// SsfoVisit(nCurrentPosition,mylist,nRealNumber);
//DtVisit(nCurrentPosition,false,mylist,nRealNumber);
DxVisit(nCurrentPosition,mylist,nRealNumber);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -