日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

7-3 银行家算法--综合 (50 分)(思路+详解+分析输入)宝宝们 加油

發(fā)布時間:2023/12/4 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7-3 银行家算法--综合 (50 分)(思路+详解+分析输入)宝宝们 加油 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一:前言

這道題涉及到 銀行家算法的申請資源 算法 還有 安全性檢查的耍算法 那么強烈建議 把前面的學(xué)完再看本題
7-1 銀行家算法–安全性檢查 (20 分)
7-2 銀行家算法–申請資源 (30 分)

二:題目

輸入N個進(jìn)程(N<=100),以及M類資源(M<=100),初始化各種資源的總數(shù),T0時刻資源的分配情況。例如: 假定系統(tǒng)中有5個進(jìn)程{P0,P1,P2,P3,P4}和三類資源{A,B,C},各種資源的數(shù)量分別為10、5、7,在T0時刻的資源分配

根據(jù)菜單選擇相應(yīng)操作:

1.初始化:第一行輸入進(jìn)程數(shù)量N,第二行輸入資源類數(shù)M,第三行輸入M類資源個類資源的總數(shù),以下N行分別輸入每個進(jìn)程的名字,該進(jìn)程對M類資源的最大需求以及已分配資源。

2.安全性檢查:判斷當(dāng)前系統(tǒng)是否處于安全狀態(tài),若安全,輸出“找到安全序列,處于安全狀態(tài)?!狈駝t,輸出“找不到安全序列,處于不安全狀態(tài)?!?/p>

3.申請資源:輸入申請進(jìn)程的名字和申請各類資源的數(shù)目。 若分配,輸出”可以找到安全序列,可以分配。“若不分配,給出不分配的原因:

(1).若輸入的進(jìn)程的名字不正確,輸出“查無此進(jìn)程?!?/p>

(2).若申請的資源數(shù)目大于最大需求,輸出“需求不合理,不予分配。”

(3).若申請的資源數(shù)目大于剩余資源,輸出“剩余資源不足,不予分配?!?/p>

(4).若找不到安全序列,輸出“找不到安全序列,不予分配?!?br /> 4.當(dāng)前資源分配情況:按照格式輸出當(dāng)前資源分配情況,包括進(jìn)程名稱、最大需求、已獲得資源、可利用資源向量。例如T0時刻,當(dāng)前的資源分配情況如下:

輸入格式:
先顯示菜單(只顯示一次),然后按照需求進(jìn)行選擇:

輸出格式:
按照選擇,輸出相應(yīng)數(shù)據(jù)。

輸入樣例1:
在這里給出一組輸入。例如:

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 2 0 結(jié)尾無空行

輸出樣例1:
在這里給出相應(yīng)的輸出。例如:

****************** 1.初始化 2.安全性檢查 3.請求資源 4.當(dāng)前資源分配情況 0.退出 ****************** 請選擇: 找到安全序列,處于安全狀態(tài)。

結(jié)尾無空行
輸入樣例2:
在這里給出一組輸入。例如:

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 2 4 0 結(jié)尾無空行

輸出樣例2:
在這里給出相應(yīng)的輸出。例如:

****************** 1.初始化 2.安全性檢查 3.請求資源 4.當(dāng)前資源分配情況 0.退出 ****************** 請選擇: 找到安全序列,處于安全狀態(tài)。 name max allocation need available P0 7 5 3 | 0 1 0 | 7 4 3 | 3 3 2 P1 3 2 2 | 2 0 0 | 1 2 2 | P2 9 0 2 | 3 0 2 | 6 0 0 | P3 2 2 2 | 2 1 1 | 0 1 1 | P4 4 3 2 | 0 0 2 | 4 3 0 | 結(jié)尾無空行

輸入樣例3:
在這里給出一組輸入。例如:

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 結(jié)尾無空行

輸出樣例3:
在這里給出相應(yīng)的輸出。例如:

****************** 1.初始化 2.安全性檢查 3.請求資源 4.當(dāng)前資源分配情況 0.退出 ****************** 請選擇: 可以找到安全序列,可以分配。

結(jié)尾無空行
輸入樣例4:
在這里給出一組輸入。例如:

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 P6 1 0 2 0 結(jié)尾無空行

輸出樣例4:
在這里給出相應(yīng)的輸出。例如:

****************** 1.初始化 2.安全性檢查 3.請求資源 4.當(dāng)前資源分配情況 0.退出 ****************** 請選擇: 查無此進(jìn)程。 結(jié)尾無空行 輸入樣例5:

在這里給出一組輸入。例如:

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 結(jié)尾無空行

輸出樣例5:
在這里給出相應(yīng)的輸出。例如:

****************** 1.初始化 2.安全性檢查 3.請求資源 4.當(dāng)前資源分配情況 0.退出 ****************** 請選擇: 剩余資源不足,不予分配。 結(jié)尾無空行

輸入樣例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 結(jié)尾無空行

輸出樣例6:
在這里給出相應(yīng)的輸出。例如:

****************** 1.初始化 2.安全性檢查 3.請求資源 4.當(dāng)前資源分配情況 0.退出 ****************** 請選擇: 找不到安全序列,不予分配。 結(jié)尾無空行

輸入樣例7:
在這里給出一組輸入。例如:

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

結(jié)尾無空行
輸出樣例7:
在這里給出相應(yīng)的輸出。例如:

****************** 1.初始化 2.安全性檢查 3.請求資源 4.當(dāng)前資源分配情況 0.退出 ****************** 請選擇: 需求不合理,不予分配。 結(jié)尾無空行

輸入樣例8:
在這里給出一組輸入。例如:

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 9 0 結(jié)尾無空行

輸出樣例8:
在這里給出相應(yīng)的輸出。例如:

****************** 1.初始化 2.安全性檢查 3.請求資源 4.當(dāng)前資源分配情況 0.退出 ****************** 請選擇: 輸入錯誤,請重新輸入! 結(jié)尾無空行

二:輸入格式

1.

可能乖寶寶們想不出 這個題是如何輸入的 又是如何實現(xiàn)各個功能的,其實就是發(fā)送一個請求 實現(xiàn)一個功能

2.接下來直接看貼心杰的演示用例

(1):這就是剛開始的狀態(tài)(只出現(xiàn)一次)

(2):這是輸入的選項1 實現(xiàn)的輸入數(shù)據(jù)的功能

(3):這是輸入了選項2 實現(xiàn)了檢查當(dāng)前系統(tǒng)是否是在安全狀態(tài)下

(4):這是是實現(xiàn)了功能4 展現(xiàn)了各個階段的的進(jìn)程狀態(tài)

三:思路

思路:1.我覺得你如果把前兩道題做出來這道題就沒那么難了
2.分析我們的寫碼思路
1>:根據(jù)示例我們能很輕松的知道這是標(biāo)準(zhǔn)的 菜單欄的功能選擇
即你輸入 1 就是讓你輸入 輸入數(shù)據(jù),輸入其他選項就是實現(xiàn)其他功能
根據(jù)我們的示例 我們會發(fā)現(xiàn)每次都是先輸入1因為那是要實現(xiàn)輸入數(shù)據(jù) 功能
然后輸完數(shù)據(jù)后 就可以 來進(jìn)行其他功能

四:寫碼思路

就是先將整個框架建好,然后再挨個實現(xiàn)各個功能

五:DeBug方法

本題中我在解決好幾個bug,不光光是拿上方的測試直接來用,而是輸入一個用例后 我并沒有 按示例當(dāng)中的輸入0直接退出 而是繼續(xù)輸入數(shù)據(jù) 這樣解決的我好幾個漏洞!所以貼心杰 在這里 仿佛把啥都想分享受給乖寶寶們,恨不得面對面解決你的疑問,平時也沒人問,做出來也就分享給屏幕前的你了,這樣我也很開心呀!!

六:來干了這杯代碼

/**思路:1.我覺得你如果把前兩道題做出來這道題就沒那么難了2.分析我們的寫碼思路1>:根據(jù)示例我們能很輕松的知道這是標(biāo)準(zhǔn)的 菜單欄的功能選擇即你輸入 1 就是讓你輸入 輸入數(shù)據(jù),輸入其他選項就是實現(xiàn)其他功能根據(jù)我們的示例 我們會發(fā)現(xiàn)每次都是先輸入1因為那是要實現(xiàn)輸入數(shù)據(jù) 功能然后輸完數(shù)據(jù)后 就可以 來進(jìn)行其他功能 */#include<bits/stdc++.h> using namespace std;int N,M; string str; vector<int>v1;//用于存放各種的資源總量 vector<int>v2;//用于代表申請資源的進(jìn)程申請的 資源量 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]);} }//用于判斷是否有該進(jìn)程 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;} //用判斷申請的資源數(shù)目是否大于剩余資源 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(){//注意每次進(jìn)行安全的檢查 都需要更新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說明剩余的各個資源總量大于該進(jìn)程的所需要的 for(int j = 0; j < M; j++){v1[j] += node[i].b[j];//那么此時剩余的資源總量為原來的加上 該進(jìn)程釋放其占有的資源} node[i].finish = true; cnt++;//記錄完成進(jìn)程的個數(shù) // cout << node[i].processName << ' ';//此處牛逼之處在于 只要我們找到滿足條件的就從-1開始繼續(xù)尋找滿足條件的 i = -1; } }if(cnt == N){return true;}return false; } //進(jìn)行一次 安全性檢查 就需要 將 檢查前的數(shù)據(jù)還原回去 否則當(dāng)你進(jìn)行了兩次安全性檢查 // 那么第一次結(jié)果正確 那么第二次的時候 此時的avaliable已經(jīng)是全滿狀態(tài)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 << "查無此進(jìn)程。" << endl;//state();}else if(requestNeed() == false){cout << "需求不合理,不予分配。" << endl;// state();}else if(requestAvaliable() == false) {cout << "剩余資源不足,不予分配。" << endl;// state();}//此時開始將申請的資源賦值給該進(jìn)程同時進(jìn)行安全檢測 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];//這里是更新 該進(jìn)程的allocation node[i].c[j] -= v2[j];//這里是更新 該進(jìn)程的needv1[j] -= v2[j]; //這里是更新 該進(jìn)程的avaliable v3[j] -= v2[j];//存放 最初 avaliable的 }} } if(isSafe() == true){cout << "可以找到安全序列,可以分配。" << endl;toFormer();//只要一進(jìn)行安全性檢查 就需要將avaliable 還原回去 // state();}else{cout << "找不到安全序列,不予分配。" << endl;toFormer();//只要一進(jìn)行安全性檢查 就需要將avaliable 還原回去 //如果不滿足條件的話 需要將原來 進(jìn)程的的資源分配形式輸出來 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];//這里是更新 該進(jìn)程的allocation node[i].c[j] += v2[j];//這里是更新 該進(jìn)程的needv1[j] += v2[j]; //這里是更新 該進(jìn)程的avaliable v3[j] += v2[j];//存放 最初 avaliable的 }} } // state();} } //注意每次都要清理這個vector容器 因為 當(dāng)你下一次再往里裝數(shù)據(jù)時 他不是從下標(biāo)為0的//地方裝的,而是從你上次填裝的截至為止開始的 v2.clear(); }//4.當(dāng)前的資源情況 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.當(dāng)前資源分配情況" << 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 << "找到安全序列,處于安全狀態(tài)。" << endl;toFormer();//只要一進(jìn)行安全性檢查 就需要將avaliable 還原回去 } else{cout << "找不到安全序列,處于不安全狀態(tài)。" << endl;toFormer();//只要一進(jìn)行安全性檢查 就需要將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


再嘮叨一句 加油 寶寶們 有疑問記得留言呀 留言呀 我碼不停地的趕到 加油 我們共同進(jìn)步

總結(jié)

以上是生活随笔為你收集整理的7-3 银行家算法--综合 (50 分)(思路+详解+分析输入)宝宝们 加油的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。