银行家算法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程序 点此文字查看原图 ...
随机推荐
- 解决Python图片处理模块pillow使用中出现的问题
最近爬一个电影票房的网站(url:http://58921.com/alltime),上面总票房里面其实是一张图片,那么我需要把图片识别成文字,来获取票房数据. 我头脑里第一想到的解决方案就是要用 ...
- TCP/IP OPTION字段
0x01 简介 TCP头部和IPV4头部除了固定的20字节外,都设置了 OPTION 字段用于存储自定义的数据,因为TCP头部和IPV4的报文长度字段均为4字节,所表示的最大值为15, 乘4,报文头部 ...
- .net正则匹配
char[] weixin = txtweixinhao.Text.Trim().ToCharArray(); for (int i = 0; i < weixin.Length; i++) i ...
- 命令提示符出现-bash-4.1$如何解决
故障原因:用户模式/etc/skel内容丢失 解决方法 复制etc/skel里内容到当前用户 [root@web01 ~]# su - test -bash-4.1$ cp /etc/skel/.ba ...
- SSH整合后tomcat启动报错SEVERE: Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
错误信息: SEVERE: Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/C ...
- servlet异步处理机制
Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下:首先,Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理:接着,调用业务接口的某些方法,以完成业务处 ...
- CXF 简单创建Webserver 例子
最近在弄webserver,因为公司需要用到,来说说,webserver的常用方式吧 1.什么是webservice 1.1 什么是远程调用技术 远程调用数据定义:是系统和系统之间的调用 先说一说 ...
- angular 定时函数
注入$interval,$timeout 服务 2.定义函数 var aa = $interval(function(){ $timout(function(){ ..... }) },,定时时间 ...
- 在Eclipse中Tomcat配置图片保存路径
在上一篇二维码功能实现的时候发现,若将二维码保存在项目路径下,服务器起了之后存入的二维码图片是无法实时读取的,所以在Tomcat上配置图片保存位置,将图片保存到项目外的地方. 查找资料的时候看见一个方 ...
- 用svm来做回归预测(python)
————————————————————***提醒自己结束了就发博客***————————————————————