广工_操作系统_课程设计_源代码
- 格式:doc
- 大小:832.00 KB
- 文档页数:64
操作系统课程设计Array文件系统管理学院计算机学院专业计算机科学与技术班级姓名学号2013年1月8日广东工业大学计算机学院制文件系统管理一、实验目的模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。
通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。
二、实验内容和要求编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。
在用户程序中通过使用文件系统提供的create,open,read,write,close,delete等文件命令,对文件进行操作。
以下报告主要包括:1.可行性分析2.需求分析3.概要设计4.详细设计5.测试6.总结三、可行性分析1、技术可行性对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。
利用大二期间学习的数据结构可以模拟出此课程设计的要求。
2、经济可行性课程设计作为本课程的练习及进一步加深理解。
与经济无关,可以不考虑。
(零花费,零收益)3.法律可行性自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。
四、需求分析编写程序实现文件系统,主要有以下几点要求:1、实现无穷级目录管理及文件管理基本操作2、实现共享“别名”3、加快了文件检索五、概要设计为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD(User File Directory)。
这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。
此外,在系统中再建立一个主文件目录MFD (Master File Directory);在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录的指针。
本设计主要实现下面几个数据结构:总体的流程图如下:六、详细设计主要数据结构:(Master File Directory),主要用以存放用户,可以增加存放密码的字符数组,本设计没有保密安全方面的忧虑,为了使用时操作更简单省去密码。
课程设计课程名称___编译原理__________题目名称___PL/0编译器的扩充 __ 学生学院___计算机学院_________专业班级_计算机科学与技术13(9)学号学生姓名指导教师___林志毅________________ 2016 年1 月2 日一、 已完成的内容:(1) 扩充赋值运算:*= 和 /=(2) 扩充语句(Pascal 的FOR 语句)FOR <变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句>(3) 增加类型:①字符类型;②实数类型。
(4) 增加注释; 多行注释由/*和*/包含,单行注释为//二、 实验环境与工具(1)计算机及操作系统:PC 机,Windows7(2)程序设计语言:C++(3)使用软件Borland C++ Builder 6.0(4)教学型编译程序:PL/0三、 具体实现:1. 扩充赋值运算:*= 和 /=(1) 语法树(2) 修改GetSym()方法(写出修改的代码)else if(CH=='*') {GetCh();if(CH=='=') { SYM=TIMESBECOMES; GetCh(); }else SYM=TIMES;} else if(CH=='/') {GetCh();if(CH=='=') { SYM=SLASHBECOMES; GetCh(); }(3) 修改STATEMENT ()方法(写出修改的代码)case IDENT:i=POSITION(ID,TX); if (i==0) Error(11);else if (TABLE[i].KIND==VARIABLE || TABLE[i].KIND==FLOATTYPE) { /*ASSIGNMENT TO NON-VARIABLE*/GetSym();if (SYM==BECOMES|| SYM==TIMESBECOMES || SYM==SLASHBECOMES||SYM==PLUSBECOMES||SYM==MINUSBECOMES) {RELOP=SYM;if(SYM!=BECOMES) { //若为除等于(或其他类似符号)则先把符号左边的变量值放入栈中GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}GetSym();} else Error(13);EXPRESSION(FSYS,LEV,TX);if(RELOP==TIMESBECOMES) {GEN(OPR,0,4);} else if(RELOP==SLASHBECOMES) {GEN(OPR,0,5);} else if(RELOP==PLUSBECOMES) {GEN(OPR,0,2);} else if(RELOP==MINUSBECOMES) {GEN(OPR,0,3);}GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}(4)运行测试(测试的PL0源码扩充单词的测试并贴运行结果截图)PL0源码:PROGRAM EX01;VAR A,B,C,D;BEGINA:=16;A/=2;WRITE(A); //结果为8B:=4;B*=2;WRITE(B); //结果为8C:=6;C+=2;WRITE(C); //结果为8D:=10;D-=2;WRITE(D); //结果为8END.(5)运行结果:(6)出现的问题及解决开始时在实现/=和*=操作时,*=的实现很顺利,而/=却一直没有得到理想的结果,通过与同学的讨论得知代码中除号指令的解析中,其实为除余操作,于是将%改为/,但是结果还是错误,经过调试发现是两个相除的数在栈中的位置相反了,正确的状态应该是除数位于次栈顶,而被除数位于栈顶。
评定等级操作系统课程设计文件系统管理学院计算机学院专业计算机科学与技术班级姓名学号2013年1月8日广东工业大学计算机学院制文件系统管理一、实验目的模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。
通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。
二、实验内容和要求编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。
在用户程序中通过使用文件系统提供的create,open,read,write,close,delete 等文件命令,对文件进行操作。
以下报告主要包括:1.可行性分析2.需求分析3.概要设计4.详细设计5.测试6.总结三、可行性分析1、技术可行性对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。
利用大二期间学习的数据结构可以模拟出此课程设计的要求。
2、经济可行性课程设计作为本课程的练习及进一步加深理解。
与经济无关,可以不考虑。
(零花费,零收益)3.法律可行性自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。
四、需求分析编写程序实现文件系统,主要有以下几点要求:1、实现无穷级目录管理及文件管理基本操作2、实现共享“别名”3、加快了文件检索五、概要设计为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD (User File Directory )。
这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。
此外,在系统中再建立一个主文件目录MFD (Master File Directory );在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录的指针。
本设计主要实现下面几个数据结构:M D F U F D A F D 用户名文件名打开文件名文件目录指针保护码打开保护码用户名文件长度读写指针文件目录指针文件名···总体的流程图如下:六、详细设计主要数据结构:1.MFD (Master File Directory ),主要用以存放用户,可以增加存放密码的字符数组,本设计没有保密安全方面的忧虑,为了使用时操作更简单省去密码。
广工网络编程课程设计一、课程目标知识目标:1. 让学生掌握计算机网络基础知识和网络编程的基本原理;2. 了解socket编程的相关概念,掌握TCP和UDP协议的使用方法;3. 学会使用网络编程库,如Python的socket库,进行客户端和服务器端程序的设计与实现;4. 理解网络编程中的同步与异步、阻塞与非阻塞的概念及其在实际应用中的区别。
技能目标:1. 培养学生具备独立设计、编写和调试网络应用程序的能力;2. 能够利用所学知识解决实际网络通信问题,如文件传输、即时通讯等;3. 提高学生的实际操作能力,使其在项目实践中熟练运用网络编程技术。
情感态度价值观目标:1. 培养学生对网络编程的兴趣和热情,激发其主动探索新技术的欲望;2. 培养学生具备良好的团队合作精神,提高沟通与协作能力;3. 引导学生认识到网络编程在现代社会中的重要性,增强其社会责任感和使命感。
课程性质:本课程为实践性较强的课程,侧重于培养学生的动手能力和实际应用能力。
学生特点:学生具备一定的编程基础,对网络知识有一定的了解,但实际操作能力有待提高。
教学要求:结合课程性质、学生特点,注重理论与实践相结合,强调实践操作,提高学生的实际编程能力。
通过项目驱动,引导学生主动学习,培养其独立解决问题的能力。
在教学过程中,关注学生的学习进度和反馈,及时调整教学策略,确保课程目标的实现。
将目标分解为具体的学习成果,便于后续的教学设计和评估。
二、教学内容1. 计算机网络基础知识:包括OSI七层模型、TCP/IP协议栈、IP地址、端口等基本概念。
2. 网络编程原理:介绍socket编程基本原理,以及TCP和UDP协议的区别与应用场景。
3. Python网络编程库:重点讲解Python中socket库的使用方法,包括创建socket对象、建立连接、数据传输、关闭连接等。
4. 客户端-服务器程序设计:分别讲解TCP和UDP协议下的客户端和服务器端程序设计方法,以及异常处理和资源管理等。
课程设计课程名称操作系统题目名称进程调度学生学院计算机学院专业班级计算机科学与技术13(2)学号学生姓名逗比威指导教师2015 年 1 月13 日目录1.设计目的 (4)2.设计内容 (4)3.设计步骤 (4)3.1.需求分析 (4)3.2.概要设计 (5)3.2.1 设计思想 (5)3.2.2 模型定义 (5)3.3.3 主程序流程图 (5)3.3.4 各程序模块之间的层次(调用)关系 (6)3.3 详细设计 (6)3.3.1 功能类定义 (6)3.3.2 函数调用关系图 (6)3.3.3 各模块流程图 (7)3.4 调式分析 (8)3.5 系统测试 (8)3.6 使用说明 (13)4. 经验与体会 (13)5.重要数据结构或源程序中的疑难部分说明 (14)1.设计目的设计编程进程调度的四个算法。
通过具体的进程调度算法的实现,加深对进程调度算法实现过程的理解,并且采用Android端动态显示,加深MVC模式的理解与使用。
2.设计内容进程调度是低级调度,它的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。
设计一个系统中有5个进程,它们的到达时间和服务时间如下表所示,忽略I/O以及其他开销时间。
进程到达时间服务时间A 0 3B 2 6C 4 4D 6 5E 8 2算法实现:先来先服务(FCFS)、非抢占及抢占的短进程优先(SPF)、高响应比优先(HRRN)以及时间片轮转(时间片=1)调度算法。
计算显示:各进程的完成时间、周转时间、带权周转时间和平均带权周转时间。
(计算到小数点后两位)上述设计采用java程序语言编程硬件环境:win8-PC 和Android4.4.2系统手机软件环境:eclipse+adt3.设计步骤3.1.需求分析要求实现4个算法演示进程调度过程,其中短作业优先算法可拆分成非抢占式和抢占式(合计成5个)。
用户生成任务要求的测试数据后,选择对应的算法启动进程调度,Android端界面动态显示调度过程,并记录各状态的个数及其各进程的完成时间、周转时间、带权周转时间和平均带权周转时间。
广工自动化单片机课程设计自动化学院网络工程专业_班学号_姓名1.程序:在显示器上显示任意四位十八进制数:56AFORG 0000H MOV A,R3LJMP MAINAGAIN: MOV DPTR,#7F03HORG 1000H MOVXMAIN: MOV 52H,#02H @DPTR,AMOV 53H,#03H MOV A,@R0 MOV 51H,#01H MOV DPTR,#DDEGMOV 50H,#00H MOV A,@A+DPTRMOV R5,#53H MOV DPTR,#7F01H KEY SUB: MOV A,#0DH MOVXMOV DPTR,#7F00H @DPTR,AMOVX ACALL DLIMS @DPTR,A INC R0 BEGIN: ACALL DIS MOV A,R3AJMP BEGIN JNBDIS: PUSH ACC ACC.3,OUTPUSH 00H RR APUSH 03H MOV R3,AMOV R0,#50H AJMP AGAINMOV R3,#7FH OUT: POP 03HPOP 00H POP ACCRETDDEG:DB@DPTR,ACALL DLIMSINC R279H,7CH,07H,5BH,6FH,7 FH,77H,39H A1:MOV A,R3MOV DPTR,#7F01H MOVX @DPTR,AMOV DPTR,#1000H MOV A,R2MOVC A,@A+DPTRMOV DPTR,#7F02HMOVX MOV A,R3RL AMOV R3,A JNB ACC.4,BEGINJMPA1 DLIMS: MOV R7,#05HDL0: MOV R6,#0FFH DL1:DJNZ R6,DL1 DJNZ R7,DL0RETEND,按任意键在显示器上2.程序二:将8个键按实验室要求定义键值 显示对应键值,要求显示值能左移;ORG 0000HLJMP MAINMAIN:ORG 1000HMOV52H,#00H JNZ INK2 MOV AJMP BEGIN 53H,#00H INK2: MOVMOV 51H,#00H R2,#07fHMOV 50H,#00H MOV R4,#00H MOV R5,#53H COLUM: MOVKEYSUB: MOV A,#0DH DPTR,#7F03HMOV DPTR,#7F00H MOV A,R2MOVX MOVX@DPTR,A @DPTR,ABEGIN: ACALL DIS INC DPTR ACALL CLEAR INC DPTRACALL MOVXCCSCAN A,@DPTRJNZ INK1 JBAJMP BEGIN ACC.2,LONEINK1: ACALL DIS MOV A,#00H ACALL DLIMS AJMP KCODEACALL DLIMS LONE: JBACALL CLEAR ACC.6,NEXTACALL MOV A,#04H CCSCAN KCODE: ADD A,R4CJNEA,#00H,XYGMOV A,#09HAJMP XYG7 XYG: CJNEA,#01H,XYG1MOV A,#08HAJMP XYG7 XYG1: CJNEA,#02H,XYG2MOV A,#0AHAJMP XYG7 XYG2: CJNEA,#03H,XYG3MOV A,#0CHAJMP XYG7 XYG3: CJNEA,#04H,XYG4MOV A,#0EHAJMP XYG7 XYG4: CJNEMOV A,#0BHAJMP XYG7XYG5: CJNEA,#06H,XYG6MOV A,#07HAJMP XYG7XYG6: CJNEA,#07H,XYG7MOV A,#02HAJMP XYG7XYG7: ACALLPUTBUFPUSH ACC KON: ACALL DISACALL CLEAR ACALL CCSCAN JNZKONPOP ACCNEXT: INC R4MOV A,R2JNB ACC.3,KEERRRA,#05H,XYG5MOV R2,A MOV R3,#0F7HAJMP COLUM MOV A,R3 KERR: AJMP BEGIN AGAIN: MOVCCSCAN: MOV DPTR,#7F03H DPTR,#7F03H MOVX @DPTR,AMOV A,#00H MOV A,@R0MOV @DPTR,A MOV DPTR,#DDEG INC DPTR MOVC A,@A+DPTRINC DPTR MOV DPTR,#7F01H MOVX A ,@DPTR MOVX @DPTR,ACPL A ACALL DLIMSANL A,#44H INC R0RET MOV A,R3 CLEAR: MOV JNB ACC.0,OUT DPTR,#7F03H RL AMOV A,#00H MOV R3,AMOVX @DPTR,A AJMP AGAINRET OUT: POP 03HDIS: PUSH ACC POP 00HPUSH 00H POP ACCPUSH 03H RETMOV R0,#50H DDEG: DB0FCH,60H,0DAH,0F2HDB66H,0B6H,0BEH,0E0HDB0FEH,0F6H,0EEH,3EHDB9CH,7AH,9EH,8EH DLIMS: MOV R7,#01H DL0: MOVR6,#0FFHDL1: DJNZ R6,DL1 DJNZ R7,DL02. 程序三: 程序实现以下要求a) 定义键盘按键b) 可进行三位16 进制除法运算c) 可进行两位10 进制乘法运算ORG 0000HLJMP MAINORG 1000HMAIN: MOV 53H,#00HMOV 52H,#00HMOV 62H,#00HRETPUTBUF: PUSH 00HPUSH ACCMOV 53H,52HMOV 52H,51HMOV 51H,50HPOP ACCMOV 50H,A GOBACK: POP 00HRETENDMOV 51H,#00HMOV 50H,#00HMOV 60H,#00HMOV 61H,#00HMOV 63H,#00H JNZ INK2MOV 64H,#00H AJMP BEGINMOV 65H,#00H INK2: MOVMOV 66H,#00H R2,#07fHMOV 67H,#00H MOV R4,#00HMOV 68H,#0CCH COLUM: MOVKEYSUB: MOV A,#0DH DPTR,#7F03HMOV DPTR,#7F00H MOV A,R2MOVX MOVX@DPTR,A @DPTR,ABEGIN: ACALL DIS INC DPTR ACALL CLEAR INC DPTRACALL MOVXCCSCAN A,@DPTRJNZ INK1 JBAJMP BEGIN ACC.2,LONEINK1: ACALL DIS MOV A,#00H ACALL DLIMS AJMP KCODEACALL DLIMS LONE: JBACALL CLEAR ACC.6,NEXTACALL MOV A,#04H CCSCAN KCODE: ADD A,R4CJNEA,#00H,XYGMOV A,#09HAJMP XYG7 XYG: CJNEA,#01H,XYG1MOV A,#08HAJMP XYG7 XYG1: CJNEA,#02H,XYG2MOV A,#0AHAJMP XYG7 XYG2: CJNEA,#03H,XYG3MOV A,#0CHAJMP XYG7 XYG3: CJNEA,#04H,XYG4MOV A,#0EHAJMP XYG7 XYG4: CJNEMOV A,#0BHAJMP XYG7XYG5: CJNEA,#06H,XYG6MOV A,#07HAJMP XYG7XYG6: CJNEA,#07H,XYG7MOV A,#02HAJMP XYG7XYG7: ACALLPUTBUFPUSH ACC KON: ACALL DISACALL CLEAR ACALL CCSCAN JNZKONPOP ACCNEXT: INC R4MOV A,R2JNB ACC.3,KEERRRA,#05H,XYG5MOV R2,A MOV R3,#0F7HAJMP COLUM MOV A,R3 KERR: AJMP BEGIN AGAIN: MOVCCSCAN: MOV DPTR,#7F03H DPTR,#7F03H MOVX @DPTR,AMOV A,#00H MOV A,@R0MOV @DPTR,A MOV DPTR,#DDEG INC DPTR MOVC A,@A+DPTRINC DPTR MOV DPTR,#7F01H MOVX A ,@DPTR MOVX @DPTR,ACPL A ACALL DLIMSANL A,#44H INC R0RET MOV A,R3 CLEAR: MOV JNB ACC.0,OUT DPTR,#7F03H RL AMOV A,#00H MOV R3,AMOVX @DPTR,A AJMP AGAINRET OUT: POP 03HDIS: PUSH ACC POP 00HPUSH 00H POP ACCPUSH 03H RETMOV R0,#50H DDEG: DB 11H,12H,0CH,66HDB10H,09H,04H,08H SZDEG: DB0FCH,60H,0DAH,0F2HDB66H,0B6H,0BEH,0E0HDB0FEH,0F6H,0EEH,3EHDB9CH,7AH,9EH,8EHDB0CCH,0DDH,0EEH PUTBUF: PUSH 00HPUSH ACCMOV A,62HMOV 63H,AMOV A,61HMOV 62H,AMOV A,60HMOV 61H,APOP ACCPUSH DPLMOV R5,AMOV DPTR,#DDEGMOVCA,@A+DPTRMOV 60H,AMOV A,R5POP DPLPOP DPH GOBACK: POP 00HJISUAN: CJNEA,#02H,CHUHAOACALLFUHAOAJMPJSENDCHUHAO: CJNEA,#01H,DENGYUHAOACALLFUHAOAJMP资料内容仅供参考,如有不当或者侵权,请联系本人改正或者删除。
广工java课程设计一、课程目标知识目标:1. 理解Java语言的基本语法和编程结构;2. 掌握面向对象编程思想,能够运用类和对象进行程序设计;3. 学会使用Java标准库和常用开发工具,如Eclipse;4. 了解Java的异常处理、文件操作和数据存储等高级话题。
技能目标:1. 能够运用Java语言编写简单的控制台应用程序;2. 培养学生分析问题、解决问题的能力,使其能够独立完成小型项目的设计与实现;3. 培养学生的团队协作和沟通能力,使其能够在项目开发中与他人有效合作。
情感态度价值观目标:1. 培养学生热爱编程,对计算机科学产生浓厚兴趣;2. 培养学生具有良好的编程习惯,注重代码规范和可读性;3. 培养学生面对困难时保持积极进取的态度,勇于克服编程过程中的各种挑战。
课程性质:本课程为实践性较强的学科,注重理论联系实际,培养学生动手能力和实际项目经验。
学生特点:学生具备一定的编程基础,对Java语言有一定了解,但实践经验不足。
教学要求:结合学生特点,注重案例教学,通过实际项目引导学生掌握Java编程的核心知识,提高学生的实践能力。
将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容1. Java基本语法和数据类型- 理解变量、常量的概念及使用方法;- 掌握基本数据类型及其操作;- 学会使用运算符和表达式。
2. 控制结构- 掌握顺序结构、分支结构和循环结构;- 学会使用条件语句和循环语句。
3. 面向对象编程- 理解类和对象的概念;- 掌握封装、继承和多态;- 学会使用构造方法和成员方法。
4. Java标准库和常用开发工具- 学习使用Eclipse等集成开发环境;- 掌握Java标准库的基本使用方法;- 了解常用的类和接口。
5. 异常处理、文件操作与数据存储- 理解异常处理机制;- 掌握文件读写和文件操作;- 学会使用数据库进行数据存储。
6. 实践项目- 分析项目需求,设计系统架构;- 编写代码实现功能模块;- 进行项目测试和优化。
操作系统源代码范文操作系统是计算机系统的核心软件之一,它负责管理计算机的硬件资源、为用户和应用程序提供服务。
操作系统的源代码是操作系统的具体实现代码,通过审视操作系统的源代码可以深入了解操作系统的实现原理和细节。
操作系统的源代码通常包括内核代码和驱动代码。
内核是操作系统的核心部分,它负责处理进程管理、内存管理、文件系统管理、设备管理等核心功能。
驱动代码是操作系统与硬件设备之间的接口代码,它负责与硬件设备进行通信和管理。
操作系统的源代码通常由多个模块组成,每个模块负责一个具体的功能。
例如,进程管理模块负责进程的创建、调度和终止;内存管理模块负责内存的分配和回收;文件系统管理模块负责文件的读写和管理等等。
这些模块之间通过函数调用和数据交换进行协作,共同完成操作系统的各项功能。
审视操作系统的源代码可以帮助我们深入了解操作系统的工作原理。
例如,通过阅读进程管理模块的源代码,我们可以了解操作系统是如何创建和管理进程的;通过阅读内存管理模块的源代码,我们可以了解操作系统是如何管理内存的分配和回收的;通过阅读文件系统管理模块的源代码,我们可以了解操作系统是如何管理文件的读写和权限控制的等等。
通过理解操作系统的源代码,我们可以更好地使用和优化操作系统。
例如,通过深入了解进程管理模块的源代码,我们可以编写更高效的多线程应用程序;通过深入了解内存管理模块的源代码,我们可以更好地调优内存资源的利用效率;通过深入了解文件系统管理模块的源代码,我们可以更好地管理和保护文件的安全性等等。
此外,操作系统的源代码还可以用于教育和研究。
学习操作系统的源代码可以帮助我们理解计算机系统的底层原理和设计思想,从而更好地应用和发展操作系统技术。
同时,研究操作系统的源代码也可以帮助我们发现其中的潜在问题和优化空间,提升操作系统的性能和可靠性。
总之,操作系统的源代码是了解操作系统实现原理和细节的重要途径,通过审视操作系统的源代码可以更好地理解和应用操作系统技术。
操作系统课程设计(完整规范版)一、设计目的操作系统课程设计旨在让学生深入了解操作系统的基本原理,掌握操作系统设计与实现的基本方法,培养学生在操作系统领域的实际动手能力和创新思维。
通过本次课程设计,学生应能够:1. 理解操作系统的功能、结构和关键技术;2. 学会分析实际操作系统的性能和特点;3. 设计并实现一个简单的操作系统模块或功能;4. 提高团队协作和沟通能力。
二、设计要求1. 设计内容:根据课程所学,选择一个具有实际意义的操作系统模块进行设计与实现。
模块可包括:进程管理、内存管理、文件系统、设备管理等。
2. 设计规范:遵循软件工程的基本原则,确保代码的可读性、可维护性和可扩展性。
3. 团队协作:本次课程设计以小组为单位进行,每组35人。
小组成员需明确分工,共同完成设计任务。
(2):包括所有设计文件、代码及相关文档;(3)演示PPT:汇报课程设计成果,阐述设计思路、实现过程及创新点。
三、设计流程1. 需求分析:分析所选操作系统模块的功能需求,明确设计目标。
2. 系统设计:根据需求分析,设计系统架构,划分模块,确定各模块的功能和接口。
3. 编码实现:按照系统设计,编写代码,实现各模块功能。
4. 测试与调试:对实现的系统模块进行功能测试、性能测试和兼容性测试,确保系统稳定可靠。
5. 优化与改进:根据测试结果,对系统进行优化和改进。
7. 演示与答辩:制作演示PPT,汇报课程设计成果,回答评委提问。
四、评分标准1. 设计报告(30%):内容完整、结构清晰、表述准确、格式规范。
2. 代码质量(40%):代码可读性、可维护性、可扩展性、创新性。
3. 演示与答辩(20%):PPT制作、汇报效果、回答问题。
4. 团队协作(10%):分工明确、协作高效、沟通交流。
五、预期成果1. 理论与实践相结合:将课堂上所学的操作系统理论知识运用到实际设计中,加深对操作系统的理解。
2. 技能提升:提高编程能力,掌握操作系统核心模块的设计与实现技巧。
课程设计课程名称编译原理题目名称编译原理课程设计学生学院计算机学院专业班级2011级计算机科学与技术7班学号3111006002学生姓名谢佳旭2013 年1 月08 日目录一、课程设计目的 (5)二、课程设计要求 (5)1、设计内容 (5)三、课程设计环境与工具 (6)四、结构设计说明 (5)1、PL/0 语言编译器 (5)2、总流程图 (6)3、各功能模块描述 (6)五、主要成分描述 (7)六、测试用例 (9)1、测试*=和/=的运算功能 (9)2、测试FOR语句功能 (9)七、开发过程和完成情况 (9)1、扩充赋值运算:*= 和/= (9)2、扩充FOR语句(Pascal) (10)3、添加单行注释 (12)八、心得体会 (14)一、课程设计目的在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。
达到进一步了解程序编译过程的基本原理和基本实现方法的目的。
二、课程设计要求1.课程设计基本内容(成绩范围:“中”、“与格”或“不与格”)(1)扩充赋值运算:*= 和/=扩充语句(Pascal的FOR语句):FOR <变量>:=<表达式>STEP<表达式> UNTIL<表达式>Do<语句>选做内容(成绩评定范围扩大到:“优”和“良”)(1)增加类型:①字符类型;②实数类型。
(2) 增加注释; 注释由/*和*/包含;(3)扩充函数:①有返回值和返回语句;②有参数函数。
(4)增加一维数组类型(可增加指令)。
(5)其他典型语言设施。
三、课程设计环境与工具(1)运行平台:WIN7旗舰SP1(2)实现工具:C++Builder 6.0(3)教学型编译程序:PL/0四、结构设计说明和各功能模块描述(1)PL/0 语言编译器PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。
操作系统实验报告学生学院____ 计算机学院______专业班级 13级计科9学 号学生姓名指导教师 李敏2015 年 12 月 29 日实验一进程调度实验一、实验目的用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、实验内容和要求设计一个有N个进程共行的进程调度程序。
要求采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程),时间片轮转算法,多级反馈队列调度算法这三种算法。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
三、实验主要仪器设备和材料实验环境硬件环境:IBM-PC或兼容机软件环境:C++、C语言编程环境四、实验方法1、编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。
“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。
动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。
广工 c语言课程设计一、课程目标知识目标:1. 学生能够掌握C语言的基本语法和结构,包括变量声明、数据类型、运算符、控制语句等。
2. 学生能够理解并运用函数的概念,掌握函数的定义、调用和传参方式。
3. 学生能够运用数组、指针和字符串进行编程,解决实际问题。
4. 学生能够理解结构体和文件操作的基本原理,并能够运用到C程序设计中。
技能目标:1. 学生能够运用C语言编写简单的程序,具备基本的编程能力。
2. 学生能够使用调试工具,对程序进行调试和优化,提高程序的正确性和效率。
3. 学生能够阅读和分析C语言代码,理解程序逻辑,具备一定的编程思维。
情感态度价值观目标:1. 学生能够培养良好的编程习惯,注重代码规范和注释,提高代码的可读性和可维护性。
2. 学生能够培养团队合作意识,学会与他人共同解决问题,分享编程经验和成果。
3. 学生能够认识到编程在现实生活中的应用价值,激发对计算机科学的兴趣和热情。
课程性质分析:本课程为广工C语言课程设计,旨在帮助学生巩固C语言知识,提高编程能力,培养实际应用能力。
学生特点分析:学生已具备一定的C语言基础,但实际编程经验不足,需要通过课程设计加强实践操作。
教学要求:1. 结合教材内容,注重理论与实践相结合,提高学生的实际编程能力。
2. 重视编程思维的培养,引导学生运用所学知识解决实际问题。
3. 注重培养学生的团队合作意识和情感态度价值观。
二、教学内容1. C语言基础语法复习:变量声明、数据类型、运算符、表达式、输入输出函数。
教材章节:第一章至第三章2. 控制语句:顺序结构、选择结构、循环结构。
教材章节:第四章3. 函数:函数定义、调用、传参方式、递归。
教材章节:第五章4. 数组、指针和字符串:一维数组、二维数组、字符串操作、指针概念、指针与数组、指针与字符串。
教材章节:第六章、第七章5. 结构体与文件操作:结构体定义、结构体数组、结构体指针、文件读写、文件操作函数。
教材章节:第八章、第十章6. 编程实践:综合运用所学知识,完成课程设计项目。
操作系统课程设计(完整规范版)一、引言操作系统是计算机系统的核心软件,它管理计算机的硬件资源,为应用程序提供运行环境。
本课程设计旨在通过实践,加深学生对操作系统原理的理解,提高学生的编程能力和系统设计能力。
二、课程目标1. 理解操作系统的基本原理和功能。
2. 掌握进程管理、内存管理、文件系统等核心模块的设计和实现。
3. 熟悉操作系统调度的基本算法。
4. 提高学生的编程能力和系统设计能力。
三、课程内容1. 操作系统概述操作系统的定义、功能和发展历程操作系统的基本组成和结构操作系统的类型和特点2. 进程管理进程的定义、状态和转换进程控制块(PCB)的结构和作用进程同步与互斥进程通信进程调度算法3. 内存管理内存管理的目标连续内存管理技术非连续内存管理技术页面置换算法4. 文件系统文件系统的定义和功能文件的结构和类型文件存储空间管理文件目录管理文件操作5. I/O系统I/O系统的功能和组成 I/O设备管理I/O调度算法缓冲管理6. 系统调用系统调用的定义和类型系统调用的实现机制常用系统调用分析7. 实验与课程设计实验目的和要求实验内容和步骤课程设计题目和要求课程设计报告格式四、课程考核1. 平时成绩(30%):包括课堂表现、实验报告和作业完成情况。
2. 实验成绩(30%):包括实验操作和实验报告。
3. 课程设计成绩(40%):包括设计报告、代码实现和答辩表现。
1. 《操作系统概念》作者:亚伯拉罕·西尔伯斯查茨等2. 《现代操作系统》作者:安德鲁·S·塔嫩鲍姆3. 《操作系统导论》作者:威廉·斯托林斯六、附录1. 课程设计报告模板2. 实验报告模板3. 课程设计答辩评分标准七、课程安排1. 理论学习操作系统概述(2课时)进程管理(4课时)内存管理(4课时)文件系统(4课时)I/O系统(2课时)系统调用(2课时)2. 实验与课程设计进程管理实验(2课时)内存管理实验(2课时)文件系统实验(2课时)I/O系统实验(2课时)课程设计(8课时)课程考核(2课时)八、实验与课程设计指导1. 实验指导进程管理实验:通过模拟进程的创建、撤销、阻塞和唤醒等操作,理解进程管理的原理。
操作【2 】体系课程设计报告小组编号: 小构成员:一.课程设计概述:1.标题: 简略文件体系的实现2.实现内容(1)在内存中开拓一个虚拟磁盘空间作为文件存储分区,在其上实现一个简略的基于多级目次的单用户单义务体系中的文件体系.在退出该文件体系的应用时,应将该虚拟文件体系以一个Windows 文件的方法保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中.(2)文件存储空间的分派可采用显式链接分派或其他的方法.(3)余暇磁盘空间的治理可选择位示图或其他的方法.假如采用位示图来治理文件存储空间,并采用显式链接分派方法,那么可以将位示图归并到FAT中.(4)文件目次构造采用多级目次构造.为了简略起见,可以不应用索引结点,个中的每个目次项应包含文件名.物理地址.长度等信息,还可以经由过程目次项实现对文件的读和写的破坏.●请求供给以下操作敕令:●my_format: 对文件存储器进行格局化,即按照文件体系的构造对虚拟磁盘空间进行布局,并在其上创建根目次以及用于治理文件存储空间等的数据构造.●my_mkdir: 用于创建子目次.●my_rmdir: 用于删除子目次.●my_ls: 用于显示目次中的内容.●my_cd: 用于更改当前目次.●my_create: 用于创建文件.●my_open: 用于打开文件.●my_close: 用于封闭文件.●my_write: 用于写文件.●my_read: 用于读文件.●my_rm: 用于删除文件.二、my_exitsys: 用于退出文件体系.设计思绪(重要算法描写.程序流程图等):1. 体系主函数main()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: void main()(4)功效: 体系主函数(5)输入: 无(6)输出: 无(7)函数需完成的工作:①对前面界说的全局变量进行初始化;②挪用startsys()进入文件体系;③列出文件体系供给的各项功效及敕令挪用格局;④显示敕令行提醒符,等待用户输入敕令;⑤将用户输入的敕令保存到一个buf中;⑥对buf中的内容进行敕令解析,并挪用响应的函数履行用户键入的敕令;⑦假如敕令不是“my_exitsys”,则敕令履行完毕后转④.2.进入文件体系函数startsys()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: void startsys()(4)功效: 由main()函数挪用,进入并初始化我们所树立的文件体系,以供用户应用.(5)输入: 无(6)输出: 无.(7)函数需完成的工作:①申请虚拟磁盘空间;②应用c说话的库函数fopen()打开myfsys文件: 若文件消失,则转③;若文件不消失,则创建之,转⑤③应用c说话的库函数fread()读入myfsys文件内容到用户空间中的一个缓冲区中,并断定其开端的8个字节内容是否为“10101010”(文件体系魔数),假如是,则转④;不然转⑤;④将上述缓冲区中的内容复制到内存中的虚拟磁盘空间中;转⑦⑤在屏幕上显示“myfsys文件体系不消失,如今开端创建文件体系”信息,并挪用my_format()对①中申请到的虚拟磁盘空间进行格局化操作.转⑥;⑥将虚拟磁盘中的内容保存到myfsys文件中;转⑦⑦应用c说话的库函数fclose()封闭myfsys文件;⑧初始化用户打开文件表,将表项0分派给根目次文件应用,并填写根目次文件的相干信息,因为根目次没有上级目次,所以表项中的dirno和diroff分离置为5(根目次地点肇端块号)和0;并将ptrcurdir指针指向该用户打开文件表项.⑨将当前目次设置为根目次.3. 磁盘格局化函数my_format()(1)对应敕令: my_format(2)敕令挪用格局: my_format(3)函数设计格局: void my_format()(4)功效: 对虚拟磁盘进行格局化,布局虚拟磁盘,树立根目次文件(或根目次区).(5)输入: 无(6)输出: 无.(7)函数需完成的工作:①将虚拟磁盘第一个块作为引诱块,开端的8个字节是文件体系的魔数,记为“10101010”;在之后写入文件体系的描写信息,如FAT表大小及地位.根目次大小及地位.盘块大小.盘块数目.数据区开端地位等信息;②在引诱块后树立两张完全一样的FAT表,用于记载文件所占领的磁盘块及治理虚拟磁盘块的分派,每个FAT占领两个磁盘块;对于每个FAT中,前面5个块设置为已分派,后面995个块设置为余暇;③在第二张FAT后创建根目次文件root,将数据区的第1块(即虚拟磁盘的第6块)分派给根目次文件,在该磁盘上创建两个特别的目次项: “.”和“..”,其内容除了文件名不同之外,其他字段完全雷同.4. 更改当前目次函数my_cd()(1)对应敕令: my_cd(2)敕令挪用格局: my_cd dirname(3)函数设计格局: void my_cd(char *dirname)(4)功效: 转变当前目次到指定的名为dirname的目次.(5)输入:dirname: 新的当前目次的目次名;(6)输出: 无(7)函数需完成的工作:①挪用my_open()打开指定目次名的父目次文件,并挪用do_read()读入该父目次文件内容到内存中;②在父目次文件中检讨新的当前目次名是否消失,假如消失则转③,不然返回,并显示出错信息;③挪用my_close()封闭①中打开的父目次文件;④挪用my_close()封闭原当前目次文件;⑤假如新的当前目次文件没有打开,则打开该目次文件;并将ptrcurdir指向该打开文件表项;⑥设置当前目次为该目次.5. 创建子目次函数my_mkdir()(1)对应敕令: my_mkdir(2)敕令挪用格局: my_ mkdir dirname(3)函数设计格局: void my_mkdir(char *dirname)(4)功效: 在当前目次下创建名为dirname的子目次.(5)输入:dirname:新建目次的目次名.(6)输出: 无.(7)函数需完成的工作:①挪用do_read()读入当前目次文件内容到内存,检讨当前目次下新建目次文件是否重名,若重名则返回,并显示错误信息;②为新建子目次文件分派一个余暇打开文件表项,假如没有余暇表项则返回-1,并显示错误信息;③检讨FAT是否有余暇的盘块,如有则为新建目次文件分派一个盘块,不然释放①平分派的打开文件表项,返回,并显示错误信息;④在当前目次中为新建目次文件查找一个余暇的目次项或为其追加一个新的目次项;需修正当前目次文件的长度信息,并将当前目次文件的用户打开文件表项中的fcbstate置为1;⑤预备好新建目次文件的FCB的内容,文件的属性为目次文件,以笼罩写方法挪用do_write()将其填写到对应的空目次项中;⑥在新建目次文件所分派到的磁盘块中树立两个特别的目次项“.”和“..”目次项,方法是: 起首在用户空间中预备好内容,然后以截断写或者笼罩写方法挪用do_write()将其写到③平分派到的磁盘块中;⑦返回.6. 删除子目次函数rmdir()(1)对应敕令: my_ rmdir(2)敕令挪用格局: my_ rmdir dirname(1)函数设计格局: void my_rmdir(char *dirname)(2)功效: 在当前目次下删除名为dirname的子目次.(3)输入:dirname:欲删除目次的目次名.(4)输出: 无.(5)函数需完成的工作:①挪用do_read()读入当前目次文件内容到内存,检讨当前目次下欲删除目次文件是否消失,若不消失则返回,并显示错误信息;②检讨欲删除目次文件是否为空(除了“.”和“..”外没有其他子目次和文件),可依据其目次项中记载的文件长度来断定,若不为空则返回,并显示错误信息;③检讨该目次文件是否已经打开,若已打开则挪用my_close()封闭掉落;④收受接管该目次文件所占领的磁盘块,修正FAT;⑤从当前目次文件中清空该目次文件的目次项,且free字段置为0: 以笼罩写方法挪用do_write()来实现;⑥修正当前目次文件的用户打开表项中的长度信息,并将表项中的fcbstate置为1;⑦返回.7. 显示目次函数my_ls()(1)对应敕令: my_ls(2)敕令挪用格局: my_ls(3)函数设计格局: void my_ls(void)(4)功效: 显示当前目次的内容(子目次和文件信息).(5)输入: 无(6)输出: 无(7)函数需完成的工作:①挪用do_read()读出当前目次文件内容到内存;②将读出的目次文件的信息按照必定的格局显示到屏幕上;③返回.8. 创建文件函数my_create()(1)对应敕令: my_create(2)敕令挪用格局: my_create filename(3)函数设计格局: int my_create (char *filename)(4)功效: 创建名为filename的新文件.(5)输入:filename:新建文件的文件名,可能包含路径.(6)输出: 若创建成功,返回该文件的文件描写符(文件打开表中的数组下标);不然返回-1.(7)函数需完成的工作:①为新文件分派一个余暇打开文件表项,假如没有余暇表项则返回-1,并显示错误信息;②若新文件的父目次文件还没有打开,则挪用my_open()打开;若打开掉败,则释放①中为新建文件分派的余暇文件打开表项,返回-1,并显示错误信息;③挪用do_read()读出该父目次文件内容到内存,检讨该目次下新文件是否重名,若重名则释放①平分派的打开文件表项,并挪用my_close()封闭②中打开的目次文件;然后返回-1,并显示错误信息;④检讨FAT是否有余暇的盘块,如有则为新文件分派一个盘块,不然释放①平分派的打开文件表项,并挪用my_close()封闭②中打开的目次文件;返回-1,并显示错误信息;⑤在父目次中为新文件查找一个余暇的目次项或为其追加一个新的目次项;需修正该目次文件的长度信息,并将该目次文件的用户打开文件表项中的fcbstate置为1;⑥预备好新文件的FCB的内容,文件的属性为数据文件,长度为0,以笼罩写方法挪用do_write()将其填写到⑤平分派到的空目次项中;⑦为新文件填写①平分派到的余暇打开文件表项,fcbstate字段值为0,读写指针值为0;⑧挪用my_close()封闭②中打开的父目次文件;⑨将新文件的打开文件表项序号作为其文件描写符返回.9. 删除文件函数my_rm()(1)对应敕令: my_rm(2)敕令挪用格局: my_rm filename(3)函数设计格局: void my_rm(char *filename)(4)功效: 删除名为filename的文件.(5)输入:filename:欲删除文件的文件名,可能还包含路径.(6)输出: 无.(7)函数需完成的工作:①若欲删除文件的父目次文件还没有打开,则挪用my_open()打开;若打开掉败,则返回,并显示错误信息;②挪用do_read()读出该父目次文件内容到内存,检讨该目次下欲删除文件是否消失,若不消失则返回,并显示错误信息;③检讨该文件是否已经打开,若已打开则封闭掉落;④收受接管该文件所占领的磁盘块,修正FAT;⑤从文件的父目次文件中清空该文件的目次项,且free字段置为0: 以笼罩写方法挪用do_write()来实现;;⑥修正该父目次文件的用户打开文件表项中的长度信息,并将该表项中的fcbstate置为1;⑦返回.10. 打开文件函数my_open()(1)对应敕令: my_open(2)敕令挪用格局: my_open filename(3)函数设计格局: int my_open(char *filename)(4)功效: 打开当前目次下名为filename的文件.(5)输入:filename: 欲打开文件的文件名(6)输出: 若打开成功,返回该文件的描写符(在用户打开文件表中表项序号);不然返回-1.(7)函数需完成的工作:①检讨该文件是否已经打开,若已打开则返回-1,并显示错误信息;②挪用do_read()读出父目次文件的内容到内存,检讨该目次下欲打开文件是否消失,若不消失则返回-1,并显示错误信息;③检讨用户打开文件表中是否有空表项,如有则为欲打开文件分派一个空表项,若没有则返回-1,并显示错误信息;④为该文件填写空白用户打开文件表表项内容,读写指针置为0;⑤将该文件所分派到的空白用户打开文件表表项序号(数组下标)作为文件描写符fd返回.11. 封闭文件函数my_close()(1)对应敕令: my_close(2)敕令挪用格局: my_close fd(3)函数设计格局: void my_close(int fd)(4)功效: 封闭前面由my_open()打开的文件描写符为fd的文件.(5)输入:fd:文件描写符.(6)输出: 无.(7)函数需完成的工作:①检讨fd的有用性(fd不能超出用户打开文件表地点数组的最大下标),假如无效则返回-1;②检讨用户打开文件表表项中的fcbstate字段的值,假如为1则须要将该文件的FCB的内容保存到虚拟磁盘上该文件的目次项中,方法是: 打开该文件的父目次文件,以笼罩写方法挪用do_write()将欲封闭文件的FCB 写入父目次文件的响应盘块中;③收受接管该文件占领的用户打开文件表表项(进行清空操作),并将topenfile字段置为0;④返回.12. 写文件函数my_write()(1)对应敕令: my_write(2)敕令挪用格局: my_write fd(3)函数设计格局: int my_write(int fd)(4)功效: 将用户经由过程键盘输入的内容写到fd所指定的文件中.磁盘文件的读写操作都必须以完全的数据块为单位进行,在写操作时,先将数据写在缓冲区中,缓冲区的大小与磁盘块的大小雷同,然后再将缓冲区中的数据一次性写到磁盘块中;读出时先将一个磁盘块中的内容读到缓冲区中,然后再传送到用户区.本实例为了轻便起见,没有设置缓冲区治理,只是在读写文件时由用户应用malloc()申请一块空间作为缓冲区,读写操作停止后应用free()释放掉落.写操作常有三种方法: 截断写.笼罩写和追加写.截断写是废弃本来文件的内容,从新写文件;笼罩写是修正文件在当前读写指针所指的地位开端的部分内容;追加写是在原文件的最后添加新的内容.在本实例中,输入写文件敕令后,体系会消失提醒让用户选择个中的一种写方法,并将随后键盘输入的内容按照所选的方法写到文件中,键盘输入内容经由过程CTR+Z键(或其他设定的键)停止.(5)输入:fd: open()函数的返回值,文件的描写符;(6)输出: 现实写入的字节数.(7)函数需完成的工作:①检讨fd的有用性(fd不能超出用户打开文件表地点数组的最大下标),假如无效则返回-1,并显示出错信息;②提醒并等待用户输入写方法: (1: 截断写;2: 笼罩写;3: 追加写)③假如用户请求的写方法是截断写,则释放文件除第一块外的其他磁盘空间内容(查找并修正FAT表),将内存用户打开文件表项中文件长度修正为0,将读写指针置为0并转④;假如用户请求的写方法是追加写,则修正文件的当前读写指针地位到文件的末尾,并转④;假如写方法是笼罩写,则直接转④;④提醒用户: 全部输入内容经由过程CTR+Z键(或其他设定的键)停止;用户可分多次输入写入内容,每次用回车停止;⑤等待用户从键盘输入文件内容,并将用户的本次输入内容保存到一暂时变量text[]中,请求每次输入以回车停止,全体停止用CTR+Z键(或其他设定的键);⑥挪用do_write()函数将经由过程键盘键入的内容写到文件中.⑦假如do_write()函数的返回值为非负值,则将现实写入字节数增长do_write()函数返回值,不然显示出错信息,并转⑨;⑧假如text[]中最后一个字符不是停止字符CTR+Z,则转⑦持续进行写操作;不然转⑨;⑨假如当前读写指针地位大于用户打开文件表项中的文件长度,则修正打开文件表项中的文件长度信息,并将fcbstate置1;⑩返回现实写入的字节数.13. 现实写文件函数do_write()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: int my_write(int fd,char *text,int len,char wstyle)(4)功效: 被写文件函数my_write()挪用,用来将键盘输入的内容写到响应的文件中去.(5)输入:fd: open()函数的返回值,文件的描写符;text: 指向要写入的内容的指针;len: 本次请求写入字节数wstyle: 写方法(6)输出: 现实写入的字节数.(7)函数需完成的工作:①用malloc()申请1024B的内存空间作为读写磁盘的缓冲区buf,申请掉败则返回-1,并显示出错信息;②将读写指针转化为逻辑块块号和块内偏移off,并应用打开文件表表项中的首块号及FAT表的相干内容将逻辑块块号转换成对应的磁盘块块号blkno;假如找不到对应的磁盘块,则须要检索FAT为该逻辑块分派一新的磁盘块,并将对应的磁盘块块号blkno登记到FAT中,若分派掉败,则返回-1,并显示出错信息;③假如是笼罩写,或者假如当前读写指针所对应的块内偏移off不等于0,则将块号为blkno的虚拟磁盘块全体1024B的内容读到缓冲区buf中;不然便用ASCII码0清空buf;④将text中未写入的内容暂存到缓冲区buff的第off字节开端的地位,直到缓冲区满,或者吸收到停止字符CTR+Z为止;将本次写入字节数记载到tmplen中;⑤将buf中1024B的内容写入到块号为blkno的虚拟磁盘块中;⑥将当前读写指针修正为本来的值加上tmplen;并将本次现实写入的字节数增长tmplen;⑦假如tmplen小于len,则转②持续写入;不然转⑧;⑧返回本次现实写入的字节数.14. 读文件函数my_read()(1)对应敕令: my_read(2)敕令挪用格局: my_read fd len(3)函数设计格局: int myread (int fd, int len)(4)功效: 读出指定文件中从读写指针开端的长度为len的内容到用户空间中.(5)输入:fd: open()函数的返回值,文件的描写符;len: 要从文件中读出的字节数.(6)输出: 现实读出的字节数.(7)函数需完成的工作:①界说一个字符型数组text[len],用来吸收用户从文件中读出的文件内容;②检讨fd的有用性(fd不能超出用户打开文件表地点数组的最大下标),假如无效则返回-1,并显示出错信息;③挪用do_read()将指定文件中的len字节内容读出到text[]中;④假如do_read()的返回值为负,则显示出错信息;不然将text[]中的内容显示到屏幕上;⑤返回.15. 现实读文件函数do_read()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: int do_read (int fd, int len,char *text)(4)功效: 被my_read()挪用,读出指定文件中从读写指针开端的长度为len的内容到用户空间的text中. (5)输入:fd: open()函数的返回值,文件的描写符;len: 请求从文件中读出的字节数.text: 指向存放读出数据的用户区地址(6)输出: 现实读出的字节数.(7)函数需完成的工作:①应用malloc()申请1024B空间作为缓冲区buf,申请掉败则返回-1,并显示出错信息;②将读写指针转化为逻辑块块号及块内偏移量off,应用打开文件表表项中的首块号查找FAT表,找到该逻辑块地点的磁盘块块号;将该磁盘块块号转化为虚拟磁盘上的内存地位;③将该内存地位开端的1024B(一个磁盘块)内容读入buf中;④比较buf中从偏移量off开端的残剩字节数是否大于等于应读写的字节数len,假如是,则将从off开端的buf中的len长度的内容读入到text[]中;不然,将从off开端的buf中的残剩内容读入到text[]中;⑤将读写指针增长④中已读字节数,将应读写的字节数len减去④中已读字节数,若len大于0,则转②;不然转⑥;⑥应用free()释放①中申请的buf.⑦返回现实读出的字节数.16.退出文件体系函数my_exitsys()(1)对应敕令: my_exitsys(2)敕令挪用格局: my_ exitsys(1)函数设计格局: void my_exitsys()(2)功效: 退出文件体系.(3)输入: 无(4)输出: 无.(5)函数需完成的工作:①应用C库函数fopen()打开磁盘上的myfsys文件;②将虚拟磁盘空间中的所有内容保存到磁盘上的myfsys文件中;③应用c说话的库函数fclose()封闭myfsys文件;④撤销用户打开文件表,释放其内存空间⑤释放虚拟磁盘空间.流程图#include <string.h>#include <time.h>#define BLOCKSIZE 1024 // 磁盘块大小#define SIZE 1024000 // 虚拟磁盘空间大小#define END 65535 // FAT中的文件停止标志#define FREE 0 // FAT中盘块余暇标志#define ROOTBLOCKNUM 2 // 根目次区所占盘块数#define MAXOPENFILE 10 // 最多同时打开文件个数t#define MAXTEXT 10000/* 文件掌握块 */typedef struct FCB{char filename[8]; // 文件名char exname[3]; // 文件扩大名unsigned char attribute; // 文件属性字段,值为0时表示目次文件,值为1时表示数据文件unsigned short time; // 文件创建时光unsigned short date; // 文件创建日期unsigned short first; // 文件肇端盘块号unsigned long length; // 文件长度char free; // 表示目次项是否为空,若值为0,表示空,值为1,表示已分派}fcb;/* 文件分派表 */typedef struct FAT{unsigned short id; // 磁盘块的状况(余暇的,最后的,下一个)}fat;/* 用户打开文件表 */typedef struct USEROPEN{char filename[8]; // 文件名char exname[3]; // 文件扩大名unsigned char attribute;//文件属性字段,值为0时表示目次文件,值为1时表示数据文件unsigned short time; // 文件创建时光unsigned short date; // 文件创建日期unsigned short first; // 文件肇端盘块号unsigned long length;//文件长度(对数据文件是字节数,对目次文件可所以目次项个数)char free; // 表示目次项是否为空,若值为0,表示空,值为1,表示已分派unsigned short dirno; // 响应打开文件的目次项在父目次文件中的盘块号int diroff; // 响应打开文件的目次项在父目次文件的dirno盘块中的目次项序号char dir[80]; // 响应打开文件地点的路径名,如许便利快速检讨出指定文件是否已经打开int father; // 父目次在打开文件表项的地位int count; // 读写指针在文件中的地位,文件的总字符数char fcbstate; // 是否修正了文件的FCB的内容,假如修正了置为1,不然为0char topenfile; // 表示该用户打开表项是否为空,若值为0,表示为空,不然表示已被某打开文件占领}useropen;/* 引诱块 */typedef struct BLOCK0{char magic[10]; // 文件体系魔数char information[200];//存储一些描写信息,如磁盘块大小.磁盘块数目.最多打开文件数等 unsigned short root; // 根目次文件的肇端盘块号unsigned char *startblock; // 虚拟磁盘上数据区开端地位}block0;unsigned char *myvhard; // 指向虚拟磁盘的肇端地址useropen openfilelist[MAXOPENFILE]; // 用户打开文件表数组int curdir; // 用户打开文件表中的当前目次地点打开文件表项的地位char currentdir[80]; // 记载当前目次的目次名(包括目次的路径)unsigned char* startp; // 记载虚拟磁盘上数据区开端地位char myfilename[] = "myfilesys";//文件体系的文件名void startsys(); // 进入文件体系void my_format(); // 磁盘格局化void my_cd(char *dirname); // 更改当前目次void my_mkdir(char *dirname); // 创建子目次void my_rmdir(char *dirname); // 删除子目次void my_ls(); // 显示目次void my_create (char *filename); // 创建文件void my_rm(char *filename); // 删除文件int my_open(char *filename); // 打开文件int my_close(int fd); // 封闭文件int my_write(int fd); // 写文件int do_write(int fd, char *text, int len, char wstyle); // 现实写文件int my_read (int fd, int len); // 读文件int do_read (int fd, int len,char *text); // 现实读文件void my_exitsys(); // 退出文件体系unsigned short findblock(); // 查找余暇盘块int findopenfile(); // 查找余暇文件表项void startsys(){FILE *fp;unsigned char buf[SIZE];fcb *root;int i;myvhard = (unsigned char *)malloc(SIZE);//申请虚拟磁盘空间memset(myvhard, 0, SIZE);//将myvhard中前SIZE个字节用 0 调换并返回 myvhard if((fp = fopen(myfilename, "r")) != NULL){fread(buf, SIZE, 1, fp);//将二进制文件读取到缓冲区fclose(fp);if(strcmp(((block0 *)buf)->magic, "10101010")){printf("myfilesys is not exist,begin to creat the file...\n");my_format();}else{for(i = 0; i < SIZE; i++)myvhard[i] = buf[i];}}else{printf("myfilesys is not exist,begin to creat the file...\n");my_format();}root = (fcb *)(myvhard + 5 * BLOCKSIZE);strcpy(openfilelist[0].filename, root->filename);strcpy(openfilelist[0].exname, root->exname);openfilelist[0].attribute = root->attribute;openfilelist[0].time = root->time;openfilelist[0].date = root->date;openfilelist[0].first = root->first;openfilelist[0].length = root->length;openfilelist[0].free = root->free;openfilelist[0].dirno = 5;openfilelist[0].diroff = 0;strcpy(openfilelist[0].dir, "\\root\\");openfilelist[0].father = 0;openfilelist[0].count = 0;openfilelist[0].fcbstate = 0;openfilelist[0].topenfile = 1;for(i = 1; i < MAXOPENFILE; i++)openfilelist[i].topenfile = 0;curdir = 0;strcpy(currentdir, "\\root\\");startp = ((block0 *)myvhard)->startblock;}void my_format(){FILE *fp;fat *fat1, *fat2;block0 *blk0;time_t now;struct tm *nowtime;fcb *root;int i;blk0 = (block0 *)myvhard;fat1 = (fat *)(myvhard + BLOCKSIZE);fat2 = (fat *)(myvhard + 3 * BLOCKSIZE);root = (fcb *)(myvhard + 5 * BLOCKSIZE);strcpy(blk0->magic, "10101010");strcpy(blk0->information, "My FileSystem Ver 1.0 \n Blocksize=1KB Whole size=1000KB Blocknum=1000 RootBlocknum=2\n");blk0->root = 5;blk0->startblock = (unsigned char *)root;for(i = 0; i < 5; i++){fat1->id = END;fat2->id = END;fat1++;fat2++;}fat1->id = 6;fat2->id = 6;fat1++;fat2++;fat1->id = END;fat2->id = END;fat1++;fat2++;for(i = 7; i < SIZE / BLOCKSIZE; i++){fat1->id = FREE;fat2->id = FREE;fat1++;fat2++;}now = time(NULL);nowtime = localtime(&now);strcpy(root->filename, ".");strcpy(root->exname, "");root->attribute = 0x28;root->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;root->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday; root->first = 5;root->length = 2 * sizeof(fcb);root->free = 1;root++;now = time(NULL);nowtime = localtime(&now);strcpy(root->filename, "..");strcpy(root->exname, "");root->attribute = 0x28;root->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;root->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday; root->first = 5;root->length = 2 * sizeof(fcb);root->free = 1;fp = fopen(myfilename, "w");fwrite(myvhard, SIZE, 1, fp);fclose(fp);}void my_cd(char *dirname){char *dir;int fd;dir = strtok(dirname, "\\");//分化字符串为一组字符串.dirname为要分化的字符串,"\\"为分隔符字符串 if(strcmp(dir, ".") == 0)return;else if(strcmp(dir, "..") == 0){if(curdir)curdir = my_close(curdir);return;}else if(strcmp(dir, "root") == 0){while(curdir)curdir = my_close(curdir);dir = strtok(NULL, "\\");}while(dir)。
课程设计课程名称________操作系统___ ____题目名称_多用户多级目录文件系统的实现_ 学生学院________计算机学院____________专业班级______ _________学号________ ___________学生姓名_________ _____________指导教师__________林穗______________2011年1月18日广东工业大学课程设计任务书题目名称多用户多级目录文件系统的实现学生学院计算机学院专业班级08软件工程一班姓名学号一、课程设计的内容本课程设计要求设计一个模拟的多用户多级目录的文件系统。
通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
二、课程设计的要求与数据1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2.文件物理结构可采用显式链接或其他方法。
3.磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。
5.设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:(1)具有login (用户登录)(2)系统初始化(建文件卷、提供登录模块)(3)文件的创建:create(4)文件的打开:open(5)文件的读:read(6)文件的写:write(7)文件关闭:close(8)删除文件:delete(9)创建目录(建立子目录):mkdir(10)改变当前目录:cd(11)列出文件目录:dir(12)退出:logout6.系统必须可实际演示,选用程序设计语言:C++、C等。
三、课程设计应完成的工作1.充分理解设计的任务,完成设计的基本要求。
然后根据自己的基础和能力选择不同难度的算法和实现方式,以取得更高的分数。
2. 独立独立完成系统的分析、设计、编码、测试工作。
3.完成设计报告的撰写。
4.以光盘(以班为单位刻录)方式提交已调试通过的完整的相关源程序和能够运行的执行文件;提交“课程设计报告”的书面和电子两种版本。
四、课程设计进程安排五、应收集的资料及主要参考文献[1]计算机操作系统,汤小丹等,西安电子科技大学出版社[2]操作系统实验指导书,傅秀芬,广东工业大学(自编)[3] 计算机操作系统教程( 第二版),张尧学、史美林,清华大学出版社[4] 现代操作系统,A.S.Tanenbaum 著,陈向群等译机械工业出版社发出任务书日期:2010年12月22日指导教师签名:林穗计划完成日期:2011年1月21日基层教学单位责任人签章:滕少华目录i.设计目的…………………………………………………………………ii.开发工具与环境…………………………………………………………iii.设计思想…………………………………………………………………iv.系统结构说明……………………………………………………………v.数据结构说明……………………………………………………………vi.各模块的算法流程图……………………………………………………1、程序总体源流程图……………………………………………………2、主要模块的算法流程图………………………………………………3、函数声明………………………………………………………………vii.程序运行及清单…………………………………………………………1、用户管理操作界面……………………………………………………2、文件管理操作界面……………………………………………………3、主要核心源代码………………………………………………………viii.操作说明书………………………………………………………………1、用户管理使用手册…………………………………………………2、文件操作管理使用手册……………………………………………ix.体会和建议………………………………………………………………………i.设计目的本课程设计要求设计一个模拟的多用户多级目录的文件系统。
通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
ii.开发工具与环境a)程序设计语言:C语言b)计算机及操作系统:PC机,WindowsXPc)开发平台:Microsoft Visual C++ 6.0简化版d)运行平台:PC机,WindowsXPiii.设计思想课程设计采用Microsoft Visual C++ 6.0简化版作为开发工具,参照了windows资源管理器的结构,模拟文件管理的工作过程,通过创建一棵多叉树,及对这棵多叉树的操作,建立了一个树型文件系统,实现了文件和文件夹的创建,打开,读写,删除,关闭,复制,粘贴,查看,属性设置等十来个功能。
操作界面简单明了,操作方便。
iv.系统结构说明模拟文件管理系统可以自行设置多个用户进行管理操作,当选择已有用户时便可进入其文件管理菜单进行相应的操作(有界面提示功能),当进入系统已建立的某个用户时,可以创建用户自己的文件夹或文件,当flag=0时为创建文件,flag=1时创建文件夹(这里设置了标志位)。
文件除了名称和打开标志外,还可对他们的访问权限、文件类型和文件长度进行设置(长度设置主要在写入文件时会用到);而文件夹则可以设置访问权限等,打开文件列表的结构体包括文件名和文件的父节点地址,打开文件夹的链表中包括文件夹名称及其地址等;对文件的管理包含复制、打开、关闭、写入、读出、粘贴、新建文件(夹)、删除文件(夹)和显示文件(夹)等等,为方便操作还设置了各功能操作(如进入下一级、返回上一级、返回初始菜单、直接退出等等)。
下面的系统结构说明图示:其中P表示parent指针,C表示child指针,N表示next指针v.数据结构说明该模拟文件管理系统的文件目录检索采用简单的线性搜索,系统所采用的数据结构:typedef struct list LIST;struct list{char listname[10];int type;int length;int protect;int flag;char *content;struct list *parent;struct list *child;struct list *next;};typedef struct usd USD;struct usd{char username[10];LIST *list;struct usd *next;};vi.各模块的算法流程图1.程序总体流程图2.主要模块的算法流程图1)创建用户模块:2)删除用户3)创建文件(夹)4)删除文件夹5)复制文件3.函数声明void displayusermenu();///用户管理界面菜单void time();///系统时间void displayfilemenu();///文件管理界面菜单void creatuser();///新建用户void deleteuser();///删除用户void displayuser();///显示用户void userhelp();///用户管理帮助void filehelp();///文件管理帮助void selectuser();///选择用户void displaylist();///显示文件或者文件夹void creatfile(LIST *qq,int flag);///创建文件(夹)void deletefile(LIST *qq,int flag);///删除文件(夹)void openfile();///打开文件void readfile(); ///读取文件void writefile(); ///写入文件void closefile();///关闭文件void next();///下一层文件夹void back();//上一层文件夹void copyfile();//复制文件void pastedfile();///粘贴文件void quit();///直接退出系统vii.程序运行及清单系统界面简洁美观实用,用户无须输入过长指令就可以完成操作。
本系统还附带操作指南,用户如有疑问可查看指南说明。
虽不如可视化易操作,但也不难。
1、用户管理操作1)程序登陆界面2)程序开始界面(即用户管理界面)3)新建用户4)列出用户5)删除用户6)系统日期时间7)帮助文档8)退出系统9)选择用户输入用户名(若系统无此用户会有提示)按回车后即进入文件操作界面。
2、对文件管理操作1)进入用户后对文件操作初始界面2)新建文件3)新建文件夹4)显示当前路径文件(夹)5)删除文件文件存在时6)删除文件夹文件夹存在时7)打开文件文件存在时8)读出文件文件需要先置于打开状态,方可读取由于没有输入内容所以文件内容为空。
9)写入文件10)读出刚才写入的内容11)关闭文件12)复制文件(先将刚才关闭的文件aa1打开再复制)如果输入的文件名不存在该用户中时会有提示信息3、主要核心源代码(见电子版)#include <stdio.h>#include <math.h>#include <malloc.h>#include <string.h>#include <conio.h>#include <time.h>#include "stdlib.h"#define NULL 0#define get(type) (type *)malloc(sizeof(type)) //分配空间typedef struct list LIST;struct list{char listname[10]; // 文件名长度int type;int length; // 文件长度int protect; // 保护模式,0为只读,1为可读写int flag; // 标志,为0时创建文件夹,为1时创建文件char *content;.struct list *parent;struct list *child;struct list *next;};typedef struct usd USD;struct usd{char username[10]; // 用户名长度LIST *list;struct usd *next;};// 函数声明void displayusermenu(); // 用户管理界面菜单void login(); // 系统登陆界面void time(); // 系统时间void displayfilemenu(); // 文件管理界面菜单void creatuser(); // 新建用户void deleteuser(); // 删除用户void displayuser(); // 显示用户void userhelp(); // 用户管理帮助void filehelp(); // 文件管理帮助void selectuser(); // 选择用户void displaylist(); // 显示文件或者文件夹void creatfile(LIST *qq,int flag);// 创建文件(夹)void deletefile(LIST *qq,int flag);// 删除文件(夹)void openfile(); // 打开文件void readfile(); // 读取文件void writefile(); // 写入文件void closefile(); // 关闭文件void next(); // 下一层文件夹void back(); // 上一层文件夹void copyfile(); // 复制文件void pastedfile(); // 粘贴文件void quit(); // 直接退出系统USD *user=NULL,*currentuser=NULL;LIST *list=NULL,*currentlist=NULL,*copylist=NULL;void displayusermenu() // 显示用户菜单{system("cls"); // 清屏int button;printf("\n\n\t\t\t欢迎使用多用户多级目录文件系统\n\n"); printf("\t\t计算机学院\t\t软件工程1班\n\n");printf("\t\t \t\t \n\n\n");printf("\t\t1、新建用户\n");printf("\t\t2、删除用户\n");printf("\t\t3、选择用户\n");printf("\t\t4、列出用户\n");printf("\t\t5、系统时间\n");printf("\t\t6、帮助文档\n");printf("\t\t7、退出系统\n\n");printf("\t\t请按功能选择操作:");scanf("%d",&button);switch(button){case 1:creatuser();break; // 创建新用户case 2:deleteuser();break; // 删除用户case 3:selectuser();displayfilemenu();break; // 选择一个用户case 4:displayuser(); // 显示用户getchar();getchar();displayusermenu();break;case 5:system("cls"); //系统时间显示time();displayusermenu();break;case 6:userhelp(); // 帮助getch();displayusermenu();break;case 7:system("cls"); // 退出printf("\n\n\n\t\t\t\t欢迎再次使用!!\n\n");getch();exit(0);break;default :printf("\n\n\t\t\t你的输入有误!请重新输入!!!\n");getch();displayusermenu();break; // 输入非上述数字重新输入}}void displayfilemenu() // 显示文件管理操作菜单{system("cls"); // 清屏int choice;LIST *p=currentlist;printf("\n\t\t [%s]你好,欢迎进入文件管理系统\n",currentuser->username);//提示信息printf("\n 当前的文件路径:");// 接入目录地址do{printf("<%s",p->listname);p=p->parent;}while(p!=NULL);printf("\t\t[格式:子目录<--根目录]\n\n");printf(" 功能选择\n\n");//菜单printf("\t\t1、新建文件\t\t\t 9、复制文件\n");printf("\t\t2、删除文件\t\t\t10、粘贴文件\n");printf("\t\t3、新建文件夹\t\t\t11、显示当前路径文件(夹)\n");printf("\t\t4、删除文件夹\t\t\t12、进入下一级文件夹\n");printf("\t\t5、打开文件\t\t\t13、返回上一级文件夹\n");printf("\t\t6、读出文件\t\t\t14、返回用户管理菜单\n");printf("\t\t7、写入文件\t\t\t15、帮助与支持\n");printf("\t\t8、关闭文件\t\t\t16、直接退出系统\n\n");printf("\n\n");printf("\t\t\t按功能选择选择相应的操作(输入相关数字): ");scanf("%d",&choice);printf("\n");system("cls");switch(choice)//switch语句{case 1:creatfile(currentlist,0);break; // 创建文件case 2:deletefile(currentlist,0);break; // 删除文件case 3:creatfile(currentlist,1);break; // 创建文件夹case 4:deletefile(currentlist,1);break; // 删除文件夹case 5:openfile();break; // 打开文件case 6:readfile();displayfilemenu();break; // 读出文件case 7:writefile();displayfilemenu();break; // 写入文件case 8:closefile();break; // 关闭文件case 9:copyfile();break; // 复制文件case 10:pastedfile();break; // 粘贴文件case 11:displaylist(); // 显示文件(夹)getch();displayfilemenu();break;case 12:next();break; // 进入下一级文件夹case 13:back();break; // 返回上一级文件夹case 14:displayusermenu();break; // 退出,返回上用户管理菜单case 15:filehelp();displayfilemenu();break;case 16:quit();break;default :printf("\n\n\t\t\t你的输入有误!请重新输入!!!\n");getch();displayfilemenu();break; // 非法输入,返回文件管理菜单重新输入}}void login(){char username[20];char password[20];printf("\n\n\n\n");printf("\t\t\t系统登陆:(用户密码均为admin)\n\n");printf("\t\t\t请输入用户名:");scanf("%s",username);printf("\t\t\t请输入密码:");scanf("%s",password);if(strcmp(username,"admin")||strcmp(password,"admin")){printf("\n\t\t用户名或密码错误,请重新输入!\n");getch();system("cls");login();}}void time() // 显示系统时间日期{time_t now; // 调用系统日期时间time(&now);printf("\n\n \t\t\t系统当前日期时间\n\n");printf("\t\t\t %s",asctime(localtime(&now)));//显示系统详细时间printf("\n\n\n");getch();}void creatuser() // 创建用户{int i;char s;USD *p,*q=user;system("cls");p=get(USD);for(i=1;q!=NULL;i++)q=q->next; // i指示当前用户个数q=user;printf("\n\t\t\t\t[创建一个新用户]\n");printf("\n\t\t\t\t请输入NO.%d个用户名: ",i);scanf("%s",p->username); //输入新用户的名字LIST *l=list;l=get(LIST);strcpy(l->listname,p->username);l->next=NULL;l->type=1;l->parent=NULL;l->child=NULL;p->list=l;p->next=NULL;if(user==NULL){user=p; // 若user为空,则把P复给user}else // 若user不为空,则以有旧用户存在{while(q->next!=NULL){ // 寻找最后一个用户if(strcmp(p->username,q->username)==0){ // 比较,看系统是否已经存在该用户printf("\n\tthe user has exit ! try again !\n\n"); // 提示出错信息getchar();getchar();system("cls");displayusermenu();}q=q->next;}if(strcmp(p->username,q->username)==0){///检查提示重名并提示信息printf("\n\t\t\t该用户已经存在!无法创建该用户!\n\n");getchar();getchar();system("cls");displayusermenu();}q->next=p; //继续寻找下一个字符}printf("\n\t\t\t\t是否要再创建一个用户?(Y/N):"); //输入下一个用户scanf("%s",&s);switch(s){case 'y':creatuser();break;case 'Y':creatuser();break;case 'n':displayusermenu();break;case 'N':displayusermenu();break;default :displayusermenu();break;}}void deleteuser() //删除用户{char n[10];USD *p=user,*pre=NULL;displayuser();if(!p){printf("\n\t\t\t\t系统无用户可删除!\n"); //P为空,报错,必须先创建一个用户getchar();getchar();system("cls");displayusermenu();}printf("\n\n\t\t\t\t请输入要删除的用户名:");scanf("%s",n);while(p!=NULL){if(strcmp(p->username,n)==0) //寻找所要删除的用户{if(p==user){user=user->next; //若是第一个用户,则释放P }else{pre->next=p->next;}free(p);printf("\n\n\n\t\t\t\t 已经成功删除用户[%s]!!! ",n);break;}else{pre=p;p=p->next;}}if(p==NULL) //找不到用户{printf("\n\n\t\t\t找不到该用户!请确认该用户是否存在!\n");}getchar();getchar();system("cls"); displayusermenu();}void selectuser() //选择用户{char n[10];USD *p=user;displayuser();if(!p){printf("\n\t\t\t该用户不存在!请确认用户名是否正确!!!"); //没有用户getchar();getchar();system("cls");displayusermenu();}printf("\n\t\t\t\t[选择一个用户]");printf("\n\n\t\t\t\t请输入用户名:");scanf("%s",n); //输入用户名while(p!=NULL){if(strcmp(p->username,n)==0) //逐个比较寻找用户{currentuser=p; //找到对应用户,则把currentuser指向该用户currentlist=p->list;printf("%s\n",currentlist->listname);return;}else{p=p->next;}}if(p==NULL) //找不到用户{printf("\n\n\t\t\t\t该用户不存在!!!");getchar();system("cls");displayusermenu();}}void creatfile(LIST *qq,int flag) //创建文件(夹){LIST *temp;LIST *p=qq->child;LIST *q;temp=get(LIST);loop:q=qq->child;if(flag==0){printf("\n\t\t\t\t[创建一个新文件]\n");printf("\n\t\t\t\t请输入新建文件名: "); //输入文件名}else{printf("\n\t\t\t\t[创建一个新文件夹]\n");printf("\n\t\t\t\t请输入新建文件夹名: "); //输入文件名}scanf("%s",temp->listname);while(q!=NULL){if(strcmp(temp->listname,q->listname)==0){printf("\n\t\t\t相同路径下有重名文件!请重新输入!");goto loop;}q=q->next;}temp->content=NULL;printf("\n\t\t文件属性: 0、只读Read\t\t1、读和写Read&Write"); //设置保护模式printf("\n\n\t\t\t请根据提示选择保护模式(0/1)?: ");scanf("%d",&temp->protect);if(temp->protect!=0&&temp->protect!=1){ printf("\n\n\t\t\t你的选择有误!请重新输入(0/1)?: ");scanf("%d",&temp->protect);}if(flag==0){printf("\n\t\t\t\t请输入该文件的长度: "); //设置文件长度,供写入文件时会用到scanf("%d",&temp->length);}if(flag==0)temp->type=0; //0为文件else temp->type=1;temp->flag=0; //文件默认为关闭状态,以后需要时再打开temp->child=NULL;temp->next=NULL;temp->parent=currentlist;if(p==NULL){qq->child=temp;}else{while(p->next!=NULL){p=p->next;}p->next=temp;}getchar();displayfilemenu();}void deletefile(LIST *qq,int flag) //删除文件(夹){char n[10];LIST *p=qq->child;LIST *pre=NULL;if(flag==0){printf("\n\t\t\t\t[删除一个文件]\n");printf("\n\t\t\t\t请输入要删除的文件名: ");}else{printf("\n\t\t\t\t[删除文件夹]\n");printf("\n\t\t\t\t请输入要删除的文件夹名: ");}scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)){if(pre==NULL) //第一个节点{qq->child=p->next;free(p);printf("\n\n\t\t\t\t文件%s已删除成功!!!\n",n);}else{pre->next=p->next; //把前一个指针的NEXT指向N当前指针的NEXT,则删除该文件printf("\n\n\t\t\t\t文件%s已删除成功!!!\n",n);free(p);}break;}else if((strcmp(p->listname,n)==0)&&(p->type==1)){if(pre==NULL) //第一个节点{qq->child=p->next;free(p);printf("\n\n\t\t\t\t文件夹%s已经成功删除!!!\n",n);}else{pre->next=p->next; //把前一个指针的NEXT指向N当前指针的NEXT,则删除该文件printf("\n\n\t\t\t\t文件夹%s已经成功删除!!!\n",n);free(p);}break;}else{pre=p;p=p->next;}}if(p==NULL&&flag==0) //该文件不存在printf("\n\n\t\t\t\t找不到该文件!");else if(p==NULL&&flag==1) printf("\n\n\t\t\t\t找不到该文件夹!\n");getchar(); //用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中)getchar();displayfilemenu();}void openfile() ////打开文件{char n[10];LIST *p=currentlist->child;printf("\n\t\t\t\t[打开一个文件]\n");printf("\n\t\t\t\t请输入要打开的文件名: ");//输入文件名scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==0))//比较文件以寻找要打开的文件{p->flag=1;printf("\n\t\t\t\t文件%s成功打开!!!\n",n);break;}else if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1)){printf("\n\t\t\t\t文件%s打开已经!!!\n",n);break;}p=p->next;}if(p==NULL){printf("\n\n\t\t\t\t找不到该文件!\n");}getchar();getchar();displayfilemenu();}void readfile() //读出文件{char n[10];LIST *p=currentlist->child;printf("\n\t\t\t\t[读取一个文件]\n");printf("\n\n\t\t\t\t请输入要读的文件名: ");scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1))//比较{printf("\n\t\t\t文件%s内容是:%s",p->listname,p->content);getchar();getchar();system("cls");return;}p=p->next;}printf("\n\n\t\t读文件失败,请确认该文件是否已经打开或文件是否存在!\n");getchar();getchar();}void writefile() //写入文件{char n[10],*temp;LIST *p=currentlist->child;printf("\n\t\t\t\t[写入文件]\n");printf("\n\t\t\t\t请输入要写的文件名: ");scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)){if(p->flag==0){printf("\n\t\t\t文件未打开,无法写入!请将文件置打开状态!!!\n");getchar();getchar();system("cls");}else if(p->protect==0){printf("\n\n\t\t\t操作受限!该文件不能写!!!\n"); //该文件限制读写getchar();system("cls");return;}else{temp=(char *)malloc(sizeof(char)*p->length);printf("\n\n\t\t\t\t请输入文件内容(length<=%d):\n\n\t",p->length);scanf("%s",temp);p->content=temp;getchar();system("cls");}return;}p=p->next;}printf("\n\n\t\t\t该文件不存在!获取失败!!!\n");//提示getchar();getchar();}void closefile() //关闭文件{char n[10];LIST *p=currentlist->child;printf("\n\t\t\t\t[关闭一个文件]\n");printf("\n\t\t\t\t请输入要关闭的文件名: ");scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1))//寻找需要文件{p->flag=0;printf("\n\t\t\t\t文件%s关闭成功.\n",n);break;}else if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==0)){。