这是我自己写的。我一直觉得自己写起代码来,有点乱套,不知道大家觉得我写得怎么样?请给我下面的程序给点评价,谢谢哦。
/****
*模拟系统作业调度,模拟环境是多道作业分配资源方式,
*在分配资源上可以选择FCFS先来先服务算法,也可以选择SJF短作业
*因为可能出现多道作业都有足够资源,那么在一个cpu对应多道作业的时候,我使用先来先服务算法
*程序有详细说明,要是不够的话,请留言。
*****/
#include "stdio.h" #include "iostream.h" #include <windows.h> #include <string.h> #include <stdlib.h> #include <ctime> int MaxmenSize= 300,MaxdeNum=20;//资源数量。分别为内存大小,磁带数目 int now_menSize=MaxmenSize,now_deNum=MaxdeNum;//当前内存大小,和磁带数目 class job { public : char jname[10]; int ntime;//需要时间 int rtime;//运行时间 int nmenory;//需要内存大小 int ndevic;//需要设备台数 char state;//状态 job *nextjob;//指向下一个job public: job(); job(char name[10],int nT,int menSize,int deNum,job* nextJ); bool isengh(int menSize,int deNum); //判断资源是否足够 void proc();//执行job过程,job每个时钟减少1 bool isend();//判断是否执行完毕 void setJob(char name[10],int nT,int menSize,int deNum,job* nextJ);//设置job的属性 void setState();//设置状态 }; job::job() { ntime=0; for(int i=0;i<10;i++)jname[i]='J'; rtime=0; nmenory= 0; ndevic=0; nextjob =NULL; state='w'; } job::job(char name[10],int nT,int menSize,int deNum,job* nextJ) { ntime=nT; for(int i=0;i<10;i++)jname[i]=name[i]; rtime=0; nmenory= menSize; ndevic=deNum; nextjob = nextJ; state='w'; } void job::setJob(char name[10],int nT,int menSize,int deNum,job* nextJ) { ntime=nT; for(int i=0;i<10;i++)jname[i]=name[i]; rtime=0; nmenory= menSize; ndevic=deNum; nextjob = nextJ; } void job::setState() { this->state='r'; } void job::proc()//作业的工作区 { if(this->state=='r') this->rtime++; } bool job::isengh (int mensize,int deNum) { if(this->state =='r') return false; if(mensize>=this->nmenory&&deNum>=this->ndevic) return true; else return false; } bool job::isend () { if (this==NULL) { cout<<this<<" >>>>>>>>>>>>>>>>>>0<<<<<<<<<<<<<<<<< "<<endl; } if(this->rtime>=this->ntime) return true ; else return false ; } void display(job* jobh,int chose)//显示函数 { system("cls");//刷屏 SYSTEMTIME sys;//获得系统时间的缓存变量 GetLocalTime( &sys ); printf( "%4d/%02d/%02d %02d:%02d:%02d 星期%1d/n/n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wDayOfWeek); if (!chose) { cout<<"先来先服务调度测试中..."<<endl<<endl; } else { cout<<"短作业优先法测试中..."<<endl<<endl; } cout<<" 名字 "<<" 内存大小 "<<" 磁带使用个数 "<<" 运行时间 "<<" 需要时间"<<" 状态 "<<endl; if(jobh==NULL) return ; else while(jobh) { cout<<jobh->jname<<" "<<jobh->nmenory<<" Kb "<<jobh->ndevic<<"个 "<<jobh->rtime<<"s "<<jobh->ntime<<" "<<jobh->state<<endl; jobh=jobh->nextjob; } cout<<endl<<"内存空间利用:"<<MaxmenSize-now_menSize<<"/"<<MaxmenSize<<" 磁带使用情况:"<<MaxdeNum-now_deNum<<"/"<<MaxdeNum<<endl; Sleep(200); return; } void main () { int menSize,deNum,nT; char jobName[10]; //job名字缓存 job *pActJob=NULL;//活动job指针 job *pHeadJob=NULL; //队列第一的job int choseCPU=0; // job Job[5]; //输入阶段 char Inchose='N'; cout<<"****************请选择调度方法*******************"<<endl<<endl; cout<<"0. FCFS 先来先服务 1.SJF 短作业优先"<<endl<<endl; cout<<"*************************************************"<<endl; cout<<"你选择:"; cin>>choseCPU; if (choseCPU) { cout<<" SJF 短作业优先 "<<endl; } else cout<<" FCFS 先来先服务 "<<endl; // pHeadJob=intput(pHeadJob,pActJob,choseCPU); do{ printf("请输入job名字 :/n"); scanf("%s",jobName); printf("***************************/n请输入/nmensize deNumber needTime/n"); scanf("%d %d %d",&menSize,&deNum,&nT); if (menSize>MaxmenSize||deNum>MaxdeNum) { system("cls"); cout<<"---------------------- - - -"<<endl<<endl<<endl; cout<<"你输入的作业需要的资源无法提供!"<<endl<<endl; cout<<"---------------------- - - -"<<endl<<endl<<endl; Sleep(400); continue; } else if (choseCPU)//短作业优先的处理 { if(pHeadJob==NULL) { //Job[0].setJob(jobName,nT,menSize,deNum,NULL); pHeadJob=new job(jobName,nT,menSize,deNum,NULL); pActJob=pHeadJob; } else { job* pJob=new job(jobName,nT,menSize,deNum,NULL); if (pHeadJob->ntime>pJob->ntime) { pJob->nextjob=pHeadJob; pHeadJob=pJob; } else { job* jobI=pHeadJob; while(jobI->nextjob&&jobI->nextjob->ntime < pJob->ntime) { jobI=jobI->nextjob; } pJob->nextjob=jobI->nextjob; jobI->nextjob=pJob; pJob=NULL; } } } else if(pHeadJob==NULL)//先来先服务的处理 { //Job[0].setJob(jobName,nT,menSize,deNum,NULL); pHeadJob=new job(jobName,nT,menSize,deNum,NULL); pActJob=pHeadJob; } else { job* pJob=new job(jobName,nT,menSize,deNum,NULL); pActJob->nextjob=pJob; pActJob=pActJob->nextjob; } cout<<"是否继续输入?(y/n) "<<endl; cin>>Inchose; getchar(); }while(Inchose=='Y'||Inchose=='y'); display(pHeadJob,choseCPU); if(pHeadJob==NULL) return ; do{ //分配阶段 pActJob=pHeadJob; while(pActJob!=NULL) { if( pActJob->isengh(now_menSize,now_deNum)) { pActJob->state='r'; now_menSize-=pActJob->nmenory; now_deNum-=pActJob->ndevic; } pActJob=pActJob->nextjob; } pActJob=pHeadJob; //运行中 job* pjobI=pActJob->nextjob; if (pjobI==NULL)//没有下一个了。表示只剩一个作业 { while(!pActJob->isend ()) { int i=10; while (i--)//时间片大小,根据老师要求后期增加的 { pActJob->proc();//当前jcb作业的运行,采用时间片轮转方式,每次作业操作都是运行时间自加 } display(pHeadJob,choseCPU); } pjobI=pActJob; } else while(!pjobI->isend ())//有多个作业。一个个分析调入cpu { int i=10; while (i--)//时间片大小,根据老师要求后期增加的 { pActJob->proc();//当前jcb作业的运行,采用时间片轮转方式,每次作业操作都是运行时间自加 } if(pjobI==0)//考虑pjobI指到0的时候,再回到队列头部 { pjobI=pHeadJob; } else { pActJob=pjobI; if(!pjobI->nextjob) pjobI=pHeadJob; else pjobI=pjobI->nextjob; } display(pHeadJob,choseCPU); } //释放 if(pjobI==pHeadJob) { pHeadJob=pHeadJob->nextjob; pjobI->nextjob=NULL; } else { pActJob->nextjob=pjobI->nextjob; } cout<<" end "<<pjobI->jname<<endl; now_menSize+=pjobI->nmenory; now_deNum+=pjobI->ndevic; //释放回来的资源哦 delete pjobI; //再输入 cout<<"要输入吗?(y/n)"<<endl; cin>>Inchose; if(Inchose=='Y'||Inchose=='y') do{ printf("请输入job名字 :/n"); scanf("%s",jobName); printf("***************************/n请输入/nmensize deNumber needTime/n"); scanf("%d %d %d",&menSize,&deNum,&nT); if (menSize>MaxmenSize||deNum>MaxdeNum) { system("cls"); cout<<"---------------------- - - -"<<endl<<endl<<endl; cout<<"你输入的作业需要的资源无法提供!"<<endl<<endl; cout<<"---------------------- - - -"<<endl<<endl<<endl; Sleep(600); continue; } else if (choseCPU)//短作业优先的处理 { if(pHeadJob==NULL) { //Job[0].setJob(jobName,nT,menSize,deNum,NULL); pHeadJob=new job(jobName,nT,menSize,deNum,NULL); pActJob=pHeadJob; } else { job* pJob=new job(jobName,nT,menSize,deNum,NULL); if (pHeadJob->ntime>pJob->ntime)//保证队列头的需要时间是最小 { pJob->nextjob=pHeadJob; pHeadJob=pJob; } else { job* jobI=pHeadJob; while(jobI->nextjob&&jobI->nextjob->ntime < pJob->ntime)//寻找新增job应该插入的位置 { jobI=jobI->nextjob; } pJob->nextjob=jobI->nextjob; jobI->nextjob=pJob; pJob=NULL; } } } else if(pHeadJob==NULL)//先来先服务的处理 { //Job[0].setJob(jobName,nT,menSize,deNum,NULL); pHeadJob=new job(jobName,nT,menSize,deNum,NULL); pActJob=pHeadJob; } else { //先来先服务方式,直接在队列尾部连上新增job job* pJob=new job(jobName,nT,menSize,deNum,NULL); pActJob->nextjob=pJob; pActJob=pActJob->nextjob; } cout<<"是否继续输入?(y/n) "<<endl; cin>>Inchose; }while(Inchose=='Y'||Inchose=='y'); }while (pHeadJob!=NULL); cout<<"--------end>>>><<<<<all---------"<<endl; }