同学代码部分错误常见原因

Horizon 摸鱼 2024-01-29 17:06:37 2024-03-20 19:45:22 36

总结了平常常犯的错误和修改思路,有写错的地方欢迎大家指正。

2024/3/9 添加了关于 文件错误 和 答案错误 的分析

2024/3/13 添加了关于 运行错误 和 超时 的分析

Wrong Answer

WA (答案错误)

一般来说,WA 的错误很难进行分类,需要针对不同的问题具体分析,但是有些十分特殊的错误也会归属于 WA 中,可以优先检查。

1.没写输出

这种情况没啥好说的,长点心吧。

int main() {
    int a = 3;
    a += 1;
    // 没写输出
}

2.没写空格/换行

先在DEVC++里通过样例再提交啊啊啊啊啊啊啊!!!!!

int main() {
    int a = 3, b = 4;
    cout << a << b;  // 中间没写空格
}

Compile Error

CE (编译错误)

1.漏写分号";" (或者写成中文";")

少分号的情况

报错行一般在上一行,往上看一眼。

分号写错的情况

报错行就在错误的那一行, DEVC++中中文分号是黑色, 英文分号是红色。

int main() {
    int a = 3;
    cout << a    // 没写分号
}

2.左右括号不匹配

报错行一般不在少括号的那一行。

DEVC++里,鼠标点一下可以自动匹配左右括号,认真对比一下。

int main() {
    int a = 3;
    cout << a;   // 下面没有右括号

3.没有创建变量就直接使用

报错的时候会光标指向变量,检查一下光标附近的变量是否创建。

int main() {
    cout << a;    // 没有创建变量a, 直接输出
}

4.cout << ; 和 cin >> ;写错

能不能长点心?

int main() {
    cout >> 3;        // 输出的符号写错
    cout << 3 " " 4;  // 输出加空格也要加符号
}

5.关键字拼错

同学写错比较多的 while,double,string,return

关键字写对通常是加粗的黑色字体,string没加粗,单独注意一下。


Time Limit Exceeded

TLE (超时)

1.死循环

尤其是嵌套循环没输出的时候!注意下面这一段代码!

int main() {
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; i++)  // 改变量i++ 死循环
}

内层循环的改变量写成了i++

2.数组输入下标范围写错,导致数组输入没有结束

刚学数组的同学写错的很多。

int main() {
    int a[15], n;
    cin >> n;  // 输入n为10
    for(int i = 0; i <= n; i++)   // 从0开始到n是n+1次循环
        cin >> a[i];
}

3.无限递归

同死循环,无法结束故没有输出。

int f(){
    return f()+1;
}

int main() {
    cout << f();
}

注: 很多同学都知道无限递归会占用大量内存,但报错类型并不是 ,而是 ,因为递归深度过大会导致栈溢出。

4、超出时间限制

一般来说需要换个算法,优化代码,改用时间复杂度更低的算法或者剪枝。

内,不同时间复杂度能通过的数据范围:

O(n)复杂度 能通过的数据范围最大为

O(nlogn)复杂度 能通过的数据范围最大为

O(n^2)复杂度 能通过的数据范围最大为

O(2^n)复杂度 能通过的数据范围最大为


Runtime Error

RE (运行错误)

1.数组越界

访问了不存在的数组元素,比如数组定义为 a[10],却访问了 a[10]a[-1]

int main() {
    int a[10];
    a[10] = 1; // 数组越界
}

2.除以0

进行除法运算时,除数为0。

int main() {
    int a = 10, b = 0;
    cout << a / b; // 除以0
}

3、非法操作STL容器

在栈空的情况下执行出栈操作。

int main(){
    stack <int> st;
    st.pop(); // 栈空的情况下出栈
}

4.空指针访问

尝试访问未初始化或已经释放的指针。

int main() {
    int* ptr = nullptr;
    cout << *ptr; // 空指针访问
}

Memory Limit Exceeded

MLE (超内存)

1.数组长度太大

数组长度太大,导致超出内存。

int main() {
    const int N = 1e9 + 5;
    int a[N];   // 长度达到1e9
}

一维数组长度不能超过 ,二维数组行列相乘不能超过


File Error

FE(文件错误)

例:

输入要求: 从文件 number.in 中读入数据。

输出要求: 输出到文件 number.out 中。

1.没有按照要求读取/写入文件

int main() {
    // 没有按照要求读取/写入文件
    int n, a[105];
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }
}

2.读取/写入文件时,写错文件名

尤其是喜欢从笔记复制的同学,复制完这句话别忘了改一下题目要求的文件名。

int main() {
    freopen("C.in", "r", stdin);    // 文件名写错
    freopen("C.out", "w", stdout);  // 文件名写错
    int n, a[105];
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }
}
{{ vote && vote.total.up }}

共 8 条回复

bai123 暗区传说

这个哪里错了#1374

#include <bits/stdc++.h>
using namespace std;
int n, y[1001];
bool is_prime(int x) {
    if (x == 1)
        return 0;
    for (int i = 2; i < x; i++) {
        if (x % i == 0)
            return 0;
    }
    return 1;
}
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0;; j++) {
            y[j] = is_prime(i);
        }
    }
    sort(y, y + n);
    for (int i = 0; i < n; i++) {
        cout << y[i] << endl;
    }
    return 0;
}
CPP 刷题王

还有freopen

root 站长

1、数组长度太大

直接从 CSP-J 二等奖变成没有奖

13983427298

666666

bai123 暗区传说

赵老师1455怎么做?

tctm385 赵老师真帅

学废了

CICI 掌上明珠
CICI 掌上明珠