| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 401 人关注过本帖
标题:在写时间片轮转算法时出错,求解答
只看楼主 加入收藏
讨厌数构
Rank: 1
等 级:新手上路
帖 子:32
专家分:4
注 册:2013-10-21
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:3 
在写时间片轮转算法时出错,求解答
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
//==========================
struct PCB
{
    string name;
    int ArrivalTime;
    int ServiceTime;
    int FinishTime;
    int WholeTime;
    int needTime;
    double WeightWholeTime;
    double AverageWT,AverageWWT;
    //bool Finished;
};

struct Queue
{
    int size;   //数组的大小
    int head, tail;  //队列的头和尾下标
    PCB *item;          //数组头指针
};
//Queue 类型别名
void input(PCB *&p,int &n)
{
    cout<<"请输入各个进程的名字,到达时间和服务时间"<<endl;
    for(int i=0;i<n;i++)
    {
        cin>>p[i].name>>p[i].ArrivalTime>>p[i].ServiceTime;
        p[i].needTime=p[i].ServiceTime;
    }
}
//循环队列的操作
void InitQueue(Queue *&q,int &n)
{
     q->size =n ;
     q->item = new PCB[n]; //分配内存
     //unhandled exception in 1.exe:0xC0000005:Access Violation
     q->tail = 0;
     q->head = 0;
}
//==============================================
void EnQueue(Queue *&q, const PCB &key)//入队
{
     int tail = (q->tail+1) % q->size; //取余保证,当quil=queuesize-1时,再转回0
     if (tail == q->head)                   //此时队列没有空间
     {
         cout<<"the queue has been filled full!"<<endl;
     }
     else
     {
         q->item[tail] = key;
         q->tail = tail;
     }
}
//====================================================
PCB DeQueue(Queue *&q) //出队
{
     PCB tmp;
     if(q->tail == q->head)     //判断队列不为空
     {
         cout<<"the queue is NULL"<<endl;
     }
     else
     {
         tmp = q->item[q->head];
         q->head = (q->head+1) % q->size;
     }
     return tmp;
}
//====================================
bool IsQueueEmpty(Queue *q)
{
    if(q->head == q->tail)
    {
        return true;
    }
    else
    {
        return false;
    }
}
//===================================
bool IsQueueFull(Queue *q)
{
    if((q->tail+1)% q->size == q->head)
    {
        return true;
    }
    else
    {
        return false;
    }
}//==================================
void insert_sort(PCB *&p,int n)
{
    int i,j;
    PCB temp;
    for(i=1;i<n;i++)
    {
        
        temp=p[i];//赋值
        j=i-1;
        while(j>=0&&temp.ArrivalTime<p[j].ArrivalTime)
        {
            
            p[j+1]=p[j];
            j--;
        }
        
        p[j+1]=temp;
    }
   
    cout<<"输出排序后的各个进程的名字,到达时间和服务时间"<<endl;
    for(i=0;i<n;i++)
    {
        cout<<p[i].name<<" "<<p[i].ArrivalTime<<" "<<p[i].ServiceTime<<endl;
    }
   
}
//==============================================
void print(PCB &p)
{
    cout<<setiosflags(ios::left)<<"进程:"<<"  "<<setw(10)<<p.name<<"到达时间为:"<<"  "<<setw(10)<<p.ArrivalTime<<
        "服务时间为:"<<"  "<<setw(10)<<p.ServiceTime<<"完成时间为:"<<"  "<<setw(10)<<p.FinishTime<<
        "周转时间为:"<<"  "<<setw(10)<<p.WholeTime<<"带权周转时间为:"<<"  "<<setw(10)<<p.WeightWholeTime<<endl;
}
//==========================================
//时间片轮转算法
void RR(Queue *&q,int &PServiceTime)
{
    PCB temp;
    int time=0;
    double sumWT=0,sumWWT=0;
    while(!IsQueueEmpty(q))
    {
        temp=DeQueue(q);
        if(temp.needTime>PServiceTime)
        {
            temp.needTime=temp.needTime-PServiceTime;
            time+=PServiceTime;
            EnQueue(q,temp);//再次入队
        }
        else
        {
            temp.FinishTime=time+temp.needTime;
            temp.WholeTime=temp.FinishTime-temp.ArrivalTime;
            temp.WeightWholeTime=temp.WholeTime/temp.ServiceTime;
   
            sumWT+=temp.WholeTime;
            sumWWT+=temp.WeightWholeTime;
            time+=temp.needTime;
            print(temp);
        

        }


    }
}
//=================================
int main()
{
    int n,i,PServiceTime;
    cout<<"请输入进程的个数"<<endl;
    cin>>n;
    if(n<=0)
    {
        cout<<"进程个数不合法,请重新输入"<<endl;
        exit(1);
    }
    PCB *p=new PCB[n];//进程
    input(p,n);
    cout<<"请输入时间片的大小"<<endl;
    cin>>PServiceTime;
    insert_sort(p,n);
    Queue *q;//队列
    InitQueue(q,n);
    for(i=0;i<n;i++)
        EnQueue(q, p[i]); //入队
    RR(q,PServiceTime);   
    return 1;

}
搜索更多相关主题的帖子: include double 
2014-12-19 17:41
讨厌数构
Rank: 1
等 级:新手上路
帖 子:32
专家分:4
注 册:2013-10-21
收藏
得分:0 
都没有人吗??

一步一步好好学下去吧。加油!!!
2014-12-21 18:40
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:20 
回复 2楼 讨厌数构
输入什么你都不肯说,让别人浪费时间去瞎猜吗?
2014-12-22 09:51
讨厌数构
Rank: 1
等 级:新手上路
帖 子:32
专家分:4
注 册:2013-10-21
收藏
得分:0 
回复 3楼 rjsp
没错吧,我程序都给了。。。问题已解决

一步一步好好学下去吧。加油!!!
2014-12-22 10:12
快速回复:在写时间片轮转算法时出错,求解答
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.116407 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved