操作系统实验2-作业调度3.0

1.实验内容和要求

 

(1)初始化程序运行界面,实现菜单选项

(2)选择从文件读取作业

(3)选择调度算法菜单

(4)显示调度结果

 

2.主要程序段

 

  1 #include<stdio.h>
  2 
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #include<conio.h>
  6 #include <time.h>
  7 
  8 struct jcb
  9 { 
 10     char name[10];           /* 作业名 */  
 11     char status;             /* 作业状态 */  
 12     
 13     int arrtime;             /* 到达时间 */  
 14     int startime;            /* 开始运行时间 */  
 15     int reqtime;             /* 要求服务时间 */ 
 16     int finitime;            /* 完成时间 */ 
 17     
 18     float TAtime;            /* 周转时间 */  
 19     float TAWtime;           /* 带权周转时间 */  
 20     
 21     float prio;              //优先权
 22     float rp;              //响应比
 23 } jobarr[24],jobfin[24],job[24];    
 24 
 25 void AutoInput(int n,jcb job[]);//调用自己输入模拟数据
 26 int ReadFile();//文件读取
 27 void Finishtime(int n,jcb job[]);//计算结束时间
 28 TAtime(int n,jcb job[],float averageTAtime);//计算周转时间、平均周转时间
 29 TAWtime(int n,jcb job[],float averageTAWtime);//计算带权周转时间、平均带权周转时间
 30 void FCFS(int n,jcb job[]);//先到先服务,按到达时间排序
 31 void SJF(int n,jcb job[]);//短作业优先,按服务时间排序
 32 void HRRF(int n,jcb job[]);//最高响应比优先
 33 void putOutjob(jcb job[],int n);//打印内容
 34 
 35 void main()
 36 {
 37     //    int intarr,intfin,intjob;  /* 到达作业个数,完成作业个数,未到达作业个数 */
 38     float averageTAtime=0;
 39     float averageTAWtime=0;
 40     int n;
 41     int systime=0; 
 42     int i;
 43     int a,b;
 44     printf("1.调用文本写入数据\n2.调用自己输入模拟数据\n");
 45     scanf("%d",&a);
 46     if(a==1)
 47         ReadFile();
 48     else 
 49         AutoInput(n,job);
 50     
 51     
 52     printf("\t\t************选择调度算法************\n");
 53     printf("\t\t1.FCFS(先到先服务)算法调度\n\t\t2.SJF(短作业优先)算法调度\n\t\t3.HRRF(最高响应比优先)算法调度\n");
 54     printf("\t\t************************************\n");
 55     scanf("%d",&b);
 56     if(b==1)
 57     {
 58         printf("\t\t************FCFS(先到先服务)************\n");
 59         FCFS(n,job);
 60         printf("\n\n作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间\n");
 61         for(i=0;i<n;i++)
 62         {
 63             printf("%s\t%d\t%d\t%d\t%d\t%f\t%f\n",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime);
 64             printf("\n");
 65         }
 66         printf("\n\n");
 67     }
 68     
 69     else if(b==2)
 70     {
 71         printf("\t\t************SJF(短作业优先)************\n");
 72         SJF(n,job);
 73         printf("\n\n作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间\n");
 74         for(i=0;i<n;i++)
 75         {
 76             printf("%s\t%d\t%d\t%d\t%d\t%f\t%f\n",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime);
 77             printf("\n");
 78         }
 79     }
 80     
 81     else if(b==3)
 82     {
 83         printf("\t\t************HRRF(最高响应比优先)************\n");
 84         HRRF(n,job);
 85         printf("\n\n作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间\n");
 86         for(i=0;i<n;i++)
 87         {
 88             printf("%s\t%d\t%d\t%d\t%d\t%f\t%f\n",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime);
 89             printf("\n");
 90         }
 91     }    
 92     
 93     
 94     
 95     Finishtime(n,job);
 96     averageTAtime=(float)TAtime(n,job,averageTAtime);
 97     averageTAWtime=(float)TAWtime(n,job,averageTAWtime);
 98     
 99     printf("现在系统时间:%d\n",systime);
100     printf("平均周转时间=%f\n",averageTAtime);
101     printf("平均带权周转时间=%f\n",averageTAWtime);
102     
103 }
104 
105 void AutoInput(int n,jcb job[])//调用自己输入模拟数据
106 {
107     printf("作业个数:");
108     scanf("%d",&n);
109     printf("\n");
110     for(int i=0;i<n;i++)
111     {
112         printf("第%d个作业:\n",i+1);
113         printf("输入作业名称:");
114         scanf("%s",job[i].name);
115         printf("到达时间:");
116         scanf("%d",&job[i].arrtime);
117         printf("要求服务时间:");
118         scanf("%d",&job[i].reqtime);
119         printf("\n");
120     }
121 }
122 
123 
124 
125 /*
126 
127   void putOutjob(jcb job[],int n)//打印内容
128   {
129   int i;
130   printf("\n\n作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间\n");
131   for(i=0;i<n;i++)
132   {
133         printf("%s\t%d\t%d\t%d\t%d\t%f\t%f\n",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime);
134         printf("\n");
135         
136           }
137           printf("\n\n");
138           }
139           
140 */
141 
142 void FCFS(int n,jcb job[])//先到先服务,按到达时间排序
143 {
144     int i,j;
145     jcb tmp;
146     for(i=0;i<n-1;i++)
147         for(j=i+1;j<n;j++)
148         {
149             if(job[i].arrtime>job[j].arrtime)
150             {
151                 tmp=job[i];
152                 job[i]=job[j];
153                 job[j]=tmp;
154             }
155         }
156 }
157 
158 
159 void SJF(int n,jcb job[])
160 {
161     int i,j;
162     jcb tmp;
163     for(i=0;i<n-1;i++)
164         for(j=i+1;j<n;j++)
165         {
166             if(job[i].reqtime<job[j].reqtime)
167             {
168                 tmp=job[i];
169                 job[i]=job[j];
170                 job[j]=tmp;
171             }
172         }
173 }
174 
175 void HRRF(int n,jcb job[])
176 {
177     int i,j;
178     jcb tmp;
179     for(i=0;i<n;i++)
180     {
181         job[i].rp=job[i].TAtime/job[i].arrtime;
182     }
183     for(i=0;i<n-1;i++)
184         for(j=i+1;j<n;j++)
185         {
186             if(job[i].rp>job[j].rp)
187             {
188                 tmp=job[i];
189                 job[i]=job[j];
190                 job[j]=tmp;
191             }
192         }
193 }
194 
195 
196 void Finishtime(int n,jcb job[])//计算结束时间
197 {
198     int i;
199     for(i=0;i<n;i++)
200     {
201         if(i==0)
202         {
203             //job[i].startime=job[i].arrtime;
204             job[i].finitime=job[i].arrtime+job[i].reqtime;
205             job[i].startime=job[i].finitime;
206         }
207         else
208         {
209             job[i].finitime=job[i-1].startime+job[i].reqtime;
210             job[i].startime=job[i].finitime;
211         }
212     }
213 }
214 
215 TAtime(int n,jcb job[],float averageTAtime)//计算周转时间、平均周转时间
216 {
217     int i;
218     float sum=0;
219     for(i=0;i<n;i++)
220     {
221         job[i].TAtime=(float)job[i].finitime-job[i].arrtime;
222         sum=sum+job[i].TAtime;
223     }
224     averageTAtime=sum/(float)n;
225     return averageTAtime;
226 }
227 
228 
229 TAWtime(int n,jcb job[],float averageTAWtime)//计算带权周转时间、平均带权周转时间
230 {
231     int i;
232     float sum=0;
233     for(i=0;i<n;i++)
234     {
235         job[i].TAWtime=job[i].TAtime/job[i].reqtime;
236         sum=sum+job[i].TAWtime;
237     }
238     averageTAWtime=sum/(double)n;
239     return averageTAWtime;
240 }
241 
242 int ReadFile()
243 {
244     int m=0;
245     int i=1;
246     FILE *fp;     //定义文件指针
247     fp=fopen("3.txt","r");  //打开文件
248     if(fp==NULL)
249     {
250         printf("File open error !\n");
251         exit(0);
252     }
253     printf("\n 作业名称    作业到达时间     作业运行所需要时间\n");
254     while(!feof(fp))
255     {
256         fscanf(fp,"%d%d%d",&job[i].name,&job[i].arrtime,&job[i].reqtime);  //fscanf()函数将数据读入
257         printf("\n%3f%12d%15d\n",job[i].name,job[i].arrtime,job[i].reqtime);  //输出到屏幕
258         i++;//
259     };
260     
261     if(fclose(fp))     //关闭文件
262     {
263         printf("Can not close the file !\n");
264         exit(0);
265     }
266     m=i-1;
267     return m;
268     
269 }

 

运行结果及分析

仍有一些问题未解决,故最后的输出错误。此次编程是自己摸索的,由于编程能力不足,所以会因为一些小错误卡住很久。还有些问题到现在都无法解决。

今后的练习中会多向同学学习,弥补自身的不足。

posted @ 2016-04-22 11:33  08周诗琦  阅读(259)  评论(0编辑  收藏  举报