银行家算法C++程序
此程序在Windows10 CodeBlocks17.12环境下测试运行,其他编程环境未经测试!

作业需求↓↓↓↓↓↓

运行效果图如下

(codeblocks下载地址http://www.codeblocks.org/downloads/binaries)

C++代码
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std; int **all,**ma,*work,**need,*a,*sum,*finish;//定义已分配矩阵,最大需求矩阵,工作向量,需求矩阵,可利用资源向量,各类资源总个数,finish标志
string *pN,*rN;//定义进程名称数组,资源名称数组
int row,col;//定义未知矩阵的行数和列数,动态输入 //------安全性算法-----
void isSafe(int row,int col){
int t2,t3,t4;//整型中间变量
string t1;//字符型中间变量
int i,j,g,k;//循环变量i,j,标志位g,k //finish标志全部置零
for(i=;i<row;i++){
finish[i]=;
} //令work向量等于可利用资源向量
for(j=;j<col;j++){
work[j]=a[j];
} g=;
for(i=;i<row;i++){
k=;
//用以判断某类资源的需求是否全部小于可分配资源
for(j=;j<col;j++){
if(need[i][j]<=work[j])
{k++;}
}
if(k==col){
for(j=;j<col;j++){
work[j]=work[j]+all[i][j];
} //对Need矩阵进行排序
for(j=;j<col;j++){
t2=need[i][j];
for(int temp=i;temp>g;temp--){
need[temp][j]=need[temp-][j];
}
need[g][j]=t2;
} //对已分配矩阵进行排序
for(j=;j<col;j++){
t3=all[i][j];
for(int temp=i;temp>g;temp--){
all[temp][j]=all[temp-][j];
}
all[g][j]=t3;
}
t1=pN[i]; //对进程名称数组进行排序
for(int temp=i;temp>g;temp--){
pN[temp]=pN[temp-];
}
pN[g]=t1; finish[i]=;//置标志位为1 //对标志位finish进行排序
t4=finish[i];
for(int temp=i;temp>g;temp--){
finish[temp]=finish[temp-];
}
finish[g]=t4;
i=g;
g++;
} } //判断标志位,只要有finish标志位0的进程,结束整个程序,若全为1,则输出安全序列
for(i=;i<row;i++){
if(finish[i]==){
cout<<"(不安全!!!!!!!)"<<endl<<"(程序已退出!)"<<endl;
exit();
}
}
cout<<"(存在安全序列为){";
for(i=;i<row;i++){
cout<<pN[i]<<",";
}
cout<<"} 所以此时系统处于安全状态"<<endl;
} //------银行家算法-----
void request(int col){
int *py,i,j;//定义t0后进程请求资源的资源数组和循环变量i,j
string px;//资源名变量
py=new int[col];//分配数组大小
cout<<"(请输入请求资源的进程名)"<<endl;
cin>>px;//输入t0后进程请求资源的进程名 //寻找请求资源的进程名在进程名数组中的位置
for(i=;i<row;i++){
if(px==pN[i]){
cout<<"(请依次输入对各类资源的请求数目,数之间以空格隔开)"<<endl;
for(j=;j<col;j++){
cin>>py[j];
}
break;
}
} int re1=,re2=;//定义标志位,分别用以判断某进程请求的各类资源是否全部小于等于最大需求和可分配资源
for(j=;j<col;j++){
if(py[j]<=need[i][j])
{re1++;}
if(py[j]<=a[j])
{re2++;}
} //若符合标志位判断标准,对资源进行修改
if(re1==col&&re2==col){
for(j=;j<col;j++){
need[i][j]=need[i][j]-py[j];
a[j]=a[j]-py[j];
all[i][j]=all[i][j]+py[j];
}
isSafe(row,col);//对资源重新分配后 调用安全性算法
}else{cout<<"(不安全!!!)"<<endl;} delete[] py;//释放
}
int main()
{
int i,j,ch;//定义循环变量i,j和判断变量ch(判断是否有进程请求资源)
cout<<"(请依次输入进程个数和资源个数(以空格隔开))"<<endl;
cin>>row>>col; //以下是对数组或者矩阵分配大小
pN=new string[row];//进程名数组
rN=new string[col];//资源名数组
a=new int[col];//可利用资源数组
sum=new int[col];//各类资源总个数
finish=new int[row];//各类资源总个数
work=new int[col]; //动态分配 分配矩阵
all=new int*[row];
for(i=;i<row;i++){
all[i]=new int[col];
} //动态分配最大需求矩阵
ma=new int*[row];
for(i=;i<row;i++){
ma[i]=new int[col];
} //动态分配需求矩阵
need=new int*[row];
for(i=;i<row;i++){
need[i]=new int[col];
} cout<<"(请输入进程名(以空格隔开,按回车键结束))"<<endl;
for(i=;i<row;i++){
cin>>pN[i];
} cout<<"(请输入资源名(以空格隔开,按回车键结束))"<<endl;
for(i=;i<col;i++){
cin>>rN[i];
} cout<<"(请输入各类资源的总数量)"<<endl;
for(i=;i<col;i++){
cin>>sum[i];
} //最大矩阵
for(i=;i<row;i++){
cout<<"(请输入进程 "+pN[i]+" 对各类资源的最大需求(以空格隔开,按回车键结束))"<<endl;
for(j=;j<col;j++){
cin>>ma[i][j];
}
} //分配矩阵
for(i=;i<row;i++){
cout<<"(请依次输入进程 "+pN[i]+" 已分配资源情况(以空格隔开,按回车键结束))"<<endl;
for(j=;j<col;j++){
cin>>all[i][j];
}
} //需求矩阵
for(i=;i<row;i++){
for(j=;j<col;j++){
need[i][j]=ma[i][j]-all[i][j];
}
} //可利用资源
for(j=;j<row;j++){
a[j]=sum[j]-all[][j];
}
for(j=;j<col;j++){
for(i=;i<row;i++){
a[j]=a[j]-all[i][j];
}
} isSafe(row,col);//调用安全性算法
cout<<"(是否有进程对资源发出请求,是---1,否---0)"<<endl;
cin>>ch;
if(ch==){
request(col);//调用银行家算法
} //释放
for(i=;i<row;i++){
delete[] all[i];
delete[] ma[i];
delete[] need[i];
}
delete[] all,ma,need,pN,rN,a,sum,work,finish;
return ;
}
2019-04-20-20:39:05
银行家算法C++程序的更多相关文章
- 避免死锁的银行家算法C++程序实现
本篇博文为追忆以前写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...
- 用python实现银行家算法
编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性. 进程 已占资源 最大需求数 资源种类 A B C D A B C D P0 0 0 1 2 0 0 1 2 P1 1 0 0 0 ...
- C程序模拟实现银行家算法
C程序模拟实现银行家算法 上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解 ...
- 操作系统,银行家算法模拟实现(Windows 环境 C++)
计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛) 实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现.以下为详细步骤 ...
- 银行家算法之JavaScript实现
上学期有个课程叫做操作系统,期末的时候这课程还有个课程设计,其中有个题目叫做银行家算法. 什么是银行家算法我就不解释了! 看着同学们的设计,大同小异甚至前篇一律. 清一色的控制台程序,清一色的蛋疼输入 ...
- linux多线程模拟银行家算法
题外话: 这应该是最近有点难度的作业了,起码比之前的理发师,读写,哲学家问题要难. 但是做好程序的结构,自顶向下,就还是不难的. 银行家算法简介: 代码: init() ...
- c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)
银行家算法数据结构 (1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.如果Available[j]=K,则表示系统中现有Rj类资源K个. (2) ...
- Round() 四舍五入 js银行家算法(转)
首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825; ...
- 1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)
阅读并理解提供给大家的C语言文法文件. 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图 ...
随机推荐
- Java代码调用服务器上的Shell脚本
Java代码调用服务器上的Shell脚本 这里主要是因为我们报表平台有用到用户手工录入的数据作为结果数据且需要纳入saiku去展示 如我们所知,saiku不会自动刷新,所以需要在数据更新接口中调用服务 ...
- 学习poisson.c
static char help[] = "A structured-grid Poisson problem with DMDA+KSP.\n\n"; #include < ...
- linux修改主机名+免密认证+关闭防火墙
在很多软件安装的时候都有这些需求,因此在这里一起讲一下 修改主机名 简单的使用 hostnamectl 命令就好了 hostnamectl set-hostname NAME 免密认证 准备工作,修改 ...
- LeetCode算法历程-02
编写一个程序判断给定的数是否为丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例 1: 输入: 6 输出: true 解释: 6 = 2 × 3 示例 2: 输入: 8 输出: true ...
- JavaScript js 引入CDN 不生效 注意事项
[博客园cnblogs笔者m-yb原创,转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708]https ...
- Js函数基本介绍
1. 函数的创建 在JavaScript里面创建函数的关键字为function 函数名:就是在我们调用函数的时候需要书写的标识符 形参:全称为形式参数,调用函数的时候,这个函数所需要的参数是什么 实参 ...
- 运行python脚本时,报错InsecurePlatformWarning: A true SSLContext object is not available,解决方法
今天,要在新环境里运行一个python脚本,遇到下面的报错: /usr/lib/python2.7/site-packages/urllib3/util/ssl_.py:160: InsecurePl ...
- oracle 同义词synonym
在A用户下,想访问B用户下的表,一遍需要用 “用户名.表名 ”的格式进行访问.如果想不加用户名,直接访问,需要建同义词. 同义词语法如下: CREATE [PUBLIC] SYNONYM synony ...
- 软工个人作业4——Alpha阶段个人总结
一.个人总结 1.在alpha 结束之后, 每位同学写一篇个人博客, 总结自己的alpha 过程: 经过本次alpha阶段的冲刺,首先学到了很多,收获了很多,同时也蛮辛苦的.其实我觉得作为组员我有很认 ...
- vue生命周期和钩子函数
new Vue 创建vue实例 init events & liftcycle 开始初始化 beforeCreate 组件刚被创建,组件属性计算之前,如data属性等 init injecti ...