| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3980 人关注过本帖
标题:终于实现了银行家算法~!
只看楼主 加入收藏
lionmusicyj
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2008-9-20
结帖率:100%
收藏
 问题点数:0 回复次数:19 
终于实现了银行家算法~!
想看一下自己对c++理解的怎么样,所以就想写一个银行家的算法,呵呵~!用了四个晚上终于实现了!各位看看哈~!帮小弟看看还有那些地方需要修改的,另外我写的这个只能输出一中序列,而是实际情况中可以有不同的组合序列,这个算法一直不知道该如何实现~!希望有高手能指点一下哈~!

#include <iostream>
using namespace std;
bool test_Request(int *,int *);                         //测试函数
void assign();                                          //分配函数
bool  safe_check();                                 //安全检测函数
void recover(int);                                                 //回收函数
bool check_finish();                                               //检测finish函数
int P_finish[5]={0,0,0,0,0};                                       //已完成的进程序列
int P_work[5];                                                     //进程工作序列
int P_max[][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};          //进程最大需求
int P_Alloctioan[][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};   //进程已得到的
int P_need[][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};         //进程还需分配的
int Sys_resource[3]={3,3,2};                                       //系统拥有的资源
int n;                                                             //告诉系统第几个进程需要申请
int Request[3];                                                    //告诉系统申请每类资源的数量
int main()
{
   cout<<"请输入要申请资源的进程(1-5): ";
   cin>>n;
   while(n<0||n>5)                                                 //输入正确的进程序号
    {
      cout<<"输入错误,请重新输入进程序号:";
       cin>>n;   
    }
    n=n-1;
   cout<<"输入该进程所要申请的各资源数(A B C): "<<endl;
   for(int j=0;j<3;j++)                                            //输入申请资源的数量
     cin>>Request[j];
   if(test_Request(Request,Sys_resource))
    {
     assign();
     if(safe_check())
      {cout<<"不会产生死锁,安全进程队列为:"<<endl;
       for(int a=0;a<5;a++)
       cout<<"P"<<P_work[a]<<'\t';
      }
     else
     cout<<'\a'<<"产生死锁!!";
    }
   else cout<<"系统资源不足!";
    system("pause");
}

bool test_Request(int *p,int *q)
{
   for(int m=0;m<3;m++)
    {
      if(*(p+m)>*(q+m))
       return 0;
      if(*(p+m)<=*(q+m)&&m==2)
       return 1;
    }
}
void assign()
{
  for(int m=0;m<3;m++)
     {
      P_need[n][m]-=Request[m];
      Sys_resource[m]-=Request[m];
      P_Alloctioan[n][m]+=Request[m];;
     }
}

bool  safe_check()
{
   int i,j=0;
   while(1)
   {
      for(i=0;i<5;i++)
       if(test_Request(P_need[i],Sys_resource)&&P_finish[i]==0)
        break;
       if(i<5)
         {
            recover(i);
            P_finish[i]=1;
            P_work[j]=i+1;
            j++;
         }
       if(i>=5)
         {
            if(check_finish())
             return true;
            else
             return false;
         }
   }
}

void recover(int i)
{
  for(int m=0;m<3;m++)
    Sys_resource[m]+=P_Alloctioan[i][m];
}

bool check_finish()
{
   for(int i=0;i<5;i++)
     {
        if(P_finish[i]==0)
         return false;
        else
         if(P_finish[i]!=0&&i==4)
          return true;
     }
}
搜索更多相关主题的帖子: 银行家 算法 
2008-10-23 00:15
lionmusicyj
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2008-9-20
收藏
得分:0 
咋没人回呢??
貌似看的人还不少哦`!
呵呵`!
2008-10-23 14:16
lmyouya
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2008-10-17
收藏
得分:0 
我看了,便回贴,银行家算法,恩,又懂,又不懂!

呼呼

吖吖走了
2008-10-23 14:23
taokingcool
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-11-12
收藏
得分:0 
不错,很好
2008-10-23 16:54
huxiangking
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2008-10-23
收藏
得分:0 
算法模棱看懂 就不知干啥哩
又不学经济学 嘿~
2008-10-23 19:47
任我行328
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-10-23
收藏
得分:0 
楼住不错 啊,
2008-10-23 20:36
p1s
Rank: 4
等 级:贵宾
威 望:10
帖 子:454
专家分:3
注 册:2005-11-4
收藏
得分:0 
当年操作系统课里面的算法。
给LZ个提示,如果要尝试输出所有结果的话,可以考虑用递归。
2008-10-23 21:26
lionmusicyj
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2008-9-20
收藏
得分:0 
呵呵~!
我现在在学校上的还是那本书呢~!
LS的大哥说用递归可以解决??能具体一点不??
小弟学艺不精~!
2008-10-23 23:15
blueboy82006
Rank: 5Rank: 5
来 自:幻想世界
等 级:贵宾
威 望:16
帖 子:1227
专家分:57
注 册:2007-7-23
收藏
得分:0 
我好像很久之前就见你在写吧...

2008-10-23 23:18
lionmusicyj
Rank: 1
等 级:新手上路
帖 子:98
专家分:0
注 册:2008-9-20
收藏
得分:0 
呵呵`!
对啊~!
六天前发的帖子,你给了我一个实现的代码。。。
第一天去打印,第二天休息一下下,第三天一晚上研究你的代码(其实我觉得最重要的就是finish[]和work[]这两个队列比较难想到,嘿嘿!~!),第四天到发这个帖子,在写自己的~!呵呵!
收到的鲜花
  • blueboy820062008-10-24 21:20 送鲜花  10朵   附言:有前途,好好干!
2008-10-24 02:18
快速回复:终于实现了银行家算法~!
数据加载中...
 
   



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

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