设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1948|回复: 1
打印 上一主题 下一主题

还是银行家~!

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-5 01:00:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上次写的哪个银行家算法,给老师看了以后,他说不行,不符合他的要求,于是问清楚以后,又写了一个~!
大家看看,功能有增强~!其实写完以后体会最深的不再是银行家算法的实现了,而是指针的用法了,感受颇深!
#include <iostream>
using namespace std;
int P_num;                   //进程总数
int Soure_num;               //资源类数
int **P_soure;               //进程已分配的资源数量
int **P_max;                 //系统的最大需求资源数量                  
int **P_need;                //进程需要的资源数量
int *Sys_resoure;                //系统拥有资源数量
int *P_application;            //某个进程申请的资源数量
int P_app_num;                   // 第几个进程申请资源
int *Finish;                     //已经完成序列
int *Working;                    //进程工作序列

void P_input();                  //初始化函数
bool comp();                     //测试函数
bool safe_check();                //安全检测
void assign();                   //资源分配函数
bool p_comp(int i);               //判断系统资源是否不足 s
void recover(int i);              //回收函数


int main()
{
  P_input();
  if(comp())
   {
    assign();
    if(safe_check())
    {
      for(int i=0;i<P_num;i++)
       cout<<"P"<<Working[i]<<",";
    }
    else
    cout<<'\a'<<"产生死琐!!";
   }
  system("pause");  
  return 0;
}


void P_input()                                        //初始化大小
{
   cout<<"请输入有多少个进程:";
   cin>>P_num;                                        //初始化进程数
   cout<<"系统有多少类资源:";
   cin>>Soure_num;                                    //初始化资源种类
   Sys_resoure=new int [Soure_num];
   cout<<"系统拥有的每类资源的数量:";
   for(int i=0;i<Soure_num;i++)
    cin>>Sys_resoure[i];
   system("cls");
   //初始化完成序列
   Finish=new int [P_num];
   for(int i=0;i<P_num;i++)
    Finish[i]=0;
   //初始化工作序列
   Working=new int [P_num];
   for(int i=0;i<P_num;i++)
    Working[i]=0;
   
   //初始化进程需要的最大资源数量 )
   P_max=new int * [P_num];
   for(int i=0;i<P_num;i++)                           //初始化大小
    P_max[i]=new int [Soure_num];
  
   for(int i=0;i<P_num;i++)         
    {
      cout<<"*********进程需要的最大资源数量*************"<<endl;
      for(int j=0;j<Soure_num;j++)
      {
        cout<<"请输入 "<<i+1<<"号进程需要的第 "<<j+1<<" 类资源的最大数量:";
        cin>>P_max[i][j];
      }
      system("cls");
    }
  
    //初始化进程已分配的资源数量
    P_soure=new int * [P_num];
    for(int i=0;i<P_num;i++)                           //初始化大小
    P_soure[i]=new int [Soure_num];
    for(int i=0;i<P_num;i++)        
    {
      cout<<"*********进程已分配的资源数量*************"<<endl;
      for(int j=0;j<Soure_num;j++)
      {
        cout<<"请输入 "<<i+1<<"号进程已分配的第 "<<j+1<<" 类资源数量:";
        cin>>P_soure[i][j];
      }
      system("cls");
    }
   
    //初始化进程的需求资源
    P_need= new int * [P_num];
    for(int i=0;i<P_num;i++)                           //初始化大小
    P_need[i]=new int [Soure_num];
    for(int i=0;i<P_num;i++)        
      for(int j=0;j<Soure_num;j++)
        P_need[i][j]=P_max[i][j]-P_soure[i][j];
        
        for(int i=0;i<P_num;i++)
        {cout<<"第"<<i<<"个进程的需求是:";
         for(int j=0;j<Soure_num;j++)
          cout<<P_need[i][j]<<",";
          cout<<endl;
        }
        
    //初始化第几个进程申请寺院
    cout<<"输入需要申请资源的编号:";
    cin>>P_app_num;
    P_app_num-=1;
   
    //初始化进程申请的资源数量
    P_application= new int [Soure_num];
    for(int i=0;i<Soure_num;i++)
    {
      cout<<"申请的第 "<<i+1<<" 类资源的数量为:";
      cin>>P_application[i];
    }
}


bool comp()                                      //比较进程申请的资源是否大于系统资源和该进程所需求的资源
{
  for(int i=0;i<Soure_num;i++)
   {
     if(P_application[i]>Sys_resoure[i]||P_application[i]>P_need[P_app_num][i])
     {
       cout<<"系统资源不足!!";
       return 0;
     }
       return 1;
   }
}

void assign()                                 //分配函数
{
   for(int i=0;i<Soure_num;i++)
   {
    P_need[P_app_num][i]-=P_application[i];
    Sys_resoure[i]-=P_application[i];
    P_soure[P_app_num][i]+=P_application[i];
   }
}


bool p_comp(int i)                          //判断系统资源是否不足
{
   for(int j=0;j<Soure_num;j++)
    {
       if(P_need[i][j]>Sys_resoure[j])
       return 0;
    }
    return 1;
}


bool safe_check()                     //安全检测
{
int i;
int n=0;
while(1)
{
   for(i=0;i<P_num;i++)
    {
       if(p_comp(i)&&Finish[i]==0)
       break;
    }
   if(i<P_num)                                  //第i个进程可以执行
   {
      recover(i);
      Finish[i]=1;
      Working[n]=i+1;
      n++;
   }
   if(i>=P_num)                                 
   {
      for(int j=0;j<P_num;j++)
       {
        if(Finish[j]!=1)
        return 0;
       }
       return 1;
   }
}
}

void recover(int i)                             //回收函数
{
  for(int j=0;j<Soure_num;j++)
    Sys_resoure[j]+=P_soure[i][j];
}
2#
发表于 2009-11-5 01:00:13 | 只看该作者
顶顶顶顶顶顶顶顶顶顶
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-19 15:32 , Processed in 0.069644 second(s), 8 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表