版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一.试验目的用高级语言编写和调试一种简朴的文献系统,模拟文献管理的工作过程。从而对多种文献操作命令的实质内容和执行过程有比较深入的理解。二、试验规定规定设计一种n个顾客的文献系统,每次顾客可保留m个文献,顾客在一次运行中只能打开一种文献,对文献必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。程序采用二级文献目录(即设置主目录[MFD])和顾客文献目录(UFD)。此外,为打开文献设置了运行文献目录(AFD)。在执行读写命令时,需改读写指针。因系统小,文献目录的检索使用了简朴的线性搜索。文献保护简朴使用了三位保护码:容许读写执行、对应位为1,对应位为0,则表达不容许读写、执行。程序中使用的重要设计构造如下:主文献目录和顾客文献目录(MFD、UFD)、打开文献目录(AFD)(即运行文献目录)MDF顾客名文献目录指针UFD文献名保护码文献长度AFD打开文献名打开保护码读写指针文献系统算法的流程图如下:#include<stdio.h>#include<string.h>#defineN10#defineL10#defineS6structmfd_type{ charuname[20]; intuaddr;};structufd_type{ charfname[20]; charfattr[10]; intrecordl; intaddrf;};structuof_type{ charfname[20]; charfattr[10]; intrecordl; charfstatue;//1:建立0:打开 intreadp; intwritep;};intfdph[N*L];//寄存文献在磁盘上的第一种空间编号intfdpt[N*L];//寄存文献在磁盘上的最末一种空间编号intdisk[400];//寄存磁盘空闲块号intdiskt,diskh;//空闲块的尾、首指针最末structmfd_typemfd[N];structufd_typeufd[N*L];structuof_typeuof[N*S];inttemp,mi,ni,uno,ucounter;voidcreate(charcfname[20],intcrecordl,charcfattr[10]){ intcltemp1=uno*L,cltemp2=(uno+1)*L,frd;while((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,cfname)!=0)) cltemp1++; if(strcmp(ufd[cltemp1].fname,cfname)!=0) { cltemp1=uno*L; while((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,"")!=0))cltemp1++; if(strcmp(ufd[cltemp1].fname,"")==0) { frd=cltemp1; cltemp1=uno*S; cltemp2=(uno+1)*S; while((cltemp1<cltemp2)&&(strcmp(uof[cltemp1].fname,"")!=0))cltemp1++; if(strcmp(uof[cltemp1].fname,"")==0) { if(disk[diskh]!=-1) { strcpy(uof[cltemp1].fname,cfname); strcpy(uof[cltemp1].fattr,cfattr); uof[cltemp1].recordl=crecordl; uof[cltemp1].fstatue=1; uof[cltemp1].readp=disk[diskh]; uof[cltemp1].writep=disk[diskh]; fdph[frd]=disk[diskh]; fdpt[frd]=disk[diskh]; strcpy(ufd[frd].fname,cfname); strcpy(ufd[frd].fattr,cfattr); ufd[frd].recordl=crecordl; ufd[frd].addrf=disk[diskh]; diskh=disk[diskh]; printf("%s\n","文献建立成功!"); } elseprintf("%s\n","磁盘没有空间,不能建文献!"); } elseprintf("%s\n","没有空的登记拦1,不能建文献"); } elseprintf("%s\n","没有空的登记拦2,不能建文献"); } elseprintf("%s\n","同名文献不能建立!");};voidopen(charpfname[20],charooptype[10]){ intcltemp1=uno*L,cltemp2=(uno+1)*L; intcltemp3=uno*S,cltemp4=(uno+1)*S;while((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,pfname)!=0))cltemp1++; if(strcmp(ufd[cltemp1].fname,pfname)==0) { while((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,pfname)!=0))cltemp3++; if(strcmp(uof[cltemp3].fname,pfname)==0)//有文献 { if(uof[cltemp3].fstatue==0)printf("%s\n","文献已打开!"); elseprintf("%s\n","此文献正在建立,不能打开!"); } else//无文献 { if(strcmp(ufd[cltemp1].fattr,ooptype)!=0)printf("%s\n","操作不合法,不能打开!"); else { cltemp3=uno*S; while((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,"")!=0))cltemp3++; if(strcmp(uof[cltemp3].fname,"")) printf("%s\n","在已开表中没有空拦,不能打开文献!"); else { strcpy(uof[cltemp3].fname,pfname); uof[cltemp3].recordl=ufd[cltemp1].recordl; strcpy(uof[cltemp3].fattr,ufd[cltemp1].fattr); uof[cltemp3].readp=ufd[cltemp1].addrf; uof[cltemp3].writep=ufd[cltemp1].addrf; uof[cltemp3].fstatue=0; printf("%s\n","打开文献成功!"); } } } } else printf("%s\n","此文献已不存在,不能打开!");};voidwrite(charwfname[20],intwrecordno){ intcltemp1=uno*L,cltemp2=(uno+1)*L; intcltemp3=uno*S,cltemp4=(uno+1)*S;while((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,wfname)!=0))cltemp3++; if(strcmp(uof[cltemp3].fname,wfname))printf("文献没有建立或打开,不能写");//在已开文献中没有次文献,不能写 else//文献建立或打开 { if(uof[cltemp3].fstatue)//建立 { printf("%s%d%s","写第",uof[cltemp3].writep,"块空间!"); if(disk[diskt]==-1) printf("%s\n","没有空闲块不能写!"); else { uof[cltemp3].writep=disk[diskt]; diskt=disk[diskt]; printf("%s\n","写文献成功!"); } } else//打开 { if(strcmp(uof[cltemp3].fattr,"r")==0) printf("%s\n","操作不合法,不能写!"); else { if(disk[diskt]==-1) printf("%s\n","没有空闲块不能写!"); else { printf("%s%d%s\n","写第",uof[cltemp3].writep,"块空间!"); uof[cltemp3].writep=disk[uof[cltemp3].writep]; printf("%s\n","写文献成功!"); } } } }};voidread(charrfname[20],intrreadl){ intcltemp1=uno*S,cltemp2=(uno+1)*S,frd;while((cltemp1<cltemp2)&&(strcmp(uof[cltemp1].fname,rfname)!=0))cltemp1++; if(strcmp(uof[cltemp1].fname,rfname)==0) { printf("%s%d%s\n","第",uof[cltemp1].readp,"块读"); frd=fdph[uno*L]; while((cltemp2!=disk[frd])&&(disk[frd]!=-1))frd=disk[frd]; uof[cltemp1].readp=disk[frd]; printf("%s\n","文献读成功"); } elseprintf("%s\n","文献未打开不能读");};voidclose(charcofname[20]){ intcltemp1=uno*S,cltemp2=(uno+1)*S;while((cltemp1<cltemp2)&&(strcmp(uof[cltemp1].fname,cofname)!=0))cltemp1++; if(strcmp(uof[cltemp1].fname,cofname)==0) { printf("uof[cltemp1].fname=%s,cofname%s\n",uof[cltemp1].fname,cofname); cltemp2=uof[cltemp1].fstatue; printf("uof[cltemp1].fstatue=%d\n",cltemp2); switch(cltemp2) { case1:printf("%s\n","写文献结束符。");//置文献结束状态 case0:strcpy(uof[cltemp1].fname,""); printf("%s\n","关闭文献成功");break; default:printf("%s\n","文献已关闭"); } } else printf("%s\n","文献不存在!");};voiddeletef(chardfname[20]){ intcltemp1=uno*L,cltemp2=(uno+1)*L; intcltemp3=uno*S,cltemp4=(uno+1)*S;while((cltemp1<cltemp2)&&(strcmp(ufd[cltemp1].fname,dfname)!=0))cltemp1++; if(strcmp(ufd[cltemp1].fname,dfname)==0) { while((cltemp3<cltemp4)&&(strcmp(uof[cltemp3].fname,dfname)!=0))cltemp3++; if(strcmp(uof[cltemp3].fname,dfname)==0)strcpy(uof[cltemp1].fname,""); disk[diskt]=fdpt[cltemp1]; strcpy(ufd[cltemp1].fname,""); printf("%s\n","此文献撤销成功!"); } else printf("%s\n","此文献已撤销!");};voidlist(){ inttemp,temp1,fcounter=0,fucounter=0; printf("文献名文献属性记录长度文献首地址\n"); for(temp=0;temp<ucounter;temp++) { fucounter=0; printf("顾客名为%s的顾客拥有的文献:\n",mfd[temp].uname); for(temp1=temp*L;temp1<(temp+1)*L;temp1++) { if(strcmp(ufd[temp1].fname,"")>0) { printf("%s%s%d%d\n",ufd[temp1].fname,ufd[temp1].fattr,ufd[temp1].recordl,ufd[temp1].addrf); fucounter++; fcounter++; } } printf("该顾客文献总数:%d\n",fucounter); } printf("系统拥有文献总数:%d\n",fcounter);};intmain(){ intmmi,temp,temp1; charfname[20],cfattr[10],ooptype[10],chtemp[10]; intrecordl,rreadl; intchlen; charmun[20],inst[10],insts[10],instta[8][10]; strcpy(instta[0],"create"); strcpy(instta[1],"open"); strcpy(instta[2],"write"); strcpy(instta[3],"read"); strcpy(instta[4],"close"); strcpy(instta[5],"deletef"); strcpy(instta[6],"list"); strcpy(instta[7],"end"); printf("\n"); for(temp=0;temp<N;temp++) { strcpy(mfd[temp].uname,""); mfd[temp].uaddr=0; }for(temp=0;temp<N*L;temp++){ strcpy(ufd[temp].fname,""); strcpy(ufd[temp].fattr,""); ufd[temp].addrf=0; ufd[temp].recordl=0;} for(temp=0;temp<N*S;temp++) { strcpy(uof[temp].fname,""); strcpy(uof[temp].fattr,""); uof[temp].fstatue=0; uof[temp].readp=0; uof[temp].recordl=0; uof[temp].writep=0; } printf("请输入顾客总数:"); scanf("%d",&ucounter); printf("请输入文献目录表(顾客名和顾客首地址),输入e/E0为结束。\n"); for(temp=0;temp<ucounter;temp++) { scanf("%s%d",chtemp,&(mfd[temp].uaddr)); if(((chtemp,"e")==0)||(strcmp(chtemp,"E")==0))break; strcpy(mfd[temp].uname,chtemp); } ucounter=temp; printf("输入文献目录表结束。\n"); for(temp1=0;temp1<ucounter;temp1++) { printf("请输入第%d个顾客的目录表。\n",temp1+1); printf("请输入顾客目录表(文献名文献属性(r/w)文献记录长度文献首地址,输入e/Ee00为结束。\n"); for(temp=temp1*L;temp<(temp1+1)*L;temp++) { scanf("%s%s%d%d",chtemp,ufd[temp].fattr,&(ufd[temp].recordl),&(ufd[temp].addrf)); if((strcmp(chtemp,"e")==0)||(chtemp,"E")==0)break; strcpy(ufd[temp].fname,chtemp);// printf("%s,%s,%d,%d\n",ufd[temp].fname,ufd[temp].fattr,ufd[temp].recordl,ufd[temp].addrf); } } printf("顾客目录表输入结束。"); for(temp1=0;temp1<ucounter;temp1++) { printf("请输入第%d个顾客的已开文献表。\n",temp1+1); printf("%s\n","请输入顾客已开文献表,e/Ee0000为结束。\n文献名文献属性(r/w)文献记录长度文献状态(0/1),文献读文献写\n"); for(temp=temp1*S;temp<(temp1+1)*S;temp++) { scanf("%s%s%d%d%d%d",chtemp,uof[temp].fattr,&(uof[temp].recordl),&(uof[temp].fstatue),&(uof[temp].readp),&(uof[temp].writep)); if((strcmp(chtemp,"e")==0)||(strcmp(chtemp,"E")==0))break; strcpy(uof[temp].fname,chtemp); // printf("%s,%s,%d,%d,%d,%d\n",uof[temp].fname,uof[temp].fattr,uof[temp].recordl,uof[temp].fstatue,uof[temp].readp,uof[temp].writep); } } printf("%s\n","输入顾客已开文献表结束。"); diskh=0; diskt=399; while(1) { printf("%s\n","请输入顾客名"); scanf("%s",mun); uno=0; while((uno<ucounter)&&(strcmp(mfd[uno].uname,mun)!=0))uno++;// printf("uno=%d\n",uno); if(uno!=ucounter) { printf("%s\n","请输入命令:"); scanf("%s",inst);// printf("%s\n",inst);// printf("!\n"); mi=0; chlen=strlen(inst); while((inst[mi]!='(')&&(mi<chlen)){insts[mi]=inst[mi];mi++;} insts[mi]='\0';// printf("!!\n");// printf("%s\n",insts); mmi=0; while((mmi<=7)&&(strcmp(instta[mmi],insts)!=0))mmi++;// printf("%d\n",mmi); switch(mmi) { case0:ni=0;mi++; while(inst[mi]!=',') {fname[ni]=inst[mi];mi++;ni++;}; mi++; fname[ni]='\0'; ni=0; recordl=0; while(inst[mi]!=',') {recordl=recordl*10+(inst[mi]-48);mi++;ni++;} mi++;ni=0; while(inst[mi]!=')') {cfattr[ni]=inst[mi];mi++;ni++;} mi++;cfattr[ni]='\0'; printf("%s,%d,%s\n",fname,recordl,cfattr); create(fname,recordl,cfattr);break; case1:ni=0;mi++; while(inst[mi]!=',') {fname[ni]=inst[mi];mi++;ni++;}; mi++; fname[ni]='\0'; ni=0; while(inst[mi]!=')') {ooptype[ni]=ins
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年电气传动控制系统的定义与分类
- 2026年基于BIM的土木工程施工协同性分析
- 2026春招:小学教师题目及答案
- 2026年桥梁的象征性与地标效应
- 2026年八年级上学期英语期末考试冲刺卷含答案
- 医疗健康产业跨界融合与创新
- 医院消毒隔离操作规范展示
- 货架安全管理培训流程表课件
- 医疗行业礼仪与医护人员心理健康
- 2026年河北旅游职业学院高职单招职业适应性测试模拟试题有答案解析
- 2026年及未来5年中国锻造件行业市场深度分析及发展前景预测报告
- 2025年荆楚理工学院马克思主义基本原理概论期末考试真题汇编
- 2026年恒丰银行广州分行社会招聘备考题库带答案详解
- 纹绣风险协议书
- 【语文】湖南省长沙市雨花区桂花树小学小学一年级上册期末试卷(含答案)
- 贵港市利恒投资集团有限公司关于公开招聘工作人员备考题库附答案
- 2026年及未来5年市场数据中国大型铸锻件行业市场深度分析及投资战略数据分析研究报告
- 冬季防静电安全注意事项
- 2025版煤矿安全规程题库
- 2023年关于宁波市鄞州粮食收储有限公司公开招聘工作人员笔试的通知笔试备考题库及答案解析
- 经典离骚公开课
评论
0/150
提交评论