先来先服务和短作业优先 一个程序要有这两个功能
以下的代码,老师说不好,要重写,那位大牛给大面积修改一下或者在写个简单的。
我的邮箱是:zhanglongofchina@163.com,为防止同学也在这里找答案,老师又不让过了,最好发我邮箱,期待高手。。。
1 // testtest.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 6 7 8 #include <stdio.h> 9 #include <stdlib.h> // for malloc and system("pause") 10 #include "ProcessControl.h" 11 12 typedef struct ln 13 { 14 int id; //进程号 15 int at; //到达时间 16 int st; //服务时间 17 int ft; //完成时间 18 int zt; //周转时间 19 float dt; //带权周转时间 20 struct ln *next; 21 }node,*link; 22 23 link Creat() 24 { 25 link H=NULL; 26 node *p,*q; 27 int id,at,st; 28 29 printf("-------请输入依次进程号、到达时间、服务时间(id=-1退出)-------\n"); 30 printf("进程号 到达时间 服务时间\n"); 31 scanf("%d",&id); 32 scanf("%d",&at); 33 scanf("%d",&st); 34 while(id!=-1){ 35 p=(node *)malloc(sizeof(node)); 36 p->id=id; 37 p->at=at; 38 p->st=st; 39 p->next=NULL; 40 if(H==NULL)//第一个节点 41 { 42 H=p; 43 q=p; 44 } 45 else 46 { 47 q->next=p; 48 q=q->next; 49 } 50 51 52 scanf("%d",&id); 53 if(id==-1) break; 54 scanf("%d",&at); 55 scanf("%d",&st); 56 } 57 return H; 58 } 59 //============================================================== 60 /*需考虑 处理机中间出现了空闲状态*/ 61 link jisuan(link H) //计算周转时间和带权周转时间 62 { 63 64 node *p,*q; 65 int time; //保存前一个节点的完成时间 66 67 if(H==NULL) 68 return H; 69 p=H; 70 p->ft=p->at+p->st; //第一个节点 71 time=p->ft; 72 q=p->next; 73 while(q) //计算完成时间 74 { 75 if(q->at<time) 76 q->ft=time+q->st; 77 else // 处理器空闲了一段时间 78 q->ft=q->at+q->st; 79 time=q->ft; 80 q=q->next; 81 } 82 83 p=H; 84 while(p) //计算周转时间 85 { 86 p->zt=p->ft-p->at; 87 p=p->next; 88 } 89 90 p=H; 91 while(p) //计算带权周转时间 92 { 93 p->dt = (float)p->zt / p->st; 94 p=p->next; 95 } 96 return H; 97 } 98 //=========================================================== 99 void Print(link H) 100 { 101 node *p; 102 if (H==NULL) 103 printf("\n进程队列为空!!!\n"); 104 else 105 { 106 p=H; 107 printf("\n 进程号 到达时间 服务时间 完成时间 周转时间 带权周转时间\n"); 108 while(p!=NULL) 109 { 110 printf(" %-8d %-8d %-8d %-8d %-8d %-8.2f\n",p->id ,p->at ,p->st,p->ft,p->zt,p->dt ); 111 p=p->next; 112 } 113 printf("\n\n"); 114 } 115 } 116 //=========================================================== 117 118 link fcfs(link H) //先到先服务 119 { 120 node *p,*q,*t; 121 122 if(H==NULL) 123 return H; 124 125 p=H; 126 q=H->next; 127 t=(node *)malloc(sizeof(node)); 128 while(p) 129 { 130 while(q) 131 { 132 if(p->at>q->at)//从小到大排序 133 { 134 t->id=q->id; 135 t->at=q->at; 136 t->st=q->st; 137 q->id=p->id; 138 q->at=p->at; 139 q->st=p->st; 140 p->id=t->id; 141 p->at=t->at; 142 p->st=t->st; 143 } 144 q=q->next; 145 } 146 p=p->next; 147 if(p!=NULL) 148 q=p->next; 149 } 150 return H; 151 } 152 //==================================================== 153 154 /* 考虑因素 */ 155 /* 1:有多个进程最早时刻到 */ 156 /* 2:最早到达的是长作业进程 */ 157 /* 3:处理机中间出现了空闲状态 */ 158 159 link sjf(link H) //短作业优先 160 { 161 node *p,*q,*t; 162 if (H==NULL || H->next==NULL) 163 return H; 164 165 /*取出此阶段第一时间到达且服务时间最短的进程*/ 166 p=H; 167 q=H->next; 168 t=(node *)malloc(sizeof(node)); 169 while(p->at==q->at && q!=NULL) 170 { 171 if(q->st<p->st) //交换数据 172 { 173 t->id=q->id; 174 t->at=q->at; 175 t->st=q->st; 176 q->id=p->id; 177 q->at=p->at; 178 q->st=p->st; 179 p->id=t->id; 180 p->at=t->at; 181 p->st=t->st; 182 } 183 q=q->next; 184 } 185 186 /*从第二个节点开始按短作业排序*/ 187 p=H->next; 188 q=p->next; 189 while(p) 190 { 191 while(q) 192 { 193 if(p->st>q->st)//从小到大排序 194 { 195 t->id=q->id; 196 t->at=q->at; 197 t->st=q->st; 198 q->id=p->id; 199 q->at=p->at; 200 q->st=p->st; 201 p->id=t->id; 202 p->at=t->at; 203 p->st=t->st; 204 } 205 q=q->next; 206 } 207 p=p->next; 208 if(p!=NULL) 209 q=p->next; 210 } 211 return H; 212 } 213 214 link section(link H) //将进程按处理机忙/闲分段 215 { 216 link L; 217 node *p,*q; 218 int time; 219 if(H==NULL) 220 return H; 221 222 H=fcfs(H); //先按时间排序 223 L=H; 224 p=H; 225 q=H->next; 226 time=p->at+p->st; 227 while(q) 228 { 229 if(q->at<=time) 230 time=time + q->at; 231 else //分成一段连续的时间 232 { 233 p->next=NULL; //以前p和q之间分段 234 L=sjf(L); //短作业排序 235 p->next=q; //链接分开的两段 236 L=q; //L作为下一段的开头 237 time=q->at+q->st; 238 } 239 p=q; //p保存q的前一个节点的地址 240 q=q->next; 241 } 242 243 /*最后一个分段或只有一段*/ 244 L=sjf(L); //短作业排序 245 return H; 246 } 247 //================================================================ 248 /* ------此算法尚未实现--------------*/ 249 link fpf(link H) //高优先权优先调度算法 250 { 251 node *p,*q,*t; 252 int time=0; //记录当前时间 253 float weight1,weight2; //优先权 254 255 if (H || H->next) //至少2个节点 256 return H; 257 p=(node *)malloc(sizeof(node)); 258 t=(node *)malloc(sizeof(node)); 259 H=sjf(H); //先按短作业优先排序 260 time=p->at+p->st; 261 p=H->next; 262 q=p->next; 263 while(p) 264 { 265 weight1=( time - p->at + p->st ) / (float)p->st ; 266 while(q) 267 { 268 weight2=( time - q->at + q->st ) / (float)q->st ; 269 if(weight2>weight1) 270 { 271 t->id=q->id; 272 t->at=q->at; 273 t->st=q->st; 274 q->id=p->id; 275 q->at=p->at; 276 q->st=p->st; 277 p->id=t->id; 278 p->at=t->at; 279 p->st=t->st; 280 } 281 q=q->next; 282 } 283 time=time+p->st; 284 p=p->next; 285 if(p!=NULL) 286 q=p->next; 287 } 288 return H; 289 } 290 //================================================================ 291 292 int _tmain(int argc, _TCHAR* argv[]) 293 { 294 //link H; 295 //H=Creat(); 296 297 //H=fcfs(H); 298 //H=jisuan(H); 299 //printf("\n\n先到先服务进程调度如下:\n\n"); 300 //Print(H); 301 //system("pause"); 302 303 //H=section(H); 304 //H=jisuan(H); 305 //printf("\n\n短作业优先进程调度如下:\n\n"); 306 //Print(H); 307 //system("pause"); 308 309 CProcessControl clsPcl; 310 clsPcl.Create(); 311 clsPcl.fcfs(); 312 clsPcl.jisuan(); printf("\n\n先到先服务进程调度如下:\n\n"); 313 clsPcl.Print(); 314 315 system("pause"); 316 317 clsPcl.section(); 318 clsPcl.jisuan(); 319 printf("\n\n短作业优先进程调度如下:\n\n"); 320 clsPcl.Print(); 321 system("pause"); 322 323 324 return 0; 325 }
要是解决问题了再送10QB。
1 // stdafx.h : 标准系统包含文件的包含文件, 2 // 或是经常使用但不常更改的 3 // 特定于项目的包含文件 4 // 5 6 #pragma once 7 8 9 #define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料 10 #include <stdio.h> 11 #include <tchar.h> 12 13 14 15 // TODO: 在此处引用程序需要的其他头文件
1 // stdafx.cpp : 只包括标准包含文件的源文件 2 // testtest.pch 将作为预编译头 3 // stdafx.obj 将包含预编译类型信息 4 5 #include "stdafx.h" 6 7 // TODO: 在 STDAFX.H 中 8 // 引用任何所需的附加头文件,而不是在此文件中引用
1 #pragma once 2 #include <list> 3 4 using namespace std; 5 typedef struct _tag_stProcess 6 { 7 int id; //进程号 8 int at; //到达时间 9 int st; //服务时间 10 int ft; //完成时间 11 int zt; //周转时间 12 float dt; //带权周转时间 13 }*ProcessNode,Node; 14 15 class CProcessControl 16 { 17 public: 18 list<ProcessNode> m_Link; 19 20 public: 21 CProcessControl(void); 22 23 ~CProcessControl(void); 24 25 void Create(); 26 void jisuan(); 27 void Print(); 28 void fcfs(); 29 void sjf(list<ProcessNode>::iterator,list<ProcessNode>::iterator); 30 void section(); 31 void fpf(); 32 33 };
1 #include "StdAfx.h" 2 #include "ProcessControl.h" 3 #include <iterator> 4 #include <map> 5 #include <iostream> 6 using namespace std; 7 8 CProcessControl::CProcessControl(void) 9 { 10 } 11 12 CProcessControl::~CProcessControl(void) 13 { 14 } 15 16 void CProcessControl::Create() 17 { 18 printf("-------请输入依次进程号、到达时间、服务时间(id=-1退出)-------\n"); 19 printf("进程号 到达时间 服务时间\n"); 20 //scanf("%d",&id); 21 //scanf("%d",&at); 22 //scanf("%d",&st); 23 while (true) 24 { 25 ProcessNode pProNode = new Node(); 26 cin>> pProNode->id >> pProNode->at >> pProNode->st; 27 if (pProNode->id == -1) 28 break; 29 else 30 { 31 m_Link.push_back(pProNode); 32 } 33 } 34 35 } 36 37 void CProcessControl::jisuan() 38 { 39 list<ProcessNode>::iterator it; 40 int time = 0; 41 for (it = m_Link.begin(); it != m_Link.end(); ++it) 42 { 43 if ((*it)->at < time ) 44 { 45 (*it)->ft=time+(*it)->st; 46 } 47 else 48 { 49 (*it)->ft = (*it)->at + (*it)->st; 50 } 51 time = (*it)->ft; 52 53 (*it)->zt = (*it)->ft - (*it)->at; 54 if ((*it)->st != 0) 55 { 56 (*it)->dt = (float)(*it)->zt / (*it)->st; 57 } 58 } 59 60 } 61 62 void CProcessControl::Print() 63 { 64 if (m_Link.empty()) 65 printf("\n进程队列为空!!!\n"); 66 else 67 { 68 printf("\n 进程号 到达时间 服务时间 完成时间 周转时间 带权周转时间\n"); 69 for (list<ProcessNode>::iterator it = m_Link.begin(); it != m_Link.end(); ++it) 70 { 71 printf(" %-8d %-8d %-8d %-8d %-8d %-8.2f\n",(*it)->id ,(*it)->at ,(*it)->st,(*it)->ft,(*it)->zt,(*it)->dt ); 72 } 73 printf("\n\n"); 74 } 75 } 76 77 void CProcessControl::fcfs() 78 { 79 if (m_Link.empty()) 80 { 81 return; 82 } 83 size_t nlist_count = m_Link.size(); 84 multimap<int,ProcessNode> _map_node; 85 for (list<ProcessNode>::iterator it = m_Link.begin(); it != m_Link.end(); ++it) 86 { 87 _map_node.insert(pair<int,ProcessNode>((*it)->at,*it)); 88 } 89 90 m_Link.clear(); 91 multimap<int, ProcessNode>::iterator iter; 92 for(iter = _map_node.begin(); iter != _map_node.end(); iter++) 93 { 94 m_Link.push_back(iter->second); 95 96 } 97 } 98 99 void CProcessControl::sjf(list<ProcessNode>::iterator it_para=NULL,list<ProcessNode>::iterator it_para2=NULL) 100 { 101 if (it_para == NULL) 102 { 103 it_para = m_Link.begin(); 104 it_para2 = m_Link.end(); 105 } 106 if (m_Link.empty()) 107 { 108 return; 109 } 110 list<ProcessNode>::iterator it_2 = m_Link.begin(); 111 if (++it_2 == m_Link.end()) 112 return; 113 map<int,ProcessNode> t_map; 114 map<int,ProcessNode>::iterator it_map; 115 list<ProcessNode>::iterator it; 116 for (it = m_Link.begin(); it != m_Link.end(); ++it) 117 { 118 if ((*it)->st < (*it_2)->st) 119 { 120 ProcessNode tmp = (*it); 121 (*it) = (*it_2); 122 (*it_2) = tmp; 123 } 124 125 } 126 for (it = it_2; it != m_Link.end(); ++it) 127 { 128 t_map.insert(pair<int,ProcessNode>((*it)->st,(*it))); 129 } 130 for (it = it_2,it_map = t_map.begin(); it != m_Link.end(),it_map != t_map.end(); ++it,++it_map) 131 { 132 (*it) = it_map->second; 133 } 134 } 135 136 void CProcessControl::section() 137 { 138 if (m_Link.empty()) 139 { 140 return; 141 } 142 fcfs(); 143 list<ProcessNode> tmp = m_Link; 144 list<ProcessNode>::iterator it, it1; 145 it = tmp.begin(); 146 int time = (*it)->at + (*it)->st; 147 148 it++; 149 150 for (it1 = it ; it!= tmp.end(); ++it) 151 { 152 if ((*it)->at <= time) 153 { 154 time += (*it)->at; 155 } 156 else 157 { 158 m_Link.clear(); 159 for (list<ProcessNode>::iterator i_m_link = it1; i_m_link != it; i_m_link++) 160 { 161 m_Link.push_back(*i_m_link); 162 } 163 sjf(); 164 list<ProcessNode>::iterator i_m_link = it1, m_l; 165 for (i_m_link = it1, m_l = m_Link.begin(); i_m_link != it , m_l != m_Link.end(); i_m_link++,m_l++) 166 { 167 //m_Link.push_back(*i_m_link); 168 (*i_m_link) = (*m_l); 169 } 170 time = (*it)->at + (*it)->st; 171 it1 = it; 172 } 173 } 174 175 sjf(); 176 }
建议详细说一下程序要实现的功能
谢谢
谢谢,完成了
感觉描述的东西很像是要实现一个优先队列,建议找本数据结构研究一下。
谢谢,完成了