常见基础错误
手(shou)误(jian)
- 出错特征:程序执行流程出乎意料,结果不正确。
- 出错样例:
for (int i = 0; i < n; i++) { if (i = n) printf("%d\n", i); else printf("%d ", i); }
- 治疗方法:剁手。多剁两次就记住了。
浮点数判等
- 出错特征:WA到死。
- 出错样例:
double a = 1/3*3; double b = 1; if (a == b) { printf("Yes"); }
- 治疗方法:
const double eps = 1e-5; double a = 1/3*3; double b = 1; if (abs(a-b) < eps) { printf("Yes"); }
- 注意点:eps到底取多少? 一般在1e-5到1e-8之间。有些题目卡eps。(就是莫名其妙的一个wa一个ac)
声明变量和使用变量太远……
- 出错特征:Output Limit Error 或 WA 或 RE 或 TE 或 机器爆炸。
出错样例:
题目:计算a+b。
输入:t组数据,每组测试数据包含两个数a,b。
输出:对于没组数据,输出a+b的值。每两组输出之间换行隔开
#include <cstdio> bool isFirst, t; int a, b; int main() { isFirst = true; scanf("%d", &t); while (t--) { scanf("%d%d", &a, &b); if (isFirst) { isFirst = false; } else { puts(""); } printf("%d\n", a+b); } return 0; }
数据: 3 1 2 2 3 3 4
- 治疗方法:先睡一觉。写出这种代码,你一定是太累了。
忘记初始化
- 出错特征:WA
- 出错样例:比如每次使用vis之前没有清false之类。
- 治疗方案:
- 每个变量定义的同时就初始化。
- 提交代码之前,检查所有定义的变量是否已经初始化。
数组开小了
- 出错特征:差别不大的会WA或TE。差别大的会RE。
- 出错样例:眼花手抖导致的数组少个0。,“树”类问题数组只开了n(应该要4n)
- 治疗方案:数组开的足够大。
Ctrl+C && Ctrl+V
- 出错说明:复制一段代码然后粘贴再修改的方式编程。常常出现没修改干净的问题。常出现在搜索题或输出图形的题。
- 出错特征:WA
- 出错样例:暂缺
- 治疗方法:
- 不要复制代码。把能重用的地方封装成函数然后再用(往往比较费时间)
- 采用复制代码方式。修改后然后检查3遍,当WA的时候,重点检查此处。优先重写此处。(即将复制的代码列为高危代码)
- PS:写工程的时候,不要复制代码……除非你的工程不需要维护(比如作业)
建议的代码书写方式
- 良好的代码风格。包括但不限于
- 有意义的变量名(起名字真的是个技术,没那麼简单,就能找到,
聊得来的伴) - 缩进
- 大括号的位置(选择一个风格保持统一)
- 有必要的空格使代码清晰(比如:
int a = (10*3/2 + 10)/3
) - C++式的变量声明方式(即等到要用的时候再声明,不要在函数开头声明一堆,然后再用)
- 有意义的变量名(起名字真的是个技术,没那麼简单,就能找到,
- 防御性编程
- 声明变量后立即初始化,不管是否必要。
- 指针不用后立即清空,不管是否必要。
写在最后
“年代久远”的缘故,上面的错误已经找不到原来的代码了。 如果各位刷题时出现闹鬼代码,欢迎编辑在此,以供后人抓鬼。