讲真...写到这儿真的是感慨良多。
我从来没想过自己能在计算机这条路上走多远,也没计划过下一步要往哪里走。但是当自己的第一个近于成品的计算器完成时,内心的感觉近乎奇异,一方面在惊讶我竟然完成了,另一方面在感叹其实自己也是能走这么远的,也是能走下来的,种种情绪混合成类似于激动的起伏。
当然,在学期总结时,难免要回顾一下寒假伊始曾经夸下的海口。
在第一篇博客中《写在寒假》 中我曾疑问过,c语言的实用性?现在能做出回答了,c语言是IT世界的入门和基础。也曾疑问过数学的作用,现在看来,在c++庞大的项目中,从始到终都能看见数学思想的作用和影响。
我在那篇博客中有这样的段落:
“...从中大致说明了我的两个问题:一 我缺少改进代码的意识,二 敲代码我缺少创新的自信。 敲代码时我常常忘了写一小段就去执行一下,因为长篇的代码出错真的是无从下手。敲代码时我常常忘了写一小段就去执行一下,因为长篇的代码出错真的是无从下手。”
在这学期,每次写完代码都会扫一遍,检查那些地方可以省语句,或者想方设法去 减少行数。后面会提到,c++贴心地帮我解决了这些问题~
-
回到计算器
从第三次作业正式开始计算器项目的征程。整个线路大概如下:
第三次作业:对输入的四则运算表达式进行字符和数字的拆分--->分文件类的认识和使用
第四次作业:写能完成对输入四则运算表达式的计算的程序--->在分文件的基础上:scan.cpp
继承第三次作业的表达式拆分,而calculation.cpp
则将得到的中缀表达式顺序的栈转成后缀表达式,后将此栈送入result.cpp
进行计算。 这也是整个计算器的大致思路,也是整个项目中最难的一步。也因此经历了几个深夜。所幸没有像上学期那样在某个比赛中感受到“福大凌晨四点半空气中的湿意和校园的宁静”,但也因此牵动了几天课堂的魂不守舍。反复的崩溃到最后的能顺利计算,删除了十几个版本的备份。但是收货也是巨大的,学会了后缀表达式的思想,认识了<sstream>
和命令行,学会了<stack>
和<queue>
的简单使用……一路莽撞摸索,竟也能窥得半点真意。
第五次作业:文件输入输出流的使用。在四的基础上,新增了另一种输入方式:文件输入。这是大量运算的开始。但这次作业相对第四次,是一种缓冲,没那么难。主要学习了c++的专用<fstream>
和c语言的<freopen>
,基本能顺利完成作业。
第六次作业:在我看来,这次的作业解决了我一直以来的困惑,我们要如何把一行行的代码变成最终的app呈现在用户面前? 包装,界面化。不再是黑漆漆的命令行或者调试窗口,接近于一个完整程序的界面化,使我的计算器终于“得颜见天日”。
说难不难,说不难也难的第六次作业,在我经历了前几次的教训后,选择在一整天无课的周四一次性完成了它,避免了后期的遗忘。从早上八点坐到下午六点→_→ 不知道自己的做法是否正确,但是毋庸置疑的是,在这个项目上这种做法确实提高了我的效率,避免了我在后续的课堂上神魂失守。
第六次作业在我看来,最难的地方是对一种新事物的接受。选用了mfc的我有种学习新语言的感觉,一开始茫然无措,对着虚有其表的界面不知如何将我的计算器插入。在正式开始做界面化之前,我的时间都用在了对mfc的了解上,去查找大量的教程来让我熟悉这个工具,懂得它是什么,它能做什么,如何实现它的工作。还好本次计算器只需要了解mfc功能的一小个角就能大概实现我那简陋的界面和简单的功能。
从式子的拆分到计算到外包装,一个简单的计算器初见雏形。显然作为新手的我完成的计算器项目仍然存在许多的bug:- 对不规则输入无法像win自带的计算器自动进行修正或者像科学计算器具有强大的包容性,当式子太过不规则仍然容易出现崩溃状态。
- 界面化不够美观...反人类的按键设计→_→ (一时情怀),追求正常就会非常原始追求美观就会极端不正常的外观让强迫症真的难以忍受,暑假在这个项目上进行修改第一步可能就是外观的美化!!!
- 多方面用户体验不好,正如学长指出,不管是表达式的输入或者结果的显示输出,都可能出现式子太长编辑框无法容纳的现象。这显然是亟需解决的重要事情之一,目前的构想是利用键盘上的←→或者↑↓实现式子的分行。
- 显示的整数结果后仍然会带上.000000的不必要的小数部分。
-
学长还指出:当运算一次之后,再输入是否能将原来的清空?现在的情况是,如果不按清空键就不能直接进行下一次的运算。 这里还可以这样:当运算一次后,如果按符号键,则自动取上一次的结果加入运算。就像现实计算器上的Ans键一样;如果是数字键,则自动清空并显示所输入的数字。
批量计算的时候,最好能有个提示“正在计算,请稍后...”这样。更好一点的话,加上进度条。
这些都会考试之后进行修改和完善。
- 在第六次作业我的答案文件中,还发现了当计算结果超过一定位数就会自动显示成科学计数法形式,这并不是我所需要(手写体)的。
- 在程序的内部,前期代码的不熟练和冗长,以及方法、类与类之间的调用,都是是计算速度较慢的重要原因。尤其在前期,面向对象的思想为0,什么都喜欢返回给main函数....
- 重构计算器
这个真的有想过...每当开始新的一次作业,都要茫然地在自己的超级长的代码中搜索、重新认识它,超级痛苦的经历啊~也是因为此,喜欢一次性完成作业了。
如果重构会学会面向对象一点了...- 首先画出大纲流程图。规划整个计算器,分为
scanner
、calculator
、printer
部分。然后在每个类下进行方法的细分,如canner
应包含split experssion()
,judge experssion ()
(判断不规则输入) 以及文件读取的read file()
函数。
calculator
则只包含两个函数,其中translate experssion()
负责对接收到的(scanner中调用此函数)中缀表达式队列转化为后缀表达式,再送给同一文件下的calculate the expr()
函数进行计算。最后的printer
只需要负责输出结果的print result()
、输出不规则提示的print warning()
和输出到文件write in file()
函数即可。
用箭头来表示类、方法间的调用关系。这算是计算器的第一步,然后只需要照着这个框架图写程序即可。 - 其次,在原有代码的基础上,进行简略和修改。以及改进许多的方法,比如不规则的判断、后缀表达式的转换。
- 最后是包装,会根据上面的不足,重新考虑一遍嗷。
- 首先画出大纲流程图。规划整个计算器,分为
- 课程总结
- 在本学期课程中,发表了十二篇,其中两篇课堂作业博客,七篇计算器相关博客。至于代码量...其实一直非常好奇,这个玩意儿怎么计算?感觉写了挺多的....吧....毕竟我啰嗦....
- 在本学期的学习中,有哪些是经过博客作业后才学到的?
太多了。比如栈、队列的使用,mfc、github的入门、分文件类的写法、界面化的入门等等等...更别提例如这些c++类等等等等,这些本来都是在后续的课程中学到的,但是由于计算器项目的涉及,“迫使”我提前去了解和学习。 - 经过这学期的学习,你有哪些体会和感受?
首先说说c和c++ :一开始完全没感受到两者的区别。我第一次觉得c++好用是因为stl中的sort功能,一下子解决了冒泡排序法的好几行代码!!简直偷懒神器啊!!!我之前曾经在寒假的博客中提过,自己总是容易写这一行代码就忘了前面的功能实现。而c++中的类完美地解决了这个困扰。首先一块一块地实现每个类地功能,只需要在main函数中进行整合就好。可以想见,在大程序大项目中这种思想是多么地贴心!!!也就不怕分时间分段工作忘了前面代码的困扰。
其次说说计算器项目的感受:一开始第三次作业就让我惊惧万分,始终不懂得.h和.cpp这两个文件应如何处理。险些选择了放弃,还好第三次作业与第四次作业间还隔了段时间。为了完成第四次作业,硬是将第三次作业重头来过。现在想来,.cpp和.h已经成了c++的基础内容,那段对我来说那么难的时间也已经过去了好久。在着整个项目中,最开心的就是每一次的发现bug和解决bug,去想出更多的情况,去解决它。在每一次的bug修复中,都能学到许多的东西。而在每一次对新知识的感受不再是陌生时,这种认识新朋友的感人也总是让人感动非凡。每一次的新作业初出时,总会觉得这是一种不可能完成的任务,从未接触过的层面,在“腥风血雨”后回顾,总是容易滋生名为感动的情绪。 - 今后在编程这一方面有什么计划? 个人认为,自己在这一块尚入门,对很多东西都不了解,谈计划太过草率,唯一能做的就是学好当下。
- 其他一些杂谈:一直觉得,缺乏文学素养在工科学生中是普遍存在的现象。一年下来,或是因为自己贪玩,总也挤不出能用来好好看书的时间,深以为憾。从来不觉得对工科学生而言,文学作品就是鸡肋,我想在暑假,阅读是我的重要完成任务之一。