1 package yun3; 2 3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import java.util.Calendar; 6 import java.util.Scanner; 7 public class number3 { 8 9 /** 10 * * 作者:範銘祥 11 * 功能:演示先來先到處理演算法 12 * 日誌2:事實證明日誌1的方法可用,但在系統執行過程中因為一些邏輯性問題而出錯,我將畫一張新邏輯圖 13 * 來解決這問題,現建立新程式解決,並縮略程式 14 */ 15 public static void main(String[] args) throws Exception 16 { 17 System.out.println("是否要自定作業個數?Y/N"); 18 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 19 String choose=br.readLine(); 20 JCB[] project=new JCB[25]; 21 int aa=1; 22 if(choose.equals("Y")) 23 { 24 Scanner in=new Scanner(System.in); 25 System.out.println("請輸入作業的個數"); 26 aa=in.nextInt()+1;//這裡aa預留大了1,後面只需用<符號 27 } 28 if(choose.equals("N")) 29 { 30 aa=6; 31 } 32 //錄入各專案的JBC資料 33 System.out.println("以下是輸入作業資訊:\n"); 34 Scanner in=new Scanner(System.in); 35 for(int i=1;i<aa;i++) 36 { 37 38 project[i]=new JCB(); 39 project[i].vv=i; 40 System.out.println("請輸入第"+i+"個作業的名字 "); 41 project[i].name=br.readLine(); 42 project[i].inmessage("作業等待"); 43 System.out.println("輸入第"+i+"個作業所需的執行時間(秒)!"); 44 int run=in.nextInt(); 45 project[i].time_1(run); 46 System.out.println("輸入第"+i+"個作業開始執行的時間(秒)"); 47 int get=in.nextInt(); 48 project[i].time_2(get); 49 } 50 //以下是用於排序 51 open1 s1=new open1(); 52 s1.open1_2(aa, project); 53 // //Test0 54 // for(int v=1;v<aa;v++) 55 // { 56 // System.out.println("vv"+project[v].vv); 57 // } 58 //以下是用於將正確的作業順序填入JCB 59 JCB PP[]=new JCB[25]; 60 for(int b=1;b<aa;b++) 61 { 62 PP[b]=new JCB(); 63 for(int c=1;c<aa;c++ )//這裡用於搜尋在pro[]vv中的1234 64 { 65 if(project[c].vv==b) 66 { 67 PP[b]=project[c]; 68 } 69 } 70 } 71 //test 72 for(int u=1;u<aa;u++) 73 { 74 System.out.println("第"+u+"處理: 原第"+PP[u].vv+"個作業——名稱:"+PP[u].name+"到達時間:"+PP[u].gettime+"執行時間"+PP[u].runtime); 75 } 76 //錄完go時間模組 77 Calendar c = Calendar.getInstance(); 78 int gominute = c.get(Calendar.MINUTE); 79 int gosecond = c.get(Calendar.SECOND); 80 int all=gominute*60+gosecond; 81 //裝逼提示使用者系統開始時間(秒) 82 System.out.println("錄完作業入系統的時間0"); 83 //以下是開始執行各作業的執行情況 84 boolean go=true;int ii=1;int kk2=0; 85 boolean go2=true; 86 /*最外層迴圈*/do 87 { 88 89 // System.out.println("ii"+ii); 90 Calendar b = Calendar.getInstance(); 91 /*0延遲更新時間*/int m = b.get(Calendar.MINUTE)*60; 92 int s = b.get(Calendar.SECOND)+m;//現時間總和 93 //以下這部分專門用來顯示時間 94 int kk=s-all; 95 if(kk==kk2) 96 { 97 System.out.println("系統時間:第"+kk+"秒"); 98 } 99 kk2=kk+1; 100 int yy=PP[ii].runtime;//這裡不知為何要用int來傳入PP【ii】.runtime,測試後發現這個可行 101 if(s==PP[ii].gettime+all)//當時間到達任務開始的時間 102 { 103 System.out.println("第"+ii+"個作業的到達時間"+PP[ii].gettime); 104 System.out.println("作業"+ii+"正在執行"); 105 /*在該作業中不斷迴圈時間 直至時間跳到now=s(記錄的是該作業開始執行的時間)+runtime*/ 106 go2=true;//使下個作業能再進去 107 while(go2) 108 { 109 Calendar d = Calendar.getInstance();//可以對每個時間域單獨修改 110 int m3 = d.get(Calendar.MINUTE)*60; 111 int s3 = d.get(Calendar.SECOND)+m3;//數出的最新的時間 112 /*判斷*/ if(s+yy==s3) 113 { 114 System.out.println("任務作業"+ii+"名字"+PP[ii].name+"狀態:完成"); 115 PP[ii].zt="作業完成"; 116 int nowt2=s3-all; 117 System.out.println("現在系統時間"+nowt2); 118 go2=false; 119 //然後再判斷現時間是否超過下一作業的開始時間 是則 替代之 120 if(ii+1<=aa-1)//限制ii+1的範圍 避免空 121 { 122 if(nowt2>=PP[ii+1].gettime) 123 { 124 PP[ii+1].gettime=nowt2; 125 } 126 } 127 ii++; 128 } 129 //跳出來了 130 if(ii==aa) 131 { 132 go=false; 133 } 134 135 } 136 137 } 138 }while(go); 139 System.out.println(" 你的要求全部完成 "); 140 } 141 142 } 143 class JCB{ 144 public String name,zt;//作業名 執行狀態 145 public int vv;//用來排完順序後儲存原來的作業號 146 public int runtime;//執行所需要時間 147 public int gettime;//到達時間 148 //從這裡錄入 149 public void inmessage(String zt) 150 { 151 this.zt=zt; 152 } 153 public void time_1(int cd) 154 { 155 this.runtime=cd; 156 } 157 public void time_2(int gd) 158 { 159 this.gettime=gd; 160 } 161 } 162 class SYS_START 163 { 164 public int gomm; //記錄全部作業開始時的時間 165 public int goss; //記錄全部作業開始時的時間 166 public int allstart;//這個是將全部作業開始的時間化為秒數 167 public SYS_START() 168 { 169 this.allstart=gomm*60+goss; 170 } 171 public void gommtime(int mmtime) 172 { 173 this.gomm=mmtime; 174 } 175 public void gosstime(int sstime) 176 { 177 this.goss=sstime; 178 } 179 180 } 181 class open1 182 { 183 public void open1_2(int aa,JCB project[]) 184 { 185 //以下是開始排序來達到先來先到處理演算法:採用的是氣泡排序法 186 int temp=0; 187 for(int i=1;i<aa;i++) 188 { 189 for(int y=aa-1;y>i;y--) 190 { 191 if(project[y].gettime<project[y-1].gettime) 192 { 193 temp=project[y].vv; 194 project[y].vv=project[y-1].vv; 195 project[y-1].vv=temp; 196 } 197 } 198 } 199 } 200 }
啊啊啊啊啊啊啊!!!
被一句pk掉
Thread.sleep(1000);