收藏 分销(赏)

操作系统课程设计--模拟磁盘文件管理的程序.doc

上传人:二*** 文档编号:4511893 上传时间:2024-09-26 格式:DOC 页数:55 大小:362.04KB 下载积分:5 金币
下载 相关 举报
操作系统课程设计--模拟磁盘文件管理的程序.doc_第1页
第1页 / 共55页
本文档共55页,全文阅读请下载到手机保存,查看更方便
资源描述
中南林业科技大学 操作系统课程设计 课程题目:模拟磁盘文件管理的程序 姓名: 学号: 专业: 计算机科学与技术 年级: 2006 计算机科学学院 2021年11月 模拟磁盘文件管理的程序 一、 课程设计内容 ⑴ 自定义磁盘文件管理的数据结构; ⑵ 能够自由创建、修改、删除文件; ⑶ 文件具有一定自定义的属性; ⑷ 能够显示当前系统文件的状态。 二、 课程设计的数据结构说明 程序中定义了两个类: class file//文件类 {private: char name[10]; //文件名 public: int tag; //删除标记 1:已删 0:未删 file( ){ } char *getname( ){return name;} //获取文件名 int gettag( ){return tag;} //获取删除标记 int getlength() {return length;} //获取文件大小 int getblocknum() {return blocknum;} // 磁盘块数 int getblocksum1(){return blocksum1;} //磁盘块号的始点 int getblocksum2(){return blocksum2;} //磁盘块号的终点 int length,blocknum,blocksum1,blocksum2; void setname(char na[ ] ) {strcpy(name,na);} //设置文件名 void delwenjian(){ tag=1; }//设置删除标记 1:已删 0:未删 void creatfile(char *na,int L,int num,int s1,int s2) //创建文件 void deltefile(char *na) {tag=1; strcpy(name,na);} //删除文件 void disp( )//输出文件信息 class fdatabase //文件库类 { private: int top; //文件记录指针 file f[50]; public: fdatabase(){top=-1;} //构造函数 int search(char *fname)//按文件名查找 int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在 int deltefile(char *na)//删除文件时先查找是否存在 void disp() //输出所有文件信息 }; 三、 课程设计的模板说明 1、初始化,建立文件系统 输入磁盘大小(G),每个盘块大小(M),自动建立位示图,位示图字长定为32位 输出位示图的行数,以及行号、列号与磁盘块号的转换公式(都从0开始编号)。 2、 循环选择执行以下功能 1、存储文件 输入建立的文件名和文件大小,如果该文件名已经存在,则输出不能建立的信息否则计算所需的磁盘块数 为其分配足够多的磁盘块,并记录下来 输出所占用的磁盘块号 2、删除文件 输入要删除的文件名,如果该文件名不存在,则输出删除错误信息,否则收回该文件所占用的磁盘块 删除该文件名 3、显示位示图情况 显示位示图的情况 显示剩余磁盘块的数目 4、显示文件列表 显示文件名,文件大小,占用的磁盘块数目和磁盘块号 四、 课程设计的源代码 #include<iostream.h> #include <math.h> #include<iomanip.h> #include<string.h> #include<fstream.h> int i=0,j=0,sum=0,tt=0,r,ii,k,g,m; int a[100][32]; class file//文件类 {private: int no; //文件编号 char name[10]; //文件名 public: int tag; //删除标记 1:已删 0:未删 file( ){ } char *getname( ){return name;} //获取姓名 int gettag( ){return tag;} //获取删除标记 int getno() {return no;} //获取文件编号 int getlength() {return length;} //获取文件大小 int getblocknum() {return blocknum;} // 磁盘块数 int getblocksum1()//磁盘块号的始点 { return blocksum1; } int getblocksum2()//磁盘块号的终点 { return blocksum2;} int length; //文件大小 int blocknum;//盘块数 int blocksum1;//所占盘块号的始点 int blocksum2;//所占盘块号的终点 void setname(char na[ ] ) //设置文件名 {strcpy(name,na);} void delwenjian(){ tag=1; }//设置删除标记 1:已删 0:未删 void creatfile(char *na,int L,int num,int s1,int s2) //创建文件 { tag=0; length=L; blocknum=num; blocksum1=s1; blocksum2=s2; strcpy(name,na); blocknum=length/m; //盘块数=文件大小/盘块大小 if(length%m!=0) //盘块数取上整 blocknum=blocknum+1; cout<<" 所需磁盘块数:"<<blocknum<<endl<<endl; if((sum+blocknum)<=32) //所有盘块数只占用一行,直接赋值 { for(;j<(sum+blocknum);j++) a[i][j]=1; sum=sum+blocknum; //再进行下面文件的盘块数累加 } else { //占用多行,先赋值整行 for(;j<32;j++) a[i][j]=1; i=i+1; for(j=0;j<(sum+blocknum)-32;j++) //再进行剩余项赋值 { a[i][j]=1; } sum=sum+blocknum-32; } tt=tt+blocknum; //输出文件所占用的盘块号 cout<<" 所占磁盘块号:"<<tt-blocknum<<" to "<<tt-1<<endl; blocksum1=tt-blocknum; blocksum2=tt-1; } void deltefile(char *na) //删除文件 { tag=1; strcpy(name,na); } void disp( )//输出文件信息 {cout<<setw(8)<<name <<setw(10)<<length<<setw(18)<<blocknum<<setw(12)<<blocksum1<<" to "<<blocksum2<<endl;} }; class fdatabase //文件库类 { private: int top; //文件记录指针 file f[50]; public: fdatabase() //构造函数 {top=-1;} int search(char *fname)//按文件名查找 { for ( ii=0;ii<=top;ii++) { if (strcmp(f[ii].getname(),fname)==0 && f[ii].tag==0) return 0; } return 1; } int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在 { int p; p=search(na); if (p==1) { top++; f[top].creatfile(na,L,num,s1,s2); return 1;} else {cout<<" !!!该文件已存在,不能创建!!!\n\n"; return 0; } } int deltefile(char *na)//删除文件时先查找是否存在 {int b,p,x=0,n1,n2,q1,q2,t; p=search(na); if (p==0) //若文件存在 { //进行删除文件赋值 f[ii].tag=1; b=f[ii].length/m; //盘块数=当前文件大小/盘块大小 if(ii==0) // 对第一个删除文件进行赋值 for(k=0;k<b;k++) a[x][k]=0; else{ n1=(f[ii-1].blocksum2+1)/32; //被查找的文件之前文件所占用的盘块数/32, //大于0表示跨行 n2=(f[ii].blocksum2+1)/32; //所有文件所占用的盘块数/32,大于0表示跨行 q1=(f[ii-1].blocksum2+1)-n1*32; // 当前文件的开始盘块号 q2=(f[ii].blocksum2+1)-n2*32; // 用于跨行后计算盘块号 t=n2-n1; if(t==0) //若n2与n1相等,表明当前所有被占用盘块在同一行 for(k=q1;k<1+b;k++) a[n2][k]=0; else { if((f[ii-1].blocksum2+1)%32==0) //前面所占用的盘块数是32倍数 { x=x+n1; //当前文件赋值 for(;t-1>=0;t--,x++) //循环进行整行赋值 for(k=0;k<32;k++) a[x][k]=0; x=n2; //对剩余项赋值 for(k=0;k<b-(t-1)*32;k++) a[x][k]=0; } else //对当前文件前几项赋值 { x=n1; for(k=q1;k<32;k++) a[x][k]=0; x=x+1; int t1=t; for(;t-1>0;t--,x++) //中间整行赋值 for(k=0;k<32;k++) a[x][k]=0; x=n2; //最后剩余项赋值 for(k=0;k<(f[ii].blocksum2+1)-t1*32;k++) a[x][k]=0; } } return 1; } } else {cout<<"该文件不存在"; return 0;} } void disp() //输出所有文件信息 { for (int i=0;i<=top;i++) if(f[i].tag==0) f[i].disp(); } }; void bit_map(int I) { int s=0; cout<<"---------------------------------------------------------------"<<endl; for(int p=0;p<I;p++) {for(int q=0;q<32;q++) cout<<a[p][q]<<" "; cout<<endl; } out<<"----------------------------------------------------------------"<<endl; for(int p1=0;p1<I;p1++) for(int q1=0;q1<32;q1++) if(a[p1][q1]==1) s=s+1; s=(g*1024)/m-s; cout<<" 剩余盘块数:"<<s<<endl; } void main() { int I,l,b,i,j,ss1,ss2,sum=0; char fname[20]; fdatabase p; file w; cout <<"\t\t************************************************\n"; cout <<"\t\t* *\n"; cout <<"\t\t* 初始化,建立文件系统 *\n"; cout <<"\t\t* *\n"; cout <<"\t\t************************************************\n"; cout <<" 请输入磁盘大小GB: "; cin >>g; cout<<endl; cout <<" 请输入盘块大小MB: "; cin >>m; cout<<endl; I=(g*1024)/(32*m); for( i=0;i<I;i++) for( j=0;j<32;j++) a[i][j]=0; cout<<" 建立的位示图为:"<<endl; bit_map(I); cout<<" 行数:"<<I<<endl; cout <<"\t\t************************************************\n"; cout <<"\t\t* *\n"; cout <<"\t\t* 行号、列号与磁盘块号的转换公式为: *\n"; cout <<"\t\t* 磁盘块号=行号*32+列号 *\n"; cout <<"\t\t* 行号=磁盘块号/32 *\n"; cout <<"\t\t* 列号=磁盘块号%32 *\n"; cout <<"\t\t* *\n"; cout <<"\t\t************************************************\n"; char choice; while(choice!='0') {cout <<"\t\t************************************************\n"; cout <<"\t\t* *\n"; cout <<"\t\t* 文 件 管 理 系 统 *\n"; cout <<"\t\t* *\n"; cout <<"\t\t************************************************\n"; cout <<"\t\t\t1 存 储 文 件\n\n\t\t\t2 删 除 文 件 \n\n\t\t\t3 显示位示图情况 \n\n\t\t\t4 显示文件列表"<<endl; cout <<" 请输入选择项: "; cin >> choice; cout<<endl; switch (choice) { case '1': cout <<" 请输入文件名: "; cin>>fname; cout<<endl; //创建文件前,先查找是否有同名文件存在 int q; q=p.search(fname); if (q==0) { cout<<" !!!该文件已存在,不能创建!!!\n\n"; break; } cout <<" 请输入文件大小MB: "; cin>>l; cout<<endl; if(l>g*1024) {cout<<" !!!文件大小超过磁盘最大容量,无法进行分配!!!"<<endl; break;} p.creatfile(fname,l,b,ss1,ss2); break; case '2': cout <<" 请输入文件名: "; cin>>fname; cout<<endl; q=p.search(fname); if (!q==0) { cout<<" !!!该文件不存在,无法删除!!!\n\n "; break; } p.deltefile(fname); break; case '3': cout <<"\t\t**************显示位示图如下*********************\n"; bit_map(I); cout<<endl; break; case '4': cout <<"\t\t*************文件列表如下************************\n"; cout<<"---------------------------------------------------------------"<<endl; cout<<setw(10)<<"文件名"<<setw(15)<<"文件大小(MB)"<<setw(15)<<"所占盘块数"<<setw(15)<<"所占盘块号"<<endl; p.disp(); cout<<endl; break; default: cout<<"输入错误,请从新输入: \n\n"; break; } } } 五、 课程设计程序运行结果 1、初始化,建立文件系统 (1)用户根据提示输入磁盘大小(GB)与每个盘块大小(MB); (2)程序首先根据用户输入的磁盘大小(GB)与每个盘块大小(MB),自动建立位示图,即初始化位示图,位示图每一行长度固定为32位(即列固定为32);位示图中每一位表示一个盘块,取值0和1分别表示空闲和占用。初始化的位示图应全为0; (3)程序再输出位示图的剩余盘块数,行数,以及行号、列号与磁盘块号的转换公式 (行列皆从0开始编号); 这样,初始化,建立文件系统完成。运行结果: 2、选择执行:存储文件,删除文件,显示位示图情况,显示文件列表 【显示文件管理系统列表】显示文件系统管理列表,并提示输入信息1——4。用户输入文件操作命令1(存储文件),2 (删除文件)、3(显示位示图情况)、4(显示文件列表); 格式如下:键入1,创建文件名为fname,大小为L(MB)的文件; 键入2,删除文件名为fname的文件; 键入3,显示位示图情况; 键入4,显示所有文件信息。 运行结果: 【存储文件】 用户输入文件操作命令是1(存储文件)。系统提示你输入你要建立的文件名和文件大小,如果该文件名已经存在,则系统提示输出不能建立此文件的信息,否则计算所需的磁盘块数和所占用的磁盘块号,并输出结果。相应的在位示图上,因为位示图是矩阵,可以用数组存储,根据所占用的磁盘块号和公式: 磁盘块号=行号*32+列号 行号=磁盘块号/32 列号=磁盘块号%32 计算出文件占用的磁盘块在位示图上的位置,现在是创建文件,所以将位示图该位置上的二进制数置1,表示已分配出去。 分别创建名为ll,zz和mm三个文件,文件大小分别为224MB,320MB和56MB。 此时对应的位示图如下: 文件列表如下: 若再创建一个已经创建过的文件,则显示如下信息: 若创建的文件大小超过磁盘的最大容量,则显示如下信息: 【删除文件】 用户输入文件操作命令是2 (删除文件) 。系统提示你输入要删除的文件名,如果该文件名不存在,则输出删除出错信息。在位示图上,根据所占用的磁盘块号和公式: 磁盘块号=行号*32+列号 行号=磁盘块号/32 列号=磁盘块号%32 计算出文件占用的磁盘块在位示图上的位置,现在是删除文件,所以将位示图该位置上的二进制数置0,表示收回该文件所占用的磁盘块。 删除第二个文件zz,结果如下: 则相应的位示图和文件列表变为: 若删除一个不存在的文件,则显示如下信息: 【显示位示图情况】 如果用户输入文件操作命令是我wst() (显示位示图情况),系统输出此时位示图的情况,状态位为'0'表示对应盘块空闲,状态位为'1'表示该盘块已被分配出去。系统再显示剩余磁盘块的数目。 以下是删除zz文件,创建xx后和创建xx后,删除ll的位示图: 【显示文件列表】 如果用户输入文件操作命令是disp()(显示所有文件情况),系统会显示所有文件的文件名,文件大小,占用的盘块数和盘块号。 以下是删除zz文件,创建xx后和创建xx后,删除ll显示的文件列表: 目录 第一章课程设计目的和要求………………………………………………………………………1 1。1 课程设计的目的……………………………………………………………………………1 1。2 课程设计实现的要求………………………………………………………………………1 第二章 课程设计任务内容…………………………………………………………………………2 第三章 详细设计说…………………………………………………………………………………3 3.1 模块…………………………………………………………………………………………3 3。1。1 模块描述………………………………………………………………………………3 3.1。2功能模块图……………………………………………………………………………3 3.2性能…………………………………………………………………………………………4 3。3 函数说明……………………………………………………………………………………4 3.3.1 学生信息录入函数……………………………………………………………………4 3。3.2所有学生上机费用计算函数…………………………………………………………6 3。3.3 学生信息查询函数……………………………………………………………………8 3.4 系统流程图………………………………………………………………………………11 第四章软件使用说明………………………………………………………………………………12 4.1 软件使用说明及出现的问题…………………………………………………………12 4.2 运行结果………………………………………………………………………………12 4.2。1 初始运行界面……………………………………………………………………12 4。2。2 查询界面…………………………………………………………………………13 4。2.3 计算界面…………………………………………………………………………13 第五章 课程设计心得与体会………………………………………………………………………14 附录一 参考文献……………………………………………………………………………………15 附录二 程序清单……………………………………………………………………………………16 机房收费管理系统 第一章 课程设计目的和要求 1。1 课程设计的目的 进一步巩固《C++程序设计》所学的知识,特别加强数组,指针,结构体,文件数据类型的应用,熟悉面向过程的结构化和面向对象可视化程序设计方法,培养结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解,锻炼程序设计的能力,以及用C/C++ 语言解决实际问题的能力,为以后后续课程的学习打好基础. 此课程设计着眼于知识的运用,把平常学的知识运用到课程实践中来,本身就是考察我们知识运用能力.要求熟悉运用一些编程软件(如:Microsoft Visual C++ 6.0),对我们所学的理论知识进一步的深化. 1。2 课程设计实现的要求 在程序设计中,既可以用传统的结构化程序设计方法,也可以用先进的面向对象程序设计方法。机房收费管理系统主要应用在机房,将每位上网同学的学号、班级、姓名、上机起始时进行录入,对每位同学的上网费用进行计算并按班级、学号、姓名进行查询. 第二章 课程设计任务内容 用C/C++语言实现一个机房收费管理系统,该系统主要应用在机房管理上,通过这个系统可以录入学生信息的总数,学生信息包括学生的学号、班级、姓名,还有学生上机的起始时间。在本程序中要有学生信息录入功能,上机费用计算功能,按条件查询功能,信息的录入是要录入学生的学号、班级、姓名、上机时间,上机费用按每小时1元计算,不足一小时也按一小时计算,上机费用=上机的时间*1.0/h,上机的时间为从上机时起到下机时所在电脑的当时时间为准。录入完成后可以按学生的学号、班级、姓名来查询学生的上机情况. 第三章 详细设计说明 3.1 模块 3.1。1模块描述 定义一个结构体,在其中声明结构变量,然后定义字符串,来存放要用到的变量.然后定义此程序的其他功能模块的原型.主函数调用各个功能子函数,定义各个功能子函数,通过 addition做一个学生信息录入的函数,实现学生学号、班级、姓名以及上机时间的录入,通过calculate做一个计算学生上机费用的函数,实现上机费用的计算,通过search创建一个查询函数,实现对上机学生情况的查询。在程序中需要输入的内容包括: (1)学生信息的录入 实现过程:根据提示选择“1”进入学生信息录入界面,按界面文字提示输入要录入信息的学生数,,按步骤输入学生的信息,以“Enter"键结束,系统自动保存所输入的信息。 (2)上机费用的计算 实现过程:根据提示选择“2”进入计算界面,以“Enter"键结束,由系统自动计算出所有学生的上机费用. (3)学生信息查询 实现过程:根据提示选择“3"进入信息的查询界面,按自己的需要通过学生的学号、班级、姓名来查询学生的信息,系统自动调出所查询学生的信息,以“Enter”键结束,此时所有的基本信息都被要求重新输入。 3.1。2功能模块图 此系统的函数功能模块图如图3-1所示。 机房收费管理系统 学生信息的录入 学生上机费用的计算 某个同学上机费用查询 图3—1 函数功能模块图 3。2 性能 该模块性能要求 (1)灵活性要求 输出的数据能准确的按照操作代码输出。 (2)时间特性要求 输入的各项操作代码能及时反应其运行结果。 3。3 函数说明 3。3。1 学生信息录入函数 (1)原型:void addition() (2)功能:该函数用来录入学生信息,包括要录入学生信息的总数,录入学生的学号、班级、姓名以及上机时间。 (3)流程图:如图3—2所示。 开始 i=1 i<=n 输入第i个学生的学号 假 真 输入第i个学生的班级 录入学生信息 输入第i个学生的上机时间 i++ 结束 输入第i个学生的姓名 3—2学生信息录入函数的流程图 (4)对应代码 void addition() { int i; printf("\n请输入录入学生信息的总数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("\n\t请输入第%d个学生学号:”,i); scanf(”%s",student[i-1].num); printf(”\n\t请输入第%d个学生班级:”,i); scanf(”%s",student[i—1]。theclass); printf(”\n\t请输入第%d个学生姓名:",i); scanf(”%s”,student[i—1]。name); printf("\n\t请输入第%d个学生上机时间(例08:00):",i); scanf("%s",student[i—1].ontime); printf(”\n\t提示:您已成功录入第%d条信息\n",i); } } 3.3.2所有学生上机费用计算函数 (1)原型:void calculate() (2)功能:该函数用来计算学生上机的费用, (3)流程图:如图3—3所示。 开始 i=1 假 i<=n 真 输出第i个学生的费用 假 上机总时间是否不足一小时 真 上机费用=上机时间*1 上机费用=上机的整时间*1+1 i++ 结束 图3—3 成绩查询函数的程序流程图 (4)对应代码 void calculate() { int hours; char times[30]; time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime(&rawtime ); strcpy(times,asctime(timeinfo)); printf("\t所有学生上机费用如下:\n"); for(int i=1;i<=n;i++) { printf(”学生%d费用:",i); if((student[i-1]。ontime[3]-48)*10+student[i-1]。ontime[4]>(times[14]—48)*10+times[15]) hours=(times[11]-48)*10+times[12]-(student[i—1].ontime[0]-48)*10—student[i-1].ontime[1]; else hours=(times[11]-48)*10+times[12]—(student[i-1].ontime[0]—48)*10-student[i—1]。ontime[1]+1; printf(”%d\n",hours); } } 3。3.3 学生信息查询函数 (1)原型:void search() (2)功能:该函数用来按照条件显示学生上机时间。 (3)流程图:如图3-4所示。 开始 输出请选择查询方式:1.根据学号查询;2.根据班级查询;3.根据姓名查询: 分别按学生的学号、班级、姓名查询 假 1、继续0、返回主菜单 真 结束 图3-4 成绩修改函数的程序流程图 (4)对应代码 void search() { int i,b,c,count; do { char find[20]; printf("\n请选择查询方式:1.根据学号查询;2.根据班级查询;3.根据姓名查询:"); scanf("%d",&b); switch(b) { case 1: count=PF_FLOATING_POINT_PRECISION_ERRATA; printf("\n请输入学生的学号:”); scanf("%s”,find); for(i=0;i<n;i++) { if (strcmp(student[i]。num,find)==0) { count++; if(count==PF_FLOATING_POINT_EMULATED) printf(”学生学号\t学生班级\t学生姓名\t上机时
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服