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

📄 代码.txt

📁 操作系统实验
💻 TXT
字号:
# include <iostream.h>
# include <iomanip.h>


struct process         //定义进程结构体
{
	char Name[20];    //程序名
	int reach_time;     //进程到达时间 
	int run_time;     //进程服务时间
	int begin_time;     //进程开始时间
	int end_time;     //进程完成时间
	int turn_time;    //进程周转时间
	float p_turn_time;     //进程带权周转时间
};

int N;//进程的个数;
float aveturn_timeF,avep_turn_timeF,aveturn_timeS,avep_turn_timeS;//两个算法的平均周转时间和平均带权周转时间 

void GetInProcess(process *pp)//对进程数组进行初始化
{
	cout<<"   进程名(字母)  进程到达时间  进程服务时间  "<<endl;
	cout<<endl;
	for(int i=0;i<=N-1;i++)
	{
		cout<<"进程名"<<i+1<<":";
		cin>>pp[i].Name;
		cin>>pp[i].reach_time;
		cin>>pp[i].run_time;		
	}
	cout<<endl;
	cout<<"       输入完毕   输入内容为: "<<endl;
    cout<<endl;
    cout<<"进程名(字母) 该进程到达时间 该进程服务时间  "<<endl;
	for(int j=0;j<=N-1;j++)
	{		
		cout<<setw(10)<<pp[j].Name;			
		cout<<setiosflags(ios::internal);
		cout<<setw(10)<<pp[j].reach_time
			<<setw(18)<<pp[j].run_time<<endl;
	}
}
void ProcessSort(process *pp)//对此进程数组按到达时间从小到大排序 排序方法为选择法
{
	for(int i=0;i<N-1;i++)
	{
		int k=i;
		for(int j=i+1;j<=N-1;j++)
			if(pp[k].reach_time>pp[j].reach_time)
				k=j;
		//在此已得到最小数的下标 
		process t;
		t=pp[k];
		pp[k]=pp[i];
		pp[i]=t;
	}//完成排序 
}
void PrintProcess(process *pp)//输出诸进程  
{
	cout<<"   进程名  到达时间  服务时间  开始执行时间 完成时间  周转时间  带权周转时间  "<<endl;
	for(int i=0;i<=N-1;i++)
		cout<<setw(8)<<pp[i].Name
			<<setw(10)<<pp[i].reach_time
			<<setw(10)<<pp[i].run_time
			<<setw(10)<<pp[i].begin_time
			<<setw(10)<<pp[i].end_time
			<<setw(10)<<pp[i].turn_time
			<<setw(12)<<pp[i].p_turn_time
			<<endl;
}
void FCFS(process *pp)//对各数据项进行赋值 FCFS算法
{
	pp[0].begin_time=pp[0].reach_time;
	pp[0].end_time=pp[0].run_time+pp[0].begin_time;
	pp[0].turn_time=pp[0].end_time-pp[0].reach_time;
	pp[0].p_turn_time=(float)pp[0].turn_time/pp[0].run_time;
	for(int i=1;i<=N-1;i++)
	{
		pp[i].begin_time=pp[i-1].end_time;
		pp[i].end_time=pp[i].run_time+pp[i].begin_time;
		pp[i].turn_time=pp[i].end_time-pp[i].reach_time;
		pp[i].p_turn_time=(float)pp[i].turn_time/pp[i].run_time;	
	}
	//以下为计算平均周转时间和平均带权周转时间
	int sum1=0;
	for(int j=0;j<=N-1;j++)
		sum1=sum1+pp[j].turn_time;
	aveturn_timeF=(float)sum1/N;
	float sum2=0;
	for(int k=0;k<=N-1;k++)
		sum2=sum2+pp[k].p_turn_time;
	avep_turn_timeF=sum2/N;
}
void SJF(process *pp)//SJF算法 
{
	int kk=0;//记录性变量 看已有多少个进程已计算了
	int *ccharg=new int[N];//记录性数组 看有哪些进程已计算了 0为否1为是
	for(int l=0;l<=N-1;l++)
		ccharg[l]=0;
	process *p1=new process[N];//另外开辟一个存放进程的数组 
	//计算第一个先到的进程各个量 
	pp[0].begin_time=pp[0].reach_time;
	pp[0].end_time=pp[0].run_time+pp[0].begin_time;
	pp[0].turn_time=pp[0].end_time-pp[0].reach_time;
	pp[0].p_turn_time=(float)pp[0].turn_time/pp[0].run_time;
	p1[0]=pp[0];//赋值到新开辟的数组中
	ccharg[0]=1;//表pp数组中下标为0的量已计算  
	while(kk<N-1)
	{
		//根据d1[kk].end_time找到前K(下标)进程已到达
		int k=-1;
		for(int i=1;i<=N-1;i++)//前提为pp数组已经过按到达时间从小到大排序 
			if(p1[kk].end_time<pp[i].reach_time)
			{
				k=i-1;
				break;
			}
		if(k==-1)//说明所有的进程都已到达 
			k=N-1;
		//在1到K个进程找到服务时间最短的进程下标min**注意这儿有缺点当有服务时间一样的时间则按下的算法
		//为先到的那个进程先运行 
		int min=0,m=-1;
		for(int j=1;j<=k;j++)
		{
			if(ccharg[j]==1)//说明此下标的进程已计算完毕  
			{
			}
			else
			{
				if(m==-1)//说明是第一次进入else
				{
					min=j;
					m=0;
				}
				else
				{
					if(pp[min].run_time>pp[j].run_time)
						min=j;		
				}
			}
		}
		//下面为算出min的各数据项
		pp[min].begin_time=p1[kk].end_time;
		pp[min].end_time=pp[min].run_time+pp[min].begin_time;
		pp[min].turn_time=pp[min].end_time-pp[min].reach_time;
		pp[min].p_turn_time=(float)pp[min].turn_time/pp[min].run_time;
		kk++;
		p1[kk]=pp[min];
		ccharg[min]=1;//说明min已算 
	}//while结束 

	cout<<endl;
	PrintProcess(p1);
	cout<<"--------------------------------------------------------------------------------"<<endl;
	int sum1=0;
	for(int x=0;x<=N-1;x++)
		sum1=sum1+pp[x].turn_time;
	aveturn_timeS=(float)sum1/N;
	float sum2=0;
	for(int y=0;y<=N-1;y++)
		sum2=sum2+pp[y].p_turn_time;
	avep_turn_timeS=sum2/N;
}
//主函数开始
void main()
{
	process *pro=NULL;
	cout<<"       ★★★★★★★★★★★★处理机调度实验★★★★★★★★★★★★  "<<endl;
	cout<<endl;
	cout<<"请输入进程的个数(有几个进程): ";
	cin>>N;
	pro=new process[N];
	cout<<endl;
	cout<<"根据提示分别输入整型的数据,对进程初始化:"<<endl; 
	cout<<endl;
	cout<<"例如:a 2 3"<<endl;
	cout<<endl;
	GetInProcess(pro);
	ProcessSort(pro);
	cout<<endl;
	cout<<"     经过计算,结果如下:"<<endl;
	cout<<endl;

	//SJK算法
	cout<<"                    ★★★★SJF算法如下★★★★             "<<endl;
	SJF(pro);
	PrintProcess(pro);
	cout<<endl;
	cout<<"平均周转时间: "<<aveturn_timeS<<endl;
	cout<<"平均带权周转时间: "<<avep_turn_timeS<<endl;
	cout<<endl;


	//FCFS算法 
	cout<<"                    ★★★★FCFS算法如下★★★★            "<<endl;
	cout<<endl;
	FCFS(pro);
	PrintProcess(pro);
	cout<<endl;
	cout<<"平均周转时间: "<<aveturn_timeF<<endl;

	cout<<"平均带权周转时间: "<<avep_turn_timeF<<endl;
	cout<<endl;

	

}

⌨️ 快捷键说明

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