📄 unit4.cpp
字号:
//---------------------------------------------------------------------------
//计算机02(7)班 洪凌郁 19号
#include <vcl.h>
#pragma hdrstop
#include "stdio.h"
#include "stdlib.h"
#include <iostream.h>
#include "Unit4.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
void CopyL(int Sour[],int Dist[] ,int x);
void SetDI(int DiscL[]);
void Print(int Pri[],int x);
void DelInq(int Sour[],int x,int y);
void FCFS(int Han,int DiscL[]); //先来先服务算法
void SSTF(int Han,int DiscL[]); //最短寻道时间优先
int SCAN(int Han,int DiscL[],int x,int y);//扫描算法
void CSCAN(int Han,int DiscL[]); //循环扫描算法
void N_Step_SCAN(int Han1,int DiscL[]);//分步扫描算法
void PaiXu(); //排序
void Pri(); //打印
int NAll=0;
int Best[5][2];
int Limit=0;
int Jage;
int Aver=0;
int form4_flag;
int DiscLine[10]; //要寻找的磁道号个数
int Hand; //初始化磁道号
//---------------------------------------------------------------------------
void CopyL(int Sour[],int Dist[] ,int x)
{
int i;
for(i=0;i<=x;i++)
{
Dist[i]=Sour[i];
}
}
//---------------------------------------------------------------------------
void Print(int Pri[],int x)
{ AnsiString str2;
int i;
for(i=0;i<=x;i++)
{
str2+=IntToStr(Pri[i]);
str2+=" ,";
}
Form4->Memo1->Lines->Add(str2);
}
//---------------------------------------------------------------------------
void SetDI(int DiscL[])
{ int i;
for(i=0;i<=9;i++)
{
DiscL[i]=rand()%Limit;
}
Print(DiscL,9);
}
//---------------------------------------------------------------------------
void DelInq(int Sour[],int x,int y)
{
int i;
for(i=x;i<y;i++)
{
Sour[i]=Sour[i+1];
x++;
}
}
//---------------------------------------------------------------------------
void FCFS(int Han,int DiscL[])
{ AnsiString str4;
int RLine[10];
int i,k,All,Temp;
All=0;
k=9;
CopyL(DiscL,RLine,9);
str4=" 按照FCFS算法磁道的访问顺序为:\r\n\r\n";
for(i=0;i<=9;i++)
{
Temp=RLine[0]-Han;
if(Temp<0)
Temp=(-Temp);
str4+=IntToStr(RLine[0]);
str4+=" , ";
All=Temp+All;
DelInq(RLine,0,k);
k--;
}
Best[Jage][1]=All;
Best[Jage][0]=1;
Jage++;
Aver=All/10;
str4+="\r\n\r\n<<<<移动的磁道总数为: ";
str4+=IntToStr(All);
str4+=" ; ";
str4+="平均寻道总数为: ";
str4+=IntToStr(Aver);
str4+=" >>>>\r\n";
Form4->Memo2->Lines->Add(str4);
}
//---------------------------------------------------------------------------
void SSTF(int Han,int DiscL[])
{ AnsiString str5;
int i,j,k,h,All;
int Temp;
int RLine[10];
int Min;
All=0;
k=9;
CopyL(DiscL,RLine,9);
str5="按照SSTF算法磁道的访问顺序为 : \r\n ";
for(i=0;i<=9;i++)
{
Min=64000;
for(j=0;j<=k;j++)
{
if(RLine[j]>Han)
Temp=RLine[j]-Han;
else
Temp=Han-RLine[j];
if(Temp<Min)
{
Min=Temp;
h=j;
}
}
All=All+Min;
str5+=IntToStr(RLine[h]);
str5+=" , ";
Han=RLine[h];
DelInq(RLine,h,k);
k--;
}
Best[Jage][1]=All;
Best[Jage][0]=2;
Jage++;
Aver=All/10;
str5+="\r\n\r\n<<<<移动的磁道总数为: ";
str5+=IntToStr(All);
str5+=" ; ";
str5+="平均寻道总数为: ";
str5+=IntToStr(Aver);
str5+=" >>>>\r\n";
Form4->Memo2->Lines->Add(str5);
}
//---------------------------------------------------------------------------
int SCAN(int Han,int DiscL[],int x,int y)
{ AnsiString str6;
int j,n,k,h,m,All;
int Temp;
int Min;
int RLine[10];
int Order;
Order=1;
k=y;
m=2;
All=0;
CopyL(DiscL,RLine,9);
str6="按照SCAN算法磁道的访问顺序为:\r\n";
Min=64000;
for(j=x;j<=y;j++)
{
if(RLine[j]>Han)
Temp=RLine[j]-Han;
else
Temp=Han-RLine[j];
if(Temp<Min)
{
Min=Temp;
h=j;
}
}
All=All+Min;
str6+=IntToStr(RLine[h]);
str6+=" , ";
if(RLine[h]>=Han)
Order=0;
Han=RLine[h];
DelInq(RLine,h,k);
k--;
while(m>0)
{
if(Order==1)
{
for(j=x;j<=y;j++)
{
h=-1;
Min=64000;
for(n=x;n<=k;n++)
{
if(RLine[n]<=Han)
{
Temp=Han-RLine[n];
if(Temp<Min)
{
Min=Temp;
h=n;
}
}
}
if(h!=-1)
{
All=All+Min;
str6+=IntToStr(RLine[h]);
str6+=" , ";
Han=RLine[h];
DelInq(RLine,h,k);
k--;
}
}
Order=0;
m--;
}
else
{
for(j=x;j<=y;j++)
{
h=-1;
Min=64000;
for(n=x;n<=k;n++)
{
if(RLine[n]>=Han)
{
Temp=RLine[n]-Han;
if(Temp<Min)
{
Min=Temp;
h=n;
}
}
}
if(h!=-1)
{
All=All+Min;
str6+=IntToStr(RLine[h]);
str6+=" , ";
Han=RLine[h];
DelInq(RLine,h,k);
k--;
}
}
Order=1;
m--;
}
}
NAll=NAll+All;
if((y-x)>5)
{
Best[Jage][1]=All;
Best[Jage][0]=3;
Jage++;
Aver=All/10;
str6+="\r\n\r\n<<<<移动的磁道总数为: ";
str6+=IntToStr(All);
str6+=" ; ";
str6+="平均寻道总数为: ";
str6+=IntToStr(Aver);
str6+=" >>>>\r\n";
}
Form4->Memo2->Lines->Add(str6);
return(Han);
}
//---------------------------------------------------------------------------
void CSCAN(int Han,int DiscL[])
{
AnsiString str7;
int j,h,n,Temp,m,k,All,Last;
int RLine[10];
int Min;
m=2;
k=9;
All=0;
Last=Han;
CopyL(DiscL,RLine,9);
str7="按照CSCAN算法磁道的访问顺序为:\r\n";
while(k>=0)
{
for(j=0;j<=9;j++)
{
h=-1;
Min=64000;
for(n=0;n<=k;n++)
{
if(RLine[n]>=Han)
{
Temp=RLine[n]-Han;
if(Temp<Min)
{
Min=Temp;
h=n;
}
}
}
if(h!=-1)
{
All=All+Min;
str7+=IntToStr(RLine[h]);
str7+=" , ";
Han=RLine[h];
Last=RLine[h];
DelInq(RLine,h,k);
k--;
}
}
m--;
Han=0;
if(k>=0)
{
Temp=Last-Han;
All=All+Temp;
}
}
Best[Jage][1]=All;
Best[Jage][0]=4;
Jage++;
Aver=All/10;
str7+="\r\n\r\n<<<<移动的磁道总数为: ";
str7+=IntToStr(All);
str7+=" ; ";
str7+="平均寻道总数为: ";
str7+=IntToStr(Aver);
str7+=" >>>>\r\n";
Form4->Memo2->Lines->Add(str7);
}
//---------------------------------------------------------------------------
void N_Step_SCAN(int Han1,int DiscL[])
{ AnsiString str8;
int i,m;
int RLine1[10];
NAll=0;
m=2;
i=-1;
CopyL(DiscL,RLine1,9);
str8="\r\n按照CSCAN算法磁道的访问顺序为:\r\n";
for(m=0;m<2;m++)
{
Han1=SCAN(Han1,RLine1,i+1,i+5);
i=i+5;
}
Best[Jage][1]=NAll;
Best[Jage][0]=5;
Aver=NAll/10;
str8+="\r\n\r\n<<<<移动的磁道总数为: ";
str8+=IntToStr(NAll);
str8+=" ; ";
str8+="平均寻道总数为: ";
str8+=IntToStr(Aver);
str8+=" >>>>\r\n";
Form4->Memo2->Lines->Add(str8);
}
//---------------------------------------------------------------------------
void PaiXu()
{
int i,j,Temp;
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
if(Best[j][1]>Best[j+1][1])
{
Temp=Best[j+1][1];
Best[j+1][1]=Best[j][1];
Best[j][1]=Temp;
Temp=Best[j+1][0];
Best[j+1][0]=Best[j][0];
Best[j][0]=Temp;
}
}
}
}
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm4::BitBtn2Click(TObject *Sender)
{ AnsiString str1;
int i;
int Con=1;
while(Con!=0)
{
Jage=0;
switch(form4_flag)
{
case 1:
FCFS(Hand,DiscLine); Con=0;
break;
case 2:
{
SSTF(Hand,DiscLine); Con=0; }
break;
case 3:
{
SCAN(Hand,DiscLine,0,9);Con=0;}
break;
case 4:
{
CSCAN(Hand,DiscLine);Con=0; }
break;
case 5:
{
N_Step_SCAN(Hand,DiscLine);Con=0; }
break;
default: break;
}
Form4->Memo2->Lines->Add(str1);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm4::RadioButton5Click(TObject *Sender)
{
if(RadioButton5->Checked)
form4_flag=5;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::RadioButton2Click(TObject *Sender)
{
if(RadioButton2->Checked)
form4_flag=2;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::RadioButton3Click(TObject *Sender)
{
if(RadioButton3->Checked)
form4_flag=3;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::RadioButton4Click(TObject *Sender)
{
if(RadioButton4->Checked)
form4_flag=4;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::RadioButton1Click(TObject *Sender)
{
if(RadioButton1->Checked)
form4_flag=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::BitBtn1Click(TObject *Sender)
{
Hand=StrToInt(Form4->Edit1->Text);
Limit=StrToInt(Form4->Edit2->Text);
SetDI(DiscLine);
Form4->BitBtn1->Enabled=false;
Form4->BitBtn2->Enabled=true;
Form4->BitBtn4->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::BitBtn3Click(TObject *Sender)
{
Form4->Memo1->Clear();
Form4->Memo2->Clear();
Form4->BitBtn1->Enabled=true;
Form4->BitBtn2->Enabled=true;
Form4->BitBtn4->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::FormCreate(TObject *Sender)
{
if(RadioButton1->Checked)
form4_flag=1;
if(RadioButton2->Checked)
form4_flag=2;
if(RadioButton3->Checked)
form4_flag=3;
if(RadioButton4->Checked)
form4_flag=4;
if(RadioButton5->Checked)
form4_flag=5;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::BitBtn4Click(TObject *Sender)
{AnsiString str1;
int i;
FCFS(Hand,DiscLine);
SSTF(Hand,DiscLine);
SCAN(Hand,DiscLine,0,9);
CSCAN(Hand,DiscLine);
N_Step_SCAN(Hand,DiscLine);
PaiXu();
str1+="按算法的寻道效率进行排序如下:";
for(i=0;i<5;i++)
{
str1+=IntToStr(Best[i][0]);
str1+=" ";
}//for
str1+="\r\n\r\n 通过对各种算法进行比较,由此可以得出结论:\r\n\r\n ";
str1+="扫描算法(SCAN)的寻道效率比较高; 最短寻道时间算法(SSTF)的效率紧跟其后 ; 循环扫描算法(CSCAN)和N-Step-SCAN算法次之 ; ";
str1+=" 先来先服务(FCFS)的寻道效率最低!";
Form4->Memo2->Lines->Add(str1);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -