持续更新ing...
* 自用,请勿搬运or转载,分享随意 *
* 这里是一只小小小小小白第一次发帖,求勿杠求轻喷qvq *
* 欢迎dalao们纠错 *
Ⅰ. 关于OJ里面各种常见的评测状态和出现的原因(这里只列出了新手期一般出现的原因)
AC: Accepted(答案正确)
恭喜你的代码通过了全部的测试点( ̄▽ ̄)* 太优秀啦///
CE: Compile Error(编译错误)
语法错误
- 标点符号写成了全角
【所!有!的!标点符号!一定要写半角/英文标点!】
- 分号等关键标点符号漏写
- 括号不匹配
- 语句不规范
【比如for】
- 应用函数时没有include相应的头文件
- 函数的命名与头文件中已有的函数重复
- “%”前的数为非整数
【%前后的数一定要是整数!!】
- ……
编译不报错但需要重视的情况:“==”写成“=”;if或者for等后面的多个语句没有用花括号括起来……
一个比较奇怪的CE:数组申请的内存过大(即长度过长)
这是我上次在SCNU-N的热身赛时真实碰到的最匪夷所思的CE(。),在G题定义了一个全局变量的数组,长度有0x3fffffff,然后交上domjudge就报错CE了 TAT (在搜索引擎没搜索到有用信息,推测是domjudge或者评测机不能申请到这么大内存的问题)
p.s. 一般来说数组作为局部变量时最长的长度:int数组的最大范围是500000(估计)、char类型的最大范围是2000000;全局变量则可以定义更长的数组。(详情见对于c++中数组的最大长度的理解 - 二十四桥明月夜的博客)
WA: Wrong Answer(答案错误)
- 逻辑错误:一定要仔细读题,正确理解题意,可能会出现理解错误的问题或者有些情况没考虑到(比如洛谷P1426 小鱼会有危险吗里面,如果先游再if判断的话,很容易就漏考虑了小鱼一开始就有危险的情况)。
- 粗心错误:
- 注意数据范围
【比如有没有必要用到long long】。
- 数组长度的设置。
- 留意各种特殊值可能存在的特殊处理
【比如0、1、负数、边界值】。
- 数据的初始化
【比如sum、cnt、bool类型的、数组。总之一定要养成给 除了自己能够左右的变量的值以外的其他数据 初始化的习惯】。
- 运算符优先级
【比如闰年的判断:!year%4 和 !(year%4) 的问题(笑】
RE: Runtime Error(运行时错误)
- 数组越界【数组范围为0<=i<=n-1】(缓冲区溢出)
- 运行过程中出现了除以零或者%0的情况(算术溢出)
TLE: Time Limited Error(超出时间限制)
MLE: Memory Limited Error(超出内存限制)
- 死循环(不断申请内存)
- 单个数组过大或定义了过多数组
PE: Presentation Error(格式错误)
【最近进行的SCNU-N热身赛里面的D题就是典型例子,很多人因为冒号后面漏了个空格而陷入WA的debug中XD(正式ACM赛里面会有这个报错)。一个取巧的方法就是可以拿鼠标光标去选一下Sample输出,看看里面哪个地方藏了括号之类的。】
Ⅱ. 码风
强烈安利这个视频[av3929318](和这个视频的up主!)->【原创教程】代码规范_哔哩哔哩 (゜-゜)つロ 干杯-bilibili 不要求都按视频里的来啦,完全可以看个人喜好的www 但最重要就是要整齐和统一。
最最基本的排版要求:至少你同一层的代码缩进得相同吧√
For example:
//第一层
bool isPrime(int num){
//第二层
for(int i=2;i<=sqrt(num);i++){
//第三层
if(num%i==0){
//第四层
++cnt;
return 0;
}
}
return 1;
}
变量命名方法(不要再用abcdef啦!)
1. 匈牙利命名法:iCount,iSum,cName
2. 驼峰式命名法(Camel-Case):stuName, StuName
3. 下划线命名法:student_name
Ⅲ. 应该要拿个小本本记下来的东西
讲真学C++的时候要记的东西真的不多,但有些东西记住了真的很有用↓
常用头文件及函数
#include <cmath>
abs(num);
sqrt(num);
pow(num);
#include <cstdio>
scanf("%d",&num);
printf("%d",num);
#include <iomanip> //精度控制
cout<<setiosflags(ios::fixed)<<setprecision(2)<<num;
#include <algorithm> //偷懒专用库(初学者不建议使用
sort(num,num+n); //把num[]从小到大排列
swap(a,b); //交换a和b
max(a,b); //返回a,b的较大值
min(a,b); //返回a,b的较小值
#include <cstring> //操作char数组
char str[100];
int len=strlen(str); //返回字符串长度
strcat(str1,str2); //把str2连接到str1后面
strcpy(str1,str2); //即str1=str2
cout<<strcmp(str1,str2); //返回两字符串左起第一个不相同的字符的ASCII码的差值
cout<<strlwr(str); //把str的全部字母转化成小写字母并输出
cout<<strupr(str); //把str的全部字母转化成大写字母并输出
memset(num,0,sizeof(num));
//memset可用于初始化数组(这里把num[]初始化为0),但是以字节为单位的(第三个参数)。一般初始化为0或-1(二进制补码都为0或1)。另外也可以以0x3f来初始化数组,表示无穷。
#include <bits/stdc++.h> //万能头文件,包含了常用的一大堆库,但目前有些OJ或比赛不支持,慎用
ASCII码
没必要全部都记,但总要记些特别的。比如:小写字母=大写字母+32以及AZ、09和az的相对位置(谁在前谁在后)。
常用数据类型的范围
1. int 4bytes(32位,大概2.1e10)
2. long long 8bytes(64位,大概4.2e10)
3. double 8bytes(64位)
格式控制符
%d -> int
%o -> 以八进制形式输出
%x -> 以十六进制形式输出
%lld -> long long
%lf -> double
%c -> 单个字符
%s -> 字符串
Ⅳ. 关于DEBUG
静态查错
简而言之,就是你一直登着你的WA代码,说不定瞪着瞪着就发现哪里有问题了呢_。
反正就是逐条语句分析,必要的时候可以拿起手边的草稿纸,手算模拟一波。
↓比如这是上面提到的P1426 小鱼会有危险吗的WA代码,无奖竞猜错误在哪x_x。
#include<iostream>
using namespace std;
int main(){
int sum=0,s,x;
cin>>s>>x;
for(int i=7;;i*=0.98){
sum+=i;
if(sum>=s-x){
if(sum+i*0.98>s+x) cout<<"n"<<endl;
else cout<<"y"<<endl;
break;
}
}
return 0;
}
输出查错
一个我最喜欢用的方法kkkkk 一言以蔽之就是——输出关键值或者关键位置某个变量的值的状态。
比如上面那份代码:
#include<iostream>
using namespace std;
int main(){
int sum=0,s,x;
cin>>s>>x;
for(int i=7;;i*=0.98){
sum+=i;
if(sum>=s-x){
if(sum+i*0.98>s+x) cout<<"n"<<endl;
else cout<<"y"<<endl;
break;
}
}
return 0;
}
光看可能看不出来哪里有问题,那么我们可以试试在for循环里加一句【cout<<sum<<endl;】这样可以看到sum在每次循环时的状态值。(当然这里的错误并不是逻辑的问题,所以这么做并不能看出来)
以及,其实这个方法的原理跟编译器自带的debug功能原理相同,能掌握下面的debug方法固然最好,毕竟省时间呀。
运用编译器的debug调试功能
因为不怎么用不再赘述,指路一篇Dev-C++的调试指南:Dev C++单步调试/debug详细图解 - CaprYang的博客
另外给用Linux的小伙伴推一个gdb调试:gdb调试的基本使用 - H&K - 博客园
Ⅴ. 最后接好这堆网站安利ya——
这个不多说啦,刷题好去处。交题没AC的时候先努力思考一下自己的代码存在什么问题,但如果挠破头都想不到哪里有问题的话可以看看这道题目的讨论版,总能发现奇妙的东西(笑
实在过不了再尝试看看题解,学习学习优秀的思路hhhh
p.s.尤其推荐去刷试炼场的新手村,我觉得学完数组那一章以后新手村八个关卡基本上都没问题的啦,对自己有点信心呐。
一个干货非常非常多的网站,如果有心走竞赛的话可以把它从里到外仔仔细细地刷个几遍,除了侧边栏的介绍和提醒以外,还有顶栏的语言基础和各种算法,应有尽有,肯定能找到你想要的hhhh(包括之前的位运算链接就是出自它的门下)。
一个目前来说发展得比较好的IT中文论坛,虽然里面的博客有很多搬运的,重复率挺高,但早期还是有很多优秀的blog的。一般来说跟计算机有关的科普和问题都可以来这里找。
华南师大的搬砖技术社区!本校的论坛怎么能不支持一下呢!(还记得最开始水的时候还看到一篇讲Minecraft mod的帖子)
置顶那一篇计算机入门的帖强推!也强推Linux区的帖子kkkk学到了不少(虽然长期潜水)。
如果能接受英文阅读的话,我强烈推荐这个网站!!很多编程相关的偏门到极点的问题最后都是在这里找到答案的!
而且它会有问题查重,保证剩下的都是比较优质的问题hhhh。当然你也可以在这里提问,只是提问之前请务必记得开头那篇《How To Ask Questions The Smart Way》。
唯一的缺点可能就是外网加载得比较慢吧(但是不用翻墙啊!)。
这是!一个!好玩的!边学边练的!学语言的网站!也有配套APP!
在这里,你能学到各种语言的courses,通过先阅读基础知识再做一道题的形式,轻轻松松过完语法基础!
还能找人PK一大堆各种各样的语言基础选择题!妈妈再也不用担心我期末考试的程设选择题啦!(在线C++求战😃 互相PK互相进步)
全世界最大的同性交友网站(咳。
GitHub是一个面向开源及私有软件项目的托管平台,简单来说就是能在上面找到很多有趣又好玩的开源项目,可以经常逛逛发现新大陆呐√。
欢迎捉虫,也欢迎大佬们指出不妥之处QvQ感谢阅读biu~