三周,三个课设,三种收获

 

三周,三个课设,三种收获

181920三周安排的分别是编译原理、组成原理和微机原理的课程设计,一学期这么长时间做这么多课程设计还是第一次呢。前两年总共做过C++程序设计、数据结构和数电的课程设计,数据结构认真做了,觉得做一次课设,真的能收获很多,即使题目再简单。所以,在这学期面对课设的时候,我的第一原则是自己先做,绝不去在网上找别人的代码。可是“独善其身”还真挺难的,其一太多人根本没重视课设,其二课设夹杂着三门考试。

很高兴的是现在课程设计结束了,现在回想起来,确实我做到了,不仅仅顺利完成了,而且也从中学到了不少,也很有成就感。

编译原理——版本之道

编译原理课程设计是纯软件的,从17周题目公布之后,我选的题是“设计一个语法制导翻译器,将算术表达式从中缀式翻译成后缀式。”这题难度不大,之所以选它第一是因为我觉得它难度不大,我有能力独立做出来;第二比较综合,涉及到词法分析、语法分析以及语义分析三大编译过程,对我学的知识一次很好的实践补充。选完题之后自己就开始陆续着手去做,因为我的经验是一旦做晚了,后面肯定没时间去做逼着自己在网上找代码。

完成的还算比较顺利吧,用书上的文法

 

词法分析只要识别数字、操作符即可,语法分析则将此文法转化成非左递归的运用递归下降分析方法也很好实现,至于要转化为后缀式,则是在语法分析过程穿插一些语义动作,即所谓的语法制导翻译。

基本完成了课程设计的任务,本可以就此打住了,但是总觉得这个也太简单了吧,于是就想方设法拓展一些功能,最终那个文法变成下面这个,也增加了表格处理和出错处理:

 

 

我将此命名为“可编程简易计算器”,可以实现简易的可编程功能。这些功能也不是一次就添加成功的,白天有什么想法晚上回宿舍总要给它实现了才肯睡觉。

一个功能一个功能的添加,一个版本一个版本的升级,直到验收的前一晚上我还在为完善程序做最后的奋斗。“真正优秀的程序员对他程序中每个字节的分配都了如指掌”,这句话太好了,因为程序是自己一点一点写的,所以验收我是不怕的,专门找了一个他们说比较严的老师来给我验收,我先给他展示了一些基本功能,他突然打住,让我将求幂的运算符给换成“^”,我程序中用的是“**”,因为当时考虑想运用书上说到的“超前搜索”这个思想,这样难度就加大了。我回答道我程序用的比那个实现的要难得多,但是老师就是让我改成那个,哼,一个程序改难不容易改简单还不简单吗,没有犹豫很快就给改好了,运行时其实我是心虚的,我怕突然冒出一个BUG,但还好等我输入“3^2”时结果是正确的。老师没说别的,就要走,我拉住他我的功能还没演示完呢,他还是走了,我知道验收结果应该不错了。

整个编译课设做下来,我也比以前编程成熟老练了很多,也逐渐养成编程时时保存,注释,以及保留历史代码的习惯了。以前修改代码总是在源代码基础乱改一气,也没备份,导致最后想回去也回不去了。

 

组成原理课程设计——测试之道

2011年的第一天,一觉睡到8点钟,“不好,这周组成课程设计!”赶紧爬了起来赶到实验室,很郁闷的是一个人也没有,门也没开!我就纳闷了,组成课设不应该要在实验室做的吗,怎么实验室门都不开呢?想了许久才明白今天是元旦,老师放假了!白费了我一番苦心啊!

组成课设是三个人一组的,Geilina 先找到我要和我一组,然后准备就和她两个人一组做了,最后发现田田还没分组,果断我给拉过来了!之前我没准备充分,倒是田田做了不好工作,第二天到实验室也知道要干什么了相比很多组都在网上找微指令,我们组都是一条条地编的,不过大部分都是田田编的,我给校正的,Geilina给输入的,配合的很好,进行的也很顺利。关于扩展的几个功能,第一个是控制台修改程序指令,我首先想到设计的,事实证明这个东西对后面的输入程序有很大帮助;第二个关于带进位减的功能,是借鉴其他组的,而此时如果我们加上这些指令,将会超过控存的最大容量,我创造性地将两条微指令合并成了一条。星期三又忙活了一整天,本来打算验收的,奈何时间还差了点。

星期四下午考微机就没去了,到了星期五,最后一天,前一天晚上我写了一个A*B的测试程序,足足有30H行代码,包含了几乎所有的指令;我敢说没有其他组能编这样的测试程序,他们的测试程序无非就是将所有指令揉杂在一起,毫无逻辑可言!我用了近一个小时,结合书上两个数相乘的运算方法,觉得写的非常完美了。但是郁闷的是输进去的时候,出现了问题,当时傻了,这问题如何是好啊?问题到底出在哪呢,还真不好找。我对我的程序还是有十足的把握的,我怀疑是不是微指令哪地方有问题,可是微指令每天我和Geilina都测试过,没有问题啊! 正当他俩开始抱怨我为什么要写这么复杂的测试程序时,我还是坚持要将这个程序给调出来,绝不能就这样放弃了!

田田给程序加了些输出指令,以便运行时能观察每步的结果,这样就能准确定位出错的地方。最后终于让我给揪出问题的地方了,原来是我们的相对寻址那条指令有问题,多跳了一条。再经过稍稍修改,当输入两个数出来结果是积,当时成就感、激动感、幸福感参杂在一起。确实真的不容易,这么多天,三个人两天中午都是在实验室吃的午饭遇到问题很多,都一个个给解决了。验收很顺利,老师没多过问,问了他俩了问题,我就没问了,我知道老师应该还很满意的吧。

我得反思了,有条件相对寻址跳转指令这条我测试过,确实记得当时没运行成功,但是当时没在意,又重新测试了一编,发现又好了。现在想想后面之所以调了那么长时间,原因就在我一时的疏忽,第一次我测的是为零跳转,第二次我测的是不为零不转,而这个指令就是在相对跳转时相对寻找多寻了一条,而不跳转确是对的,我第二次测试发现结果正确之后就以为这条指令没有问题了!真不应该呀!没有回头想想第一次为什么会失败,否则后面就省了很多时间!而第二个教训就是,我在写A*B的测试程序时并没有注意到后面给调试的留点空间,没在其中关键步骤加些输出指令,这给后期调试加大了很大的难度!

 

微机课程设计——设计之道

时间来到元月10日,这周面对两门考试,大多人都无心做课程设计了,我还是想坚持我的原则——自己独立完成!果真这独立真的变成了独立了!微机七个人一组,最终也只有我一个人在那编!题目不难,可以说是六个题中最简单的一个了,主要代码是键盘扫描程序,识别某个键转到相应的程序中执行。

前一天花了5毛钱打印了一个实验的代码仔细研究了一下,因为做了几次实验,但是每次都是去打酱油的,没有写过几行代码,更没熟悉硬件平台。一晚上看了一个代码,才知道其实这个硬件平台还算比较简单的,前后的框架不用去改,熟悉每个端口地址,其实对程序编码没有任何阻碍,这中间每个题拿到汇编中都是简单题,但是加了个硬件平台大家都懵了似的。

本计划一天就可以搞定的,但是好久没编汇编程序,硬是第一天没调出来,最后发现问题从一开始我就犯了一个大错误——设计不好!

很有心地画了流程图,但是没有好好斟酌一番,原先设计不当有二:其一程序虽然整体看着很有逻辑,但是在汇编中却有很大隐患,我将键盘扫描放在每个子程序中,每次检测到有效按键按下时转到相应程序执行,这样本次程序还没RET,每次堆栈都在不断地增加,却没有被释放,必然存在栈溢出的危险;其二,数码管和二极管显示程序也略显得太繁琐,实现起来可以更简单一点的。

这是因为这两点没设计好,导致第一天忙活了一整天,最终无功而返!第二天考完微机马上又去实验室,经过修改,还是有点瑕疵;第三天终于七个人都到齐了,给我莫大的鼓舞,我也一鼓作气将程序给顺利完成了。

不过留有遗憾的是,本想加三个功能,最终也没实现好,不知为什么数码管快速刷新显示六个不同的数什么地方出错了,导致一个附加功能都实现不了。从原理上看是不会有问题的,这让我一直纠结着,虽然当天验收时比较顺利通过了。直到前晚打开水时,看着水箱显示水卡价钱的数码管一个数一个数地减,本想我的程序也能实现这样的功能,突然我明白了问题出在什么地方了,原先程序段是这样的

 

问题来了,在我第二次给出了一个数的时候原本想送到第二位时,但是此时是第一位片选选中的,这样就导致还是送到第一位去了,再给出第二位片选信号时第二位才选中,但是确实有短暂时间是覆盖了第一位的数据。这就是为什么我程序运行时会出现怪异数据原因。解决办法很简单,送段选数据之前先不选中任何一位,这样在快速刷新时,由于人眼的暂留时间以及LED余光将会以为数据同时显示。

可惜呀,也没机会去修改了。不过还是将问题给弄明白了,这才是最关键的!还是蛮开心的!

这次收获的是,以后做任何事情之前,得花大量时间在设计上面,软件工程上有句话,1/3的开发时间是用在设计上的,只有好的设计后期的编程以及调试都会相对简单些。设计不好,一旦出现问题,所有编码都要推倒重来!而我之前做课程设计,好像拿到题目就想编代码,不行就重新编。这习惯得改得改!!

 

唉,现在终于可以松一口气了!这三个课设弄得我真有点疲惫了。尤其面对考试的压力,我还好两个都没怎么耽误。个人把课程设计看的比考试重要,我不懂为什么很多人都不重视课程设计,难道因为学分少?唉,可是,真正这一个个课程设计才是四年大学锻炼本领的一个平台呀….

考试是永远不会增加你的创新思维和动手能力的!

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值