#操作系统课程设计银行家算法流程图 源代码 设计报告.docx
- 文档编号:17278884
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:29
- 大小:203.65KB
#操作系统课程设计银行家算法流程图 源代码 设计报告.docx
《#操作系统课程设计银行家算法流程图 源代码 设计报告.docx》由会员分享,可在线阅读,更多相关《#操作系统课程设计银行家算法流程图 源代码 设计报告.docx(29页珍藏版)》请在冰点文库上搜索。
#操作系统课程设计银行家算法流程图源代码设计报告
操作系统课程设计-银行家算法(流程图+源代码+设计报告)
一、实验目的:
熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法,加深记意。
二、实验要求:
用高级语言编写和调试一个描述银行家算法的程序。
三、实验内容:
1、设计一个结构体,用于描述每个进程对资源的要求分配情况。
包括:
进程名——name[5],要求资源数目——command[m](m类资源),还需要资源数目——need[m],已分配资源数目——allo[m]。
2、编写三个算法,分别用以完成:
①申请资源;
②显示资源;③释放资源。
(动态完成)
4、程序流程图
5、源程序:
最新版本:
bk5.c
/*bk2.c:
:
可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*/
/*可修改#defineNP10*/
/*#defineNS5*//*资源种类*/
/*bk3.c:
:
可以继续分配资源(〉2)*/
/*bk4.c:
:
可保存分析结果*/
/*bk5.c:
:
除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*/
/*
四、程序流程图:
五、源程序:
最新版本:
bk5.c
/*bk2.c:
:
可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*/
/*可修改#defineNP10*/
/*#defineNS5*//*资源种类*/
/*bk3.c:
:
可以继续分配资源(〉2)*/
/*bk4.c:
:
可保存分析结果*/
/*bk5.c:
:
除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*/#include"string.h"
#include"stdio.h"
#include"dos.h"
#include"conio.h"
#defineMOVEIN1
#defineGUIYUE2
#defineACC3
#defineOK1
#defineERROR0
#defineMAXSH7
#defineMAXSHL10
#defineMAXINPUT50
#definemaxsize100
intact;
intip=0;
intline=0;/*line为要写的行号,全局变量*/
intwriteok;
intright;
charwel[30]={"WelcomeToUseAn_LiSystem"};
charente[76]={"警告:
未经作者同意不得随意复制更改!
"};
charrights[40]={"Copyright(c)2002"};
structdatetoday;
sssssssssssss;
ttttttttttttt
{intdata[maxsize];
inttop;
}stack;
intemptystack(stack*S)
{if(S->top==48&&S->data[S->top]==35)return
(1);/*35is'#'*/
elsereturn(0);
}
intpush(stack*S,intx)
{if(S->top>=maxsize-1)return(-1);
else{S->top++;
S->data[S->top]=x;
return(0);
}
}
intgettop(stack*S)
{returnS->data[S->top];
}
intpop(stack*S)
{if(emptystack(S)){
printf("thestackisempty\n");
exit
(1);}
elseS->top--;
returnS->data[S->top+1];
}
voidinitstack(stack*S)
{inti;
S->top=0;S->data[S->top]=35;
}
/*****模拟打字机的效果*********/delay_fun()
{
inti;
voidmusic();
for(i=0;;i++)
{
if(wel!
='\0')
{
delay(1000);
textcolor(YELLOW);
gotoxy(26+i,8);
cprintf("%c",wel);
printf("谢谢");
printf("网络");
music(1,60);
}
elsebreak;
}
delay(500000);
for(i=0;;i++)
{
if(ente!
='\0')
{
delay(1000);
textcolor(RED);/*显示警告及版权*/gotoxy(2+i,11);
cprintf("%c",ente);
music(1,60);
}
elsebreak;
}
delay(40000);
for(i=0;;i++)
{
if(rights!
='\0')
{
delay(1000);
textcolor(YELLOW);
gotoxy(30+i,14);
cprintf("%c",rights);
music(1,60);
}
else
break;
}
getch();
}
/*********登陆后的效果**********/logined()
{inti;
clrscr();
gotoxy(28,10);
textcolor(YELLOW);
cprintf("程序正在载入请稍候.....");
gotoxy(35,12);
for(i=0;i<=50;i++)
{
gotoxy(40,12);
delay(8000);
cprintf("%02d%已完成",i*2);gotoxy(i+15,13);
cprintf("\n");
cprintf("|");
}
main0();
}
/*********对PC扬声器操作的函数****/
voidmusic(intloop,intf)/*f为频率*/{inti;
for(i=0;i<30*loop;i++)
{
sound(f*20);
delay(200);}
nosound();
}
intanalys(ints,inta)
{inthh,pos;
switch(a)
{case(int)'i':
hh=0;break;
case(int)'+':
hh=1;break;
case(int)'*':
hh=2;break;
case(int)'(':
hh=3;break;
case(int)')':
hh=4;break;
case(int)'#':
hh=5;break;
case(int)'E':
hh=6;break;
case(int)'T':
hh=7;break;
case(int)'F':
hh=8;break;
default:
{printf("\nanalys()分析发现不该有的字符%c!
(位置:
%d)",a,ip+1);
writeerror('0',"\n............分析出现错误!
!
!
");
writeerror(a,"\n错误类型:
不该有字符");
printf("谢谢");
printf("网");
returnERROR;
}
}
pos=(s-48)*10+hh;
switch(pos)
{case3:
case43:
case63:
case73:
act=4;returnMOVEIN;
case0:
case40:
case60:
case70:
act=5;returnMOVEIN;
case11:
case81:
act=6;returnMOVEIN;
case92:
case22:
act=7;returnMOVEIN;
case84:
act=11;returnMOVEIN;
/*-------------------------------------------*/
case91:
case94:
case95:
act=1;returnGUIYUE;
case21:
case24:
case25:
act=2;returnGUIYUE;
case101:
case102:
case104:
case105:
act=3;returnGUIYUE;
case31:
case32:
case34:
case35:
act=4;returnGUIYUE;
case111:
case112:
case114:
case115:
act=5;returnGUIYUE;
case51:
case52:
case54:
case55:
act=6;returnGUIYUE;
/*+++++++++++++++++*/
case15:
returnACC;
/*******************************/
case6:
return1;
case7:
case47:
return2;
case8:
case48:
case68:
return3;
case46:
return8;
case67:
return9;
case78:
return10;
default:
{if(a=='#')printf("");
elseprintf("\nanalys()分析发现字符%c不是所期望的!
(位置:
%d)",a,ip+1);
writeerror('0',"\n...........分析出现错误!
!
!
");
writeerror(a,"\n错误类型:
字符");
writeerror('0',"不是所期望的!
");
printf("谢谢");
printf("网");
returnERROR;
}
}
}
intwritefile(inta,char*st)
{FILE*fp;
fp=fopen("an_slr.txt","a");
if(fp==0){printf("\nwriteerror!
!
");writeok=0;}
else{if(a==-1)
{fprintf(fp,"%s",st);/*若a==-1则为添加的注释*/
}
elseif(a==-2)
{getdate(&today);
gettime(&now);
fprintf(fp,"\n测试日期:
%d-%d-%d",today.da_year,today.da_mon,today.da_day);
fprintf(fp,"
}
测试时间:
%02d:
%02d:
%02d",now.ti_hour,now.ti_min,now.ti_sec);
elseif(a>=0)fprintf(fp,"\nstep:
%02d,%s",a,st);
writeok=1;
fclose(fp);}
returnwriteok;
}
intwriteerror(chara,char*st)/*错误类型文件*/
{FILE*fpp;
fpp=fopen("an_slr.txt","a");
if(fpp==0){printf("\nwriteerror!
!
");writeok=0;}
else{if(a=='0')fprintf(fpp,"%s",st);/*若a=='0'则为添加的注释*/elsefprintf(fpp,"%s\'%c\'(位置:
%d)",st,a,ip+1);
writeok=1;
fclose(fpp);}
returnwriteok;
}
/*^^^^^^^^^^^^^^^^^^^^^^*/
main0()
{intan,flag=1,action,lenr;
chara,w[MAXINPUT];
intlen,s,ss,aa,ana;
stack*st;
charr[MAXSH][MAXSHL];/*初始化产生式*/
strcpy(r[0],"S->E");
strcpy(r[1],"E->E+T");
strcpy(r[2],"E->T");
strcpy(r[3],"T->T*F");
strcpy(r[4],"T->F");
strcpy(r[5],"F->(E)");
strcpy(r[6],"F->i");
clrscr();
printf("\npleaseinputanalysestring:
\n");
gets(w);
len=strlen(w);
w[len]='#';
w[len+1]='\0';
initstack(st);
push(st,48);/*(int)0进栈*/
writefile(-1,"\n------------------------SLR
(1)词法分析器-------------------------");
writefile(-1,"\n
计本003安完成于2003.01.1214:
04");
writefile(-1,"\n谢谢");
writefile(-1,"网");
writefile(-1,"\n以下为串");
writefile(-1,w);
writefile(-1,"('#'为系统添加)的分析结果:
");writefile(-2,"");
do{
s=gettop(st);
aa=(int)w[ip];
action=analys(s,aa);
if(action==MOVEIN)
{ss=48+act;
push(st,aa);
push(st,ss);/*ifss=4int=52*/
ip++;
}
elseif(action==GUIYUE)
{lenr=strlen(r[act])-3;
for(an=0;an<=2*lenr-1;an++)
pop(st);/*#0*/
s=gettop(st);/*s=0*/
push(st,(int)r[act][0]);
/*将产生式左端F进栈*/
ana=analys(s,(int)r[act][0])+48;
if(ana>59)printf("\分析出错:
ana>59!
!
!
");
push(st,ana);
/*analys(s,aa)即为goto(s',aa)*/
if((line+1)%20==0)
{printf("\nThisscreenisfull,pressanykeytocontinue!
!
!
");getche();
clrscr();
}
printf("step%02d:
%s\n",line++,r[act]);
writefile(line,r[act]);
}
elseif(action==ACC)
{flag=0;
right=1;}
elseif(action==ERROR)
{flag=0;
right=0;
}/*接受成功*/
else
{flag=0;
right=0;
}/*出错*/
}while(flag==1);
if(right==1)printf("\nok,输入串%s为可接受串!
!
",w);
if(right==0)printf("\nsorry,输入串%s分析出错!
!
",w);
if(writeok==1){printf("\nAnWinsofthavewroteafilean_slr.txt");
if(right==1)writefile(-1,"\n最终结果:
输入串为可接受串!
");
}
}
main()/*主函数*/
{clrscr();
delay_fun();
logined();
}
六、测试报告-操作系统课程设计-银行家算法(流程图+源代码+设计报告)六、测试报告:
(测试结果保存于系统生成的an.txt文件中)
以下为课本上的实例:
:
-------------------------------------------------------------------------------------
========================银行家算法测试结果=========================
-------------------------------------------------------------------------------------
T0时刻可用资源(Available)A:
3,B:
3,C:
2
测试日期:
2003-6-28
请求分配时间:
14:
07:
29
经测试,可为该进程分配资源。
以下为资源分配表
资源
WorkNeedAllocationWork+AllocFinish
IDABCABCABCABC
P01030302010202020000050302TRUE
P03050302000101020101070403TRUE
P00070403070403000100070503TRUE
P02070503060000030002100505TRUE
P04100505040301000002100507TRUE#include"string.h"
#include"stdio.h"
#include"dos.h"
#include"conio.h"
#defineMOVEIN1
#defineGUIYUE2
#defineACC3
#defineOK1
#defineERROR0
#defineMAXSH7
#defineMAXSHL10
#defineMAXINPUT50
#definemaxsize100
intact;
intip=0;
intline=0;/*line为要写的行号,全局变量*/
intwriteok;
intright;
charwel[30]={"WelcomeToUseAn_LiSystem"};
charente[76]={"警告:
未经作者同意不得随意复制更改!
"};charrights[40]={"Copyright(c)2002"};
structdatetoday;
sssssssssssss;
ttttttttttttt
{intdata[maxsize];
inttop;
}stack;
intemptystack(stack*S)
{if(S->top==48&&S->data[S->top]==35)return
(1);/*35is'#'*/
elsereturn(0);
}
intpush(stack*S,intx)
{if(S->top>=maxsize-1)return(-1);
else{S->top++;
S->data[S->top]=x;
return(0);
}
}
intgettop(stack*S)
{returnS->data[S->top];
}
intpop(stack*S)
{if(emptystack(S)){
printf("thestackisempty\n");
exit
(1);}
elseS->top--;
returnS->data[S->top+1];
}
voidinitstack(stack*S)
{inti;
S->top=0;S->data[S->top]=35;
}
/*****模拟打字机的效果*********/delay_fun()
{
inti;
voidmusic();
for(i=0;;i++)
{
if(wel!
='\0')
{
delay(1000);
textcolor(YELLOW);
gotoxy(26+i,8);
cprintf("%c",wel);
printf("谢谢");
printf("网络");
music(1,60);
}
elsebreak;
}
delay(500000);
for(i=0;;i++)
{
if(ente!
='\0')
{
delay(1000);
textcolor(RED);/*显示警告及版权*/gotoxy(2+i,11);
cprintf("%c",ente);
music(1,60);
}
elsebreak;
}
delay(40000);
for(i=0;;i++)
{
if(rights!
='\0')
{
delay(1000);
textcolor(YELLOW);
gotoxy(30+i,14);
cprintf("%c",rights);
music(1,60);
}
else
break;
}
getch();
}
/*********登陆后的效果**********/logined()
{inti;
clrscr();
gotoxy(28,10);
textcolor(YELLOW);
cprintf("程序正在载入请稍候.....");
gotoxy(35,12);
for(i=0;i<=50;i++)
{
gotoxy(40,12);
delay(8000);
cprintf("%02d%已完成",i*2);gotoxy(i+15,13);
cprintf("\n");
cprintf("|");
}
main0();
}
/*********对PC扬声器操作的函数****/
voidmusic(intloop,intf)/*f为频率*/{inti;
for(i=0;i<30*loop;i++)
{
sound(f*20);
delay(200);}
nosound();
}
intanalys(ints,inta)
{inthh,pos;
switch(a)
{case(int)'i':
hh=0;break;
case(int)'+':
hh=1;break;
case(int)'*':
hh=2;break;
case(int)'(':
hh=3;break;
case(int)')':
hh=4;br
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- #操作系统课程设计银行家算法流程图 源代码 设计报告 操作系统 课程设计 银行家 算法 流程图 设计 报告