刚作为 TA 监考完大一新生的程序设计期末考试,对你这个问题算是有一点想法吧,稍微写一下我觉得可能有用的点
第一个是方法论的问题,首先要对自顶向下的面向过程开发有初步的了解。我觉得初学者应该领会一下这个基本思想,写简单程序的时候先做一下分解,写一下伪代码,把大的程序分解成若干个小的模块,再一点点完善下去。我经常是能看到有同学一把梭哈,for 循环套 if 套 for ,主函数打个上百行跟我说不知道有什么问题,我看到都头大。如果是这种情况就应该好好改进一下思考习惯,慢慢练练。
第二个是积累的问题。这个是跟任课老师聊的时候他提出来的,就很多同学不会分解的原因是他不知道分解之后程序是个什么样子。这个只能多做题了、多积累了,有一个不太相关的例子是当年打 ACM 的时候我们都是自己带打印好的代码进场的。但其实这个是相同的,对于新人来说也可以考虑记忆一些比较简单的代码范式,背一些伪代码,比如说递归、二分、二维数组的一些基本操作之类的。我就经常看到有些同学回回都能错同一个地方……好歹也是应试教育刷题刷上来的,贝叶斯搜索都能根据先验知识调整自身参数,大一新生入学半年就退化得连错题本都没有了。
现在比当年有很多很优秀的资源,比如说 B 站上的公开课质量比很多老师讲的不知道好多少个数量级。在线编程平台的话我们同学有用一个[dotcpp](
https://www.dotcpp.com/),其他的像牛客网、leetcode 之类的也可以挑一些简单题目来写写。
第三个就是自身学习方法的问题。程序设计本质上还是一个刷题的学科(或者说大一的所有基本科目都是刷题可破的)。这里可以借用强化学习的探索-利用问题。在程序设计中,所谓的“探索”意味着刷新题,“利用”意味反复学习过去的题目学透知识点。可以把对应的知识点的题目的完成情况记录下来,就基本能发现自己的问题了。反面例子就是有一位沉迷刷题的同学,很喜欢做自己会做的题目,不会做的题目问完我之后基本就不管了,从期末考试的结果来看这种学习方式应该是有些问题的。
刷题的时候总是会遇到一些比较困难 /不熟悉的题目,调试也很费劲,有一个比较笨的方法是直接单步手动把题目的所有过程算出来(当然,可能需要自己做一个简单的样例),然后写伪代码,然后一步步把伪代码改成真实代码。执行的时候如果有问题,就一步步把中间变量的结果全部算出来,然后看一下真实情况和线下到底那个有问题。这个方法是能够 100%起效果的,我就是这么教的,唯一的问题是做题速度极慢,但至少是能够做出来的。就,学会跑之前还是先走熟练了比较好。
总体而言,不要有太多的心理负担,大一级别的 C 语言编程只要学习时间上去了,谁都能搞定的。从个人的经验来说,在大一大二这个阶段,即使在 985 甚至是浙大、上交之类的学校,只要拿出高三时期八成的刷题功力都是能直接杀穿的,国一要看人品,但一般拿个二等奖学金真的是没什么难度。个人的建议是好好反思一下平时时间都花在哪里了,先把学习时间堆上去,把学习习惯找回来。