此程序在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++程序的更多相关文章

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

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

  2. 用python实现银行家算法

    编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性. 进程 已占资源 最大需求数 资源种类 A B C D A B C D P0 0 0 1 2 0 0 1 2 P1 1 0 0 0 ...

  3. C程序模拟实现银行家算法

    C程序模拟实现银行家算法 上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解 ...

  4. 操作系统,银行家算法模拟实现(Windows 环境 C++)

    计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛) 实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现.以下为详细步骤 ...

  5. 银行家算法之JavaScript实现

    上学期有个课程叫做操作系统,期末的时候这课程还有个课程设计,其中有个题目叫做银行家算法. 什么是银行家算法我就不解释了! 看着同学们的设计,大同小异甚至前篇一律. 清一色的控制台程序,清一色的蛋疼输入 ...

  6. linux多线程模拟银行家算法

    题外话: 这应该是最近有点难度的作业了,起码比之前的理发师,读写,哲学家问题要难. 但是做好程序的结构,自顶向下,就还是不难的. 银行家算法简介:                 代码: init() ...

  7. c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)

    银行家算法数据结构 (1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.如果Available[j]=K,则表示系统中现有Rj类资源K个. (2) ...

  8. Round() 四舍五入 js银行家算法(转)

    首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825;        ...

  9. 1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)

    阅读并理解提供给大家的C语言文法文件. 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图 ...

随机推荐

  1. Linux关机总结

    立刻关机 root@ubuntu17:~# shutdown -h now 100分钟后关机 root@ubuntu17:~# shutdown -h + Shutdown scheduled -- ...

  2. 列举至少3种Support包中提供的布局或工具

    android.support.v7.widget.CardView 继承自FrameLayout并实现了圆角和阴影效果,常用于ListView或RecyclerView中Item布局的根节点 示例代 ...

  3. 关于angular实现表单的一些问题

    如何用angular实现表单的一些问题?核心步骤大概如下: 创建模型类 创建控制此表单的组件. 创建具有初始表单布局的模板. 使用ngModel双向数据绑定语法把数据属性绑定到每个表单输入控件. 往每 ...

  4. open还是codecs.open区别

    >>> fr = open('test.txt','a')>>> line1 = "我是一道光">>> fr.write(li ...

  5. 关于JS 的cookie 操作 与 json 的数据结构 问题

    今天写了一个购物车,由于购物车内容是保存在 cookie中 所以不想浪费服务器资源做cookie的操作 故在前端封装了一些对象来处理购物车,由于cookie的数据结构的设计是一个json格式 使用 账 ...

  6. SSM excel文件的导入导出

    对于excel文件的导入导出,后台接收读取和建表封存都是固定死的,所以对于excel导入时,excel文件内容必须匹配后台相关对象,不然报错. excel文件导出,用<a><a/&g ...

  7. jQuery dataTables 列不对齐的原因

    如果把 jQuery dataTables 用在初始化时为隐藏的区域中,会发现表头和内容的列是不对齐的. 解决方案: 如果是折叠的,可以加上: $('#myCollapsible').on('show ...

  8. CNN

    <卷积神经网络详述> <卷积神经网络——雨石博客>      学习参考:http://blog.csdn.net/stdcoutzyx/article/details/4159 ...

  9. 如何开发NPM包

    创建包目录 D:\>mkdir mypackage && cd mypackage D:\mypackage>npm init --yes 进入mypackage目录,你会 ...

  10. vuex核心

    最详细的Vuex教程 什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是dat ...