文件系统实验报告
- 格式:doc
- 大小:14.16 KB
- 文档页数:11
实验报告实验人:实验名称:掌握EFS的加密和解密实验目的:学会EFS的加密和学会利用备份密钥、添加恢复代理和添加授权用户解密数据实验过程:先做好前期准备工作:创建两个用户Tom和Bob,把他们加进远程,在Tom里建一个文件夹“tom”,在文件夹里建一个文档“tom”,在里面写点文字,对文件夹加密,用Bob访问。
(统一在D 盘)(一)前期准备工作(1)EFS的加密右击该文件夹,点击“属性”→“高级”→“加密内容以便保护数据”,如下图你可以选择怎样加密,如上图所示,加密完成后文件夹和文档的字体颜色会变成绿色,如右上图所示。
(2)访问进入Bob远程桌面(或管理员桌面),在D盘打开tom文件夹,可以看到tom文档,但打不开文档,存取被拒绝,如下图(二)EFS的解密(1)备份密钥(在Tom下)•1).在运行中输入“certmgr.msc”然后回车,打开证书管理器。
如下图所示点击“个人”→“证书”,右击“tom”→“所有任务”→“导出”会弹出“欢迎使用证书导出向导”界面点击“下一步”选择“是,导出私钥”,点击“下一步”点击“下一步”键入密码,点击“下一步”填入文件名例如tom 点击“下一步”导出成功•2).利用管理控制台mmc打开证书管理器。
点击“文件”→“添加/删除管理单元”点击“添加”,找到“证书”,点击“添加”点击“确定”如下图单击加号,如下图然后,导出过程与第一个的一样。
下图是导出文件存放的位置Bob访问不知道私钥时,还是打不开文档。
在C:\Documents and Settings\tom中找到导出文件双击(或右击,点击“安装PFX”),弹出“欢迎使用证书导入向导”点击“下一步”点击“下一步”输入密码,点击“下一步”点击“下一步”点击“完成”导入成功这样,Bob就能访问Tom的加密文件夹里的文档了,如下图Tom在加密文件夹里在建一个文档,Bob也能看到。
上图是Tom新创建的文档ttt,下图是Bob打开的。
acl实验报告ACL实验报告一、引言ACL(Access Control List)是一种用于控制系统资源访问权限的机制。
通过ACL,系统管理员可以根据用户的身份、角色或其他标识来限制用户对特定资源的访问。
本实验旨在探索ACL的原理和应用,并通过实际操作来加深对ACL的理解。
二、ACL的基本原理ACL的基本原理是根据用户的身份或角色来控制对资源的访问权限。
ACL可以应用于文件、文件夹、网络设备等各种资源。
在ACL中,通常包含两类主体:访问主体(Subject)和资源主体(Object)。
访问主体可以是用户、用户组或其他身份标识,而资源主体可以是文件、文件夹、网络端口等。
ACL中的权限通常包括读取、写入、执行等操作。
通过为每个主体分配适当的权限,系统管理员可以精确控制用户对资源的操作。
例如,管理员可以设置只有特定用户组的成员才能读取某个文件,或者只有特定用户才能执行某个程序。
三、ACL的应用场景ACL在实际应用中有广泛的应用场景。
以下是几个典型的例子:1. 文件系统权限控制在操作系统中,文件和文件夹是最常见的资源。
通过ACL,管理员可以为每个文件或文件夹设置不同的访问权限。
例如,对于某个重要的文件,管理员可以设置只有自己和特定用户才能读取和写入,其他用户只能读取。
这样可以确保敏感信息不被未授权的用户访问。
2. 网络访问控制对于企业内部的网络,管理员可以使用ACL来控制用户对不同网络资源的访问。
例如,某个部门的员工只能访问本部门的内部网站和文件共享,而不能访问其他部门的资源。
通过ACL,管理员可以轻松实现这种网络访问控制。
3. 路由器和防火墙配置在网络设备中,ACL也扮演着重要的角色。
通过为路由器或防火墙配置ACL,管理员可以控制网络流量的访问权限。
例如,可以设置只有特定IP地址或特定端口的流量才能通过,其他流量则被阻止。
这样可以提高网络的安全性和性能。
四、ACL实验操作步骤以下是一个简单的ACL实验操作步骤,以文件系统权限控制为例:1. 创建测试文件首先,在你的计算机上创建一个测试文件,命名为test.txt。
简单文件系统的设计及实现一、实验目的: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 一台运行Windows 2000 Professional或 Windows 2000 Server的操作系统的计算机。
2 计算机中需安装 Visual C++ 6.0专业版或企业版四、实验要求:(1 按照学校关于实验报告格式的要求, 编写实验报告 (含流程图 ;(2实验时按两人一组进行分组,将本组认为效果较好的程序提交检查。
计算机系课程设计实验报告课程名称操作系统课程设计实验学期 2012 至 2013 学年第 1 学期学生所在系部计算机与信息管理系年级 2010 专业班级计算机001班学生姓名学号任课教师实验成绩计算机系制一个简单的文件系统的详细设计一、实验目的(1)阅读并调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
(2)了解设计一个n个用户的文件系统,每个用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验要求1、阅读所给文件系统源程序,并加注释(注释量达60%),2、修改、完善该系统,画出所设计的文件系统的详细流程图。
三、文件系统功能设计1. 功能设计该文件系统是一个多用户、多任务的文件系统。
对用户和用户的文件数目并没有上限。
也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。
该系统可以支持的操作命令如下:①bye——用户注销命令。
当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面。
命令格式:bye②close——删除用户注册信息命令。
执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。
命令执行完成后返回登陆界面。
命令格式:close③create——在当前目录下创建一个文件,且该文件不能跟当前已有的文件重名。
该文件的管理信息登记在用户文件信息管理模块中。
执行完该命令后回到执行命令行。
命令格式:create>file1其中:“>”符为提示符,file1为要创建的文件名。
④delete——删除当前用户目录下的一个文件,命令执行完毕返回至命令行。
命令格式:delete>file1其中:file1为要删除的文件名。
⑤list——显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。
实验二观察Linux行为实验时间6小时实验目的学习Linux内核、进程、存储和其他资源的一些重要特征。
实验目标编写一个程序使用/proc机制检查反映机器平均负载、进程资源利用等方面的各种内核值。
在得到内核状态之后,将所观察到的行为在屏幕上输出。
背景知识Linux、Solaris和其他版本的UNIX提供了一种非常有用的检查内核状态机制,叫做/proc文件系统。
这是可以用来完成本练习的关键机制。
1. /proc文件系统/proc文件系统是一种操作系统机制,它的接口就像传统UNIX文件系统的一个目录(在根目录中)。
可以改变到/proc正如改变到任何其他目录,例如,bash$ cd /proc使/proc作为当前目录。
一旦把/proc作为当前目录,就可以用ls命令列出它的内容。
其内容看起来像普通的文件和目录。
但是,/proc或者其子目录中的文件实际上是读取内核变量并以ASCII字符串方式报告它们的程序。
这些例程中的一些仅在伪文件打开时读取内核表,而其他例程在每次文件被访问时读表。
因此各种读函数的工作方式可能与预期的有所不同,因为它们并没有在真正操作文件。
Linux提供的/proc实现可以读取很多不同的内核表。
/proc中包含一些目录和文件,每个文件读取一个或多个内核变量。
而具有数字名称的子目录包括更多的伪文件读取其进程ID和目录名相同的进程的有关信息。
self目录包含了正在使用/proc进程的特定进程信息。
/proc目录树的确切内容随Linux的版本而不同,所以必须对伪文件进行实验查看所提示的信息。
/proc中的文件可以像普通的ASCII文件一样进行读取。
例如,向shell敲入以下命令:bash$ cat /proc/version将得到打印到stdout的类似下面的信息:Linux version 2.2.12 (gcc version egcs-2.91.6619990314/Linux (egcs-1.1.2 release)) #1 Mon Sep 27 10:40:35EDT 1999为了读取一个伪文件的内容,可以打开文件然后使用stdio程序库中的例程如fgets()或者fscanf()来读取文件。
第1篇一、实验目的1. 理解嵌入式系统挂载的基本原理和流程。
2. 掌握使用Linux内核进行挂载操作的方法。
3. 学习开发简单的文件系统,实现挂载功能。
4. 增强实践能力,提高嵌入式系统开发水平。
二、实验环境1. 操作系统:Ubuntu 18.042. 编程语言:C/C++3. 开发工具:gcc、make、vim4. 实验平台:Linux虚拟机三、实验内容1. 理解挂载的概念及作用2. Linux内核挂载机制3. 文件系统开发4. 挂载系统设计与实现四、实验步骤1. 理解挂载的概念及作用挂载是指将文件系统加载到操作系统的文件系统中,使得用户可以访问该文件系统中的文件和目录。
挂载是嵌入式系统中常用的功能,例如,在Android系统中,需要挂载外部存储设备(如SD卡)才能访问其中的文件。
2. Linux内核挂载机制Linux内核通过VFS(虚拟文件系统)来实现文件系统的挂载。
VFS为所有文件系统提供了一个统一的接口,使得用户可以在不知道具体文件系统类型的情况下,访问文件和目录。
挂载过程大致如下:(1)用户或应用程序请求挂载文件系统;(2)内核调用挂载函数,查找对应的文件系统模块;(3)加载文件系统模块;(4)调用文件系统的挂载函数,将文件系统挂载到指定的挂载点;(5)用户或应用程序可以通过挂载点访问文件系统中的文件和目录。
3. 文件系统开发本实验中,我们将开发一个简单的文件系统,实现挂载功能。
以下是文件系统的主要功能:(1)支持创建、删除、读取、写入文件和目录;(2)支持文件和目录的权限设置;(3)支持文件系统的挂载和卸载。
文件系统开发步骤如下:(1)定义文件系统结构体,包括文件系统信息、超级块、inode表、数据块等;(2)实现文件系统初始化函数,创建超级块、inode表、数据块等;(3)实现文件和目录的创建、删除、读取、写入等操作;(4)实现文件系统的挂载和卸载功能。
4. 挂载系统设计与实现挂载系统主要包括以下模块:(1)挂载模块:负责加载文件系统模块,调用文件系统的挂载函数;(2)卸载模块:负责卸载文件系统模块,调用文件系统的卸载函数;(3)文件系统模块:负责实现文件系统的各种操作。
Linux操作系统报告单专业:计算机科学与技术学号:姓名:名称:文件和目录管理任课教师:班级:完成日期:成绩:一、实验名称及目的:实验名称:文件和目录管理实验目的:1、了解linux系统的文件和目录结构2、熟悉linux系统的文件和目录管理的方式和命令3、能够熟练的使用文件和目录管理命令二、实验内容及要求:1.查看操作系统的根目录下,有哪些目录2.文件操作(1)查看文件(可以是二进制的)内容 cat执行格式:cat filename 或more filename 或cat filename|more 例: cat file1 以连续显示方式,查看文件 file1 的内容 more file1或 cat file1|more 以分页方式查看文件的内容(2)删除文件rm执行格式: rm filename 例: rm file? rm f* (3)复制文件 cp执行格式:cp [r] source dest ination 例:cp file1 file2将 file1 复制成 file2cp file1 dir1 将file1复制到目录 dir1 cp /tmp/file1 将file1复制到当前目录cp /tmp/file1 file2 将file1复制到当前目录名为 file2 cp –r dir1 dir2 (recursive copy)复制整个目录(4)移动或更改文件、目录名称 mv执行格式: mv source destination 例:mv file1 file2 将文件 file1,更名为 file2mv file1 dir1 将文件 file1,移到目录 dir1 下 mv dir1 dir2(5)比较文件(可以是二进制的)或目录的内容 diff执行格式:diff [r] name1 name2 (name1、name2 同为目录)文件或例: diff file1 file2 比较 file1 与 file2 的不同处diff –r dir1 dir2 dir1 与 dir2 的不同处(6)文件中字符串的查找 grep专业:计算机科学与技术学号:姓名:执行格式:grep string file1例:grep abc file1 查找并列出串 abc 所在的整行文字 3、系统询问与权限口令(1)查看系统中的使用者执行格式: who (2)查看 username执行格式: who am I 查看自己的 username (3)改变自己的 username 的帐号与口令 su执行格式: su username例: su username 输入账号 Password 输入密码(4)文件属性的设置 chmod执行格式:chmod [R] mode name 其中:[-R]为递归处理,将指定目录下所有文件及子目录一并处理 mode 为 3-8 位数字,是文件/目录读、写、执行允许权的缩写(r:read,数字代号为"4", w:write,数字代号为"2", x:execute,数字代号为"1")mode: rwx rwx rwx user group other 缩写:(u)(g)(o)例:chmod 755 dir1 将将目录 dir1 设定成任何人皆有读取及执行的权利,但只有拥有者可作写修改。
操作系统原理实验报告一、实验目的操作系统是计算机系统中最为关键的软件之一,它负责管理和控制计算机的硬件和软件资源,为用户和应用程序提供一个方便、高效、稳定的运行环境。
本次实验的目的在于通过实际操作和观察,深入理解操作系统的核心原理和关键机制,包括进程管理、内存管理、文件系统管理、设备管理等方面,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C++。
三、实验内容及步骤(一)进程管理实验1、进程创建与终止编写程序,使用系统调用创建一个新的进程,并在新进程中执行特定的任务,如打印一段文本。
观察新进程的创建过程和资源分配情况。
编写程序,实现父进程等待子进程终止,并获取子进程的退出状态。
2、进程调度编写程序,模拟多个进程的并发执行,设置不同的优先级和时间片。
观察进程的调度顺序和执行时间,分析调度算法的效果。
(二)内存管理实验1、内存分配与释放编写程序,使用动态内存分配函数(如 malloc、new 等)申请一定大小的内存空间,并进行读写操作。
观察内存的分配和释放过程,检查是否存在内存泄漏。
2、内存分页与分段了解操作系统的内存分页和分段机制。
编写程序,模拟内存分页和分段的过程,展示地址转换和页面置换算法的效果。
(三)文件系统管理实验1、文件创建与读写编写程序,创建一个新文件,并向文件中写入一定的数据。
读取文件中的数据,并进行验证。
2、文件目录操作编写程序,实现对文件目录的创建、删除、遍历等操作。
观察文件目录的结构和变化。
(四)设备管理实验1、设备驱动程序了解设备驱动程序的基本概念和工作原理。
编写一个简单的设备驱动程序,实现对特定设备的控制和数据传输。
2、设备中断处理模拟设备中断的产生和处理过程。
编写中断处理程序,处理设备中断事件。
四、实验结果与分析(一)进程管理实验结果与分析1、进程创建与终止成功创建了新进程,并在新进程中打印出指定的文本。
计算机操作系统实验报告一、实验目的本次计算机操作系统实验旨在深入了解计算机操作系统的工作原理和核心功能,通过实际操作和观察,增强对操作系统的认知和理解,提高解决实际问题的能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019硬件配置:Intel Core i5 处理器,8GB 内存,512GB 固态硬盘三、实验内容与步骤(一)进程管理实验1、创建进程使用 C++语言编写程序,通过调用系统函数创建新的进程。
在程序中,设置不同的参数和条件,观察进程的创建过程和资源分配情况。
2、进程调度编写模拟进程调度的程序,实现不同的调度算法,如先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等。
通过改变进程的到达时间、执行时间和优先级等参数,观察不同调度算法对系统性能的影响。
3、进程同步与互斥使用信号量和互斥锁等机制实现进程之间的同步与互斥。
编写多进程程序,模拟生产者消费者问题、读者写者问题等经典的同步互斥场景,观察程序的运行结果,分析同步互斥机制的有效性和性能。
(二)内存管理实验1、内存分配实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
通过模拟内存请求和释放的过程,观察不同算法下内存的使用情况和碎片产生的情况。
2、虚拟内存配置系统的虚拟内存设置,观察虚拟内存的工作原理。
编写程序访问超过物理内存大小的数据,观察系统如何利用虚拟内存进行数据交换和页面置换。
3、内存保护设置内存访问权限,编写程序尝试越界访问内存,观察系统的保护机制如何防止非法访问和错误操作。
(三)文件系统实验1、文件操作使用系统提供的文件操作接口,进行文件的创建、读写、删除等操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件权限管理设置文件的访问权限,包括读取、写入、执行等权限。
通过不同用户身份访问文件,观察权限管理的效果和安全性。
3、磁盘调度实现不同的磁盘调度算法,如先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描算法(SCAN)等。
中南大学Linux操作系统实验报告学生姓名学院信息科学与工程学院指导老师胡小龙专业班级完成时间目录1.实验一Linux的安装 (3)1.1 实验目的 (3)1.2 实验设备 (3)1.3 实验原理 (3)1.4 实验步骤 (3)2. 实验二Linux基本操作 (5)2.1 实验目的 (5)2.2 实验设备 (5)2.3 实验原理 (6)2.4 实验步骤 (6)3. 实验三Linux系统管理 (10)3.1 实验目的 (10)3.2 实验设备 (10)3.3 实验原理 (10)3.4 实验步骤 (11)4. 实验四Linux Shell程序设计 (14)4.1 实验目的 (14)4.2 实验设备 (14)4.3 实验原理 (15)4.4 实验步骤 (17)5. 实验五Linux 高级程序设计 (20)5.1 实验目的 (20)5.2 实验设备 (21)5.3 实验原理 (21)5.4 实验步骤 (21)6. 实验六Linux内核 (23)6.1 实验目的 (23)6.2 实验设备 (23)6.3 实验原理 (23)6.4 实验步骤 (23)Linux操作系统1.实验一Linux的安装1.1 实验目的(1)了解硬盘分区的概念和方法;(2)掌握硬盘的分区规划;(3)掌握Linux操作系统的安装和配置过程。
1.2 实验设备一台pc机、RedHat Linux 7.2以上版本、VMware Workstation v5.5。
1.3 实验原理Linux可以以多种方式安装在PC机上:(1)独立分区安装、(2)DOS分区安装和(3)虚拟机VMWare下安装。
鉴于VMware下安装对原来系统影响较小且不影响本实验目的,因此采用VMWare下安装方式。
1.4 实验步骤(1)在Windows XP下安装VMware 5.5(2)配置虚拟机(3)启动虚拟机(4)启动Linux安装过程(5)安装过程配置(6)安装后配置(7)第1次启动VMWare下Linux操作系统2.实验二Linux基本操作2.1 实验目的(1)复习Linux基本命令;(2)掌握常用Linux命令。
篇一:实验四 文件系统实验报告 实验四 文件系统实验 一 .目的要求 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 4 typedef 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,e.name); 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中*/