我做的银行家算法,结果在里面有个算法循环有问题,跳不出来了,高手们给指点指点嘛!
先谢谢哈!!
代码如下:
#include"lhj.h"
#include <iostream.h>
//以下是主函数
void main(){
void changedata(int);
void resetdata(int);
int checkdata(int);
void showdata();
i=0;
char flag='Y';
showdata();
printf("各种资源的总数量为:\n");
printf("资源A:10,资源B:5,资源C:7 \n");
while(flag=='Y'||flag=='y')
{
//i=-1;
//while(i<0||i>=M)
//{
printf("请输入需申请资源的进程号(从0到");
printf("%d",M-1);
printf(",否则重新输入!):");
scanf("%d",&i);
if(i<0||i>=M)printf("输入的进程号不存在,重新输入!\n");
printf("请输入进程%d申请的资源数:\n",i);
for (j=0;j<N;j++)
{
printf("输入资源%d:\n",j);
scanf("%d",&Request[j]);
}
for (j=0;j<N;j++)
{
if(Request[j]>Need[i][j]) //银行家算法第一步
{
printf("进程%d申请的资源数大于进程还需要第%d类资源的资源量!申请不合理!请重新选择!\n",i,j);
flag='N';
break;
}
else
{
if (Request[j]>Available[j]) //银行家算法第二步
{
printf("进程%d申请的资源数大于系统可用%d申请的资源数大于系统可用%d类资源的资源量!申请不合理!请重新选择!\n",i,j);
flag='N';
break;
}
}
} //for
//}
if(flag=='Y'||flag=='y')
{
changedata(i);
if(checkdata(i))
{
showdata();
}
else
{
resetdata(i);
showdata();
}
}//if
printf("\n");
printf("是否继续银行家算法,按'Y'或'y'键继续,按'N'键退出: ");
cin>>flag;
}//while
}
//以下是未进行安全检查之前对资源的分配
void changedata(int k)
{
for (j=0;j<N;j++)
{
Available[j]=Available[j]-Request[j];
Allocation[k][j]=Allocation[k][j]+Request[j];
Need[k][j]=Need[k][j]-Request[j];
}
}
//以下是对银行家算法进行检查
int checkdata(int k)
{
i=0;
k=0;
i=k;
int Work1;
int Work[N],Finish[M],temp[M];
for(i=0;i<M;i++)
Finish[i]=false;
for(j=0;j<N;j++)
{
Work[j]=Available[j];
}
while(1)
{
while(i<M)
{
for(j=0;j<N;j++)
{
Work1=Work[j];
if(Finish[i]==false&&Need[i][j]<=Work[j])
{
Work[j]=Work[j]+Allocation[i][j];
Finish[i]=true;
temp[k]=i;
k++;
}
else
{
i++;
}
}//for
}//while
if(Work1==Work[j])break;
}//while
//for(i=0;i<M;i++)
//{
if(Finish[0]==true&&Finish[1]==true&&Finish[2]==true&&Finish[3]==true&&Finish[4]==true)
{
printf("\n");
printf("经安全性检查,系统安全, 本次资源申请成功!!!\n");
printf("\n");
printf(" 本次安全序列为:");
for(i=0;i<M;i++)
{
printf("进程");
printf("%d",temp[i]);
printf("->");
return 1;
}
}
//}
// {
// }
else
{
printf("\n");
printf("系统不安全!!! 本次资源申请不成功!!!\n");
printf("\n");
return 0;
}
//}
}
//以下是进行安全检查之后对资源的重新分配
void resetdata(int k)
{
for (j=0;j<N;j++)
{
Available[j]=Available[j]+Request[j];
Allocation[k][j]=Allocation[k][j]-Request[j];
Need[k][j]=Need[k][j]+Request[j];
}
}
//以下是定义各个进程的相关信息的一个函数:
void showdata(){
printf("各种资源的最大需求量为:\n");
for(i=0;i<M;i++)
{
printf("进程P%d三种资源的最大需求量为:\n",i);
printf("%d %d %d\n",Max[i][0],Max[i][1],Max[i][2]);
}
printf("各种资源得到的分配量为:\n");
for(i=0;i<M;i++)
{
printf("进程P%d三种资源得到的分配量为:\n",i);
printf("%d %d %d\n",Allocation[i][0],Allocation[i][1],Allocation[i][2]);
}
printf("各种资源的当前需求量为:\n");
for(i=0;i<M;i++)
{
printf("进程P%d三种资源的当前需求量为:\n",i);
printf("%d %d %d\n",Need[i][0],Need[i][1],Need[i][2]);
}
printf("当前可利用资源量:\n");
printf("%d %d %d\n",Available[0],Available[1],Available[2]);
}