2020/11/10 问题很大的银行家算法!!!

希望有大佬能指正我到底哪里有问题!! 我真是给折磨坏了,直接上代码了

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define processnum 5//进程数 
#define resourcenum 3 //资源数 

int Available[resourcenum]={3,3,2};
int Max[processnum][resourcenum]={7,5,3,
                                  3,2,2,
                                  9,0,2,
                                  2,2,2,
                                  4,3,3};
int Allocation[processnum][resourcenum]={0,1,0,
                                         2,0,0,
                                         3,0,2,
                                         2,1,1,
                                         0,0,2};
int Need[processnum][resourcenum]={7,4,3,
                                   1,2,2,
                                   6,0,0,
                                   0,1,1,
                                   4,3,1};
bool Finish[processnum];

int request[resourcenum]={0,0,0};

int WORK[resourcenum];
int temp[processnum];

void init()
{
    cout<<"请输入进程数和当前可用资源数目" ;
    
    cout<<"请输入当前可用资源";
    for(int i=0;i<resourcenum;i++)
    {
        cin>>Available[i];
    }
    
     
    
    cout<<"请输入Max矩阵";
    for(int i=0;i<processnum;i++)
    {
        for(int j=0;j<resourcenum;j++)
        {
            cin>>Max[i][j];
        }
    }
    
    cout<<"请输入Allocation矩阵";
        for(int i=0;i<processnum;i++)
    {
        for(int j=0;j<resourcenum;j++)
        {
            cin>>Allocation[i][j];
        }
    }
    
    cout<<"请输入Need矩阵" ;
        for(int i=0;i<processnum;i++)
    {
        for(int j=0;j<resourcenum;j++)
        {
            cin>>Need[i][j];
        }
    }

}


void show()
{
    cout<<"当前资源剩余";
    for(int i=0;i<resourcenum;i++)
    {
        cout<<Available[i]<<" ";
    }
    
    cout<<endl;
    cout<<"ID"<<"       "<< "Max"<<"          "<<"Allocation"<<"         "<<"Need"<<"         "<<endl;
    for(int i = 0; i < processnum; i++){
        printf(" P%d\t",i);
        for(int j = 0; j < resourcenum; j++){
           cout<<Max[i][j]<<" ";
        }
        printf("\t\t");
        for(int j = 0; j < resourcenum; j++){
            cout<<Allocation[i][j]<<" ";
        }
        printf("\t\t");
        for(int j = 0; j < resourcenum; j++){
            cout<<Need[i][j]<<" ";
        }
        cout<<endl;
    }
    
}


int safe()//在假定分配资源的情况下检查系统的安全性
    {
    //temp[]用来记录进程安全执行的顺序
    int i,j,m,k=0,count;
    
    for(i=0;i<processnum;i++)
    {
    Finish[i]=false;
    }  
    
    for(j=0;j<resourcenum;j++)
    {
    WORK[j]=Available[j];//把可利用资源数赋给WORK[]
    }
    
    for(i=0;i<processnum;i++)
    {
        
    count=0;
    for(j=0;j<resourcenum;j++)
    {
    
    if(Finish[i]==false&&Need[i][j]<=WORK[j])
    count++;
    }
    
    if(count==resourcenum)//当进程各类资源都满足NEED<=WORK时
    {
        
    for(m=0;m<resourcenum;m++)
    WORK[m]=WORK[m]+Allocation[i][m];
    Finish[i]=true;
    temp[k]=i;//记录下满足条件的进程
    k++;
    if(i==4)
    {
        i=-1;
    }
    
    }
    
    }
    for(i=0;i<processnum;i++)
    {
    
    if(Finish[i]==false)
    {
    printf("系统不安全!!!本次资源申请不成功!!!\n");
    return 1;
    }
    }  
    printf("\n");
    printf("经安全性检查,系统安全,本次分配成功。\n");
    printf("\n");
    printf("本次安全序列:");
    for(i=0;i<processnum;i++)//打印安全系统的进程调用顺序
    {
    printf("进程");
    printf("%d",temp[i]);
    if(i<processnum-1)
    printf("->");
    }
    printf("\n");
    return 0;
}

int safefrist()   //这个东西我是为了满足的老师要求加的,感觉应是很多余的东西
{
        //temp[]用来记录进程安全执行的顺序
    int i,j,m,k=0,count;
    
    for(i=0;i<processnum;i++)
    {
    Finish[i]=false;
    }  
    
    for(j=0;j<resourcenum;j++)
    {
    WORK[j]=Available[j];//把可利用资源数赋给WORK[]
    }
    
    for(i=0;i<processnum;i++)
    {
        
    count=0;
    for(j=0;j<resourcenum;j++)
    {
    
    if(Finish[i]==false&&Need[i][j]<=WORK[j])
    count++;
    }
    
    if(count==resourcenum)//当进程各类资源都满足NEED<=WORK时
    {
        
    for(m=0;m<resourcenum;m++)
    WORK[m]=WORK[m]+Allocation[i][m];
    Finish[i]=true;
    temp[k]=i;//记录下满足条件的进程
    k++;
    if(i==4)
    {
    for(i=4;i>=0;i--)
    {
        
    count=0;
    for(j=0;j<resourcenum;j++)
    {
    
    if(Finish[i]==false&&Need[i][j]<=WORK[j])
    count++;
    }
    
    if(count==resourcenum)//当进程各类资源都满足NEED<=WORK时
    {
        
    for(m=0;m<resourcenum;m++)
    WORK[m]=WORK[m]+Allocation[i][m];
    Finish[i]=true;
    temp[k]=i;//记录下满足条件的进程
    k++;
    
    }
    }
    }
    
    }
    
    }
    for(i=0;i<processnum;i++)
    {
    
    if(Finish[i]==false)
    {
    printf("系统不安全!!!本次资源申请不成功!!!\n");
    return 1;
    }
    }  
    printf("\n");
    printf("经安全性检查,系统安全,本次分配成功。\n");
    printf("\n");
    printf("本次安全序列:");
    for(i=0;i<processnum;i++)//打印安全系统的进程调用顺序
    {
    printf("进程");
    printf("%d",temp[i]);
    if(i<processnum-1)
    printf("->");
    }
    printf("\n");
    return 0;
}

void  blank(int k)
{
    int s=k;
    cout<<"请输入申请资源";
    for(int i=0;i<resourcenum;i++)  //输入申请资源 
    {
            cin>>request[i];
    }
    int count=0;
    int count1=0;
    for(int i=0;i<resourcenum;i++)  //判断need 
    {
        if(request[i]<=Need[s][i])
        {
            count++;
        }
    
    }
    
    for(int i=0;i<resourcenum;i++)  //判断Available 
    {
        if(request[i]<=Available[i])
        {
            count1++;
        }
    }

    
    
    if(count==resourcenum&&count1==resourcenum)  //如果满足条件,开始分配资源 
    {
    
    
    for(int i=0;i<resourcenum;i++)
    {
        Available[i]-=request[i];
        
    }
    
    for(int i=0;i<resourcenum;i++)
    {
        Allocation[s][i]+=request[i];
        
    }
    
        for(int i=0;i<resourcenum;i++)
    {
        Need[s][i]-=request[i];
        
    }
    
    
    }
    

}


int main(){
    int s;
    int k;
    
    show();
    safefrist();
    show();
    cout<<"请输入你要请求的进程";
    cin>>k;
    blank(k);
    s=safe(); 
    if(s==0)
    {
        show();
    }else{
    for(int i=0;i<resourcenum;i++)
    {
        Available[i]+=request[i];
        
    }
    
    for(int i=0;i<resourcenum;i++)
    {
        Allocation[s][i]-=request[i];
        
    }
    
        for(int i=0;i<resourcenum;i++)
    {
        Need[s][i]+=request[i];
        
    }
        
    }
    
    return 0;
}

 

 

总之就是折磨,希望有大佬能指点我下!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值