常见基础错误

手(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++式的变量声明方式(即等到要用的时候再声明,不要在函数开头声明一堆,然后再用)
  • 防御性编程
    • 声明变量后立即初始化,不管是否必要。
    • 指针不用后立即清空,不管是否必要。

写在最后

“年代久远”的缘故,上面的错误已经找不到原来的代码了。 如果各位刷题时出现闹鬼代码,欢迎编辑在此,以供后人抓鬼。

results matching ""

    No results matching ""