干货 | NOIP避免错误指南(一)
学习干货
生活和生意上的大多数成功来自你知道应该避免哪些事情,比如过早死亡。
——查理 · 芒格
无论对于小学生、初中生还是高中生,信息学奥赛都是升学的一大助力,那么学习信息学和参加NOIP竞赛有什么注意事项呢?
下面小编从编程风格、编译命令、巧用#语句和头文件四个方面来简单介绍NOIP参赛的注意要点。
编程风格
对于NOIP来说,也许编程风格没那么重要,但是,一个好的编程风格,有助于在编写程序之后的调试以及赛后分析,有时,甚至可以影响到比赛结果。
1、有一个规则的变量命名法。
Q:你的变量名有3个字母以上的吗?
有的人的变量命名很随意,直接就是a,b,c,d……在变量较少的情况下,还不会有什么问题,但一旦变量较多,还能很快的反应过来哪个变量到底代表什么含义吗?显然不能。
所以,推荐在命名变量时使用英文单词(缩写)或者汉语拼音(缩写),能在定义时加上注释就更好了。
2、有一定的缩进习惯
保持良好的缩进习惯能有效的区分开各个层次之间的关系。无论是2空格,4空格,还是6空格,只要能保持就很好。
简单的对比(左右滑动查看):
3、将不同功能部分分函数编写
这是比较重要的一点。为什么要分函数编写呢?
第一,有的功能要重复使用,开个函数就可以直接调用函数而不用复制代码,并且修改方便。
第二,查错调试时可以分函数模块查错,分别检查每个函数是否达到预期功能即可,比整体查错更简单。
第三,可以巧用函数返回值来实现某些功能。
Ps.熟悉我的同学知道,对于较为复杂的题目,我的main()通常只有两个函数,input()和work()以及一个输出答案部分(有时输出我还会写个output())。
4.函数先声明再编写
什么意思呢?
就是说先在main()前以typename funname(argulist);的形式声明函数,然后再在main()后写代码。
这样做的好处是,不用担心在fun1()中调用fun2()时fun2()还未定义以至于CE。
实例:qyz某次写了两个函数find1()和find2(),在find1()中调用了find2(),又在find2()中调用了find1(),这时如果直接在main前编写而不先声明的话,无论以怎样的顺序放两个函数的代码都是会CE的,这时就必须要先声明再编写了。
事实上,用术语应该叫做先定义,再实现。
编译命令
编译命令是个很好的东西,可以在很大程度上帮助你修正程序的语法错误。
1、-Wall -Wextra,这两个命令可以使编译器显示更多的警告,例如变量未初始化就使用, 有命名冲突,main未return 0;等等。还可以加上-Werror以使警告转换成错误。
2、跑暴力打表程序可以开-O2。-O2使得编译器对于程序进行优化,降低常数,提高速度。
注意,如果想卡时可不要开-O2,有很大影响的。另外,-O2会影响浮点数的精度,以及可能带来一些无法预料的问题。
如何加编译命令?
在左下图中勾选选项,并依次填写即可。注意加空格。或是直接在右图所示位置选择即可。(左右滑动查看)
来看个实例。
请大家找出下面这个程序中不符合规范以及可能会导致错误的地方。
毛病有不少,不是嘛?
来看看编译器的反应。
不加-Wall -Wextra来编译看看。
看,编译通过了,编译器并没有返回任何错误信息。
现在把-Wall -Wextra加上再看看。
看,编译器给出了很多警告。下面来分析一下这些警告。
return type defaults to 'int' [-Wreturn-type]——main没有标明返回int。
format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat]——scanf中的%d没有以int*与之对应,也就是说没加取地址符号。
unused variable 'x' [-Wunused-variable]——x变量没有使用。
control reaches end of non-void function [-Wreturn-type]——控制流程到达了非void函数的尾部,即有返回值的函数(main)没有返回值。
'n' is used uninitialized in this function [-Wuninitialized]——变量n在没有初始化的情况下就使用了。
看看,-Wall -Wextra的作用是不是很大呢?不过,自己小心不要犯错才是王道。
巧用#语句
例如,喜欢屏幕I/O,但题目又要文件I/O,抑或相反,可以在stdio.h中#define一个自己的标记,例如我喜欢#define zaxs。之后再程序中利用#ifdef #ifndef 以及#endif来将freopen语句屏蔽。例如:
#ifndef zaxs //#ifdef zaxs
freopen(...);freopen(...);
#endif
这样就可以确定提交程序后使用的是要求的I/O方式,因为评测系统不可能有你自己定义的标记。
另外,max,abs也可以用#来写
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
for也可以用#来缩短哦
#define rep(i,m,n) for(i=m;i<=n;++i)
头文件
每年的NOIP总会有人因为头文件的问题导致CE而爆0。这是很可悲的一件事。
Dev4.9.9.2.带的gcc是3.*.*版本的,对头文件检查不严格。事实上,它会自动链接某些头文件,以至于在不加某些头文件的时候依旧可以使用该头文件中的函数。
如果比赛时gcc换成了4.*.*会好很多,但是还是要自己注意。以防万一的话,可以把所有常用头文件都加上。
下面列一些常用头文件:
C:stdio.h math.h stdlib.h time.h string.h limlts.h
C++:iostream fstream algorithm string queue stack list map set 以及上面C的头文件去.h加c的版本。
注意不是所有C的头文件都有对应的C++的版本,非ansi c的头文件(例如memory.h)就没有。
参加NOIP比赛不仅需要注意上述几个要点,在比赛技巧、语言特性等方面也需要多加关注,更多精彩内容请看下期。
乐程
编程,未来人才的核心竞争力
乐程致远信息学教育专注青少年信息学竞赛,老师有真实竞赛经验,对于孩子遇到的问题更容易感同身受,沉淀多年教学经验开创了AC教学法,配合自研的OJ和题库,适合各个年级的学生学习。
针对零基础的同学,通过《计算思维能力综合评测报告》给出针对性的学习建议;针对冲刺提高组一等奖的同学,因材施教,对于薄弱的知识点进行补足和提高。
课程类型
线上/线下授课:
小班授课(5-10人),根据测试成绩划分班级
具体课程详见:乐程 | 课程体系
暑期/寒假集训营:针对参加当年竞赛学生进行集训
答疑卡:
一年卡:40次答疑,考前点题,制定训练计划
两年卡:100次答疑,考前点题,制定训练计划,3次金牌教练在线授课
课时价格:
¥300~¥400/小时
部分师资
周老师:高中毕业于人大附中,本科毕业于澳大利亚Monash大学计算机系,算法基础扎实,实战经验丰富,善于启发学生的计算思维。
王老师:本科和研究生毕业于清华大学计算机系,计算机算法专家,精通C++编程,使用C++十年以上。实战经验丰富,善于启发学生的计算思维。
乐程 课程体系
面向:4-6年级小学零基础;初一、初二零基础
目标:培养编程思维,参加NOIP比赛,助力升学
面向:初中零基础,高中要求有一定NOIP 知识基础,参加过NOIP普及组或提高组比赛
目标:学习高级编程,参加NOIP提高组比赛
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com