#include<iostream>
#include<assert.h>
#include<graphics.h>
#include<time.h>
#include<conio.h>
using namespace std;
const int MAXPROCESS=100;
const int MAXRESOURCE=100;
int Available[MAXRESOURCE]; //可用资源向量
int Max[MAXPROCESS][MAXRESOURCE]; //最大需求矩阵
int Allocation[MAXPROCESS][MAXRESOURCE]; //分配矩阵
int Need[MAXPROCESS][MAXRESOURCE]; //需求矩阵
int Request[MAXRESOURCE]; //请求向量
int Work[MAXRESOURCE]; //工作向量
bool Finish[MAXPROCESS];
int SafeSeries[MAXPROCESS]; //安全序列
int n; //进程数
int m; //资源数
void Init() //初始化模块
{
rectangle(100, 50, 680, 100); //输入进程数
outtextxy(110, 60, "请输入进程总数:");
char a[20],num[20];
int i,g,j;
int c;
for(i=0;i<20;i++)
{
if((c=getchar())!='\n')
a[i]=c;
else
{
a[i]=0;
break;
}
}
n=atoi(a);
sprintf(num,"%d",n);
outtextxy(400,60,num);
rectangle(100, 100, 680, 150); //输入资源种类数
outtextxy(110, 110, "请输入资源种类数:");
for(i=0;i<20;i++)
{
if((c=getchar())!='\n')
a[i]=c;
else
{
a[i]=0;
break;
}
}
m=atoi(a);
sprintf(num,"%d",m);
outtextxy(400,110,num);
rectangle(100, 150, 680, 200); //输入资源数目
outtextxy(110, 160, "请输入可利用资源数目:");
int f=420;
for( j = 0; j < m; ++j )
{
for(i=0;i<20;i++)
{
if((c=getchar())!='\n')
a[i]=c;
else
{
a[i]=0;
break;
}
}
Available[j]=atoi(a);
sprintf(num,"%d",Available[j]);
outtextxy(f=f+30,160,num);
}
rectangle(100, 200, 680,260+n*30); //最大矩阵输入
outtextxy(110, 210, "最大需求矩阵输入:");
int b=250,w=450,d=650,q=110;
for( i = 0; i < n; ++i )
{
for( j = 0; j < m; ++j )
{
for(int k=0;k<20;k++)
{
if((c=getchar())!='\n')
a[k]=c;
else
{
a[k]=0;
break;
}
}
Max[i][j]=atoi(a);
sprintf(num,"%d",Max[i][j]);
outtextxy(q=q+30,b,num);
}
b=b+30;
q=110;
}
rectangle(100, 400, 680,460+n*30); //最大矩阵输入
outtextxy(110, 410, "分配矩阵输入:");
q=110;
for( i= 0; i < n; ++i )
{
for( j = 0; j < m; ++j )
{
for(int k=0;k<20;k++)
{
if((c=getchar())!='\n')
a[k]=c;
else
{
a[k]=0;
break;
}
}
Allocation[i][j]=atoi(a);
sprintf(num,"%d",Allocation[i][j]);
outtextxy(q=q+30,w,num);
}
w=w+30;
q=110;
}
rectangle(100, 600, 680,660+n*30); //最大矩阵输入
outtextxy(110,610, "需求矩阵输入:");
q=110;
for( i = 0; i < n; ++i )
{
for( j = 0; j < m; ++j )
{
for(int k=0;k<20;k++)
{
if((c=getchar())!='\n')
a[k]=c;
else
{
a[k]=0;
break;
}
}
Need[i][j]=atoi(a);
sprintf(num,"%d",Need[i][j]);
outtextxy(q=q+30,d,num);
}
d=d+30;
q=110;
}
}
bool IsSafe() //判断安全性算法
{
int i=0;
for (i=0;i<n;++i)
{
if(Finish[i] == true)
continue;
else
break;
}
if(i == n)
return true; //安全
else
return false; //不安全
}
bool Select(int &tmp,int tmpNeed[][MAXRESOURCE]) //选则模块
{
//选择一个Finish[i]=false,Need[i]<=Work[i]
int j=0;
for (int i=0;i<n;++i)
{
if(Finish[i])
continue;
for (j=0;j<m;++j)
{
if(tmpNeed[i][j] > Work[j])
break;
}
if(j == m)
{
tmp=i;
return true;
}
}
return false;
}
bool Safe(int *tmpAvail,int tmpAlloc[][MAXRESOURCE],int tmpNeed[][MAXRESOURCE]) //输出安全序列模块
{
for(int i = 0; i < n; ++i)
{
Finish[i] = false;
}
for (int j = 0; j < m; ++j)
{
Work[j] = tmpAvail[j];
}
int tmp=0;
int index = 0;
while(Select(tmp,tmpNeed))
{
Finish[tmp] = true;
for (int k = 0; k < m; ++k)
{
Work[k] += tmpAlloc[tmp][k];
}
SafeSeries[index++] = tmp;
}
if(IsSafe())
return true; //安全
else
return false; //不安全
}
void Display() //显示模块
{
int i=0;
int j=0,a=110,b=250,c=450,d=650;
char num[20];
rectangle(100, 100, 500, 200);
outtextxy(110,110,"当前可利用的资源数目:");
for(i = 0; i < m; ++i)
{
sprintf(num,"%d",Available[i]);
outtextxy(a=a+20,150,num);
}
rectangle(100, 200, 500, 260+n*30);
outtextxy(110,210,"最大需求矩阵:");
a=110;
for(i = 0; i < n; ++i )
{
for( j = 0; j < m; ++j)
{
sprintf(num,"%d",Max[i][j]);
outtextxy(a=a+20,b,num);
}
b=b+30;
a=110;
}
rectangle(100, 400, 500, 460+n*30);
outtextxy(110,410,"分配矩阵:");
a=110;
for( i = 0; i < n; ++i )
{
for( j = 0; j < m; ++j )
{
sprintf(num,"%d",Allocation[i][j]);
outtextxy(a=a+20,c,num);
}
c=c+30;
a=110;
}
rectangle(100, 600, 500, 660+n*30);
outtextxy(110,610,"需求矩阵:");
a=110;
for( i = 0; i < n; ++i )
{
for( j = 0; j < m; ++j )
{
sprintf(num,"%d",Need[i][j]);
outtextxy(a=a+20,d,num);;
}
d=d+30;
a=110;
}
}
void BankA() //银行家算法
{
int i=0;
int index=0;
rectangle(100, 50, 680, 100); //输入进程数
outtextxy(110, 60, "请输入请求资源的进程下标:");
char a[20],num[20];
int j;
char c;
for(i=0;i<20;i++)
{
if((c=getchar())!='\n')
a[i]=c;
else
{
a[i]=0;
break;
}
}
index=atoi(a);
sprintf(num,"%d",index);
outtextxy(650,60,num);
assert(index < n && index >= 0);
rectangle(100, 100, 680, 150); //输入进程数
outtextxy(110, 110, "请输入当前的请求资源:");
int b=500;
for (j=0;j<m;++j)
{
for(i=0;i<20;i++)
{
if((c=getchar())!='\n')
a[i]=c;
else
{
a[i]=0;
break;
}
}
Request[j]=atoi(a);
sprintf(num,"%d",Request[j]);
outtextxy(b=b+30,110,num);
}
for (i=0;i<m;++i)
{
if(Request[i] <= Need[index][i])
{
continue;
}
else
{
rectangle(300, 550, 650, 600);
outtextxy(310, 560, "第一次试分配失败");
break;
}
}
if(i < 3) //如果第一次试分配失败则不执行后面的语句
{
return ;
}
for(i=0;i<m;++i)
{
if(Request[i] <= Available[i])
{
continue;
}
else
{
rectangle(300, 550, 650, 600);
outtextxy(310, 560, "第二次试分配失败");
break;
}
}
if(i <3) //如果第二次试分配失败则不同执行后面的语句
{
return ;
}
//开始试分配
int tmpAvail[MAXRESOURCE]={0};
int tmpAlloc[MAXPROCESS][MAXRESOURCE]={0};
int tmpNeed[MAXPROCESS][MAXRESOURCE]={0};
memmove(tmpAvail,Available,sizeof(int)*MAXRESOURCE);
memmove(tmpAlloc,Allocation,sizeof(int)*MAXPROCESS*MAXRESOURCE);
memmove(tmpNeed,Need,sizeof(int)*MAXPROCESS*MAXRESOURCE);
for (int i=0;i<m;++i)
{
tmpAvail[i] -= Request[i];
tmpAlloc[index][i] += Request[i];
tmpNeed[index][i] -= Request[i];
}
bool ret=Safe(tmpAvail,tmpAlloc,tmpNeed);
if(ret == true)
{
memmove(Available,tmpAvail,sizeof(int)*MAXRESOURCE);
memmove(Allocation,tmpAlloc,sizeof(int)*MAXPROCESS*MAXRESOURCE);
memmove(Need,tmpNeed,sizeof(int)*MAXPROCESS*MAXRESOURCE);
cout<<"进程p"<<index<<"请求资源允许"<<endl;
}
else
{
for(int i = 0; i < n; ++i)
{
Finish[i] = false;
}
rectangle(300, 550, 650, 600);
outtextxy(310, 560, "第三次试分配失败");
}
}
void Menu() //界面函数
{
initgraph(880, 880);
setbkcolor(LIGHTGRAY);
cleardevice();
setlinecolor(BLACK);
rectangle(80 , 50 , 800, 200);
rectangle(300, 300, 580, 350);
rectangle(300, 400, 580, 450);
rectangle(300, 500, 580, 550);
rectangle(300, 600, 580, 650);
rectangle(300, 700, 580, 750);
settextcolor(BLACK);
settextstyle(100,0,0);
outtextxy(200,70,"银行家算法");
settextstyle(30, 0, 0);
outtextxy(320, 310, "测试安全性代码");
outtextxy(320, 410, "测试银行家算法");
outtextxy(320, 510, "初始化");
outtextxy(320, 610, "打印矩阵");
outtextxy(320, 710, "退出");
}
int main() //主函数
{
int index=0;
int flag=1;
MOUSEMSG m;
Menu();
while (flag) //功能函数调用
{
m = GetMouseMsg();
if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>300 && m.y < 350)
{
cleardevice();
Safe(Available,Allocation,Need);
if(IsSafe())
{
rectangle(100, 200, 500, 300);
outtextxy(110,210,"安全序列为:");
int a=110;
char num[20];
for (int i = 0; i < n ; ++i)
{
sprintf(num,"%d",SafeSeries[i]);
outtextxy(a=a+30,250,"P");
outtextxy(a=a+20,250,num);
}
for(int i = 0; i < n; ++i)
{
Finish[i] = false;
}
}
else
{
rectangle(100, 400, 500, 500);
outtextxy(110,410,"该时刻是不安全的!");
}
rectangle(700, 50, 870, 100);
outtextxy(710, 60, "返回主界面");
int t=1;
MOUSEMSG m1;
while(t)
{
m1= GetMouseMsg();
if(m1.mkLButton&&m1.x > 700 &&m1.x < 870 &&m1.y>50 && m1.y < 100)
{
Menu();
t=0;
}
}
}
else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>400 && m.y < 450)
{
cleardevice();
BankA();
char c=getchar();
while(c)
{
if(IsSafe())
{
rectangle(100, 200, 500, 300);
outtextxy(110,210,"安全序列为:");
int a=110;
char num[20];
for (int i = 0; i < n ; ++i)
{
sprintf(num,"%d",SafeSeries[i]);
outtextxy(a=a+30,250,"P");
outtextxy(a=a+20,250,num);
}
for(int i = 0; i < n; ++i)
{
Finish[i] = false;
}
}
else
{
rectangle(100, 400, 500, 500);
outtextxy(110,410,"该时刻是不安全的!");
}
c=0;
}
rectangle(700, 50, 870, 100);
outtextxy(710, 60, "返回主界面");
int t=1;
MOUSEMSG m2;
while(t)
{
m2= GetMouseMsg();
if(m2.mkLButton&&m2.x > 700 &&m2.x < 870 &&m2.y>50 && m2.y < 100)
{
Menu();
t=0;
}
}
}
else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>500 && m.y < 550)
{
cleardevice();
Init();
rectangle(700, 50, 870, 100);
outtextxy(710, 60, "返回主界面");
int t=1;
MOUSEMSG m3;
while(t)
{
m3= GetMouseMsg();
if(m3.mkLButton&&m3.x > 700 &&m3.x < 870 &&m3.y>50 && m3.y < 100)
{
Menu();
t=0;
}
}
}
else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>600 && m.y < 650)
{
cleardevice();
Display();
rectangle(700, 50, 870, 100);
outtextxy(710, 60, "返回主界面");
int t=1;
MOUSEMSG m4;
while(t)
{
m4= GetMouseMsg();
if(m4.mkLButton&&m4.x > 700 &&m4.x < 870 &&m4.y>50 && m4.y < 100)
{
Menu();
t=0;
}
}
}
else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>700 && m.y < 750)
flag=0;
}
}
使用easyx画了界面!