实验二

package 先来先服务;
import java.util.Scanner;
public class Test1 {
    public static void main(String []args){
        //用户输入作业个数,定义三个数组分别存储用户输入作业、后备队列作业、完成运行作业
                System.out.print("请输入作业个数:");
                Scanner reader=new Scanner(System.in);
                int n=reader.nextInt();        
                Job j[] =new Job[n];
                Job ReadyJob[]=new Job[n];
                Job RunningJob[]=new Job[n];
                int m=0;
                int l=0;
                int CurrentTime=0;
        //用户从键盘输入作业相关信息        
                for(int i=0;i<n;i++){
                    j[i]=new Job();
                    System.out.print("请输入第"+(i+1)+"个作业的名称:");
                    j[i].JobName=reader.next();
                    System.out.print("请输入第"+(i+1)+"个作业的提交时刻:");
                    j[i].GetTime=reader.nextInt();
                    System.out.print("请输入第"+(i+1)+"个作业的运行时间:");
                    j[i].RunTime=reader.nextInt();
                }
        //输出用户输入数据        
                System.out.println("\n**用户输入的原始数据**");
                System.out.println("作业名称                        "+"提交时刻                        "+"运行时间");
                for(int i=0;i<n;i++){
                    System.out.print(j[i].JobName+"              ");
                    System.out.print(j[i].GetTime+"            ");
                    System.out.println(j[i].RunTime+"                ");
                }
        //运用冒泡排序对用户输入作业进行排序        
                System.out.print("\n**按提交时间排序后,还未进入后备队列的任务!**\n");
                for(int i=1;i<n;i++){
                    for(int k=0;k<n-i;k++){
                        if(j[k].GetTime>j[k+1].GetTime){
                            Job temp=j[k];
                            j[k]=j[k+1];
                            j[k+1]=temp;
                        }
                    }        
                }
        //输出排序后的用户作业
                System.out.println("作业名称                        "+"提交时刻                             "+"运行时间");
                for(int i=0;i<n;i++){
                    System.out.print(j[i].JobName+"              ");
                    System.out.print(j[i].GetTime+"            ");
                    System.out.println(j[i].RunTime+"            ");
                }
        //当用户输入作业或后备队列作业不为空时,进入先来先服务调度算法        
                System.out.print("\n**按先来先服务调度算法进行调度!**\n");        
                
                while(m>0 || n>0){
        //若当前系统时间小于排序后的用户输入作业中的第一个作业的提交时间,则系统时间自动加一            
                    while(CurrentTime<j[0].GetTime){
                        System.out.println("当前系统时间为:"+CurrentTime);
                        System.out.println("继续请输入任意字母!\n");
                        String c=reader.next();
                        CurrentTime++;
                    }                    
                    System.out.println("当前系统时间为:"+CurrentTime);
        //若排序后的用户输入作业中的作业大于当前系统时间,则进入后备队列            
                    int count=0;
                    for(int i=0;i<n;i++){
                        if(CurrentTime>=j[i].GetTime){
                            ReadyJob[m]=j[i];
                            m++;    
                            count++;
                        }
                    }    
        //将已进入后备队列的作业从用户输入作业中删除    
                    for(int a=0;a<count;a++){
                        for(int b=0;b<n-1;b++){
                            j[b]=j[b+1];                
                        }
                        n--;    
                    }
                    
        //当用户输入作业不为空时,输出未进入后备队列的作业        
                    if(n>0){
                        System.out.print("**以下为还未进入后备队列的作业!**\n");
                        System.out.println("作业名称                        "+"提交时刻                             "+"运行时间");
                        for(int i=0;i<n;i++){                        
                                System.out.print(j[i].JobName+"              ");
                                System.out.print(j[i].GetTime+"            ");
                                System.out.println(j[i].RunTime+"          ");                
                        }
                    }
        //当后备队列不为空时进行以下操作                
                    if(m>0){
        //输出已进入后备队列的作业
                        System.out.print("**以下为已进入后备队列的作业!**\n");
                        System.out.println("作业名称                     "+"提交时刻                      "+"运行时间  ");
                        for(int i=0;i<m;i++){
                            System.out.print(ReadyJob[i].JobName+"              ");
                            System.out.print(ReadyJob[i].GetTime+"            ");
                            System.out.println(ReadyJob[i].RunTime+"          ");
                        }
        //输出处于运行状态的作业名称,并计算运行的作业完成运行后作业的各种属性和当前系统时间                
                        System.out.println("处于运行的作业;"+ReadyJob[0].JobName);
                        ReadyJob[0].StartTime=CurrentTime;
                        ReadyJob[0].EndTime=ReadyJob[0].StartTime+ReadyJob[0].RunTime;    
                        ReadyJob[0].CircleTime=ReadyJob[0].EndTime-ReadyJob[0].GetTime;
                        ReadyJob[0].CircleCoefficient=ReadyJob[0].CircleTime/ReadyJob[0].RunTime;
                        CurrentTime=ReadyJob[0].StartTime+ReadyJob[0].RunTime;
        //运行完成的作业进入运行完成作业的队列                
                        RunningJob[l]=ReadyJob[0];        
                        l++;
        //将已完成运行的作业从后备队列中删除
                        for(int i=0;i<m-1;i++){        
                            ReadyJob[i]=ReadyJob[i+1];                
                        }
                        m--;
        //输出已完成运行作业的相关信息                
                        System.out.println("**以下为已完成的作业**");
                        System.out.println("作业名称                    "+"提交时刻                     "+"运行时间                  "+"开始时间                 "+"结束时间                "+"周转时间                   "+"周转系数                 ");
                        for(int i=0;i<l;i++){
                            System.out.print(RunningJob[i].JobName+"            ");
                            System.out.print(RunningJob[i].GetTime+"             ");
                            System.out.print(RunningJob[i].RunTime+"             ");
                            System.out.print(RunningJob[i].StartTime+"            ");
                            System.out.print(RunningJob[i].EndTime+"            ");
                            System.out.print(RunningJob[i].CircleTime+"            ");
                            System.out.println(RunningJob[i].CircleCoefficient);
                        }    
                    }
        //提示用户输入c继续程序的执行        
                        System.out.println("继续请输入任意字母!\n");
                        String S=reader.next();        
                    }    
        //计算该组作业的平均周转时间        
                double SumCircleTime=0;
                for(int i=0;i<l;i++){
                    SumCircleTime=SumCircleTime+RunningJob[i].CircleTime;
                }
                System.out.println("该组作业的平均周转时间:"+SumCircleTime/l);
        //计算该组作业的平均周转系数        
                double SumCircleCoefficient=0;
                for(int i=0;i<l;i++){
                    SumCircleCoefficient=SumCircleCoefficient+RunningJob[i].CircleCoefficient;
                }
                System.out.println("该组作业的平均周转系数:"+SumCircleCoefficient/l);
                
                System.out.println("已完成此次调度!");
            }    
}


package 先来先服务;
import java.util.Scanner;
    
    //定义一个Job类,用来存放Job的属性
class Job{
    String JobName;     //定义作业名称
    int GetTime;        //定义到达时间
    int RunTime;        //定义运行时间
    char JobState='w'; //定义作业状态
    int StartTime;      //定义开始时间
    int EndTime;                   //定义结束时间
    double CircleTime;             //定义周转时间
    double CircleCoefficient;      //定义周转系数
} 

总结:其实我并不太懂这次实验要求我做什么,做的时候去查书看书才有一点点理解,对这些算法也不太熟悉,写得也不多,能写的也不多,就比较理解先来先服务这个算法,其余的算法要理解还需要一定时间。

原文地址:https://www.cnblogs.com/xy1015/p/4492687.html