学习期间自己写的,希望能帮到大家。

//============================================================================
// Name        : BankerAlgorithm.cpp
// Author      : Aen
// Copyright   : SDJZU
// Description : Banker's Algorithm in C++
//============================================================================
#include <iostream>
using namespace std;bool SafeAlgorithm();//安全性算法
void Menu();//菜单
void InputData();//输入函数
void UpdateData();//修改数据
void ShowData();//显示信息
void ShowSafeData();//显示安全序列
void Res();//判断是否安全int Avaliable[100] = { 0 };       //拥有资源
int Max[100][100] = { 0 };        //共需要
int Allocation[100][100] = { 0 }; //已得到
int Need[100][100] = { 0 };       //还需要int Work[100]={0};               //可提供的各类资源数目
int SafeWork[100][100]={0};           //显示数组
bool Finish[100]={false};             //判断是否有足够的资源分给进程int ProcessNumber=100;                  //最大进程数 初始化
int ResourceNumber=100;                  //最大资源数 初始化char ResourceName[100]={0};       // 资源名称
int SafeSequence[100]={0};        //排序后的进程顺序/** 这个程序写的有点冗杂,安全性算法是SafeAlgorithm()这个函数,银行家算法直接写在了InputData()这个函数中*/
int main() {Menu();InputData();ShowData();Res();ShowSafeData();UpdateData();return 0;
}void InputData(){cout << "请输入可提供的资源种类数量:";cin >> ResourceNumber;for(int i=0;i<ResourceNumber;i++){cout << "第" << i+1 << "个资源名字:" ;cin >> ResourceName[i];cout << "资源数量:" ;cin >>Avaliable[i];}cout << "请输入进程的数量:";cin >> ProcessNumber;cout << "请输入每个进程的Max值:" <<endl;for(int i=0;i<ProcessNumber;i++){for(int j=0;j<ResourceNumber;j++){cin >> Max[i][j];}}cout << "请输入每个进程的Allocation值:" << endl;StartAllocation:while(1){for(int i=0;i<ProcessNumber;i++){for(int j=0;j<ResourceNumber;j++){cin >> Allocation[i][j];if(Allocation[i][j]>Max[i][j]){cout << "申请的资源大于最大值,请重新输入!\n";//假如矩阵输入输入错误会输出多个goto StartAllocation;}Need[i][j] = Max[i][j] - Allocation[i][j];Avaliable[j] = Avaliable[j] - Allocation[i][j];}}break;}//给 Work[] 赋值for(int i=0;i<ResourceNumber;i++){Work[i] = Avaliable[i];}
}
void UpdateData(){char YN;int num,q[100]={0},p=0;while(1){cout<<"是否修改以上的信息?(Y/N)";cin >> YN;if(YN=='Y'||YN=='y'){cout<<"请输入要修改的进程(";for(int i=0;i<ProcessNumber;i++){cout<<i<<" ";}cout<<")";cin >> num;cout<<"请输入请求的资源数:";StartUpdate:for(int i=0;i<ResourceNumber;i++){cin >> q[i];}for(int i=0;i<ResourceNumber;i++){if((q[i]<=Need[num][i])&&(q[i]<=Avaliable[i])){++p;}else{cout<<"请重新输入请求的资源数:";goto StartUpdate;}}if(p==ResourceNumber){for(int i=0;i<ResourceNumber;i++){Avaliable[i] = Avaliable[i] - q[i];Need[num][i] = Need[num][i] - q[i];Allocation[num][i] = Allocation[num][i] + q[i];}//给 Work[] 赋值for(int i=0;i<ResourceNumber;i++){Work[i] = Avaliable[i];}ShowData();Res();ShowSafeData();}}else{cout<<"程序结束!"<<endl;return;}}
}
void ShowData(){cout << " 资源情况                     Max        Allocation       Need        Available" << endl;cout << "  进程                        ";for (int i = 0; i < 3; i++){for (int j = 0; j < ResourceNumber; j++){cout << ResourceName[j] << " ";}cout << "        ";}cout<<endl;for (int i = 0; i < ProcessNumber; i++){cout << " P" << i << "        ";for (int j = 0; j < ResourceNumber; j++){cout << Max[i][j] << " ";}cout << "        ";for (int j = 0; j < ResourceNumber; j++){cout << Allocation[i][j] << " ";}cout << "        ";for (int j = 0; j < ResourceNumber; j++){cout << Need[i][j] << " ";}if(i==0){cout << "        ";for (int j = 0; j < ResourceNumber; j++){cout << Avaliable[j] << " ";}}cout << endl;}
}
void ShowSafeData(){cout << " 资源情况                     Work        Need        Allocation        Work+Allocation       Finish" << endl;cout << "  进程                        ";for (int i = 0; i < 4; i++){for (int j = 0; j < ResourceNumber; j++){cout << ResourceName[j] << " ";}cout << "        ";}cout<<endl;for (int i = 0; i < ProcessNumber; i++){cout << " P" << SafeSequence[i] << "        ";for (int j = 0; j < ResourceNumber; j++){cout << SafeWork[SafeSequence[i]][j] << " ";}cout << "        ";for (int j = 0; j < ResourceNumber; j++){cout << Need[SafeSequence[i]][j] << " ";}cout << "        ";for (int j = 0; j < ResourceNumber; j++){cout << Allocation[SafeSequence[i]][j] << " ";}cout << "        ";for (int j = 0; j < ResourceNumber; j++){cout << SafeWork[SafeSequence[i]][j]+Allocation[SafeSequence[i]][j] << " ";}cout << "          ";if(Finish[i]==true){cout << "true" << " ";}cout << endl;}
}
bool SafeAlgorithm(){//安全性算法int Y=1,X=0,count=0, s=0;for(int i=0;i<100;i++){//初始化 finish数组Finish[i]=false;}while(Y){for(int i=0;i<ProcessNumber;i++){count=0;for(int j=0;j<ResourceNumber;j++){if((Finish[i]==false)&&(Need[i][j]<=Work[j])){//安全性算法++count;}if(count==ResourceNumber){//假如一个进程对所有资源都满足for(int k=0;k<ResourceNumber;k++){SafeWork[i][k]=Work[k];Work[k] = Work[k] + Allocation[i][k];}Finish[i]=true;SafeSequence[s]=i;//存储进程安全序列++s;count=0;++X;}}}if(X==ProcessNumber){Y=0;}}for(int i=0;i<ProcessNumber;i++){if(Finish[i]==false){return false;}}return true;
}
void Res(){if(SafeAlgorithm()){cout<<"It's safe!"<<endl;for(int i=0;i<ProcessNumber;i++){cout<<"P"<<SafeSequence[i];if(i<ProcessNumber-1){cout<<"->";}}}else{cout<<"It's dangerous!"<<endl;}cout<<endl;
}
void Menu(){cout << "\t||              银行家算法实现                             ||" << endl;cout << "\t||              作者 : 夏德鑫                              ||" << endl;cout << "\t||              2017/11/19              ||" << endl;cout << "\n\n"<<endl;cout << "\t||              银行家算法开始                             ||" << endl;cout << "\n"<<endl;
}



程序运行截图:(图片内容显示较小,放大页面可以看的清楚)


银行家算法(C++实现)相关推荐

  1. python银行家算法代码_避免死锁的银行家算法C++程序实现

     本篇博文为追忆以前写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...

  2. 二十三、死锁的处理策略---避免死锁(银行家算法)

    一.知识总览 二.什么是安全序列 **所谓安全序列:**就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成,只要能找出一个安全序列,系统就是安全状态.当然,安全序列可能有多个. 如果分配了资源 ...

  3. 操作系统 进程调度-银行家算法实验报告

    实验要求 一. 实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止.本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家 ...

  4. 随机洗牌算法 银行家算法

    1. 随机洗牌算法 https://blog.csdn.net/qq_26399665/article/details/79831490 Fisher-Yates Shuffle算法 最早提出这个洗牌 ...

  5. 实验三银行家算法linux,操作系统原理与linux_银行家算法实验报告.doc

    . . . PAGE 成 绩 评 阅 人 评阅日期 计算机科学与技术系 实 验 报 告 课程名称: 操作系统原理与linux 实验名称: 银行家算法 2011年 04 月 实验三 银行家算法 一.实验 ...

  6. 银行家算法的分析与实现

    文章目录 1 银行家算法的分析与实现 1 银行家算法的分析与实现 问题描述: 研究一个银行家如何将总数一定的资金,安全的借给若干个顾客,使顾客既能满足对资金的需求,也使银行家可以收回自己的全部资金,不 ...

  7. Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 如何找回四舍五入法?...

    Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法,  也就是四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍 去,五前为奇要进一, 这个算法比四舍五入更精确些. R ...

  8. 银行家算法回顾[JAVA实现]

    为什么80%的码农都做不了架构师?>>>    分析了一下银行家算法,基于银行家算法做了一个小程序. 银行家算法主要用于操作系统进程管理程序中,用于防止死锁. 接下来这段代码将模拟这 ...

  9. 操作系统之银行家算法—详解流程及案例数据

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  10. 利用银行家算法避免死锁(C++实现)

    算法思想: 代码: #include<iostream> #include<string> using namespace std; #define numberOfProce ...

最新文章

  1. Maven本地缓存清理小工具
  2. java boolean几个字节_Java中boolean类型到底占用多少个字节?
  3. 25. Leetcode 143. 重排链表 (链表-基础操作类-重排链表)
  4. iOS—OC——C——野指针
  5. 转使用Moq让单元测试变得更简单
  6. Python弹窗提示警告框MessageBox
  7. C/C++ getopt()函数的介绍及使用
  8. Python面向对象之反射
  9. 全方面的了解超宽带信号高速采集记录回放系统
  10. Docker卸载镜像
  11. leetode题库5438--制作 m 束花所需的最少天数
  12. Stella 知识库--模型类的设计
  13. 电脑怎么开护眼模式_绿色电脑桌面、手机护眼模式真的可以护眼?
  14. 数据库创建图书馆管理系统
  15. 11 Django REST Framework 针对基于类的视图添加 @csrf_exempt
  16. Pr:导出设置之多路复用器与常规
  17. 三代组装软件Canu使用
  18. 兔子数列(斐波拉契数列)javscript的三种写法
  19. office 高效办公智慧树_智慧树知到《OFFICE高效办公》见面课答案
  20. K22中使用UART的IDLE Line功能

热门文章

  1. 算法-舍弃不吉利数字
  2. SPCL:Siamese Prototypical Contrastive Learning
  3. 前端如何进行seo优化
  4. 麦子学院IT资源,web前端,UI设计,Java全套,IOS,android,产品经理,pyhton,网络安全,运维
  5. 将个人文件夹挂载到服务器上,通过 WebDAV 将服务器全部或某个文件夹挂载到电脑上当网络硬盘 | 很文博客...
  6. 9:用户和权限-步入Linux的现代方法
  7. 整理一个将qq音乐的歌单导入到苹果音乐中的方法
  8. 如何控制cpu资源使用?
  9. 服务器如何挂网页游戏,网页游戏怎么挂云服务器
  10. 怼天怼地的马斯克道歉了?