# Pre 课上测试游记

通过阅读本文,您可以大致了解 2021 年秋季北航计算机组成课程 Pre 课上测试的题目内容、难度
Pre 课上测试的主要内容是 Logisim、Verilog 和 MIPS 汇编,按照 2021 年秋季的课程要求,Pre 课上考试不计入最终成绩,不影响 P0
题目每年都会发生变化,笔者在 Pre 考试中没有刻意记忆题意,因此随便看看就好

读题一定要仔细

首先是吐槽:北区机房的电脑屏幕太暗,键盘的手感太差

然后是表扬:助教很负责(但是我根本没做完,所以也没有问答环节),电脑带的环境很多(我甚至找到了 Clion,但是没啥用),很流畅,没有死机(比新主楼的好),没有异常退出,不知如果 Python 在这写会不会好点

开始考试,点开题,卧槽,为啥还有选择,发现根本不会,迅速蒙过去(还好不算分

交了一题,发现,草,只能交一次,遂打开 Logisim 开始模拟电路图,用 ISE 检查语法格式,还好 35min 切完选择

# 选择题部分

选择题考察的内容还是挺细致的,有 Bit Extender 的实现方法:Splitter+Constant 和直接用 Bit Extender,但是我当时很慌找遍了 Logisim 也没有找到 Bit Extender(UPD:后来找到了),有逻辑电路的化简,直接扔给 Logisim 去做就完了(但是这一题我还手抖选错了),状态数量的判断(心情电路,课后题改),剩下的没啥印象了

# 大题部分

看完选择题立马去切 T1,T1 是个 Logisim 组合,看上去好麻烦,貌似可以用位运算,我直接上暴力解,直接用 Splitter 把低 4 位高 4 位分开,然后低四位用比较器比较跟 0011,0101,0110,1001,1010,1100,0111,1011,1101,1110,1111 是否相等,高四位跟输入的掩码或一下看是不是 1,两者再与一下,然后输出就好了,不到 30min 切完一遍过

(题面等有了再补上)

然后去切 T2,不出意料是个字符自动机,然后迅速画完状态图开始写,结果是噩梦的开始

首先我一上来就错了,也许是好长时间没写字符自动机了,或许是认为没有重复字符计数很简单,直接忘记了考虑转移回首字母时需要直接比较第 2 个字符(所谓的 KMP 算法,失配数组),30min 写完之后开始调,怎么也调不过小样例,遂想到许多奇怪的方法,比如加了一个 MagicC 状态,后来调了 30min 后意识到,MagicC 不就是 ErrorC,失配字符如果是首字母直接比第二个得了,然后改过之后交了一发,全 WA,崩溃 ing,这时想需要喝口水冷静下,但是并不能去上厕所(差评

构造几个样例,发现过不去,已经有点慌了,但是最大的问题还没被发现(我看错题了),遂停止,去切 T3,T3 是个极简单的汇编,甚至给出了 C 代码,10min 写完,5min 调完,一遍过后,回去读 T2

(同样题面回头补)

越读 T2 越发现理解错题意了,首先 cscore 之间的空格是可以接受的,然后 cscore 中间出现别的字符 cnt 清零,但是每次输出要保留最大值,离考试结束还有 1h,我才发现读错题了

然后重新画状态图,但是实在不敢重构代码,遂修改,越改越乱,离考试结束还有 25min,放弃(反正不算成绩

下面来看一下大毒瘤 T2,经典字符自动机

你的任务是在输入字符串中匹配正则表达式 (c|C)(s|S)(c|C)(o|O)(r|R)(e|E) 的字符串,并统计其连续出现的最大次数并输出,这里的连续出现是指:字符串首尾相接,字符串之间由一个或若干个空格连接(本题 reset 采用异步复位)

首先第一个让我困惑的问题是字符串 cs core 是否符合题意,当我 WA 掉的时候,我是朝这个方向想的,浪费了大量时间,最后我也不知道它是否符合题意,估计不符合吧

然后转移时,务必注意前缀,所谓字符自动机,就类似于构造一个 AC 自动机,失配指针的位置要指对

最后点评:毒瘤题,但是只是我脑抽了,以及细节太多,其实估计不难

不知道还有机会补题不,我非给他过了不可,本题编码不难,但是 ISE 是真的难用