| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 706 人关注过本帖
标题:经过我的努力现在卡在对齐上了........求思路!求方法!~
只看楼主 加入收藏
lihonghaoc
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-1-19
结帖率:0
收藏
已结贴  问题点数:1 回复次数:1 
经过我的努力现在卡在对齐上了........求思路!求方法!~
#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');
 }
}

输出结果是这样滴
图片附件: 游客没有浏览图片的权限,请 登录注册

怎么对齐,求思路。
搜索更多相关主题的帖子: content include public 
2014-06-27 11:45
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:1 
类似这个效果吗

程序代码:
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int i;
    for (i=0;i<110;i++)
    {
       if(i%10==0) cout<<endl;
       cout<<setw(5)<<i;
    }
    cout<<endl;
    return 0;
}


[ 本帖最后由 wp231957 于 2014-6-28 12:00 编辑 ]

DO IT YOURSELF !
2014-06-28 11:59
快速回复:经过我的努力现在卡在对齐上了........求思路!求方法!~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036155 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved