经过我的努力现在卡在对齐上了........求思路!求方法!~
#include <iostream>#include <time.h>
#include<math.h>
#define Bsize 4
#define Psize 10
#include<string>
using namespace std;
int QString[Psize];
int Num=0;
struct pageInfor
{
int content;//页面号
int timer;//被访问标记
};
class LHH_replace
{
public:
LHH_replace(); //构造函数
~LHH_replace(); //构造函数
int findSpace(); //查找是否有空闲内存
int findExist(int curpage); //查找内存中是否有该页面
int findReplace(); //查找应予置换的页面
void FIFO(); //FIFO算法
void SJ(); //随机算法
void BlockClear(); //BLOCK恢复
void initia1(int string[]);
pageInfor *block; //物理块
pageInfor *page; //页面号串
int memory_state[Bsize][Psize];
int s; //缺页统计
private:
};
void P_String(int QString[]) //随机产生页面的各个数
{
int i;
srand((unsigned)time(NULL)); //初始化
for(i=0;i<Psize;i++)
{
QString[i]=rand()*20/RAND_MAX+1;//随机数
}
cout<<"页面走向情况如下:";
for(i=0;i<Psize;i++) //输出各个数
{
cout<<QString[i]<<" ";
}
cout<<endl;
}
LHH_replace::LHH_replace() //构造函数初始化BLOCK
{
s=0;
block = new pageInfor[Bsize];
for(int i=0; i<Bsize; i++)
{
block[i].content = -1;
block[i].timer = 0;
}
}
void LHH_replace::initia1(int QString[] ) //用于初始化页
{
int j;
page = new pageInfor[Psize];
for(int i=0; i<Psize; i++)
{
page[i].content = QString[i];
page[i].timer = 0;
}
for(i=0;i<Psize;i++)
for(j=0;j<Bsize;j++)
memory_state[j][i]=0;
}
LHH_replace::~LHH_replace()
{
s=0;
}
int LHH_replace::findSpace() //查找是否有空闲内存
{
for(int i=0; i<Bsize; i++)
if(block[i].content == -1)
return i;//找到空间内存
return -1;
}
int LHH_replace::findExist(int curpage) //查找内存中是否有该页面
{
for(int i=0; i<Bsize; i++)
if(block[i].content == page[curpage].content)
return i;//找到内存中有该页面,返回BLOCK中的位置
return -1;
}
int LHH_replace::findReplace() //查找先进先出算法中应予置换的页面
{
int pos = 0;
for(int i=0; i<Bsize; i++)
if(block[i].timer >= block[pos].timer)
pos = i;//找到应予置换页面,返回BLOCK中位置
return pos;
}
void LHH_replace::FIFO()//先进先出算法
{
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1) //内存中有该页面
{
for(int b=0; b<Bsize; b++)
{
memory_state[b][i]=memory_state[b][i-1];
}
s++; //记录命中数的变量加1
}
else
{
space = findSpace();
if(space != -1) //内存中有空闲
{
for(int b=0; b<Bsize; b++)
{
memory_state[b][i]=memory_state[b][i-1]; //将第一列的数组复制到第二列
}
block[space] = page[i];
memory_state[space][i]=block[space].content;
}
else //内存中没有空闲
{
for(int b=0; b<Bsize; b++)
{
memory_state[b][i]=memory_state[b][i-1];
}
position = findReplace(); //找到要置换的位置
block[position] = page[i];
memory_state[position][i]=block[position].content;
}
}
for(int j=0; j<Bsize; j++)
block[j].timer++; //block中所有页面timer++
}
}
void LHH_replace::BlockClear() //block恢复
{
for(int i=0; i<Bsize; i++)
{
block[i].content = -1;
block[i].timer = 0;
}
}
typedef struct page
{
int num; //记录页面号
int time; //记录调入内存时间
}Page; //页面逻辑结构,构造为方便算法实现设计
Page b[Bsize];
Page call[Bsize]; //内存单元数
int c[Bsize][Psize]; //暂保存内存当前的状态;缓冲区
int queue[100]; //记录调入队列
int K; //调入队列计数变量
void InitL(Page *b,int c[Bsize][Psize]) //初始化内存单元、缓冲区
{
int i,j;
for(i=0;i<Bsize;i++)
{
b[i].num=-1;
b[i].time=Psize-i-1;
}
for(i=0;i<Bsize;i++)
for(j=0;j<Psize;j++)
c[i][j]=-1;
}
int GetMax(Page *b) //取得在内存中停留最久的页面,默认状态下为最早调入的页面
{
int i;
int max=-1;
int tag=0;
for(i=0;i<Bsize;i++)
{
if(b[i].time>max)
{
max=b[i].time;
tag=i;
}
}
return tag;
}
int Equation(int fold,Page *b) //判断页面是否已在内存
{
int i;
for(i=0;i<Bsize;i++)
{
if (fold==b[i].num)
return i;
}
return -1;
}
void Lru(int fold,Page *b)//最近最久为使用算法
{
int i;
int val;
val=Equation(fold,b);
if (val>=0)
{
b[val].time=0;
for(i=0;i<Bsize;i++)
if (i!=val)
b[i].time++;
}
else
{
queue[++K]=fold; //记录调入页面
val=GetMax(b);
b[val].num=fold;
b[val].time=0;
for(i=0;i<Bsize;i++)
if (i!=val)
b[i].time++;
}
}
void LHH_replace::SJ()//随机淘汰算法
{
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1) //内存中存在该页面此时即为命中
{
for(int b=0; b<Bsize; b++)
{
memory_state[b][i]=memory_state[b][i-1];
}
s++; //命中次数加1
}
else //内存中不存在该页面
{
space = findSpace(); //查找是否有空闲内存
if(space != -1) //有空闲内存
{
for(int b=0; b<Bsize; b++)
{
memory_state[b][i]=memory_state[b][i-1];
}
block[space] = page[i]; //页面调入内存
memory_state[space][i]=block[space].content;
}
else
{
for(int k=0; k<Bsize; k++)
{
memory_state[k][i]=memory_state[k][i-1];
for(int j=i; j<Psize; j++)
{
if(block[k].content != page[j].content)
{ block[k].timer = 999; } //设置timer为一个很大的数
else
{ block[k].timer = j; break;}
}
}
position = findReplace();
block[position] = page[i];
memory_state[position][i]=block[position].content;
}
}
}
}
int decide(string str) //判断输入数据是否为整型
{
for(int i=0;i<str.size();i++)
{
if(str[i]<'0'||str[i]>'9')
{
return 0;
break;
}
}
return i;
}
int trans(string str) //将字符串转化成数字
{
int sum=0;
for(int i=0;i<str.size();i++)
sum=sum+(str[i]-'0')*pow(10,str.size()-i-1);
return sum;
}
int put() //强制输入一个整型数
{
int a,d;
string str;
cin>>str;
a=decide(str);
while(a==0)
{
cout<<"输入错误,请重新输入!"<<endl;
cin>>str;
a=decide(str);
}
d=trans(str);
return d;
}
void Put() //页面产生的方法
{
cout<<"请选择产生页面的方法"<<endl;
cout<<"a:随机产生 b:输入产生(注意;区分大小写)"<<endl;
cout<<"您选择的方法是:";
char F;
cin>>F;
while(F!='a'&&F!='b')
{
cout<<"输入错误,请重新输入:";
cin>>F;
}
if(F=='a')
P_String(QString) ;
if(F=='b')
{
cout<<"请依次输入各页面号:"<<endl;
for(int i=0;i<Psize;i++)
{
QString[i]=put();
}
}
cout<<endl;
cout<<"|---------------------------------------------------------------|"<<endl;
}
void main()
{
cout<<"|-----------------------实验三 置换算法与命中率-----------------|"<<endl;
cout<<"|---------------------------20111501016-------------------------|"<<endl;
int t=1;
while(t)
{
Put();
LHH_replace test1;
LHH_replace test3;
char select;
do{
cout<<"请选择要应用的算法:<1>FIFO算法 <2>LRU算法 <3>随机置换算法 <0>退出"<<endl;
int p,q;
cout<<"请您输入对应算法号:";
cin>>select;
while(select!='0'&&select!='1'&&select!='2'&&select!='3')
{
cout<<"您的输入无效,请重新输入:"<<endl;
cin>>select;
}
if(select=='0')
{
cout<<"您选择的是菜单<0>"<<endl;
cout<<"完成退出."<<endl;
t=0;
}
if(select=='1')
{
cout<<"您选择的是菜单<1>"<<endl;
cout<<"FIFO算法状态:"<<endl;
test1.initia1(QString);
test1.FIFO();
test1.BlockClear();
cout<<"-------------------------------------------"<<endl;
for(p=0;p<Bsize;p++)
{
for(q=0;q<Psize;q++)
cout<<test1.memory_state[p][q]<<" ";
cout<<endl;
}
cout<<"-------------------------------------------"<<endl;
cout<<"命中率:"<<test1.s<<"/"<<Psize<<endl;
test1.~LHH_replace();
cout<<endl;
}
if(select=='2')
{
int i,j;
K=-1;
InitL(b, c);
for(i=0;i<Psize;i++)
{
Lru(QString[i],b);
c[0][i]=QString[i]; //记录当前的内存单元中的页面
for(j=0;j<Bsize;j++)
c[j][i]=b[j].num;
}
cout<<"您选择的是菜单<2>"<<endl;
cout<<"LRU算法状态:"<<endl;
cout<<"------------------------------------------"<<endl; //输出结果
for(i=0;i<Bsize;i++)
{
for(j=0;j<Psize;j++)
{
if(c[i][j]==-1)
cout<<" 0";
else
cout<<" "<<c[i][j];
}
cout<<" "<<endl;
}
cout<<"------------------------------------------"<<endl;
cout<<"命中率:"<<(Psize-(K+1))<<"/"<<Psize;
cout<<'\t';
cout<<endl;
}
if(select=='3')
{
cout<<"您选择的是菜单<3>"<<endl;
cout<<"随机算法状态:"<<endl;
test3.initia1(QString);
test3.SJ();
test3.BlockClear();
cout<<"------------------------------------------"<<endl;
for(p=0;p<Bsize;p++)
{
for(q=0;q<Psize;q++)
cout<<test3.memory_state[p][q]<<" ";
cout<<endl;
}
cout<<"------------------------------------------"<<endl;
cout<<"命中率:"<<test3.s<<"/"<<Psize<<endl;
test3.~LHH_replace();
cout<<endl;
}
}while(select=='1'||select=='2'||select=='3');
}
}
输出结果是这样滴
怎么对齐,求思路。