【操作系统】实验一:处理机调度仿真

修改了很多,目前最新版。

以下是代码(C++):

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>


using namespace std;


typedef struct
{
    string name;//作业名。
    int RunTime;//运行时间。次关键字。
    int PRI;//优先级。
    int ATime;//到达时间。主关键字。
    //struct iWork* next;//下个作业。
} iWork;


iWork Work[100];//输入队列。
iWork SupportWork[100];//后备队列。
iWork ReadyWork[100];//就绪队列。
iWork FinishWork[100];//完成队列。
int Number=0,Number1=0,Number2=0;
int Qian1=0,Qian2=0,Qian3=0;
int Pidao=0,N=0;


void Print(string n,int t1,int t2,int p)
{
    Work[Number].name=n;
    Work[Number].RunTime=t1;
    Work[Number].PRI=p;
    Work[Number].ATime=t2;
}


void PrintWork(int i)
{
    cout<<"  "<<Work[i].name
        <<"         "<<Work[i].ATime
        <<"          "<<Work[i].RunTime
        <<"            "<<Work[i].PRI<<endl;
}


void PrintSupportWork(int i)
{
    cout<<"               "<<SupportWork[i].name
        <<"           "<<SupportWork[i].ATime
        <<"          "<<SupportWork[i].RunTime
        <<"       "<<SupportWork[i].PRI<<endl;
}


void PrintReadyWork(int i)
{
    cout<<"               "<<ReadyWork[i].name
        <<"           "<<ReadyWork[i].ATime
        <<"          "<<ReadyWork[i].RunTime
        <<"       "<<ReadyWork[i].PRI<<endl;
}


void SortWork()
{
    iWork A;
    for(int i=0; i<Number-1; i++)
        for(int j=0; j<Number-1-i; j++)
            if(Work[j].ATime>Work[j+1].ATime)
            {
                A=Work[j];
                Work[j]=Work[j+1];
                Work[j+1]=A;
            }
            else if(Work[j].ATime==Work[j+1].ATime)
            {
                if(Work[j].RunTime>Work[j+1].RunTime)
                {
                    A=Work[j];
                    Work[j]=Work[j+1];
                    Work[j+1]=A;
                }
            }
}


void SortReadyWork(int a,int b,int s)
{
    iWork A;
    for(int i=a; i<a+b-1; i++)
        for(int j=a; j<a+b-1-i; j++)
            if(s==2 && ReadyWork[j].PRI>ReadyWork[j+1].PRI)
            {
                A=ReadyWork[j];
                ReadyWork[j]=ReadyWork[j+1];
                ReadyWork[j+1]=A;
            }
            else if(s==1 && ReadyWork[j].PRI<ReadyWork[j+1].PRI)
            {
                A=ReadyWork[j];
                ReadyWork[j]=ReadyWork[j+1];
                ReadyWork[j+1]=A;
            }
}


void Pexcel1()
{
    cout<<"作业名    到达时间   运行时间    优先级"<<endl;
    SortWork();
    int i=Qian2;
    while(i!=Number)
    {
        PrintWork(i);
        i++;
    }
    cout<<endl;
}


void Pexcel2()
{
    cout<<"作业名    到达时间   运行时间    优先级"<<endl;
    int i=0;
    while(i!=Number)
    {
        PrintWork(i);
        i++;
    }
    cout<<endl;
}


void Printing()
{
    int Time=0;
    int S;
    cout<< endl
        << "---------------------------------------------------------------" << endl
        << "|--- 1.优先级大者先运行 ----" << "---- 2.优先级小者先运行 ----|" << endl
        << "---------------------------------------------------------------" << endl
        <<"请选择优先级:";
    cin>>S;
    while(true)
    {
        cout<<"-----------------------------------------------------------"<<endl;
        cout<<"---------------当前时间:   "<<Time<<"--------------"<<endl;


        int i;
        i=Qian1;
        while(i!=Number)
        {
            if(Work[i].ATime==Time)
            {
                cout<<"---------------------------------------------------"<<endl;
                cout<<"作业【"<<Work[Qian1].name<<"】  进入后备队列"<<endl;
                cout<<"---------------------------------------------------"<<endl;
                SupportWork[Number1]=Work[Qian1];
                Number1++;
                Qian1++;
            }
            i++;
        }


        i=Qian3;
        while(i!=Number2)
        {
            if(ReadyWork[i].RunTime<=0)
            {
                Qian3++;
                if(Pidao!=0)
                    Pidao--;
                FinishWork[N]=ReadyWork[i];
                N++;
            }
            i++;
        }


        while(Pidao!=3)//加入就绪
        {
            if(Number1-Qian2==0)
                break;
            cout<<"作业【"<<SupportWork[Qian2].name<<"】  进入就绪队列"<<endl;
            cout<<"---------------------------------------------------"<<endl;
            ReadyWork[Number2]=SupportWork[Qian2];
            Qian2++;
            Number2++;
            Pidao++;
        }


        if(Pidao!=0)
        {
            if(Pidao>1)
                SortReadyWork(Qian3,Pidao,S);
            /*if(S==1 && Pidao==2 && ReadyWork[Qian3].PRI<ReadyWork[Qian3+1].PRI)
            {
                iWork l=ReadyWork[Qian3];
                ReadyWork[Qian3]=ReadyWork[Qian3+1];
                ReadyWork[Qian3+1]=l;
            }
            else if(S==2 && Pidao==2 && ReadyWork[Qian3].PRI>ReadyWork[Qian3+1].PRI)
            {
                iWork l=ReadyWork[Qian3];
                ReadyWork[Qian3]=ReadyWork[Qian3+1];
                ReadyWork[Qian3+1]=l;
            }*/
            cout<<"【进   程】:";
            cout<<"作业名    到达时间  剩余运行时间   优先级"<<endl;
            PrintReadyWork(Qian3);
            ReadyWork[Qian3].RunTime--;
        }


        cout<<endl<<"【就绪队列】:";
        cout<<"作业名    到达时间   运行时间  优先级"<<endl;


        if(Pidao==2)
            PrintReadyWork(Qian3+1);
        else if(Pidao==3)
        {
            PrintReadyWork(Qian3+1);
            PrintReadyWork(Qian3+2);
        }


        cout<<endl;
        cout<<"【后备队列】:";
        cout<<"作业名    到达时间   运行时间    优先级"<<endl;
        i=Qian2;
        while(i!=Number1)
        {
            PrintSupportWork(i);
            i++;
        }
        cout<<endl;
        cout<<    "【已完成作业】:";
        i=0;
        while(i!=N)
        {
            if(i==0)
                cout<<"作业名:"<<FinishWork[i].name;
            else
                cout<<endl<<"                作业名:"<<FinishWork[i].name;
            i++;
        }
        cout<<endl;
        cout<<endl<<"【作业调度表】"<<endl;
        Pexcel1();
        cout<<"-----------------------------------------------------------"<<endl;
        getchar();
        printf("\b");
        Time++;
        if(N==Number)
            break;
    }
    cout<<"【轮转结束!】"<<endl;
    cout<<endl;
    cout<<endl;
}


void Product()
{
    int n=0;
    string name;
    int t1,t2,Pri;
    while(n!=10)
    {
        name='A'+n;
        t1=rand()%(12-1)+1;
        t2=rand()%(12-1)+1;
        Pri=rand()%(15-1)+1;
        Print(name,t1,t2,Pri);
        Number++;
        n++;
    }
}


int main()
{
    string name;
    int t1,t2,Pri;
    int Select=-1;
    do
    {
        switch(Select)
        {
        case 0:
            return 0;
            break;
        case 1:
        {
            if(Number!=0)
            {
                cout<<"请清除已有数据"<<endl;
                break;
            }
            int select;
            cout<< "---------------------------------------------------------" << endl
                << "|--- 1.随即生成作业(十个) --" << "-- 2.键盘输入作业信息 ----|" << endl
                << "---------------------------------------------------------" << endl
                <<"请输入选择:";
            cin>>select;
            if(select==2)
            {
                int nm;
                cout<<"输入作业数量:";
                cin>>nm;
                cout<<"请输入(作业名,运行时间,到达时间,优先级):"<<endl;
                while(nm!=0)
                {
                    cin>>name>>t1>>t2>>Pri;
                    Print(name,t1,t2,Pri);
                    Number++;
                    nm--;
                }
            }
            else
                Product();
            cout<<endl;
            cout<<"【作业生成完成!】"<<endl;
            Pexcel2();
        }
        break;
        case 2:
        {
            cout<<"【作业调度表】"<<endl;
            Pexcel1();
        }
        break;
        case 3:
        {
            Printing();
        }
        break;
        case 4:
        {
            Qian1=Qian2=Qian3=0;
            Number=0;
            Number1=0;
            Number2=0;
            Pidao=0;
            cout<<"清除工作完成!"<<endl;
            cout<<endl;
        }
        break;
        }
        cout << "----------------------------------------------------------------" << endl
             << "---- 0.退  出           ----"<< "---- 1.生成作业信息         ----" << endl
             << "---- 2.生成作业调度表   ----"<< "---- 3.时间片轮转(3批道)----" << endl
             << "---- 4.清除已有操作     --------" << endl
             << "----------------------------------------------------------------" << endl;
        cout << "请输入功能选择:" ;
    }
    while((cin >> Select )!=NULL);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wxz1814/article/details/80524196
今日推荐