⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diaodu.cpp

📁 diaodu1完成基本模块框架 diaodu2完成了先进先出
💻 CPP
字号:
#include"stdio.h"
#include"stdlib.h"
#include<iomanip.h>
#include"ctype.h"
#include"string.h"
#include"iostream.h"

typedef struct
{
	char name[5];//作业名称
	float ddsk;//到达时刻
	float yxsj;//运行时间
	float kssk;//开始时刻
	float wcsk;//完成时刻 
	float T;//周转时间
	float W;//带权周转时间
    float now_yxsj;//到达在进程所完成时间
//	int finish;//完成标志 1表示完成
}work;

//work workobj[15];
work workobj[]={
{"A",0,4,},{"B",1,3,},{"C",2,5,},{"D",3,2,},{"E",4,4,}
};

float PT;//平均周转时间
float PW;//平均带权周转时间


void getwork()
{
//	cout<<"";

}

void printwork()
{
	float Tsum=0,Wsum=0;
	int i5,i6;
	cout<<"--------------------进程情况-----------------"<<endl;
	cout<<"进   程   名   ";
	for(int i=0;i<sizeof(workobj)/sizeof(work);i++)
        cout<<setiosflags(ios::left)<<setw(5)<<workobj[i].name;
	cout<<"平均";
	cout<<endl;
	cout<<"到 达  时 刻   ";
	for(int i1=0;i1<sizeof(workobj)/sizeof(work);i1++)
        cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i1].ddsk;
	cout<<endl;
	cout<<"运 行  时 间   ";
	for(int i2=0;i2<sizeof(workobj)/sizeof(work);i2++)
        cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i2].yxsj;
	cout<<endl;
	cout<<"开 始  时 刻   ";
	for(int i3=0;i3<sizeof(workobj)/sizeof(work);i3++)
        cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i3].kssk;
	cout<<endl;
	cout<<"完 成  时 刻   ";
	for(int i4=0;i4<sizeof(workobj)/sizeof(work);i4++)
        cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i4].wcsk;
	cout<<endl;
	cout<<"周 转  时 间   ";
	for(i5=0;i5<sizeof(workobj)/sizeof(work);i5++)
	{
        cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i5].T;
        Tsum=Tsum+workobj[i5].T;
	}
	cout<<setprecision(2)<<(float)(Tsum/i5);
	cout<<endl;
	cout<<"带权周转时间   ";
	for(i6=0;i6<sizeof(workobj)/sizeof(work);i6++)
	{
        cout<<setiosflags(ios::left)<<setw(5)<<setprecision(2)<<workobj[i6].W;
        Wsum=Wsum+workobj[i6].W;
	}
	cout<<setprecision(2)<<(float)(Wsum/i6);
	cout<<endl;
	cout<<"---------------------------------------------"<<endl;
}

void menu()
{
	cout<<"-------------menu--------------"<<endl;
	cout<<"  FCFS 先来先服务调度算法"<<endl;
	cout<<"  SJF  短作业优先调度算法"<<endl;
	cout<<"  RR   时间片轮转调度算法"<<endl;
	cout<<"  EXIT 退出程序"<<endl;
	cout<<"-------------------------------"<<endl;
}

void FCFS()
{
	for(int i=0;i<sizeof(workobj)/sizeof(work);i++)
	{
		if(i==0)
			workobj[i].kssk=workobj[i].ddsk;
		else
		{
			if(workobj[i-1].wcsk>=workobj[i].ddsk)
			   workobj[i].kssk=workobj[i-1].wcsk;
			else
			{
				cout<<"Error: "<<workobj[i].name<<"的到达时刻小于"<<workobj[i-1].wcsk<<"的完成时刻。"<<endl;
                break;			
			}
		}
        workobj[i].wcsk=workobj[i].kssk+workobj[i].yxsj;
		workobj[i].T=workobj[i].wcsk-workobj[i].ddsk;
        workobj[i].W=workobj[i].T/workobj[i].yxsj;
	}
}

void SJF()
{
	int last,now,DL[sizeof(workobj)/sizeof(work)],i2,worknum=sizeof(workobj)/sizeof(work);
	float mixyxsj;
	for(int i0=0;i0<worknum;i0++)
		DL[i0]=i0;
	for(int i=0;i<sizeof(workobj)/sizeof(work);i++)
	{
		if(i==0)
		{
			workobj[i].kssk=workobj[i].ddsk;
			last=0;
			now=0;
		}
		else
		{
			//求上一个完成时刻内已经到达的最短完成时间的名称号last
			if(workobj[last].wcsk>=workobj[DL[0]].ddsk)
			{
			   mixyxsj=workobj[DL[0]].yxsj;
			   now=DL[0];
			   for(int j=0;j<worknum;j++)
				   if((mixyxsj>workobj[DL[j]].yxsj)&&(workobj[last].wcsk>=workobj[DL[j]].ddsk))
				   {
                       mixyxsj=workobj[DL[j]].yxsj;
					   now=DL[j];
				   }
			   workobj[now].kssk=workobj[last].wcsk;
			}
			else
			{
				cout<<"Bug: "<<workobj[i].name<<"的到达时刻小于"<<workobj[last].wcsk<<"的完成时刻。"<<endl;
                break;			
			}
		}
        workobj[now].wcsk=workobj[now].kssk+workobj[now].yxsj;
		workobj[now].T=workobj[now].wcsk-workobj[now].ddsk;
        workobj[now].W=workobj[now].T/workobj[now].yxsj;
        last=now;
		//把完成的第now个进程从队列DL[]中请出去
		for(int i1=0;i1<worknum;i1++)
			if(now==DL[i1])
			{
			    for(i2=i1;i2<worknum;i2++)
					DL[i2]=DL[i2+1];
				worknum--;
			}
	}
}
void RR()
{
	int q;//时间片
	int i,sum=0;
	int last=0;//记录上一个进程的下标.
//	int time=0;
	cout<<"输入时间片q=";
	cin>>q;
	cout<<"-------------------------进程次序--------------------------"<<endl;
	cout<<"进程名 ";
	workobj[0].wcsk=0;
	for(int h=0;h<sizeof(workobj)/sizeof(work);h++)
        workobj[h].now_yxsj=0;
for(int n=1;sum<sizeof(workobj)/sizeof(work);n++)//n记录时间片轮转的次数
{
	for(i=0;i<sizeof(workobj)/sizeof(work);i++)
	{
		if(workobj[i].now_yxsj<workobj[i].yxsj)//判断该进程是否已经完成,完成则跳过
		{
			if(workobj[last].wcsk>=workobj[i].ddsk)//在上一个进程结束时下一个进程已经到来
			{
			    if(workobj[i].now_yxsj==0)
					workobj[i].kssk=workobj[last].wcsk; //给各开始时刻赋值
				if((workobj[i].now_yxsj+q)<workobj[i].yxsj)
                   { 
                       workobj[i].wcsk=workobj[last].wcsk+q;
					   for(int y=0;y<q;y++)
					       cout<<resetiosflags(ios::left)<<setw(3)<<workobj[i].name;
                       workobj[i].now_yxsj=workobj[i].now_yxsj+q;
				   }
				else
				   {
                       workobj[i].wcsk=workobj[last].wcsk+(workobj[i].yxsj-workobj[i].now_yxsj);
					   for(int y=0;y<(workobj[i].yxsj-workobj[i].now_yxsj);y++)
						   cout<<resetiosflags(ios::left)<<setw(3)<<workobj[i].name;
					   workobj[i].now_yxsj=workobj[i].yxsj;
					   sum++;
				   }
			    last=i;
			}
			else ;
		}
        else ;//该进程已经完成不做运算
		workobj[i].T=workobj[i].wcsk-workobj[i].ddsk;
        workobj[i].W=workobj[i].T/workobj[i].yxsj;
	}
}
	cout<<setiosflags(ios::left)<<endl;
	cout<<"时间轴 ";
	for(int k=0;k<=workobj[last].wcsk;k++)
		cout<<resetiosflags(ios::right)<<setw(3)<<k;
	cout<<endl;
}

void main()
{
	char caozuo[5];
	getwork();
//    printwork();
	for(;;)
	{
		menu();
	    cout<<">";
	    cin>>caozuo;
		for(int i=0;i<5;i++)
			caozuo[i]=toupper(caozuo[i]);
		if(strcmp(caozuo,"FCFS")==0)
		{
			FCFS();
			printwork();
            continue;
		}
		else if(strcmp(caozuo,"SJF")==0)
		{
			SJF();
			printwork();
            continue;
		}
		else if(strcmp(caozuo,"RR")==0)
		{
			RR();
			printwork();
            continue;
		}
		else if(strcmp(caozuo,"EXIT")==0)
			break;
		else
			cout<<"Error: 无此操作命令."<<endl;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -