第一单元
题意简述
形式化表达
表达式 → 空白项 [加减 空白项] 项 空白项 | 表达式 加减 空白项 项 空白项
项 → [加减 空白项] 因子 | 项 空白项 ‘*’ 空白项 因子
因子 → 变量因子 | 常数因子 | 表达式因子|求导因子
变量因子 → 幂函数 | 指数函数 | 自定义函数调用
常数因子 → 带符号的整数
表达式因子 → ‘(‘ 表达式 ‘)’ [空白项 指数]
幂函数 → 自变量 [空白项 指数]
自变量 → ‘x’
指数函数 → ‘exp’ 空白项 ‘(‘ 空白项 因子 空白项 ‘)’ [空白项 指数]
指数 → ‘^’ 空白项 [‘+’] 允许前导零的整数 (注:指数一定不是负数)
带符号的整数 → [加减] 允许前导零的整数
允许前导零的整数 → (‘0’|’1’|’2’|…|’9’){‘0’|’1’|’2’|…|’9’}
空白项 → {空白字符}
空白字符 → (空格) | \t
加减 → ‘+’ | ‘-‘
自定义函数相关(相关限制见“公测数据限制”)
自定义函数定义 → 自定义函数名 空白项 ‘(‘ 空白项 形参自变量 空白项 [‘,’ 空白项 形参 ...
第四单元
正向建模与开发概念正向建模与开发是一种自上而下的开发方式,从需求分析开始,建立模型,逐步细化,最终再根据模型实现对应的代码。
学以致用本单元以一个图书馆管理系统为背景,锻炼对程序架构的设计和抽象能力,以及UML建模能力(包括类图、状态图和顺序图)。通过理论课对UML语言及模型的解析,建立对UML的认知的同时,学习其中使用的三个模型图,掌握基本模块概念和模块关系。类图作为静态图反应整体代码架构;状态图可用来描述关键对象(BOOK)的状态以及状态转换;顺序图通过展示对象间的消息传递体现系统的运作流程。
在充分理解整个图书馆管理系统的架构和运行流程后,开始初步的构思,再将想法落于实践,展示在UML类图上。
类图
系统中必需的模块与服务对象,思考其负责的功能
主要是场所:书架,借书处,预约处,漂流处;服务对象:学生。
根据已有的功能划分决定方法种类
各模块之间的关系
需着重注意的是管理借书处,书架,预约处等场所和服务对象(学生)的控制类(Library),同时其也管理后续的漂流处。
需要判断储存信息的方式,是直接使用容器还是使用类进行封装
在每次的作业迭代当中,对于出现新的需求, ...
第三单元
测试策略黑箱测试
别称:功能测试、封闭盒测试或基于规格说明的测试
定义:测试人员不需要了解被测试对象的内部逻辑结构、内部特性或源代码,仅关注测试对象的输入和输出,检查测试对象是否按照需求规格说明书的规定正常工作。
理解:进行黑箱测试仅得到输入与输出,设计测试案例时,需要保证覆盖符合规格说明书的所有范围(包含功能、边界等),以及保证输出对应相应的输入要求。
白箱测试
别称:结构测试、透明盒测试或基于代码的测试
定义:测试人员需要了解被测试对象的内部逻辑结构、内部特性和源代码,基于这些内部信息来设计测试用例,以检查测试对象的内部结构和代码是否按预期工作
理解:进行白箱测试可得到输入与输出以及测试对象的源代码,需要了解其内部逻辑结构以及内部特性,故除了进行黑箱测试的相同测试外,还可进行依据上述信息针对性地测试,测试其逻辑结构是否正确的
单元测试
内容:针对软件的最小可测试单元(通常是代码中的一个模块、方法或类)进行测试
特性:每个单元测试间自动,独立运行,可设定条件进行针对测试
编写方法:
完成测试用例的编写,即数据生成
本课程中使用的测试框架为Junit,对不同单元根据JML规格 ...
第二单元
题目概况结合三次作业,模拟多线程实时电梯系统,模拟对象是一个类似北京航空航天大学新主楼的电梯系统,楼座内有多部电梯,电梯可以在楼座内1-11层之间运行。系统从标准输入中读入乘客请求信息(起点层,终点楼层),请求调度器会根据此时电梯运行情况(电梯所在楼层,运行方向等)将乘客请求合理分配给某部电梯,然后被分配请求的电梯会经过上下行,开关门,乘客进入/离开电梯等动作将乘客从起点层运送到终点层。请求的输入通过我们提供的输入接口来定时投放请求,直接调用官方提供的接口即可。
可以采用任何调度策略,即任意时刻,系统选择上下行动,是否在某层开关门,乘客分配给哪部电梯都可以自定义,只要保证在电梯系统运行时间不超过题目要求时间上限的前提下将所有的乘客送至目的地即可。
电梯重置接收到重置指令的电梯需要尽快停靠后完成重置动作,再投入电梯系统运行。为安全起见,电梯重置时内部不可以有乘客,且重置动作**需要时间$T_{reset}=1.2s$。
有两种重置请求:
第一类重置请求仅修改电梯参数,重置参数请求包含需要重置的电梯ID和电梯相关参数(满载人数、移动时间)。程序需要在重置完成后让电梯以新的参数运行,重置 ...
OOpre总结
架构设计
迭代调整与考虑
按照指导书要求创建Main,Adventurer,Bottle,Equipment,Food等基础类,按照属性的含义以及方法的功能放入不同的类当中,未考虑类与类之间的联系
随着指令的增加,需要更多的类来实现指令,发现类与类之间有许多重复与交叉的部分,可以通过继承与接口的方式来减少代码重写,增强类与类之间的联系
指令的实现若具有一定的复杂性,需要应用设计模式才能更为完善地实现指令,例如单例模式即可构造Store类,实现单一实例并直接访问的类,以及观察者模式,定义一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
补充:主函数可以通过调用命令模式来实现指令,建立抽象指令,具体指令(指令对象),但未能完善。使用junit的心得体会
在使用junit单元测试时,通过输入自己的测试代码,利用Assert语句判断输出是否符合自己预期,检测代码是否正确运行,并可以通过查看类,方法,行,分支覆盖率来查看自行编写的代码是否充分测试。
直接在主函数中输入测试代码学习oopre的心得体会
以正确输出为目的:刚开始接触java语言感到陌生与害怕,并为使用新的编程 ...
挑战性任务-Sigaction
挑战性任务报告
首先想要吐槽一点,由于要求不能对Makefile进行修改,导致不能将自己编写的文件链接入可执行文件当中,导致只能把自己写的函数挤压进已有文件当中,显得有点丑陋
本实验需要实现异步通信Sigaction,仅需关注32个普通信号中的6个信号,按照其信号处理函数或默认处理动作来处理,其余忽略即可。
信号数据存放位置由于考虑到不同进程需要存储自己的信号,便于在从内核态返回用户态时直接查询使用,故放置在进程控制块Env结构体内
信号选择由于指导书要求同一普通信号在进程中最多只存在一个,故只要考虑不同信号间的优先级即可,同时要考虑当前进程正在处理的信号的屏蔽集。( 对于SIGKILL信号,该信号不可被阻塞)
内核态到用户态的准备参考助教在讨论区的建议,需要进程从内核态返回至用户态过程中检查是否有信号进行处理,若有,则处理完后再返回中断位置,这就需要使用重新申请一个栈帧用于当前信号的处理,设置传参等,以及保存进程发生中断时的现场。(一个比较好玩的地方在于当完成信号处理后会调用系统调用syscall_set_trapframe恢复原来的栈帧,这个时候既恢复现场(重新设置cp0_e ...
Lab6
Thinking 6.1
示例代码中,父进程操作管道的写端,子进程操作管道的读端。如果现在想让父进程作为“读者”,代码应当如何修改?
123456789101112131415161718192021222324252627282930313233343536#include <stdlib.h>#include <unistd.h>int fildes[2];char buf[100];int status;int main(){ status = pipe(fildes); if (status == -1) { printf("error\n"); } switch (fork()) { case -1: break; case 0: /* 子进程 - 作为管道的写者 */ close(fildes[0]); /* 关闭不用的读端 */ write(fildes[1], "Hello world\n", 12); /* 向管道中写 ...
Lab5
Thinking 5.1
如果通过 kseg0 读写设备,那么对于设备的写入会缓存到 Cache 中。这是一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。请思考:这么做这会引发什么问题?对于不同种类的设备(如我们提到的串口设备和 IDE 磁盘)的操作会有差异吗?可以从缓存的性质和缓存更新的策略来考虑。
answer:
缓存Cache是为了提高CPU访问数据的速度,但只有在外部设备进行数据更新或缓存Cache空间不足时,缓存数据才会被写入内存,故在外部设备更新数据时,CPU可能从外设(外部设备对应的内存空间)读入更新前的数据,故引发错误。
串口设备通常是字符设备,按照字节或字符进行数据传输,传输数据的频率高,IDE磁盘是块设备,按块进行数据传输,传输数据的频率低,故前者引发问题的概率大于后者
Thinking 5.2
查找代码中的相关定义,试回答一个磁盘块中最多能存储多少个文件控制块?一个目录下最多能有多少个文件?我们的文件系统支持的单个文件最大为多大?
answer:
宏FILE_STRUCT_SIZE表示文件结构体的大小256B,一个磁盘块的大小为4KB, ...