📄 dijkstra.c
字号:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define N 5
#define M 3
int p[N];
int Available[M]; //可使用资源向量
int Max[N][M]; //最大需求矩阵
int Allocation[N][M]; //分配矩阵
int Need[N][M]; //需求矩阵
int Work[N]; //工作向量
int Finish[N]; //状态标志
int Request[N][M]; //进程申请资源向量
//读入最大需求矩阵
void readMax ()
{
int i;
FILE *fp ; //读文件
if( (fp=fopen("bao1.txt","r")) == NULL ) {
printf("文件不存在\n") ;
}
else
{
printf("最大需求矩阵\n");
printf("进程\t资源A\t资源B\t资源C\n");
for(i=0; i<N; i++)
{
fscanf(fp,"%d %d %d\n",&Max[i][0],&Max[i][1],&Max[i][2]) ;
printf("%d\t%d\t%d\t%d\n",i,Max[i][0],Max[i][1],Max[i][2]) ;
}
}
}
//读入分配矩阵
void readAllocation()
{
int i;
FILE *fp ; //读文件
if( (fp=fopen("bao2.txt","r")) == NULL ) {
printf("文件不存在\n") ;
}
else
{
printf("分配矩阵\n");
printf("进程\t资源A\t资源B\t资源C\n");
for(i=0; i<N; i++)
{
fscanf(fp,"%d %d %d\n",&Allocation[i][0],&Allocation[i][1],&Allocation[i][2]) ;
printf("%d\t%d\t%d\t%d\n",i,Allocation[i][0],Allocation[i][1],Allocation[i][2]) ;
}
}
}
//判断函数
int just(int a,int b,int c,int d,int e,int f)
{
if((a<=d)&&(b<=e)&&(c<=f))return 1;
else return 0;
}
int safecheck()//安全检查算法
{
int i;
int j;
int k=0;
for(i=0;i<N;i++)
Finish[i]=0;
for(i=0;i<M;i++)
Work[i]=Available[i];
for(j=0;j<N;j++)
for(i=0;i<N;i++)
{
if(Finish[i]==0&&just(Need[i][0],Need[i][1],Need[i][2],Work[0],Work[1],Work[2]))
{
for(j=0;j<M;j++)
{
Work[j]=Work[j]+Allocation[i][j];
Finish[i]=1;
}
p[k]=i;
k++;break;
}
}
for(i=0,j=0;i<N;i++)
{
if(Finish[i]==0)j++;
}
if(j==0)return 1;
else return 0;
}
//银行家算法
void process()
{
int i;
int j;
int m;
int n;
int l;
int a[3]={10,5,7};//定义3类资源总数
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
a[i]=a[i]-Allocation[j][i];
Available[i]=a[i];
}
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{
Max[i][j]=Max[i][j]-Allocation[i][j];
Need[i][j]=Max[i][j];
}
printf("共有5个进程0,1,2,3,4\n");
do{
printf("请输入进程名\n");
scanf("%d",&m);
printf("请输入请求的资源数\n");
scanf("%d %d %d",&Request[m][0],&Request[m][1],&Request[m][2]);
if(!just(Request[m][0],Request[m][1],Request[m][2],Need[m][0],Need[m][1],Need[m][2]))
{
printf("进程申请的资源数多于它自己申报的最大量\n");
}
else
{
if(!just(Request[m][0],Request[m][1],Request[m][2],Available[0],Available[1],Available[2]))
printf("无足够资源\n");
else
{
for(n=0;n<M;n++)
{//试探性分配
Available[n]=Available[n]-Request[m][n];
Allocation[m][n]=Allocation[m][n]+Request[m][n];
Need[m][n]=Need[m][n]-Request[m][n];
}
i=safecheck();
if(i==0)
{
printf("系统处于不安全状态\n");
for(n=0;n<M;n++)
{//恢复原来的资源分配状态
Available[n]=Available[n]+Request[m][n];
Allocation[m][n]=Allocation[m][n]-Request[m][n];
Need[m][n]=Need[m][n]+Request[m][n];
}
}
else
{
printf("系统处于安全状态\n");
printf("得到安全序列:");
for(i=0;i<N;i++)
printf("%d ",p[i]);
printf("\n");
}
}
}
printf("是否继续申请资源 是按0 否按其他键结束\n");
scanf("%d",&l);
}
while(l==0);
}
void main()
{
readMax ();
readAllocation();
process();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -