#include <iostream.h>
 #include <stdio.h> 
#include <string.h>
#include<stdlib.h>  
void FCFS();     //先来先服务 
void SJF();      //短作业优先
void input();  //输入函数 
void operation();     //运算输出函数
 int n; //全局变量 作业输入量
 double avturn;       //平均周转时间
 double avdqzz;          //平均带权周转时间 
 double t=0.0,k=0.0;          //全局变量用来表示总的周转时间和总的带权周转时间
 struct HomeWork {  
	 int num;                 //作业号  
	 char name;               //进程名 
	 double arrivetime;          //到达时间 
	 double servetime;          //服务时间  
	 double begintime;         //开始时间  
	 double endtime;          //完成时间 
	 double turntime;         //周转时间   
	 double dqzztime;          //带权周转时间 
	 double zgxy;               //最高响应比 
 }HW[10];   
 void input() 
 { 
	 cout<<"请输入要执行作业的数量:"<<endl; 
	 cin>>n;   
	 for(int i=1;i<=n;i++) 
	 {  
		 cout<<"请输入第"<<i<<"个作业的数据:"<<endl;  
		 HW[i].num=i;  
		 cout<<"进程名:";    
		 cin>>HW[i].name; 

		 cout<<"到达时间:";   
		 cin>>HW[i].arrivetime;  
		 cout<<"服务时间:";   
		 cin>>HW[i].servetime;     
	 } 
 }  
 void operation()
 {  
	 for(int i=1;i<=n;i++)  
	 {    
		 if(i==1)    
		HW[i].begintime=HW[i].arrivetime; //如果是第一个作业开始时间就是到达时间 
		 else     
	HW[i].begintime=HW[i-1].endtime;//如果不是,则作业的开始时间是前一个的结束时间   
		 HW[i].endtime=HW[i].begintime+HW[i].servetime;  
		 HW[i].turntime=HW[i].endtime-HW[i].arrivetime;  
		 HW[i].dqzztime=HW[i].turntime/HW[i].servetime;       
	 }  
	 for(i=1;i<=n;i++) 
	 {   
		 t=t+HW[i].turntime; 
		 k=k+HW[i].dqzztime;
	 }  
	 avturn=t/n; 
	 avdqzz=k/n;    
	 cout<<"作业序号 进程名 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间 "<<endl; 
	 for(i=1;i<=n;i++)    
		 cout<<"   "<<HW[i].num<<"     "<<HW[i].name<<"\t\t"<<HW[i].arrivetime<<"  \t"<<HW[i].servetime<<"    \t"<<HW[i].begintime<<"   \t"<<HW[i].endtime<<"    \t"<<HW[i].turntime<<"    \t"<<HW[i].dqzztime<<endl;
	 cout<<"平均周转时间:"<<avturn<<endl; 
	 cout<<"平均带权周转时间:"<<avdqzz<<endl; }  
 void FCFS() 
	 {  
	 input();
	 operation(); 
	 t=0.0; 
	 k=0.0;
	 }   
	 void SJF()
	 {  
		 input();
		 int no;                    //作业号 
		 double tjtime;             //提交时间 
		 double zxtime;             //执行时间 
		 for(int i=2;i<=n;i++)   
			 for(int j=i+1;j<=n;j++)   
			 {    
				 if(HW[i].servetime>HW[j].servetime)
				 {     
					 no=HW[i].num;    
					 HW[i].num=HW[j].num;  
					 HW[j].num=no;                //作业号互换   
					 tjtime=HW[i].arrivetime;     
					 HW[i].arrivetime=HW[j].arrivetime;    
					 HW[j].arrivetime=tjtime;                 //作业到达时间互换 
					 zxtime=HW[i].servetime;          
					 HW[i].servetime=HW[j].servetime;    
					 HW[j].servetime=zxtime;                    //作业服务时间互换    
				 }   
			 }   
			 operation(); 
			 t=0.0; 
			 k=0.0; 
	
 
 }   
void show()
{
   cout<<"\n*********************1.先来先服务(FCFS)算法*********************\n";
   cout<<"\n*********************2.短作业优先(SJF)算法*********************\n";
   cout<<"\n*********************0.    exit             *********************\n";
}
	 void main()
	 {  
		 show();
			 int  num=0;
	    	char ch;
			char y;
			 cout<<"请选择:"<<endl;
		    cin>>num;
			switch(num)
			{
			case 1:	 FCFS(); 
				break;
			case 2:	  SJF();
				break;

			default:
				return;
			}
		 
	 
		 
	
	 }