作业质量分析
总体分析
本次作业的成绩分布如下,可以明显地看到及格率仅仅只有 53.3%,说明情况很不理想。对网络 2011 的男同学提出表扬,大作业的完成率较高,博客的内容总体较为丰富,能看出是认真写了代码并完成博客,同时也有几位同学做了拓展。
完成作业是态度问题,博客是平时分的重要来源,如果部分同学打算继续保持下去,这门课的平时分一定会给你一个惊喜。
作业存在的问题
知识点总结
函数和数据类型部分的知识点,概念性的东西比较多,因此好好写并有一定的篇幅都给高分。函数这部分要总结的话,文字会比较多,给篇博客参考一下——C语言--函数。
流程图
流程图或者伪代码是描述程序的好方式,个人在描述算法的时候会优先考虑伪代码。但是对于大作业这种代码量比较大的程序,使用流程图可以清晰地呈现程序的工作流程和功能。流程图存在的问题有:
- 流程图太过简单,不能充分地体现程序的工作流程;
- 流程图过于完整,展示了过多的代码细节使其很难读懂;
- 流程图符号使用错误,例如决策部分没有使用菱形框;
- 流程图没有按照某个阅读顺序(例如从上到下)进行绘制,导致箭头打结在一起难以阅读;
- 没有使用专用的绘图软件绘制流程图,导致流程图不美观。
流程图的符号如下:
推荐一个好用的绘图网站——Processon。
大作业
仅从作业的完整性来看,很多同学并不很很好地呈现自己的程序的完成情况,具体的问题有:
- 提供了非常有限的代码和运行截图,无法判定完成情况;
- 文字叙述太多,但是运行截图太少,说了很多但是没看到成品;
- 对于代码的解释文字太多,而没有在代码附近注释,导致代码还是很难读懂;
- 只有代码的截图而没有适当的说明,很难辨别代码实现的功能;
- 从运行截图可以看出做了拓展,但是没有在前文提出来,亮点不突出;
- 运行截图展示的素材较少,不能体现出成品的运行效果和存在的问题。
我们专业的大部分同学未来会从事开发方向,开发软件的时候就不可避免地要写程序的说明书,所以这方面的能力还是值得去练习。想要让你的客户买你的产品,不仅要程序的质量本身过硬,更需要具备良好的表达能力把功能讲清楚。
同时写代码一定要有注释,即使是自己写的代码,隔一段时间再看也很容易看不懂,此时注释就显得很重要。开发大的程序往往需要多人合作,因此我们提供给其他同伴的代码一定要是有注释的,这样合作效率才会更高。
优秀作业推荐
- 陈宇杭——C语言博客作业03--函数:流程图较为清晰,代码能体现结构化编程思想。考虑了实际需求,调整了算式的难度。拓展功能较多,例如非法输入检查、计时器、正确率统计、作答等级评定等,推荐展示。
- 余智康——C博客作业03--函数:功能论述比较清晰,可以看出亮点,能看出有模块化编程的思想。实现了较多拓展功能,例如非法输入检查、作答情况分析等。有多个界面切换,较为清晰,通过清屏使屏幕更为整洁。出题考虑了用户的能力,并且对难度不合理的算式进行了规避,推荐展示。
- 罗发槺——C语言博客作业03--函数:考虑了用户群体,尤其是三年级可以出现更多题型。题目数量可以用户动态决定,考虑了非法输入。大作业总结较丰富,而且态度很积极,是唯一一位发代码给我调试的同学,值得肯定。
- 李洋——C博客作业03--函数:基本功能都有实现,可以判断超时作答,用户界面较为清晰。
- 原嘉怡——C博客作业03--函数:基本功能都有实现,流程图也比较清晰。能体现模块化编程的想法,用户界面较为清晰。
- 黄静——C博客作业03--函数:知识点总结很详细。有思维导图呈现总体的设计,流程图也比较清晰。基本功能都有实现。
助教寄语
李悦
函数在c语言中是非常重要的一部分,它有利于我们更加了解c这面向过程编程这一重要思想。在c语言编程过程中,就是先把一个比较大的问题划分为几个小问题,然后交由函数去封装实现,最后进行调用函数实现解决问题。这样的好处有利于程序的模块化,也避免了重复性操作。但函数的重难点也就在于对函数的设计,此次大作业中,大部分同学设计的函数功能执行着相同的功能,虽然将口算系统按年级分成了三个模块,分别用三个函数去实现各个年级的出题系统,但是三个年级中都包含出题,判断答案对错,计算正确率等相同操作,这些操作却未另外用其他函数封装实现,这样就导致三个模块中的代码冗余程度较高。这是同学们在后续学习过程中要继续优化改进的。
对于全局变量的使用,也是需要我们去注意和把握的。不可滥用全局变量,全局变量的危害大家也比较清楚,虽然在前期过程中,一定程度上能提高我们的编程效率,但是由于全局变量为所有函数模块所公用,在编写过程中某个模块对于全局变量的修改,就会影响到整个程序对于全局变量的使用,后期在修改 bug 的过程中就增加了我们调试的难度,所以在后续编程过程中,如果能尽量不用,咱就不用。
此次大作业只是一个小小的操练,希望大家能够继续努力加油!
苏雅琴
这次的大作业是小学生口算系统,对于一个系统,我们首先要思考系统的基本功能,和框架,可以有登录注册,接着再分年级。接着就应该要思考这几个模块能否分别单独放一个函数,需要的时候,只要进行函数传参调用即可,这里面,传参也是个技巧,由于大家指针可能涉及还不够,但如果了解到一定程度,熟练运用它,就会更方便。同时,博客中,会发现大家的学习总结总是会马虎应付,并且对于知识点的总结,也不够着重,要自己认识和发现哪些知识点是重要的,而不是为了交作业而写的。
林智凯
大家第一次写较大的程序,存在着很多问题。首先是代码冗余的情况,具有相同功能的代码重复出现在程序中。例如小学一二三年级都有加法题,此时较好的思路是专门写一个函数出加法题,通过传参的方式控制题目的难度。但是看大家的代码中,部分同学存在每当需要出加法题就把加法题的全套代码再写一遍,然后用硬编码的方式控制参数。这种编程手法不仅会导致代码存在大量重复,影响开发者对代码进行维护和扩展。而且当某个模块出现错误时,调试和排错的难度也会大大提升。这就好比雕版印刷术和活字印刷术,雕版印刷术只要有地方搞错了,整块印刷版就报废了,而对于活字印刷术只需要替换掉错误的模块即可。所以编写一个函数时,我们应该有意识地把某个需要多次实现的功能归纳出来,单独写一个函数来供其他函数调用。
接着是函数封装的问题,很多同学都封装了很多无参无返回值的函数。这种写法说明函数封装的不同组件是完全独立的,内在的逻辑关系非常松散。在封装函数时应该传入适当地参数控制函数的行为,并且返回合适的参数与调用函数的代码进行状态的交互,这样封装出的函数才有复用的价值。同时千万要注意全局变量能不用就别用,如果在程序中会有很多可以相互调用的函数和全局变量,则任何函数都有可能对全局变量进行修改。这就导致了函数、数据结构之间的关系一段乱麻,尤其是当代码量很长的时候,代码的理解也变得极其困难。所以全局变量能不用就别用,而应该使用传参的方式进行参数的传递。这方面需要大家多多练习,同时多读一些优秀的函数代码学习。
最后一定要提出的一点是,小学生口算刷题系统显然是有特定的用户的,也就是小学生。大家写完程序之后一定要自己先试用一下,有的同学出的题目已经不是口算能搞定的了,而且部分题目难度过大或者超纲。在我的印象中,小学生的数域没有拓展到负数,因此任何产生负数的题目都不应该出。二年级的乘法题应该仅限于九九乘法表,不能有二位数以上的乘法运算。至少是三年级以前的学生,还没有接触小数和分数的概念,出除法题的时候不能使得数有小数部分。四年级才会将数域拓展到千位,因此不能出现超过三位数的题目。我有看到某位同学出了三位数乘三位数,得数都好几万了,而且计算难度远超于三年级的水平。所以在写程序之前,大家一定要把前期调研做足了,只有充分考虑用户的需求才能写出适合的程序。前期调研的样例可以看这篇博客的第一部分——Java 程序设计——站内短信系统。