修改了很多,目前最新版。
以下是代码(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;
}