总结了平常常犯的错误和修改思路,有写错的地方欢迎大家指正。
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];
}
}
共 8 条回复
这个哪里错了#1374
还有freopen
1、数组长度太大
直接从 CSP-J 二等奖变成没有奖
666666
赵老师1455怎么做?
学废了