1、中南林业科技大学操作系统课程设计课程题目:模拟磁盘文件管理的程序姓名:学号: 专业: 计算机科学与技术 年级: 2006计算机科学学院 2021年11月模拟磁盘文件管理的程序一、 课程设计内容 自定义磁盘文件管理的数据结构; 能够自由创建、修改、删除文件; 文件具有一定自定义的属性; 能够显示当前系统文件的状态。二、 课程设计的数据结构说明程序中定义了两个类:class file/文件类private:char name10; /文件名 public: int tag; /删除标记 1:已删 0:未删file( ) char *getname( )return name; /获取文件名int
2、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(
3、) 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 f50;public:fdatabase()top=-1; /构造函数int search(char *fname)/按文件名查找int creatfile(char *na,int
4、 L,int num,int s1,int s2)/创建文件时先查找是否存在int deltefile(char *na)/删除文件时先查找是否存在void disp() /输出所有文件信息;三、 课程设计的模板说明1、初始化,建立文件系统输入磁盘大小(G),每个盘块大小(M),自动建立位示图,位示图字长定为32位输出位示图的行数,以及行号、列号与磁盘块号的转换公式(都从0开始编号)。2、 循环选择执行以下功能1、存储文件输入建立的文件名和文件大小,如果该文件名已经存在,则输出不能建立的信息否则计算所需的磁盘块数为其分配足够多的磁盘块,并记录下来输出所占用的磁盘块号2、删除文件输入要删除的文件
5、名,如果该文件名不存在,则输出删除错误信息,否则收回该文件所占用的磁盘块删除该文件名3、显示位示图情况显示位示图的情况显示剩余磁盘块的数目4、显示文件列表显示文件名,文件大小,占用的磁盘块数目和磁盘块号四、 课程设计的源代码#include#include #include#include#includeint i=0,j=0,sum=0,tt=0,r,ii,k,g,m;int a10032;class file/文件类private:int no; /文件编号char name10; /文件名public: int tag; /删除标记 1:已删 0:未删file( ) char *getn
6、ame( )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 bloc
7、ksum1;/所占盘块号的始点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(leng
8、th%m!=0) /盘块数取上整 blocknum=blocknum+1; cout 所需磁盘块数:blocknumendlendl; if(sum+blocknum)=32) /所有盘块数只占用一行,直接赋值 for(;j(sum+blocknum);j+) aij=1; sum=sum+blocknum; /再进行下面文件的盘块数累加 else /占用多行,先赋值整行 for(;j32;j+) aij=1; i=i+1; for(j=0;j(sum+blocknum)-32;j+)/再进行剩余项赋值 aij=1; sum=sum+blocknum-32; tt=tt+blocknum; /
9、输出文件所占用的盘块号 cout 所占磁盘块号:tt-blocknum to tt-1endl; blocksum1=tt-blocknum; blocksum2=tt-1;void deltefile(char *na) /删除文件 tag=1; strcpy(name,na);void disp( )/输出文件信息 coutsetw(8)name setw(10)lengthsetw(18)blocknumsetw(12)blocksum1 to blocksum2endl;class fdatabase /文件库类 private: int top; /文件记录指针file f50;pu
10、blic:fdatabase() /构造函数top=-1; int search(char *fname)/按文件名查找for ( ii=0;ii=top;ii+)if (strcmp(fii.getname(),fname)=0 & fii.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+; ftop.creatfile(na,L,num,s1,s2);return 1;elsecout !该文件已
11、存在,不能创建!nn;return 0; int deltefile(char *na)/删除文件时先查找是否存在int b,p,x=0,n1,n2,q1,q2,t; p=search(na); if (p=0) /若文件存在 /进行删除文件赋值fii.tag=1; b=fii.length/m; /盘块数=当前文件大小/盘块大小 if(ii=0) / 对第一个删除文件进行赋值for(k=0;kb;k+)axk=0;else n1=(fii-1.blocksum2+1)/32; /被查找的文件之前文件所占用的盘块数/32, /大于0表示跨行n2=(fii.blocksum2+1)/32; /所
12、有文件所占用的盘块数/32,大于0表示跨行q1=(fii-1.blocksum2+1)-n1*32; / 当前文件的开始盘块号q2=(fii.blocksum2+1)-n2*32; / 用于跨行后计算盘块号t=n2-n1;if(t=0) /若n2与n1相等,表明当前所有被占用盘块在同一行 for(k=q1;k=0;t-,x+) /循环进行整行赋值for(k=0;k32;k+) axk=0;x=n2; /对剩余项赋值for(k=0;kb-(t-1)*32;k+)axk=0;else /对当前文件前几项赋值 x=n1;for(k=q1;k0;t-,x+) /中间整行赋值 for(k=0;k32;k
13、+) axk=0;x=n2; /最后剩余项赋值for(k=0;k(fii.blocksum2+1)-t1*32;k+)axk=0; return 1; elsecout该文件不存在;return 0;void disp() /输出所有文件信息 for (int i=0;i=top;i+) if(fi.tag=0) fi.disp();void bit_map(int I) int s=0;cout-endl; for(int p=0;pI;p+) for(int q=0;q32;q+) coutapq ; coutendl; out-endl; for(int p1=0;p1I;p1+) fo
14、r(int q1=0;q132;q1+) if(ap1q1=1)s=s+1;s=(g*1024)/m-s; cout 剩余盘块数:sendl; void main() int I,l,b,i,j,ss1,ss2,sum=0; char fname20; fdatabase p; file w; cout tt*n; cout tt* *n; cout tt* 初始化,建立文件系统 *n; cout tt* *n; cout tt*n; cout g; coutendl; cout m; coutendl; I=(g*1024)/(32*m); for( i=0;iI;i+) for( j=0;
15、j32;j+) aij=0; cout 建立的位示图为:endl; bit_map(I);cout 行数:Iendl;cout tt*n;cout tt* *n; cout tt* 行号、列号与磁盘块号的转换公式为: *n; cout tt* 磁盘块号行号*32+列号 *n;cout tt* 行号磁盘块号/32 *n; cout tt* 列号磁盘块号%32 *n;cout tt* *n;cout tt*n;char choice;while(choice!=0)cout tt*n; cout tt* *n; cout tt* 文 件 管 理 系 统 *n; cout tt* *n; cout
16、tt*n; cout ttt1 存 储 文 件nnttt2 删 除 文 件 nnttt3 显示位示图情况 nnttt4 显示文件列表endl; cout choice;coutendl;switch (choice)case 1:cout fname;coutendl; /创建文件前,先查找是否有同名文件存在int q; q=p.search(fname); if (q=0) cout !该文件已存在,不能创建!nn; break; cout l;coutg*1024)cout !文件大小超过磁盘最大容量,无法进行分配!endl;break; p.creatfile(fname,l,b,ss1
17、,ss2); break;case 2:cout fname;coutendl;q=p.search(fname); if (!q=0) cout !该文件不存在,无法删除!nn ; break; p.deltefile(fname);break; case 3: cout tt*显示位示图如下*n; bit_map(I); coutendl;break;case 4:cout tt*文件列表如下*n;cout-endl;coutsetw(10)文件名setw(15)文件大小(MB)setw(15)所占盘块数setw(15)所占盘块号endl;p.disp();coutendl;break;
18、default:cout输入错误,请从新输入: nn;break; 五、 课程设计程序运行结果1、初始化,建立文件系统(1)用户根据提示输入磁盘大小(GB)与每个盘块大小(MB);(2)程序首先根据用户输入的磁盘大小(GB)与每个盘块大小(MB),自动建立位示图,即初始化位示图,位示图每一行长度固定为32位(即列固定为32);位示图中每一位表示一个盘块,取值0和1分别表示空闲和占用。初始化的位示图应全为0;(3)程序再输出位示图的剩余盘块数,行数,以及行号、列号与磁盘块号的转换公式(行列皆从0开始编号);这样,初始化,建立文件系统完成。运行结果:2、选择执行:存储文件,删除文件,显示位示图情况
19、,显示文件列表【显示文件管理系统列表】显示文件系统管理列表,并提示输入信息14。用户输入文件操作命令1(存储文件),2 (删除文件)、3(显示位示图情况)、4(显示文件列表); 格式如下:键入1,创建文件名为fname,大小为L(MB)的文件; 键入2,删除文件名为fname的文件; 键入3,显示位示图情况; 键入4,显示所有文件信息。运行结果:【存储文件】用户输入文件操作命令是1(存储文件)。系统提示你输入你要建立的文件名和文件大小,如果该文件名已经存在,则系统提示输出不能建立此文件的信息,否则计算所需的磁盘块数和所占用的磁盘块号,并输出结果。相应的在位示图上,因为位示图是矩阵,可以用数组存
20、储,根据所占用的磁盘块号和公式:磁盘块号行号*32+列号行号磁盘块号/32 列号磁盘块号32计算出文件占用的磁盘块在位示图上的位置,现在是创建文件,所以将位示图该位置上的二进制数置1,表示已分配出去。分别创建名为ll,zz和mm三个文件,文件大小分别为224MB,320MB和56MB。此时对应的位示图如下:文件列表如下:若再创建一个已经创建过的文件,则显示如下信息:若创建的文件大小超过磁盘的最大容量,则显示如下信息:【删除文件】用户输入文件操作命令是2 (删除文件) 。系统提示你输入要删除的文件名,如果该文件名不存在,则输出删除出错信息。在位示图上,根据所占用的磁盘块号和公式:磁盘块号行号*3
21、2+列号行号磁盘块号/32列号磁盘块号32计算出文件占用的磁盘块在位示图上的位置,现在是删除文件,所以将位示图该位置上的二进制数置0,表示收回该文件所占用的磁盘块。删除第二个文件zz,结果如下:则相应的位示图和文件列表变为:若删除一个不存在的文件,则显示如下信息:【显示位示图情况】如果用户输入文件操作命令是我wst() (显示位示图情况),系统输出此时位示图的情况,状态位为0表示对应盘块空闲,状态位为1表示该盘块已被分配出去。系统再显示剩余磁盘块的数目。以下是删除zz文件,创建xx后和创建xx后,删除ll的位示图:【显示文件列表】如果用户输入文件操作命令是disp()(显示所有文件情况),系统
22、会显示所有文件的文件名,文件大小,占用的盘块数和盘块号。以下是删除zz文件,创建xx后和创建xx后,删除ll显示的文件列表:目录第一章课程设计目的和要求11。1 课程设计的目的11。2 课程设计实现的要求1第二章 课程设计任务内容2第三章 详细设计说33.1 模块33。1。1 模块描述33.1。2功能模块图33.2性能43。3 函数说明43.3.1 学生信息录入函数43。3.2所有学生上机费用计算函数63。3.3 学生信息查询函数83.4 系统流程图11第四章软件使用说明124.1 软件使用说明及出现的问题124.2 运行结果124.2。1 初始运行界面124。2。2 查询界面134。2.3
23、计算界面13第五章 课程设计心得与体会14附录一 参考文献15附录二 程序清单16机房收费管理系统第一章 课程设计目的和要求1。1 课程设计的目的 进一步巩固C+程序设计所学的知识,特别加强数组,指针,结构体,文件数据类型的应用,熟悉面向过程的结构化和面向对象可视化程序设计方法,培养结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解,锻炼程序设计的能力,以及用C/C+ 语言解决实际问题的能力,为以后后续课程的学习打好基础.此课程设计着眼于知识的运用,把平常学的知识运用到课程实践中来,本身就是考察我们知识运用能力.要求熟悉运用一些编程软件(如:Microsoft Visual C+
24、 6.0),对我们所学的理论知识进一步的深化.1。2 课程设计实现的要求在程序设计中,既可以用传统的结构化程序设计方法,也可以用先进的面向对象程序设计方法。机房收费管理系统主要应用在机房,将每位上网同学的学号、班级、姓名、上机起始时进行录入,对每位同学的上网费用进行计算并按班级、学号、姓名进行查询.第二章 课程设计任务内容用C/C+语言实现一个机房收费管理系统,该系统主要应用在机房管理上,通过这个系统可以录入学生信息的总数,学生信息包括学生的学号、班级、姓名,还有学生上机的起始时间。在本程序中要有学生信息录入功能,上机费用计算功能,按条件查询功能,信息的录入是要录入学生的学号、班级、姓名、上机
25、时间,上机费用按每小时1元计算,不足一小时也按一小时计算,上机费用=上机的时间*1.0/h,上机的时间为从上机时起到下机时所在电脑的当时时间为准。录入完成后可以按学生的学号、班级、姓名来查询学生的上机情况.第三章 详细设计说明3.1 模块3.1。1模块描述定义一个结构体,在其中声明结构变量,然后定义字符串,来存放要用到的变量.然后定义此程序的其他功能模块的原型.主函数调用各个功能子函数,定义各个功能子函数,通过 addition做一个学生信息录入的函数,实现学生学号、班级、姓名以及上机时间的录入,通过calculate做一个计算学生上机费用的函数,实现上机费用的计算,通过search创建一个查
26、询函数,实现对上机学生情况的查询。在程序中需要输入的内容包括:(1)学生信息的录入实现过程:根据提示选择“1”进入学生信息录入界面,按界面文字提示输入要录入信息的学生数,按步骤输入学生的信息,以“Enter键结束,系统自动保存所输入的信息。(2)上机费用的计算实现过程:根据提示选择“2”进入计算界面,以“Enter键结束,由系统自动计算出所有学生的上机费用.(3)学生信息查询实现过程:根据提示选择“3进入信息的查询界面,按自己的需要通过学生的学号、班级、姓名来查询学生的信息,系统自动调出所查询学生的信息,以“Enter”键结束,此时所有的基本信息都被要求重新输入。3.1。2功能模块图此系统的函
27、数功能模块图如图3-1所示。机房收费管理系统学生信息的录入学生上机费用的计算某个同学上机费用查询图31 函数功能模块图3。2 性能该模块性能要求(1)灵活性要求输出的数据能准确的按照操作代码输出。(2)时间特性要求输入的各项操作代码能及时反应其运行结果。3。3 函数说明3。3。1 学生信息录入函数(1)原型:void addition()(2)功能:该函数用来录入学生信息,包括要录入学生信息的总数,录入学生的学号、班级、姓名以及上机时间。 (3)流程图:如图32所示。开始i=1i=n输入第i个学生的学号假真输入第i个学生的班级录入学生信息输入第i个学生的上机时间i+结束输入第i个学生的姓名32
28、学生信息录入函数的流程图(4)对应代码void addition() int i; printf(n请输入录入学生信息的总数:);scanf(d,&n);for(i=1;i=n;i+) printf(nt请输入第d个学生学号:”,i); scanf(”s,studenti-1.num); printf(”nt请输入第%d个学生班级:”,i); scanf(”s,studenti1。theclass); printf(”nt请输入第%d个学生姓名:,i); scanf(”%s”,studenti1。name); printf(nt请输入第d个学生上机时间(例08:00):,i); scanf(s
29、,studenti1.ontime); printf(”nt提示:您已成功录入第d条信息n,i); 3.3.2所有学生上机费用计算函数(1)原型:void calculate()(2)功能:该函数用来计算学生上机的费用,(3)流程图:如图33所示。开始i=1假i=n真输出第i个学生的费用假上机总时间是否不足一小时真上机费用=上机时间*1上机费用=上机的整时间*1+1i+结束图33 成绩查询函数的程序流程图(4)对应代码void calculate() int hours; char times30; time_t rawtime; struct tm timeinfo; time ( rawt
30、ime ); timeinfo = localtime(&rawtime ); strcpy(times,asctime(timeinfo); printf(t所有学生上机费用如下:n); for(int i=1;i(times1448)*10+times15) hours=(times11-48)10+times12-(studenti1.ontime0-48)*10studenti-1.ontime1; else hours=(times11-48)*10+times12(studenti-1.ontime048)*10-studenti1。ontime1+1; printf(”dn,ho
31、urs); 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 find20; 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;in;i+) if (strcmp(studenti。num,find)=0) count+; if(count=PF_FLOATING_POINT_EMULATED) printf(”学生学号t学生班级t学生姓名t上机时