12.20

/******************************
改一下output[][]输出格式
字符串bug
****************************/
#include <bits/stdc++.h>
using namespace std;
#define max1 200
#define max2 0x3f3f3f
struct LRU   ///LRU算法所用到的结构体
{
    int num; ///内存块的数字
    int time;///最近访问时间
};
struct table  ///表格的结构体
{
    int queyecishu;
    int mingzhongcishu;
    int zhihuancishu;
    double queyelv;
    double mingzhonglv;
    string name;
};
table lru2,option2,clock2,a[3];///a[3]用于比较三个大小使用
int  output1[max1][max1],output2[max1][max1],output3[max1][max1],s=0,s2=0,s3=0,zhong1=0,zhong2=0,zhong3=0,kk;///
LRU lru[max1];///定义一个结构体数组
char ch;
int pre[max1],dist[max1][max1],block1[max1];
int block,length,papelack=0;
int n,m,pages,replace1,replace2,replace3;
string page;///将输入的页面定义为string便于容错性判断
int a1[max1],a2[max1],a3[max1];
int num1=0;
int num2=0;
int num3=0;
void menu();
void menu1();
void menu2();
bool flag;
void delay(int d)
{
    unsigned int i;
    for(; d>0; d--)
    {
        for(i=0; i<25; i++)
        {
            printf(" \b");
        }
    }
}
int rongcuoxing(string s)
{
    int len = s.length(),num=0,word;
        for(int i = 0; i < len; i++)
        {
            if(s[i]!=0||s[i]!=1||s[i]!=2||s[i]!=3||s[i]!=4||s[i]!=5||s[i]!=6||s[i]!=7||s[i]!=8||s[i]!=9)
              {
                  return 0;
              }
            else
            {
                if(s[0]==32)
                    num=0;
                else
                    num=1;
                for(int i = 1; i < len; i++)
                {
                    if(s[i] == ' ')
                        word =0;
                    else
                    {
                        if(s[i]!=' '&&(word==0))
                        {
                            word=1;
                            num++;
                        }
                    }
                }

            }
        }
        return num;
}
void init()///初始化访问时间和物理块中存的数
{
    for (int i = 0; i < n; i++)
    {
        lru[i].time = 0;
        lru[i].num = -1;
    }
}
/******************************
返回找到的位置或者替换的位置
*******************************/
int findpage(int k)
{
    int i = 0;
    for(int j = 0; j < m; j++)
    {
        if(lru[j].num == page[k])
        {
            i = j;
            flag = false;
            break;
        }
    }
    if(flag)///没有找到
    {
        for(int j = 1; j < m; j++)
        {
            if(lru[i].time < lru[j].time)
            {
                i = j;   ///返回最后使用的内存块用来被替换。
            }
        }
    }
    return i;
}
int LRU1()
{
    papelack=0;
    init(); //初始化
    int line = 0;///可以理解为当前内存块中的页面个数。
    bool flag1; ///访问标志
    int i, j, tmp;
    for (i = 1; i <= n; i++)     ///依次访问每一个页面
    {
        flag = true;             ///用来标记是否能在内存块中找到该页面。
        if (line < m)  ///物理块没装满的情况下进行该页面访问
        {
            flag1 = false;
            for (j = 0; j < line; j++)
            {
                if (lru[j].num == page[i])   ///找到,然后用outputp1[][]记录当前内存块的页面
                {
                    for(int pp = 0; pp < m; pp++)
                    {
                        output1[s][pp] = lru[pp].num;
                    }
                    s++;
                    flag1 = true;
                    lru[j].time = 0;   ///更新访问时间
                    break;
                }
            }
            if (!flag1)            ///没找到要置换
            {
                lru[line++].num = page[i];
                lru[line].time = 0;
                for(int pp = 0; pp < m; pp++)
                {
                    output1[s][pp] = lru[pp].num;
                }
                s++;
                papelack++;
            }
        }
        else     ///当前内存块已满,要么找到,否则就要置换
        {
            tmp = findpage(i);   ///接收找到的位置或者置换的位置。
            if (flag)            ///flag为真代表没找到。
            {
                a1[num1++] = lru[tmp].num;
                lru[tmp].num = page[i];   ///先把他替换再跟新该位置的访问时间
                lru[tmp].time = 0;
                for(int pp = 0; pp < m; pp++)
                {
                    output1[s][pp] = lru[pp].num;
                }
                s++;
                replace1++;          ///中断加一
                papelack++;          ///缺页加一
            }
            else               ///找到
            {
                lru[tmp].time = 0; ///更新访问时间
                zhong1++;          ///命中次数加一
                for(int pp = 0; pp < m; pp++)
                {
                    output1[s][pp] = lru[pp].num;
                }
                s++;
            }
        }
        if (line > m)     ///内存装满
        {
            for (int k = 0; k < m; k++)
            {
                lru[k].time++;
            }
        }
        else
        {
            for (int k= 0; k < line; k++)
            {
                lru[k].time++;
            }
        }
    }
    if(line >= m)
        kk = m;
    else kk = line;
    return papelack;
}
int OPT1()
{
    int pre[max1];
    int papelack = 0;
    fill(pre,pre+max1,0);
    fill(dist[0],dist[0]+max1*max1,max2);
    fill(block1,block1+max1,-1);
    for(int i = n; i >= 1; i--)
    {
        for(int j = 0; j <= pages; j++)
        {
            if(pre[j])
            {
                dist[i][j] = pre[j] - i;
            }
            pre[page[i]-'0'] = i;
        }
    }
    for(int i = 1; i <= n; i++)
    {
        int j;
        int maxdist = 0,p;
        for( j = 1; j <= m; j++)
        {
            if(block1[j] == -1)
            {
                block1[j] = page[i];
                papelack++;
                for(int k = 1; k <= m; k++)
                {
                    output2[s2][k] = block1[k];
                }
                s2++;
                break;
            }
            else if(block1[j] == page[i])
            {
                zhong2++;
                for(int k = 1; k <= m; k++)
                {
                    output2[s2][k] = block1[k];
                }
                s2++;
                break;
            }
            if(maxdist < dist[i][block1[j]])
            {
                maxdist = dist[i][block1[j]];
                p = j;
            }
        }
        if(j > m)
        {
            replace2++;
            a2[num2++] = block1[p];
            block1[p] = page[i];
            papelack++;
            for(int k = 1; k <= m; k++)
            {
                output2[s2][k] = block1[k];
            }
            s2++;
        }
    }
    return papelack;
}
int nru[max1];//表示 物理块 i 最近时候被访问过
int page_in_block[max1];//页面 i 在 block的下标索引
int CLOCK1()
{
    int index = 1;
    papelack = 0;
    memset(nru,0,sizeof(nru));
    memset(page_in_block,0,sizeof(page_in_block));
    memset(block1, -1, sizeof(block1));
    for(int i=1; i<=n; i++)
    {
        if(page_in_block[page[i]-'0'])
        {
            //如果page[i]已经在内存中
            nru[page_in_block[page[i]-'0']] = 1;//重新标记这个物理块中的页面被访问过了
            zhong3++;
        }
        else
        {
            while(true)
            {
                if(index > m) index = 1;
                if(block1[index] == -1)
                {
                    nru[index] = 1;
                    page_in_block[page[i]-'0'] = index;
                    block1[index++] = page[i]-'0';
                    papelack++;
                    break;
                }
                if(block1[index] == page[i]-'0')
                {
                    nru[index++] = 1;
                    break;
                }
                else
                {
                    if(nru[index] == 0) //替换该页面
                    {
                        nru[index] = 1;
                        page_in_block[block1[index]] = 0;
                        page_in_block[page[i]-'0'] = index;
                        block1[index++] = page[i]-'0';
                        papelack++;
                        replace3++;
                        a3[num3++] = block1[index];
                        break;
                    }
                    else
                        nru[index++] = 0;
                }
            }
        }
        for(int k = 1; k <=m; k++)
            output3[s3][k] = block1[k];
        s3++;
    }
    return papelack;
}
/*********************
设计一个表格输出三种算法的结果
*********************/
void compare()
{
    system("CLS");
    lru2.name = "LRU";
    lru2.queyecishu = LRU1();
    lru2.zhihuancishu = replace1;
    lru2.mingzhongcishu = zhong1;
    lru2.queyelv = 1.0*lru2.queyecishu/n;
    lru2.mingzhonglv = 1.0*zhong1/n;
    option2.name = "OPTION";
    option2.queyecishu = OPT1();
    option2.zhihuancishu = replace2;
    option2.mingzhongcishu = zhong2;
    option2.queyelv = 1.0*option2.queyecishu/n;
    option2.mingzhonglv = 1.0*zhong2/n;
    clock2.name = "CLOCK";
    clock2.queyecishu = CLOCK1();
    clock2.zhihuancishu = replace3;
    clock2.mingzhongcishu = zhong3;
    clock2.queyelv = 1.0*clock2.queyecishu/n;
    clock2.mingzhonglv = 1.0*zhong3/n;
    a[0] = lru2;
    a[1] = option2;
    a[2] = clock2;
    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < 2-i; j++)
        {
            if(a[j].mingzhonglv < a[j+1].mingzhonglv)
            {
                table t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
    cout<<"结果加载中....."<<endl;
    for(int i=0; i<51; i++)
        printf("\b");
    for(int i=0; i<50; i++)
    {
        delay(5);
        printf(">");
    }
    system("CLS");
    cout<<endl;
    cout<<"\t\t\t\t\t\t\t*******************************************"<<endl;
    cout<<"\t\t\t\t\t\t\t               三种算法分析表"<<endl;   ///可以弄成加载
    cout<<"\t\t\t\t\t\t\t*******************************************"<<endl<<endl;
    cout<<"\t\t\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━-━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"\t\t\t\t\t        \t\tLRU"<<"\t\t"<<"OPTION"<<"\t\t"<<"CLOCK"<<endl;
    cout<<"\t\t\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━-━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"\t\t\t\t\t缺页次数\t\t"<<lru2.queyecishu<<"\t\t"<<option2.queyecishu<<"\t\t"<<clock2.queyecishu<<endl;
    cout<<"\t\t\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━-━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"\t\t\t\t\t置换次数\t\t"<<lru2.zhihuancishu<<"\t\t"<<option2.zhihuancishu<<"\t\t"<<clock2.zhihuancishu<<endl;
    cout<<"\t\t\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━-━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"\t\t\t\t\t命中次数\t\t"<<lru2.mingzhongcishu<<"\t\t"<<option2.mingzhongcishu<<"\t\t"<<clock2.mingzhongcishu<<endl;
    cout<<"\t\t\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━-━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"\t\t\t\t\t缺页率  \t\t"<<lru2.queyelv<<"\t\t"<<option2.queyelv<<"\t\t"<<clock2.queyelv<<endl;
    cout<<"\t\t\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━-━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"\t\t\t\t\t命中率  \t\t"<<lru2.mingzhonglv<<"\t\t"<<option2.mingzhonglv<<"\t\t"<<clock2.mingzhonglv<<endl;
    cout<<"\t\t\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━-━━━━━━━━━━━━━━━━━"<<endl<<endl;
    cout<<"\t\t\t\t\t算法性能排名";
    cout<<"\t\t\t\t\t =============================================="<<endl;
    cout<<"\t\t\t\t\t"<<a[0].name<<"\t>\t"<<a[1].name<<"\t>\t"<<a[2].name<<endl;
    cout<<"\t\t\t\t\t ==============================================="<<endl;
    ///为循环使用清空参数
    s =s2=s3= replace1=replace2=replace3=num1=num2=num3=zhong1=zhong2=zhong3=papelack=0;
    memset(a1,0,sizeof(a1));
    memset(a2,0,sizeof(a2));
    memset(a3,0,sizeof(a3));
    memset(output2,0,sizeof(output2));
    memset(output3,0,sizeof(output3));
    memset(output1,0,sizeof(output1));
    system("pause");
    system("CLS");
    menu();
}
void menu2(string string1)
{
    system("color 0D");
    printf("\t\t\t╔════════════╗\n");
    printf("\t\t\t║正在加载算法!!!║\n");
    printf("\t\t\t╚════════════╝\n");
    printf("                                                  ");
    for(int i=0; i<51; i++)
        printf("\b");
    for(int i=0; i<50; i++)
    {
        delay(5);
        printf(">");
    }
    system("CLS");
    cout<<endl;
    cout<<"\t\t\t\t\t\t                          ▂▃▅▆▇█████▇▆▅▃▂                            "<<endl;
    cout<<"\t\t\t\t\t\t☆    ===================================================================    ☆"<<endl;
    cout<<"\t\t\t\t\t\t                                                                                "<<endl;
    cout<<"\t\t\t\t\t\t                           您已经选择";
    cout<<string1;
    cout<<"\t\t\t\t\t\t                 "<<endl;
    cout<<"\t\t\t\t\t\t                           请输入页面访问串个数及访问串:                  "<<endl;
    cout<<"\t\t\t\t\t\t                           若需返回主菜单请按-1              "<<endl;
    cout<<"\t\t\t\t\t\t                                                                                 "<<endl;
    cout<<"\t\t\t\t\t\t☆    ===================================================================     ☆"<<endl;
}
void menu1()
{
    string k;
    cin>>k;
    if(k!="1"&&k!="2"&&k!="3"&&k!="4"&&k!="5")
    {
        system("CLS");
        menu();
        cout<<endl;
        menu();
        cout<<"                      请您按要求输入哟!                         "<<endl;
    }
    else if(k == "1")
    {
        system("CLS");
        menu2("LRU");
        cin>>n;
        if(n == -1)
        {
            system("CLS");
            menu();
        }
        else
        {
            cout<<"nihao"<<endl;
            getline(cin,page);
            int aa = rongcuoxing(page);
            if(aa!= n)
            {
                system("CLS");
                cout<<endl;
                cout<<"输入有误,请重新输入"<<endl;
                menu2("LRU");
            }
            pages = 1000;///限制最大数为100000;
            cout<<"请输入物理块个数:";
            cin>>m;
            system("CLS");
            cout<<"*******************************"<<endl;
            cout<<"LRU算法运行完成"<<endl;   ///可以弄成加载
            cout<<"*******************************"<<endl;
            int pa = LRU1();
            printf("----------------------------------------------------------\n");
            cout<<"缺页中断次数:"<<"\t\t"<<pa<<endl;
            cout<<"页面置换次数:"<<"\t\t"<<replace1<<endl;
            printf("缺页率: \t\t%2.2lf",1.0*pa/n*100);
            cout<<"%"<<endl;
            printf("命中率: \t\t%.2lf",1.0*zhong1/n*100);
            cout<<"%"<<endl;
            cout<<"依次被置换的页面:\t";
            for(int i = 0; i < num1; i++)
                cout<<a1[i]<<" ";
            cout<<endl;
            printf("----------------------------------------------------------\n\n");
            cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
            for(int i = 0; i < kk; i++)
            {
                for(int j = 0; j < s; j++)
                {
                    printf("%3d ",output1[j][i]);
                }
                cout<<endl;
            }
            cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
            ///为循环使用清空参数
            s = 0;
            replace1 = 0;
            num1 = 0;
            zhong1 = 0;
            papelack = 0;
            memset(a1,0,sizeof(a1));
            memset(output1,0,sizeof(output1));
            system("pause");
            system("CLS");
            menu();
        }
    }
    else if(k == "2")
    {
        system("CLS");
        menu2("OPTION");
        cin>>n;
        if(n == -1)
        {
            system("CLS");
            menu();
        }
        else
        {
            pages = 100000;
            cout<<"请输入物理块个数:";
            cin>>m;
            system("CLS");
            int pa = OPT1();
            cout<<"*******************************"<<endl;
            cout<<"OPTION算法运行完成"<<endl;   ///可以弄成加载
            cout<<"*******************************"<<endl;
            printf("----------------------------------------------------------\n");
            cout<<"缺页中断次数:"<<"\t\t"<<pa<<endl;
            cout<<"页面置换次数:"<<"\t\t"<<replace2<<endl;
            printf("缺页率: \t\t%2.2lf",1.0*pa/n*100);
            cout<<"%"<<endl;
            printf("命中率: \t\t%.2lf",1.0*zhong2/n*100);
            cout<<"%"<<endl;
            cout<<"依次被置换的页面:\t";
            for(int i = 0; i < num2; i++)
                cout<<a2[i]<<" ";
            cout<<endl;
            printf("----------------------------------------------------------\n");
            cout<<" ";
            cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
            for(int i = 1; i <= m; i++)
            {
                for(int j = 0; j < s2; j++)
                {
                    printf("%3d ",output2[j][i]);
                }
                cout<<endl;
            }
            cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
            s2 = 0;
            replace2 = 0;
            num2 = 0;
            zhong2 = 0;
            papelack = 0;
            memset(a2,0,sizeof(a2));
            memset(output2,0,sizeof(output2));
            system("pause");
            system("CLS");
            menu();
            replace2 = 0;
        }
    }
    else if(k == "3")
    {
        system("CLS");
        menu2("CLOCK");
        cin>>n;
        if(n == -1)
        {
            system("CLS");
            menu();
        }
        else
        {
            pages = 100000;
            cout<<"请输入物理块个数:";
            cin>>m;
            int pa = CLOCK1();
            cout<<"*******************************"<<endl;
            cout<<"CLOCK算法运行完成"<<endl;   ///可以弄成加载
            cout<<"*******************************"<<endl;
            printf("----------------------------------------------------------\n");
            cout<<"缺页中断次数:"<<"\t\t"<<pa<<endl;
            cout<<"页面置换次数:"<<"\t\t"<<replace3<<endl;
            printf("缺页率: \t\t%2.2lf",1.0*pa/n*100);
            cout<<"%"<<endl;
            printf("命中率: \t\t%.2lf",1.0*zhong3/n*100);
            cout<<"%"<<endl;
            cout<<"依次被置换的页面:\t";
            for(int i = 0; i < num3; i++)
                cout<<a3[i]<<" ";
            cout<<endl;
            printf("----------------------------------------------------------\n");
            cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
            for(int i = 1; i <= m; i++)
            {
                for(int j = 0; j < s3; j++)
                {
                    printf("%3d ",output3[j][i]);
                }
                cout<<endl;
            }
            cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;

            s3 = 0;
            num3 = 0;
            zhong3 = 0;
            papelack = 0;
            memset(a3,0,sizeof(a3));
            memset(output3,0,sizeof(output3));
            replace3 = 0;
            system("pause");
            system("CLS");
            menu();
        }
    }
    else if(k == "4")
    {
        system("CLS");
        menu2("算法比较");
        cin>>n;
        if(n == -1)
        {
            system("CLS");
            menu();
        }
        else
        {
            pages = 100000;
            cout<<"请输入物理块个数:";
            cin>>m;
            compare();
        }
    }
    else if(k == "5")
    {
        return ;
    }
}
void menu()        //默认主菜单界面                  ***********************************************
{
    system("color 8e");
    printf("╔════════════╗\n");
    printf("║正在加载菜单,请稍候 !!!║\n");
    printf("╚════════════╝\n");
    printf("                                                  ");

    for(int i=0; i<31; i++)
        printf("\b");
    for(int i=0; i<50; i++)
    {
        delay(5);
        printf("█");
    }
    system("CLS");
    cout<<endl;
    cout<<"                          ▂▃▅▆▇█████▇▆▅▃▂                       "<<endl;
    cout<<"☆    ===================================================================    ☆"<<endl;
    cout<<"                                                                               "<<endl;
    cout<<"                           欢迎来到操作系统页面置换算法界面                        "<<endl;
    cout<<"                                                                               "<<endl;
    cout<<"☆    ===================================================================    ☆"<<endl;
    cout<<"                            请输入一下数字选择相应算法                           "<<endl;
    cout<<"                                                                               "<<endl;
    cout<<"                                【1】   LRU算法                              "<<endl;
    cout<<"                                【2】   OPTION算法                        "<<endl;
    cout<<"                                【3】   CLOCK算法                             "<<endl;
    cout<<"                                【4】   查看算法比较表                                            "<<endl;
    cout<<"                                【5】   退出程序 "<<endl;
    cout<<"☆    ===================================================================    ☆"<<endl;
    cout<<endl;
    cout<<"                           请输入【1—5】:";
    menu1();
}
int main()
{
    cout<<setiosflags(ios::fixed)<<setprecision(2);///保留两位小数
    cout.setf(std::ios::right);///右对齐
    system("color 8e");
    menu();
    return 0;
}
/*
3
0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
3
3 2 1 5 2 4 5 3 2 5 2
*/





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值