银行家算法

#include <iostream>
using namespace std;

// 全局变量定义
int Available[100]; // 可利用资源数组
int Max[50][100];   // 最大需求矩阵
int Allocation[50][100];  // 分配矩阵
int Need[50][100];        // 需求矩阵
int Request[50][100];     // M个进程还需要N类资源的资源量
int Finish[50];
int p[50];
int m, n;   // M个进程,N类资源

// 安全性算法
bool Safe() {
    int i, j, l = 0;
    int Work[100]; // 可利用资源数组
    for (i = 0; i < n; i++)
        Work[i] = Available[i];
    for (i = 0; i < m; i++)
        Finish[i] = 0;
    for (i = 0; i < m; i++) {
        if (Finish[i] == 1)
            continue;
        else {
            for (j = 0; j < n; j++) {
                if (Need[i][j] > Work[j])
                    break;
            }
            if (j == n) {
                Finish[i] = 1;
                for (int k = 0; k < n; k++)
                    Work[k] += Allocation[i][k];
                p[l++] = i;
                i = -1;
            }
            else continue;
        }
        if (l == m) {
            cout << "系统是安全的" << '\n';
            cout << "系统安全序列是:\n";
            for (i = 0; i < l; i++) {
                cout << p[i];
                if (i != l - 1)
                    cout << "-->";
            }
            cout << '\n';
            return true; // 返回true表示系统安全
        }
    }
    return false; // 返回false表示系统不安全
}


// 银行家算法
int main() {
    int i, j, mi;
    char useSampleData;

    cout << "是否使用示例数据?(Y/N): ";
    cin >> useSampleData;

    if (useSampleData == 'Y' || useSampleData == 'y') {
        // 使用示例数据
        m = 5;
        n = 3;

        int sampleAvailable[] = {2,3,0};
        int sampleMax[][5] = {
              {7,5,3},
              {3,2,2},
              {9,0,2},
              {2,2,2},
              {4,3,3}
        };

        int sampleAllocation[][5] = {
              {0,2,0},
              {3,0,2},
              {3,0,2},
              {2,1,1},
              {0,0,2}
        };

        for (i = 0; i < n; i++) {
            Available[i] = sampleAvailable[i];
            for (j = 0; j < m; j++) {
                Max[j][i] = sampleMax[j][i];
                Allocation[j][i] = sampleAllocation[j][i];
                Need[j][i] = Max[j][i] - Allocation[j][i];
            }
        }

        cout << "已加载示例数据:" << endl;
    }
    else {
        // 手动输入数据的逻辑...
        cout << "输入进程的数目: ";
        cin >> m;
        cout << "输入资源的种类: ";
        cin >> n;

        cout << "输入每个进程最多所需的各类资源数,按照" << m << "x" << n << "矩阵输入" << endl;
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                cin >> Max[i][j];
            }
        }

        cout << "输入每个进程已经分配的各类资源数,按照" << m << "x" << n << "矩阵输入" << endl;
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                cin >> Allocation[i][j];
                Need[i][j] = Max[i][j] - Allocation[i][j];
                if (Need[i][j] < 0) {
                    cout << "你输入的第" << i + 1 << "个进程所拥有的第" << j + 1 << "个资源错误,请重新输入:" << endl;
                    j--;
                    continue;
                }
            }
        }

        cout << "请输入各个资源现有的数目: ";
        for (i = 0; i < n; i++) {
            cin >> Available[i];
        }
    }

    Safe();
    while (1) {
        cout << "输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)" << endl;
        cin >> mi;
        cout << "输入进程所请求的各个资源的数量" << endl;
        for (i = 0; i < n; i++) {
            cin >> Request[mi][i];
        }
        for (i = 0; i < n; i++) {
            if (Request[mi][i] > Need[mi][i]) {
                cout << "所请求资源数超过进程的需求量!" << endl;
                return 0;
            }
            if (Request[mi][i] > Available[i]) {
                cout << "所请求资源数超过系统所有的资源数!" << endl;
                return 0;
            }
        }
        for (i = 0; i < n; i++) {
            Available[i] -= Request[mi][i];
            Allocation[mi][i] += Request[mi][i];
            Need[mi][i] -= Request[mi][i];
        }
        if (Safe()) {
            cout << "同意分配请求" << endl;
        }
        else {
            cout << "你的请求被拒" << endl;
            for (i = 0; i < n; i++) {
                Available[i] += Request[mi][i];
                Allocation[mi][i] -= Request[mi][i];
                Need[mi][i] += Request[mi][i];
            }
        }
        for (i = 0; i < m; i++) {
            Finish[i] = 0;
        }
        char Flag;       //标志位
        cout << "是否再次请求分配?是请按Y/y,否请按N/n" << endl;
        while (1) {
            cin >> Flag;
            if (Flag == 'Y' || Flag == 'y' || Flag == 'N' || Flag == 'n') {
                break;
            }
            else {
                cout << "请按要求重新输入:" << endl;
                continue;
            }
        }
        if (Flag == 'Y' || Flag == 'y') {
            continue;
        }
        else {
            break;
        }
    }
}

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值