操作系统课程设计-银行家算法(流程图+源代码+设计报告)一、实验目的:熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法,加深记意。二、实验要求:用高级语言编写和调试一个描述银行家算法的程序。三、实验内容:1、设计一个结构体,用于描述每个进程对资源的要求分配情况。包括:进程名——name[5],要求资源数目——command[m](m类资源),还需要资源数目——need[m],已分配资源数目——allo[m]。2、编写三个算法,分别用以完成:①申请资源;②显示资源;③释放资源。(动态完成)四、程序流程图五、源程序:最新版本: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::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*/#includestring.h#includestdio.h#includedos.h#includeconio.h#defineMOVEIN1#defineGUIYUE2#defineACC3#defineOK1#defineERROR0#defineMAXSH7#defineMAXSHL10#defineMAXINPUT50#definemaxsize100intact;intip=0;intline=0;/*line为要写的行号,全局变量*/intwriteok;intright;charwel[30]={WelcomeToUseAn_LiSystem};charente[76]={警告:未经作者同意不得随意复制更改!};charrights[40]={Copyright(c)2002};structdatetoday;structtimenow;typedefstruct{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);}elsebreak;}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;i30*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