銀行家演算法C++程式

来源:https://www.cnblogs.com/CodeStudio7/archive/2019/04/20/10742609.html
-Advertisement-
Play Games

此程式在Windows10 CodeBlocks17.12環境下測試運行,其他編程環境未經測試! 作業需求↓↓↓↓↓↓ 運行效果圖如下 (codeblocks下載地址http://www.codeblocks.org/downloads/binaries) C++代碼 2019-04-20-20:3 ...


此程式在Windows10    CodeBlocks17.12環境下測試運行,其他編程環境未經測試!

 

 


 

作業需求↓↓↓↓↓↓

 


 

運行效果圖如下

 

 


 

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


 

C++代碼

  1 #include<iostream>
  2 #include<string>
  3 #include<stdlib.h>
  4 using namespace std;
  5 
  6 int **all,**ma,*work,**need,*a,*sum,*finish;//定義已分配矩陣,最大需求矩陣,工作向量,需求矩陣,可利用資源向量,各類資源總個數,finish標誌
  7 string *pN,*rN;//定義進程名稱數組,資源名稱數組
  8 int row,col;//定義未知矩陣的行數和列數,動態輸入
  9 
 10 
 11 //------安全性演算法-----
 12 void isSafe(int row,int col){
 13     int t2,t3,t4;//整型中間變數
 14     string t1;//字元型中間變數
 15     int i,j,g,k;//迴圈變數i,j,標誌位g,k
 16 
 17     //finish標誌全部置零
 18     for(i=0;i<row;i++){
 19         finish[i]=0;
 20     }
 21 
 22     //令work向量等於可利用資源向量
 23     for(j=0;j<col;j++){
 24         work[j]=a[j];
 25     }
 26 
 27     g=0;
 28     for(i=0;i<row;i++){
 29         k=0;
 30         //用以判斷某類資源的需求是否全部小於可分配資源
 31         for(j=0;j<col;j++){
 32             if(need[i][j]<=work[j])
 33                 {k++;}
 34         }
 35         if(k==col){
 36             for(j=0;j<col;j++){
 37                 work[j]=work[j]+all[i][j];
 38             }
 39 
 40 
 41             //對Need矩陣進行排序
 42             for(j=0;j<col;j++){
 43                 t2=need[i][j];
 44                 for(int temp=i;temp>g;temp--){
 45                     need[temp][j]=need[temp-1][j];
 46                 }
 47                 need[g][j]=t2;
 48             }
 49 
 50             //對已分配矩陣進行排序
 51             for(j=0;j<col;j++){
 52                 t3=all[i][j];
 53                 for(int temp=i;temp>g;temp--){
 54                     all[temp][j]=all[temp-1][j];
 55                 }
 56                 all[g][j]=t3;
 57             }
 58             t1=pN[i];
 59 
 60             //對進程名稱數組進行排序
 61             for(int temp=i;temp>g;temp--){
 62                 pN[temp]=pN[temp-1];
 63             }
 64             pN[g]=t1;
 65 
 66             finish[i]=1;//置標誌位為1
 67 
 68             //對標誌位finish進行排序
 69             t4=finish[i];
 70             for(int temp=i;temp>g;temp--){
 71                 finish[temp]=finish[temp-1];
 72             }
 73             finish[g]=t4;
 74             i=g;
 75             g++;
 76         }
 77 
 78     }
 79 
 80     //判斷標誌位,只要有finish標誌位0的進程,結束整個程式,若全為1,則輸出安全序列
 81     for(i=0;i<row;i++){
 82         if(finish[i]==0){
 83             cout<<"(不安全!!!!!!!)"<<endl<<"(程式已退出!)"<<endl;
 84             exit(1);
 85         }
 86     }
 87     cout<<"(存在安全序列為){";
 88     for(i=0;i<row;i++){
 89         cout<<pN[i]<<",";
 90     }
 91     cout<<"}"<<endl;
 92 }
 93 
 94 
 95 
 96 //------銀行家演算法-----
 97 void request(int col){
 98     int *py,i,j;//定義t0後進程請求資源的資源數組和迴圈變數i,j
 99     string px;//資源名變數
100     py=new int[col];//分配數組大小
101     cout<<"(請輸入請求資源的進程名)"<<endl;
102     cin>>px;//輸入t0後進程請求資源的進程名
103 
104     //尋找請求資源的進程名在進程名數組中的位置
105     for(i=0;i<row;i++){
106         if(px==pN[i]){
107             cout<<"(請依次輸入對各類資源的請求數目,數之間以空格隔開)"<<endl;
108             for(j=0;j<col;j++){
109                 cin>>py[j];
110             }
111          break;
112         }
113     }
114 
115     int re1=0,re2=0;//定義標誌位,分別用以判斷某進程請求的各類資源是否全部小於等於最大需求和可分配資源
116     for(j=0;j<col;j++){
117         if(py[j]<=need[i][j])
118             {re1++;}
119         if(py[j]<=a[j])
120             {re2++;}
121     }
122 
123 
124     //若符合標誌位判斷標準,對資源進行修改
125     if(re1==col&&re2==col){
126         for(j=0;j<col;j++){
127             need[i][j]=need[i][j]-py[j];
128             a[j]=a[j]-py[j];
129             all[i][j]=all[i][j]+py[j];
130         }
131         isSafe(row,col);//對資源重新分配後 調用安全性演算法
132     }else{cout<<"(不安全!!!)"<<endl;}
133 
134     delete[] py;//釋放
135 }
136 int main()
137 {
138     int i,j,ch;//定義迴圈變數i,j和判斷變數ch(判斷是否有進程請求資源)
139     cout<<"(請依次輸入進程個數和資源個數(以空格隔開))"<<endl;
140     cin>>row>>col;
141 
142     //以下是對數組或者矩陣分配大小
143     pN=new string[row];//進程名數組
144     rN=new string[col];//資源名數組
145     a=new int[col];//可利用資源數組
146     sum=new int[col];//各類資源總個數
147     finish=new int[row];//各類資源總個數
148     work=new int[col];
149 
150     //動態分配 分配矩陣
151     all=new int*[row];
152     for(i=0;i<row;i++){
153         all[i]=new int[col];
154     }
155 
156     //動態分配最大需求矩陣
157     ma=new int*[row];
158     for(i=0;i<row;i++){
159         ma[i]=new int[col];
160     }
161 
162     //動態分配需求矩陣
163     need=new int*[row];
164     for(i=0;i<row;i++){
165         need[i]=new int[col];
166     }
167 
168 
169     cout<<"(請輸入進程名(以空格隔開,按回車鍵結束))"<<endl;
170     for(i=0;i<row;i++){
171         cin>>pN[i];
172     }
173 
174     cout<<"(請輸入資源名(以空格隔開,按回車鍵結束))"<<endl;
175     for(i=0;i<col;i++){
176         cin>>rN[i];
177     }
178 
179     cout<<"(請輸入各類資源的總數量)"<<endl;
180     for(i=0;i<col;i++){
181         cin>>sum[i];
182     }
183 
184 
185     //分配矩陣
186     for(i=0;i<row;i++){
187         cout<<"(請輸入進程 "+pN[i]+" 依次分配的資源情況(以空格隔開,按回車鍵結束))"<<endl;
188         for(j=0;j<col;j++){
189             cin>>all[i][j];
190         }
191     }
192 
193     //最大矩陣
194     for(i=0;i<row;i++){
195         cout<<"(請輸入進程 "+pN[i]+" 對各類資源的最大需求(以空格隔開,按回車鍵結束))"<<endl;
196         for(j=0;j<col;j++){
197             cin>>ma[i][j];
198         }
199     }
200 
201     //需求矩陣
202     for(i=0;i<row;i++){
203         for(j=0;j<col;j++){
204             need[i][j]=ma[i][j]-all[i][j];
205         }
206     }
207 
208 
209     //可利用資源
210     for(j=0;j<row;j++){
211             a[j]=sum[j]-all[0][j];
212         }
213     for(j=0;j<col;j++){
214         for(i=1;i<row;i++){
215             a[j]=a[j]-all[i][j];
216         }
217     }
218 
219     isSafe(row,col);//調用安全性演算法
220     cout<<"(是否有進程對資源發出請求,是---1,否---0)"<<endl;
221     cin>>ch;
222     if(ch==1){
223         request(col);//調用銀行家演算法
224     }
225 
226 
227 
228     //釋放
229     for(i=0;i<row;i++){
230         delete[] all[i];
231         delete[] ma[i];
232         delete[] need[i];
233     }
234     delete[] all,ma,need,pN,rN,a,sum,work,finish;
235     return 0;
236 }

 

 2019-04-20-20:39:05

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 時隔三個多月,我終於想起我還有個博客,其實也不是忘了我這個博客,只是平時工作繁忙沒時間去寫博客,故今晚騰出時間來記錄一下上次工作中遇到的一個問題,給園友們分享出來,以免入坑。 上個星期在工作中使用JdbcTemplate執行了一個select * from table where id in (?, ...
  • 創建進程,守護進程,進程鎖Lock,進程通信IPC,JoinableQueue模塊簡介,進程池 ...
  • A.值棧概述 值棧(ValueStack),通俗的來說就是Struts2裡面用來管理和存儲數據的東西。struts2項目部署運行後,底層會創建一個action實例,同時也會在記憶體上劃分一塊區域,這個區域就是值棧,該值棧對象會貫穿整個Action生命周期,用來存儲這個過程中的數據。 B.值棧結構 首先 ...
  • 參考鏈接: https://blog.csdn.net/czyt1988/article/details/52121360 http://blog.sina.com.cn/s/blog_a6fb6cc90101gv2p.html 1. QAxObject介紹 在QT中,有個自帶的QAxObject類 ...
  • ___setattr__魔方方法一定要註意防止無限遞歸當在此方法內部給屬性賦值的時候,那會調用此方法,又會重新賦值,無限重覆最後要歸於super是種解決方法。或者用dict方法。 1 class Recangle: 2 def __init__(self,width = 0,heigh = 0): ...
  • 在python3中爬蟲常用基本庫為urllib以及requests 本文主要描述urllib的相關內容 urllib包含四個模塊:requests——模擬發送請求 error——異常處理模塊 parse——關於URL處理方法的工具模塊 robotparser——通過識別網站robot.txt判斷網站 ...
  • 這裡 sqlproxy起到一個代理的作用,使用時無需關註 mysql和oracle的實現 ...
  • 什麼是優先順序隊列? 怎麼實現一個優先順序隊列? PriorityQueue是線程安全的嗎? PriorityQueue就有序的嗎? ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...