此程式在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