首页 新闻 赞助 找找看

C/C++数据结构的问题的小程序(全分求解+10Q币)

0
悬赏园豆:200 [已解决问题] 解决于 2012-05-03 12:46

先来先服务和短作业优先 一个程序要有这两个功能

以下的代码,老师说不好,要重写,那位大牛给大面积修改一下或者在写个简单的。

我的邮箱是: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。

张龙China的主页 张龙China | 初学一级 | 园豆:22
提问于:2012-04-27 23:09
< >
分享
最佳答案
0
stdafx.h
 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: 在此处引用程序需要的其他头文件
// stdafx.cpp : 只包括标准包含文件的源文件
1 // stdafx.cpp : 只包括标准包含文件的源文件
2 // testtest.pch 将作为预编译头
3 // stdafx.obj 将包含预编译类型信息
4 
5 #include "stdafx.h"
6 
7 // TODO: 在 STDAFX.H 中
8 // 引用任何所需的附加头文件,而不是在此文件中引用
ProcessControl.h
 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 };
ProcessControl.cpp
  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 }


 

收获园豆:200
Halower | 小虾三级 |园豆:1723 | 2012-05-03 06:29
其他回答(2)
0

建议详细说一下程序要实现的功能

artwl | 园豆:16736 (专家六级) | 2012-04-28 09:16

谢谢

支持(0) 反对(0) 张龙China | 园豆:22 (初学一级) | 2012-05-03 12:46

谢谢,完成了

支持(0) 反对(0) 张龙China | 园豆:22 (初学一级) | 2012-05-03 12:46
0

感觉描述的东西很像是要实现一个优先队列,建议找本数据结构研究一下。

sinhbv | 园豆:2579 (老鸟四级) | 2012-04-28 13:54

谢谢,完成了

支持(0) 反对(0) 张龙China | 园豆:22 (初学一级) | 2012-05-03 12:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册