Bootstrap

新手编程易错部分(1)

以下错误皆源于自身错误和同学答疑时出现的千奇百怪的错误。啊,才学多少啊,不得不感慨同学们的创造力。

变量

定义变量时不初始化

解决办法:设定变量的时候养成初始化的好习惯,除了一些马上就要scanf的变量之外,其它变量统统初始化。


定义变量初始化了,但是初始化的值会引发问题

解决办法:初始化变量时,先要判断变量的作用再选择初始化的值。例如一个需要不断和数列中数字比大小,并存储数列中最大整数的变量,就不要初始化为0,最好初始化为-1,因为有的题目最大值就是0。


需要重复使用的计数器类型变量用完不初始化,导致全加进去了

解决办法:一个循环写完之后检查计数器。如果有和计数器相关的输出,那么如果计数器此时应当初始化,就直接把初始化跟在输出之后。


变量名起得差不多结果用串了

解决办法:真别再起一串a、b、c、d、e、f的变量名字了!同学帮忙检查都一脸懵!建议变量名和其实际意义相关,例如“result”、“ans”等。或者与题目中的变量名保持一致。


输入

scanf不加取地址运算符&

解决办法:长点记性吧!如果找不到bug记得想一下自己是不是落了什么东西。


scanf赋值顺序和题目反着来

解决办法:赋值之前请确认自己充分理解了题目的输入方式和顺序,同时变量名请不要乱取,以免把自己搞混。


ASCII码背串了

解决办法:实在想不起来,请用单引号字符代替。例如想不起字符a的ASCII码,请直接用'a'代替,这样也会增加代码的可移植性。

'1' = 49

'a' =  97

'a' - 'A' = 32


输出

printf的时候不换行或者乱换行导致答案格式不对

解决办法:长点心吧!或者先不管printf细节,调试的时候再比对着自己的结果和目标结果,进行修改。


printf的内容就是不复制题目非要自己打,结果少个字母或者少个空格

解决办法:求求你了!这种要打印一长串固定的话的,直接复制吧!!!


格式

括号以及分号写成中文字符

解决办法:把中英转换关了。


不写分号

解决办法:看报错信息,或者长点心。


括号嵌套,结果左右括号数量不一样

解决办法:看报错信息,或者打括号的的时候直接一对一对打。


某个结构体两行以上不加大括号

解决办法:除非非常确信这下面只有一行,不然请习惯性地打一组{}上去。


条件语句

if里面就写一个=

解决办法:看报错,长点心。


if和else if混着写把自己搞乱了

解决办法:捋清楚自己条件判断的逻辑之后再写。


else后面还加条件

解决办法:想想为什么它叫else而不叫else if?此类报错一般会提示else后面加一个“;”,请注意。


循环语句

进入循环之前变量不输入

解决办法:第一次使用某个变量前先想想它有没有意义?检查的时候可以按照过程模拟一遍,看看所有的变量有没有被初始化或者赋值。


for里面加减号写反(或者大于小于号写反)导致循环永远出不来了

解决办法:TLE的时候,查查自己循环里面的符号和条件!


数据类型

两个数字相乘导致原来的数据类型溢出了

解决办法:如果测试用例对了但提交之后检查点错两个,建议查查数据类型。用乘法之前也注意一下数据是否过大。


用整数做除法再去和浮点数运算,没有做强制类型转换,导致整数除完直接把余数扔了

解决办法:做运算的时候,如果有除法,请留意一下数据类型,别除着除着除丢了。


判断浮点数等于零直接用等号

解决方法:由于浮点数的精度,导致浮点数基本不可能严格等于零。判断浮点数等于零与要用到<math.h>中的fabs()函数,求出这个极小浮点数的绝对值。当绝对值小于10^{-8}时,认为它近似等于零。即:

fabs(n)<1e-8


特殊情况

不注意边界导致多一个或者少一个

解决方法:注意一下吧,尤其是每组数据都差一点的时候。


不考虑例如0、1、最大值等特殊临界情况或考虑错误

解决方法:提交后发现只错一两个,或者递归直接TLE了,请看看自己是否落下了什么特殊情况。


看不懂的一坨屎山代码

解决方法:不要拉屎。


不读题胡写

解决方法:6

;