干货 | NOIP避免错误指南(一)

网友投稿 2019-05-14 10:51

学习干货

https://cdn.china-scratch.com/timg/190516/10511WB0-0.jpg

生活和生意上的大多数成功来自你知道应该避免哪些事情,比如过早死亡。

——查理 · 芒格

无论对于小学生、初中生还是高中生,信息学奥赛都是升学的一大助力,那么学习信息学和参加NOIP竞赛有什么注意事项呢?

下面小编从编程风格、编译命令、巧用#语句和头文件四个方面来简单介绍NOIP参赛的注意要点。

编程风格

对于NOIP来说,也许编程风格没那么重要,但是,一个好的编程风格,有助于在编写程序之后的调试以及赛后分析,有时,甚至可以影响到比赛结果。

1、有一个规则的变量命名法。 


Q:你的变量名有3个字母以上的吗? 

有的人的变量命名很随意,直接就是a,b,c,d……在变量较少的情况下,还不会有什么问题,但一旦变量较多,还能很快的反应过来哪个变量到底代表什么含义吗?显然不能。 

所以,推荐在命名变量时使用英文单词(缩写)或者汉语拼音(缩写),能在定义时加上注释就更好了。

2、有一定的缩进习惯 


保持良好的缩进习惯能有效的区分开各个层次之间的关系。无论是2空格,4空格,还是6空格,只要能保持就很好。

简单的对比(左右滑动查看):

https://cdn.china-scratch.com/timg/190516/10511943F-1.jpghttps://cdn.china-scratch.com/timg/190516/10511914N-2.jpghttps://cdn.china-scratch.com/timg/190516/1051192462-3.jpg

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的,这时就必须要先声明再编写了。 

事实上,用术语应该叫做先定义,再实现。

https://cdn.china-scratch.com/timg/190516/1051201431-4.jpg

编译命令

编译命令是个很好的东西,可以在很大程度上帮助你修正程序的语法错误。

1、-Wall -Wextra,这两个命令可以使编译器显示更多的警告,例如变量未初始化就使用, 有命名冲突,main未return 0;等等。还可以加上-Werror以使警告转换成错误。

2、跑暴力打表程序可以开-O2。-O2使得编译器对于程序进行优化,降低常数,提高速度。

注意,如果想卡时可不要开-O2,有很大影响的。另外,-O2会影响浮点数的精度,以及可能带来一些无法预料的问题。

如何加编译命令?

在左下图中勾选选项,并依次填写即可。注意加空格。或是直接在右图所示位置选择即可。(左右滑动查看)

https://cdn.china-scratch.com/timg/190516/105120N95-5.jpghttps://cdn.china-scratch.com/timg/190516/1051206055-6.jpg

来看个实例。

请大家找出下面这个程序中不符合规范以及可能会导致错误的地方。

https://cdn.china-scratch.com/timg/190516/1051204950-7.jpg

毛病有不少,不是嘛?

来看看编译器的反应。

不加-Wall -Wextra来编译看看。

https://cdn.china-scratch.com/timg/190516/1051206411-8.jpg

看,编译通过了,编译器并没有返回任何错误信息。

现在把-Wall -Wextra加上再看看。

https://cdn.china-scratch.com/timg/190516/10512145T-9.jpg

看,编译器给出了很多警告。下面来分析一下这些警告。

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比赛不仅需要注意上述几个要点,在比赛技巧、语言特性等方面也需要多加关注,更多精彩内容请看下期。

https://cdn.china-scratch.com/timg/190516/1051215S9-10.jpg

乐程

编程,未来人才的核心竞争力

乐程致远信息学教育专注青少年信息学竞赛,老师有真实竞赛经验,对于孩子遇到的问题更容易感同身受,沉淀多年教学经验开创了AC教学法,配合自研的OJ和题库,适合各个年级的学生学习。

针对零基础的同学,通过《计算思维能力综合评测报告》给出针对性的学习建议;针对冲刺提高组一等奖的同学,因材施教,对于薄弱的知识点进行补足和提高。

课程类型

线上/线下授课:

小班授课(5-10人),根据测试成绩划分班级

具体课程详见:乐程 | 课程体系

暑期/寒假集训营:针对参加当年竞赛学生进行集训

答疑卡:

一年卡:40次答疑,考前点题,制定训练计划

两年卡:100次答疑,考前点题,制定训练计划,3次金牌教练在线授课

部分师资

       周老师:高中毕业于人大附中,本科毕业于澳大利亚Monash大学计算机系,算法基础扎实,实战经验丰富,善于启发学生的计算思维。

王老师:本科和研究生毕业于清华大学计算机系,计算机算法专家,精通C++编程,使用C++十年以上。实战经验丰富,善于启发学生的计算思维。

乐程 课程体系

https://cdn.china-scratch.com/timg/190516/1051216325-11.jpg

面向:4-6年级小学零基础;初一、初二零基础

目标:培养编程思维,参加NOIP比赛,助力升学

https://cdn.china-scratch.com/timg/190516/10512154E-12.jpg

面向:初中零基础,高中要求有一定NOIP 知识基础,参加过NOIP普及组或提高组比赛

目标:学习高级编程,参加NOIP提高组比赛

https://cdn.china-scratch.com/timg/190516/10512222b-13.jpg

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com