| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 438 人关注过本帖
标题:还是银行家~!
只看楼主 加入收藏
lionmusicyj
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2008-9-20
结帖率:100%
收藏
 问题点数:0 回复次数:1 
还是银行家~!
上次写的哪个银行家算法,给老师看了以后,他说不行,不符合他的要求,于是问清楚以后,又写了一个~!
大家看看,功能有增强~!其实写完以后体会最深的不再是银行家算法的实现了,而是指针的用法了,感受颇深!
#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];
}
搜索更多相关主题的帖子: 银行家 
2008-11-11 01:32
zhuimengR
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2008-11-6
收藏
得分:0 
顶顶顶顶顶顶顶顶顶顶
2008-11-12 13:42
快速回复:还是银行家~!
数据加载中...
 
   



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

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