7-3 银行家算法--综合 (50 分)(思路+详解+分析输入)宝宝们 加油
一:前言
這道題涉及到 銀行家算法的申請資源 算法 還有 安全性檢查的耍算法 那么強烈建議 把前面的學完再看本題
7-1 銀行家算法–安全性檢查 (20 分)
7-2 銀行家算法–申請資源 (30 分)
二:題目
輸入N個進程(N<=100),以及M類資源(M<=100),初始化各種資源的總數,T0時刻資源的分配情況。例如: 假定系統中有5個進程{P0,P1,P2,P3,P4}和三類資源{A,B,C},各種資源的數量分別為10、5、7,在T0時刻的資源分配
根據菜單選擇相應操作:
1.初始化:第一行輸入進程數量N,第二行輸入資源類數M,第三行輸入M類資源個類資源的總數,以下N行分別輸入每個進程的名字,該進程對M類資源的最大需求以及已分配資源。
2.安全性檢查:判斷當前系統是否處于安全狀態,若安全,輸出“找到安全序列,處于安全狀態。”否則,輸出“找不到安全序列,處于不安全狀態。”
3.申請資源:輸入申請進程的名字和申請各類資源的數目。 若分配,輸出”可以找到安全序列,可以分配。“若不分配,給出不分配的原因:
(1).若輸入的進程的名字不正確,輸出“查無此進程。”
(2).若申請的資源數目大于最大需求,輸出“需求不合理,不予分配。”
(3).若申請的資源數目大于剩余資源,輸出“剩余資源不足,不予分配。”
(4).若找不到安全序列,輸出“找不到安全序列,不予分配。”
4.當前資源分配情況:按照格式輸出當前資源分配情況,包括進程名稱、最大需求、已獲得資源、可利用資源向量。例如T0時刻,當前的資源分配情況如下:
輸入格式:
先顯示菜單(只顯示一次),然后按照需求進行選擇:
輸出格式:
按照選擇,輸出相應數據。
輸入樣例1:
在這里給出一組輸入。例如:
輸出樣例1:
在這里給出相應的輸出。例如:
結尾無空行
輸入樣例2:
在這里給出一組輸入。例如:
輸出樣例2:
在這里給出相應的輸出。例如:
輸入樣例3:
在這里給出一組輸入。例如:
輸出樣例3:
在這里給出相應的輸出。例如:
結尾無空行
輸入樣例4:
在這里給出一組輸入。例如:
輸出樣例4:
在這里給出相應的輸出。例如:
在這里給出一組輸入。例如:
1 5 3 10 5 7 P0 7 5 3 0 1 0 P1 3 2 2 3 0 2 P2 9 0 2 3 0 2 P3 2 2 2 2 1 1 P4 4 3 2 0 0 2 3 P4 3 3 0 0 結尾無空行輸出樣例5:
在這里給出相應的輸出。例如:
輸入樣例6:
在這里給出一組輸入。例如:
1
5 3 10 5 7 P0 7 5 3 0 1 0 P1 3 2 2 3 0 2 P2 9 0 2 3 0 2 P3 2 2 2 2 1 1 P4 4 3 2 0 0 2 3 P0 0 2 0 0 結尾無空行輸出樣例6:
在這里給出相應的輸出。例如:
輸入樣例7:
在這里給出一組輸入。例如:
結尾無空行
輸出樣例7:
在這里給出相應的輸出。例如:
輸入樣例8:
在這里給出一組輸入。例如:
輸出樣例8:
在這里給出相應的輸出。例如:
二:輸入格式
1.
可能乖寶寶們想不出 這個題是如何輸入的 又是如何實現各個功能的,其實就是發送一個請求 實現一個功能
2.接下來直接看貼心杰的演示用例
(1):這就是剛開始的狀態(只出現一次)
(2):這是輸入的選項1 實現的輸入數據的功能
(3):這是輸入了選項2 實現了檢查當前系統是否是在安全狀態下
(4):這是是實現了功能4 展現了各個階段的的進程狀態
三:思路
思路:1.我覺得你如果把前兩道題做出來這道題就沒那么難了
2.分析我們的寫碼思路
1>:根據示例我們能很輕松的知道這是標準的 菜單欄的功能選擇
即你輸入 1 就是讓你輸入 輸入數據,輸入其他選項就是實現其他功能
根據我們的示例 我們會發現每次都是先輸入1因為那是要實現輸入數據 功能
然后輸完數據后 就可以 來進行其他功能
四:寫碼思路
就是先將整個框架建好,然后再挨個實現各個功能
五:DeBug方法
本題中我在解決好幾個bug,不光光是拿上方的測試直接來用,而是輸入一個用例后 我并沒有 按示例當中的輸入0直接退出 而是繼續輸入數據 這樣解決的我好幾個漏洞!所以貼心杰 在這里 仿佛把啥都想分享受給乖寶寶們,恨不得面對面解決你的疑問,平時也沒人問,做出來也就分享給屏幕前的你了,這樣我也很開心呀!!
六:來干了這杯代碼
/**思路:1.我覺得你如果把前兩道題做出來這道題就沒那么難了2.分析我們的寫碼思路1>:根據示例我們能很輕松的知道這是標準的 菜單欄的功能選擇即你輸入 1 就是讓你輸入 輸入數據,輸入其他選項就是實現其他功能根據我們的示例 我們會發現每次都是先輸入1因為那是要實現輸入數據 功能然后輸完數據后 就可以 來進行其他功能 */#include<bits/stdc++.h> using namespace std;int N,M; string str; vector<int>v1;//用于存放各種的資源總量 vector<int>v2;//用于代表申請資源的進程申請的 資源量 vector<int>v3;//用于記錄最初的avaliable struct Node{string processName; int a[10000];//Maxint b[10000];//allocation int c[10000];//needbool finish; } node[10000];//1.初始化輸入功能 void cinFunction(){cin >> N >> M;for(int i = 0; i < M; i++){int nums;cin >> nums;v1.push_back(nums); } for(int i = 0; i < N; i++){cin >> node[i].processName;//輸入Max for(int j = 0; j < M; j++){cin >> node[i].a[j]; }//輸入allovation for(int j = 0; j < M; j++){cin >> node[i].b[j];v1[j] -= node[i].b[j];//這里是每次減去分配的資源 那么剩下的最后就是 available }//計算needfor(int j = 0; j < M; j++){node[i].c[j] = node[i].a[j] - node[i].b[j];} } //將最初的avaliable記錄下來 for(int i = 0; i < M; i++){v3.push_back(v1[i]);} }//用于判斷是否有該進程 bool judgeExit(string str){for(int i = 0; i < N; i++){if(str == node[i].processName){return true;}}return false; }//用于計算此時的request 和 need bool requestNeed(){int count = 0;for(int i = 0; i < N; i++){if(str == node[i].processName){for(int j = 0; j < M; j++){if(v2[j] <= node[i].c[j]){//請求量 小于 need count++;}} }if(count == M){return true;}}return false;} //用判斷申請的資源數目是否大于剩余資源 bool requestAvaliable(){int count = 0;for(int j = 0; j < M; j++){if(v2[j] <= v1[j]){ //請求量 小于 avaliabale count++;}} if(count == M){return true;}return false;}//2.安全性檢查 bool isSafe(){//注意每次進行安全的檢查 都需要更新finish = false 否則 下一次再檢查 finish 都等于 true了 for(int i = 0; i < N; i++){node[i].finish = false;}int cnt = 0; for(int i = 0; i < N; i++){int count = 0;for(int j = 0; j < M; j++){if(node[i].c[j] <= v1[j]){count++;}else{break;//只要有一個不合適就 break 出去 } }if(node[i].finish == false && count == M) {//count == M說明剩余的各個資源總量大于該進程的所需要的 for(int j = 0; j < M; j++){v1[j] += node[i].b[j];//那么此時剩余的資源總量為原來的加上 該進程釋放其占有的資源} node[i].finish = true; cnt++;//記錄完成進程的個數 // cout << node[i].processName << ' ';//此處牛逼之處在于 只要我們找到滿足條件的就從-1開始繼續尋找滿足條件的 i = -1; } }if(cnt == N){return true;}return false; } //進行一次 安全性檢查 就需要 將 檢查前的數據還原回去 否則當你進行了兩次安全性檢查 // 那么第一次結果正確 那么第二次的時候 此時的avaliable已經是全滿狀態void toFormer(){for(int i = 0; i < M; i++){v1[i] = v3[i];} } //3.申請資源 void apply_Resources(){cin >> str;for(int i = 0; i < M; i++){int temp;cin >> temp;v2.push_back(temp);}if(judgeExit(str) == false){cout << "查無此進程。" << endl;//state();}else if(requestNeed() == false){cout << "需求不合理,不予分配。" << endl;// state();}else if(requestAvaliable() == false) {cout << "剩余資源不足,不予分配。" << endl;// state();}//此時開始將申請的資源賦值給該進程同時進行安全檢測 else if(judgeExit(str) == true && requestNeed() == true && requestAvaliable() == true){for(int i = 0; i < N; i++){if(str == node[i].processName){for(int j = 0; j < M; j++){node[i].b[j] += v2[j];//這里是更新 該進程的allocation node[i].c[j] -= v2[j];//這里是更新 該進程的needv1[j] -= v2[j]; //這里是更新 該進程的avaliable v3[j] -= v2[j];//存放 最初 avaliable的 }} } if(isSafe() == true){cout << "可以找到安全序列,可以分配。" << endl;toFormer();//只要一進行安全性檢查 就需要將avaliable 還原回去 // state();}else{cout << "找不到安全序列,不予分配。" << endl;toFormer();//只要一進行安全性檢查 就需要將avaliable 還原回去 //如果不滿足條件的話 需要將原來 進程的的資源分配形式輸出來 for(int i = 0; i < N; i++){if(str == node[i].processName){for(int j = 0; j < M; j++){node[i].b[j] -= v2[j];//這里是更新 該進程的allocation node[i].c[j] += v2[j];//這里是更新 該進程的needv1[j] += v2[j]; //這里是更新 該進程的avaliable v3[j] += v2[j];//存放 最初 avaliable的 }} } // state();} } //注意每次都要清理這個vector容器 因為 當你下一次再往里裝數據時 他不是從下標為0的//地方裝的,而是從你上次填裝的截至為止開始的 v2.clear(); }//4.當前的資源情況 void state(){int flag = 0;cout << "name max allocation need available" << endl;for(int i = 0; i < N; i++){cout << node[i].processName << ' ';for(int j = 0; j < M; j++){cout << node[i].a[j] << ' '; } cout << "| ";for(int j = 0; j < M; j++){cout << node[i].b[j] << ' '; }cout << "| ";for(int j = 0; j < M; j++){cout << node[i].c[j] << ' '; }cout << "|";if(flag == 0){for(int j = 0; j < M; j++){if(j == 0)cout << ' ' <<v3[j];elsecout << ' ' <<v3[j] ; } flag = 1; } cout << endl; } }void init(){cout << "******************" << endl;cout << "1.初始化" << endl;cout << "2.安全性檢查" << endl;cout << "3.請求資源" << endl;cout << "4.當前資源分配情況" << endl;cout << "0.退出" << endl;cout << "******************" << endl;cout << "請選擇:" << endl ; }int main(){int option;bool flag = false;init(); while(flag == false){cin >> option;switch(option){case 1: cinFunction();break;case 2:if(isSafe() == true){cout << "找到安全序列,處于安全狀態。" << endl;toFormer();//只要一進行安全性檢查 就需要將avaliable 還原回去 } else{cout << "找不到安全序列,處于不安全狀態。" << endl;toFormer();//只要一進行安全性檢查 就需要將avaliable 還原回去 }break;case 3:apply_Resources();break; case 4:state(); break;case 0:flag = true;break; default:cout << "輸入錯誤,請重新輸入!" << endl; }}}//1 //5 //3 //10 5 7 //P0 7 5 3 0 1 0 //P1 3 2 2 2 0 0 //P2 9 0 2 3 0 2 //P3 2 2 2 2 1 1 //P4 4 3 2 0 0 2 //3 //P1 1 0 2 //0 //1 //5 //3 //10 5 7 //P0 7 5 3 0 1 0 //P1 3 2 2 3 0 2 //P2 9 0 2 3 0 2 //P3 2 2 2 2 1 1 //P4 4 3 2 0 0 2 //3 //P0 0 2 0 //0 // // // //1 //5 //3 //10 5 7 //P0 7 5 3 0 1 0 //P1 3 2 2 3 0 2 //P2 9 0 2 3 0 2 //P3 2 2 2 2 1 1 //P4 4 3 2 0 0 2 //3 //P1 2 2 0 //0
再嘮叨一句 加油 寶寶們 有疑問記得留言呀 留言呀 我碼不停地的趕到 加油 我們共同進步
總結
以上是生活随笔為你收集整理的7-3 银行家算法--综合 (50 分)(思路+详解+分析输入)宝宝们 加油的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7-2 银行家算法--申请资源 (30
- 下一篇: 46. 全排列015(回溯法求解)