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.调用文本写入数据 2.调用自己输入模拟数据 "); 45 scanf("%d",&a); 46 if(a==1) 47 ReadFile(); 48 else 49 AutoInput(n,job); 50 51 52 printf(" ************选择调度算法************ "); 53 printf(" 1.FCFS(先到先服务)算法调度 2.SJF(短作业优先)算法调度 3.HRRF(最高响应比优先)算法调度 "); 54 printf(" ************************************ "); 55 scanf("%d",&b); 56 if(b==1) 57 { 58 printf(" ************FCFS(先到先服务)************ "); 59 FCFS(n,job); 60 printf(" 作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间 "); 61 for(i=0;i<n;i++) 62 { 63 printf("%s %d %d %d %d %f %f ",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime); 64 printf(" "); 65 } 66 printf(" "); 67 } 68 69 else if(b==2) 70 { 71 printf(" ************SJF(短作业优先)************ "); 72 SJF(n,job); 73 printf(" 作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间 "); 74 for(i=0;i<n;i++) 75 { 76 printf("%s %d %d %d %d %f %f ",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime); 77 printf(" "); 78 } 79 } 80 81 else if(b==3) 82 { 83 printf(" ************HRRF(最高响应比优先)************ "); 84 HRRF(n,job); 85 printf(" 作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间 "); 86 for(i=0;i<n;i++) 87 { 88 printf("%s %d %d %d %d %f %f ",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime); 89 printf(" "); 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 ",systime); 100 printf("平均周转时间=%f ",averageTAtime); 101 printf("平均带权周转时间=%f ",averageTAWtime); 102 103 } 104 105 void AutoInput(int n,jcb job[])//调用自己输入模拟数据 106 { 107 printf("作业个数:"); 108 scanf("%d",&n); 109 printf(" "); 110 for(int i=0;i<n;i++) 111 { 112 printf("第%d个作业: ",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(" "); 120 } 121 } 122 123 124 125 /* 126 127 void putOutjob(jcb job[],int n)//打印内容 128 { 129 int i; 130 printf(" 作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间 "); 131 for(i=0;i<n;i++) 132 { 133 printf("%s %d %d %d %d %f %f ",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime); 134 printf(" "); 135 136 } 137 printf(" "); 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 ! "); 251 exit(0); 252 } 253 printf(" 作业名称 作业到达时间 作业运行所需要时间 "); 254 while(!feof(fp)) 255 { 256 fscanf(fp,"%d%d%d",&job[i].name,&job[i].arrtime,&job[i].reqtime); //fscanf()函数将数据读入 257 printf(" %3f%12d%15d ",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 ! "); 264 exit(0); 265 } 266 m=i-1; 267 return m; 268 269 }
运行结果及分析
仍有一些问题未解决,故最后的输出错误。此次编程是自己摸索的,由于编程能力不足,所以会因为一些小错误卡住很久。还有些问题到现在都无法解决。
今后的练习中会多向同学学习,弥补自身的不足。