当前位置:文档之家› 实验四 文件系统实验报告

实验四 文件系统实验报告

实验四文件系统实验一 . 目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。

从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。

二 . 例题:1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。

2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。

另外,为打开文件设置了运行文件目录(AFD)。

3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。

4、算法与框图:①因系统小,文件目录的检索使用了简单的线性搜索。

②文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。

③程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD)打开文件目录( AFD)(即运行文件目录)文件系统算法的流程图如下:三 . 实验题:1、增加 2~3个文件操作命令,并加以实现。

(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。

#include <stdio.h>#include <malloc.h>#include <string.h>#include <conio.h>#define MAXSIZE 100#define ADDSIZE 50#define PT elem+l-> length#define N 4typedef struct term{/*班级和学期的结构体*/char class1[10];char term1[10];}term;typedef struct student{/*学生成绩信息的结构体*/term st;/*班级和学期结构体放于此结构体中*/char num[10];char name[12];float course[4];float total;float average;int bit;}lnode,*stu;typedef struct{lnode *elem;/*指向上个结构体的指针*/int size;/*最大能放lnode结构体成员的个数*/int length;/*当前长度*/}sqack,*sq;sqack *l;void init(void)/*动态分配存储空间*/{l-> elem=(stu)malloc(MAXSIZE*sizeof(lnode));l-> length =0;l-> size=MAXSIZE;}void input(void)/*输入学生的信息*/{lnode *newbase,*p;char cla[10],ter[10],ch;int n,i;if(l-> length> =l-> size){newbase=(stu)realloc(l-> elem,(l-> size +ADDSIZE)*sizeof(lnode));/*追加存储空间*/l-> elem =newbase;l-> size +=ADDSIZE;}p=l-> elem;do{printf( "输入班级和学期(学期用这种格式,如2005年上学期2005 1,2005年下学期2005 2;先输入班级,回车后再输入学期)\n ");gets(cla);gets(ter);printf( "要输入多少个名单?");scanf( "%d ",&n);printf( "输入学生的成绩\n学号\t姓名\t科目1\t科目2\t科目3\t科目4\n ");for(i=0;i <n;i++){scanf( "%s%s%d%d%d%d ",p-> num ,p-> name,p-> course[0],p-> course[1],p-> course[2],p-> course[3]);strcpy(p-> st.class1,cla);strcpy(p-> st.term1,ter);++l-> length ;}printf( "要继续吗?(y/n) ");ch=getchar();}while(ch== 'Y '||ch== 'y ');}void change()/*修改学生的信息*/{lnode *p;lnode e;int flag=1,i;char s1[10],num1[10];printf( "输入学期和学号(输入学期以后按回车再输入学号):\n ");gets(s1);gets(num1);p=l-> elem ;while(p <=(l-> elem+l-> length ) && flag==1)/*查找要修改的学生的信息*/{if(strcmp(p-> num,num1)==0&&strcmp(p-> st.term1,s1)==0)flag=0;/*找到了*/p++;}p--;if(flag==1) printf( "找不到此学号!\n ");printf( "%s %s ",p-> num,p-> name);for(i=0;i <N;i++)printf( "%d ",p-> course[i]);printf( "\n ");printf( "输入修改信息\n ");scanf( "%s%s%s%s ",e.st.class1,e.st.term1,&e.num,);for(i=0;i <N;i++)scanf( "%d ",&e.course[i]);*p=e;}void same(char *t1,char *t2,lnode *t,int *k) /*把学期和班级相同的学生信息放在结构体数组tt中*/ {int i=0;lnode *p,*q;q=t;p=l-> elem ;while(p <=l-> elem+l-> length ){if(strcmp(p-> st.term1,t1)==0&&strcmp(p-> st.class1 ,t2)==0){*q=*p;q++;i++;}p++;}*k=i;}void sort(lnode *p,int *k)/*按学生成绩从高到低排序函数*/{int i;lnode *q,temp;for(q=p;q <p+ *k;q++){q-> total =0;for(i=0;i <N;i++)q-> total =q-> total +q-> course [i];q-> average =q-> total /N;}for(i=0;i <*k-1;i++)for(q=p;q <p+*k-1-i;q++)if(q-> total <(q+1)-> total){temp=*q;*q=*(q+1);*(q+1)=temp;}}void print(lnode *q,int *k)/*输出学生的成绩*/{lnode *p;p=q;for(p=q;p <q+*k;p++){printf( "%s %s ",p-> num,p-> name);for(int i=0;i <N;i++)printf( "%d ",p-> course[i]);printf( "%d %f ",p-> total,p-> average);printf( "\n ");}}void stat()/*统计学生的成绩*/{lnode tt[50];char ter[10],clas[10];int i,k;printf( "请输入学期和班级(输入学期后按回车再输入班级):\n ");for(i=0;ter[i]!= '\n ';i++)ter[i]=getchar();for(i=0;clas[i]!= '\n ';i++)clas[i]=getchar();same(ter,clas,tt,&k);/*把学期和班级相同的学生信息放在结构体数组tt中*/ sort(tt,&k);/*按学生成绩从高到低排序函数*/print(tt,&k);/*输出学生的成绩*/}void search1()/*按学号查*/{lnode *p;char ter1[10];int i,flag=1;p=l-> elem;printf( "输入学号:");gets(ter1);for(p=l-> elem;p <l-> PT;p++){if(strcmp(p-> num,ter1)==0){flag=0;printf( "%s %s ",p-> st.term1,p-> st.class1);printf( "%s %s ",p-> num,p-> name);for(i=0;i <N;i++)printf( "%d ",p-> course[i]);printf( "%d %3.1f ",p-> total,p-> average);printf( "\n ");}}if(flag) printf( "没有找到!");}void search2()/*按姓名查*/{lnode *p;char ter1[10];int i,flag=1;p=l-> elem;printf( "输入姓名:");gets(ter1);for(p=l-> elem;p <l-> PT;p++){if(strcmp(p-> name,ter1)==0){flag=0;printf( "%s %s ",p-> st.term1,p-> st.class1);printf( "%s %s ",p-> num,p-> name);for(i=0;i <N;i++)printf( "%d ",p-> course[i]);printf( "%d %f ",p-> total,p-> average);printf( "\n ");}}if(flag) printf( "没有找到!") ;}void search()/*查找学生的成绩*/{char ch;do{printf( "1 按学号查询\n2按姓名查询\n ");ch=getchar();switch(ch){case '1 ':search1();break;case '2 ':search2();break;default:printf( "错误!\n ");}printf( "要继续查找吗?(y/n) ");ch=getchar();} while(ch== 'y ' || ch== 'Y ');}void fail()/*查找不及格及学生名单*/{int i;lnode *p;for(p=l-> elem;p <l-> PT;p++){for(i=0;i <N;i++)if(p-> course[i] <60){printf( "%s %s ",p-> st.class1,p-> st.term1);for(i=0;i <N;i++)printf( "%d ",p-> course[i]);printf( "%d %f ",p-> total,p-> average);printf( "\n ");}}}void output()/*按班级输出学生的成绩单*/{lnode tt[50];int k;char clas[10],ter1[10];printf( "输入要查询的班级和学期(输入班级后按回车输入学期):\n "); gets(clas);gets(ter1);same(ter1,clas,tt,&k);/*把学期和班级相同的学生信息放在结构体数组tt中*/ print(tt,&k);/*输出学生的成绩*/}int main(){char ch;do{printf( "请选择:\n ");printf( "1 对学生成绩的录入\n2 对学生成绩的修改\n3 统计学生成绩\n4 查询学生成绩\n5查找不及格科目及学生名单\n6 按班级输出学生成绩单\n ");ch=getchar();switch(ch){case '1 ': input();break;case '2 ':change();break;case '3 ':stat();break;case '4 ':search();break;case '5 ':fail();break;case '6 ':output();break;default:printf( "错误!\n ");}printf( "要继续吗?(y/n) ");ch=getchar();}while(ch== 'y '||ch== 'Y ');return 0;getch();}2、编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。

相关主题