?? 銀行家算法c++.txt
字號:
/*
銀行家算法
銀行家可以把一定數(shù)量的資金供多個用戶周轉(zhuǎn)使用,為保證資金的安全銀行家規(guī)定:
1.當(dāng)一個用戶對資金的最大需求量不超過銀行家現(xiàn)有的資金就要接納該用戶;
2.用戶可以分期貸款,但垡的總數(shù)不能超過最大需求量;
3.當(dāng)銀行家現(xiàn)有的資金不能滿足用戶的沿需垡數(shù)時,對用戶的貸款可推遲支付,但總能使用戶在有限的時間里得到貸款;
4當(dāng)用戶得到所需的全部資金后,一定能在有限的時間里歸還所有的資金.
假設(shè)共有3類資源A B C,分別為10,5,7個
進程列表存在文件中,格式為
進程名 對A類資源需求數(shù)量 對B類資源需求數(shù)量 對c資源需求數(shù)量
輸出每個進程的處理結(jié)果
本程序包括:銀行家算法
VC++調(diào)試通過
(C)copyright by Neo
歡迎大家測試 請問題請Email:sony006@163.com
*/
#include<stdio.h>
#include<string.h>
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<conio.h>
const int MAX_P=20;
const int MAXA=10; //定義A類資源的數(shù)量
const int MAXB=5;
const int MAXC=7;
typedef struct node{
int a;
int b;
int c;
int remain_a;
int remain_b;
int remain_c;
}bank;
typedef struct node1{
char name[20];
int a;
int b;
int c;
int need_a;
int need_b;
int need_c;
}process;
bank banker;
process processes[MAX_P];
int quantity;
//初始化函數(shù)
void initial()
{
int i;
banker.a=MAXA;
banker.b=MAXB;
banker.c=MAXC;
banker.remain_a=MAXA;
banker.remain_b=MAXB;
banker.remain_c=MAXC;
for(i=0;i<MAX_P;i++){
strcpy(processes[i].name,"");
processes[i].a=0;
processes[i].b=0;
processes[i].c=0;
processes[i].need_a=0;
processes[i].need_b=0;
processes[i].need_c=0;
}
}
//新加作業(yè)
void add()
{
char name[20];
int flag=0;
int t;
int need_a,need_b,need_c;
int i;
cout<<endl;
cout<<"新加作業(yè)"<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"請輸入新加作業(yè)名:";
cin>>name;
for(i=0;i<quantity;i++){
if(!strcmp(processes[i].name,name)){
flag=1;
break;
}
}
if(flag){
cout<<"錯誤,作業(yè)已存在"<<endl;
}
else{
cout<<"本作業(yè)所需A類資源:";
cin>>need_a;
cout<<"本作業(yè)所需B類資源:";
cin>>need_b;
cout<<"本作業(yè)所需C類資源:";
cin>>need_c;
t=1;
cout<<need_a<<banker.remain_a;
if(need_a>banker.remain_a){
cout<<"錯誤,所需A類資源大于銀行家所剩A類資源"<<endl;
t=0;
}
if(need_b>banker.remain_b){
cout<<"錯誤,所需B類資源大于銀行家所剩B類資源"<<endl;
t=0;
}
if(need_c>banker.remain_c){
cout<<"錯誤,所需C類資源大于銀行家所剩C類資源"<<endl;
t=0;
}
if(t){
strcpy(processes[quantity].name,name);
processes[quantity].need_a=need_a;
processes[quantity].need_b=need_b;
processes[quantity].need_c=need_c;
quantity++;
cout<<"新加作業(yè)成功"<<endl;
}
else{
cout<<"新加作業(yè)失敗"<<endl;
}
}
}
//為作業(yè)申請資源
void bid()
{
char name[20];
int i,p;
int a,b,c;
int flag;
cout<<endl<<"為作業(yè)申請資源"<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"要申請資源的作業(yè)名:";
cin>>name;
p=-1;
for(i=0;i<quantity;i++){
if(!strcmp(processes[i].name,name)){
p=i;
break;
}
}
if(p!=-1){
cout<<"該作業(yè)要申請A類資源數(shù)量:";
cin>>a;
cout<<"該作業(yè)要申請B類資源數(shù)量:";
cin>>b;
cout<<"該作業(yè)要申請C類資源數(shù)量:";
cin>>c;
flag=1;
if((a>banker.remain_a)||(a>processes[p].need_a-processes[p].a)){
cout<<"錯誤,所申請A類資源大于銀行家所剩A類資源或該進程還需數(shù)量"<<endl;
flag=0;
}
if((b>banker.remain_b)||(b>processes[p].need_b-processes[p].b)){
cout<<"錯誤,所申請B類資源大于銀行家所剩B類資源或該進程還需數(shù)量"<<endl;
flag=0;
}
if((c>banker.remain_c)||(c>processes[p].need_c-processes[p].c)){
cout<<"錯誤,所申請C類資源大于銀行家所剩C類資源或該進程還需數(shù)量"<<endl;
flag=0;
}
if(flag){
banker.remain_a-=a;
banker.remain_b-=b;
banker.remain_c-=c;
processes[p].a+=a;
processes[p].b+=b;
processes[p].c+=c;
cout<<"為作業(yè)申請資源成功"<<endl;
}
else{
cout<<"為作業(yè)申請資源失敗"<<endl;
}
}
else{
cout<<"該作業(yè)不存在"<<endl;
}
}
//撤消作業(yè)
void finished()
{
char name[20];
int i,p;
cout<<endl<<"撤消作業(yè)"<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"要撤消作業(yè)名:";
cin>>name;
p=-1;
for(i=0;i<quantity;i++){
if(!strcmp(processes[i].name,name)){
p=i;
break;
}
}
if(p!=-1){
banker.remain_a+=processes[p].a;
banker.remain_b+=processes[p].b;
banker.remain_c+=processes[p].c;
for(i=p;i<quantity-1;i++){
processes[i]=processes[i+1];
}
strcpy(processes[quantity-1].name,"");
processes[quantity-1].a=0;
processes[quantity-1].b=0;
processes[quantity-1].c=0;
processes[quantity-1].need_a=0;
processes[quantity-1].need_b=0;
processes[quantity-1].need_c=0;
quantity--;
cout<<"撤消作業(yè)成功"<<endl;
}
else{
cout<<"撤消作業(yè)失敗"<<endl;
}
}
//查看資源情況
void view()
{
int i;
cout<<endl<<"查看資源情況"<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"銀行家所剩資源(剩余資源/總共資源)"<<endl;
cout<<"A類:"<<banker.remain_a<<"/"<<banker.a;
cout<<" B類:"<<banker.remain_b<<"/"<<banker.b;
cout<<" C類:"<<banker.remain_c<<"/"<<banker.c;
cout<<endl<<endl<<"作業(yè)占用情況(已占用資源/所需資源)"<<endl<<endl;
if(quantity>0){
for(i=0;i<quantity;i++){
cout<<"作業(yè)名:"<<processes[i].name<<endl;
cout<<"A類:"<<processes[i].a<<"/"<<processes[i].need_a;
cout<<" B類:"<<processes[i].b<<"/"<<processes[i].need_b;
cout<<" C類:"<<processes[i].c<<"/"<<processes[i].need_c;
cout<<endl;
}
}
else{
cout<<"當(dāng)前沒有作業(yè)"<<endl;
}
}
//顯示版權(quán)信息函數(shù)
void version()
{
cout<<endl<<endl;
cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
cout<<" ┃ 銀 行 家 算 法 ┃"<<endl;
cout<<" ┠───────────────────────┨"<<endl;
cout<<" ┃ (c)All Right Reserved Neo ┃"<<endl;
cout<<" ┃ sony006@163.com ┃"<<endl;
cout<<" ┃ version 2004 build 1122 ┃"<<endl;
cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
cout<<endl<<endl;
}
void main()
{
int chioce;
int flag=1;
initial();
version();
while(flag){
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"1.新加作業(yè) 2.為作業(yè)申請資源 3.撤消作業(yè)"<<endl;
cout<<"4.查看資源情況 0.退出系統(tǒng)"<<endl;
cout<<"請選擇:";
cin>>chioce;
switch(chioce){
case 1:
add();
break;
case 2:
bid();
break;
case 3:
finished();
break;
case 4:
view();
break;
case 0:
flag=0;
break;
default:
cout<<"選擇錯誤"<<endl<<endl;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -