CSP-JS第二轮新手避坑指南
(一)文件输入输出
每年都有一些选手,尤其是第一次参加第二轮的选手,因为文件输入输出语句没写或没写对,遗憾爆0。
文件输入输出有多种方式,最简单的是freopen。假如题目的标题是candy,则只需要加入这两行:
freopen(“candy.in”, “r”, stdin);
freopen(“candy.out”, “w”, stdout);
注意,这里的函数名称和参数不能写错,任意一个地方出错都会导致程序爆0。比如,candy.in不能写成candy.txt,也不能写成candy.in.txt。“r”不能写成“read”,也不能写成’r’(这种情况编译器会报错),
两行freopen中的三个参数,是分别相反的,in文件对应着out文件,读取对应着写入,标准输入对应着标准输出。下面三种常见的错误写法,都会爆0。
第一种:
freopen(“candy.in”, “r”, stdin);
freopen(“candy.out”, “r”, stdout);
第二种:
freopen(“candy.in”, “r”, stdout);
freopen(“candy.out”, “w”, stdout);
第三种:
freopen(“candy.in”, “r”, stdin);
freopen(“candy.in”, “w”, stdout);
另外,新手建议不要在程序的末尾写fclose函数。因为程序结束后,所占的内存就都释放了,fclose函数写不写是一样的。新手写的越多,意味着犯错的可能性越大。
(二)程序提交格式
不同省份的提交格式可能不尽相同,常见的有两种。
第一种,在电脑桌面建立以准考号命名的文件夹,然后把源代码提交到该文件夹内。假如四道题的标题分别是candy, sort, network, fruit,假如只会前两题,那么提交前两道题就可以了。这两题的文件名应该命名为candy.cpp和sort.cpp。提交样式如下图所示:
如果你是用codeblocks建立的项目,那么每个项目源代码的名称都是main.cpp。可把main.cpp拷贝到准考证命名的文件夹内,然后把main.cpp重命名成相应的名称比如candy.cpp。
若采用这种提交方式,不需要提交多余的文件,比如.in文件,.out文件,.exe文件。.in和.out文件用来帮助选手测试, exe是运行结果文件。如果把这些文件都提交了,也不会影响分数,因为评分时这些文件会被忽略掉。
下面这种方式是错误的,会爆0。因为多建了一层文件夹:
第二种方式,是在浏览器中打开一个网址,然后把代码直接复制粘贴到网址里面,再点击底部的“提交”按钮即可。这种方式程序文件名称无所谓(比如codeblocks项目下的程序文件名叫main.cpp),只需要把代码直接复制粘贴到网址里即可。NOI Online测试、各大OJ网站比如洛谷、以及这两年北京的第二轮,都是采用这种方式。
(三)NOILinux建立项目的位置
如果你用的是NOILinux系统,那么不要把C++项目项目建立在桌面,因为“桌面”这两个字是汉字,会导致无法编译。
可建立在Linux账户的家目录(即桌面的上一级目录)中,这样就不会影响编译。
(四)NOILinux建立.in文件
.in文件需要手动创建,.out文件则不需要手动创建,因为运行程序后会自动生成。
Windows系统中创建.in文件比较简单,右键点击空白处,选择新建文本文件即可。
NOILinux系统与Windows系统差别较大,在NOILinux系统中,右键点击空白处无法创建文本文件。可用下面三种方式来创建。
第一种,运行代码后,会生成xxx.out文件比如candy.out,然后把candy.out在同一目录下复制粘贴,会生成candy(复件).out,将candy(复件).out重命名为candy.in。
第二种,点击桌面左下角的“九个点”按钮,在弹出的界面中的第一页选择“文本编辑器”,注意文件要保存到程序项目的路径下。
第三种,在终端里进入程序项目所在的路径,然后用touch candy.in或gedit candy.in的指令来创建candy.in文件。
推荐新手使用最简单的第一种。
(五)文件名都是小写
根据历年csp-js/noip相关的比赛来看,输入文件名、输出文件名、以及源代码的文件名称都是小写的。
(六)Windows系统的扩展名要显示出来
有些Windows系统的电脑的扩展名是隐藏的,一定要让扩展名显示出来。否则轻则影响测试,重则爆0。比如有些机器隐藏了扩展名,选手将程序命名为candy.cpp,实际上是candy.cpp.cpp;选手将输入文件命名为candy.in,实际上是candy.in.txt。
(七)输出格式
如果题目要求数据之间加空格,那就不能换行输出。比如要求输出
1 2 3
如果选手输出
1
2
3
则不能得分。
大小写也要注意,需要仔细看清题目是要求全大写、全小写还是首字母大写。比如要求输出Yes,则输出YES、yes、yES等均不能得分。
(八)可多次提交代码
每做出一题,提交一题。每题写出一版代码,先提交上去,后面如果有更好的方法写完再次提交,会把先前提交的代码覆盖掉,以最后一次提交为准。
不要把所有的代码等到最后一次性提交,这样可以避免遇到突发情况来不及提交。
每写若干行代码,可保存一次。这样可以避免因为意外情况比如死机重启导致写好的代码丢失。
(九)头文件
包含常用的头文件,比如iostream,cstdio, algorithm,或者直接包含万能头文件bits/stdc++.h
(十)变量名冲突
用了using namespace std;之后容易产生的问题是,有些自己的变量名比如time、next和std命名空间中的变量名冲突,而且在Windows下编译器不报错,但是在Linux下报错。所以如果需要这几个单词,可以使用首字母大写Time、Next;或者做一下变形,比如tim、nxt;或者定义成局部变量。另外time、next等作为结构体的成员名是没问题的。
全局变量不要使用y0、y1、yn、j0、j1、jn。因为这些变量名称在C++11标准库里被定义了,不能再用作全局变量,否则编译会有警告或出错。但是这些变量可以用作局部变量。
(十一)变量初始化
变量的初始化常见有两种方式:输入和赋值。在使用变量之前记得要初始化。如果定义成全局变量,则系统会自动初始化。
(十二)数组建议用全局数组
全局数组可用的内存空间比局部数组可用的内存空间大很多很多。
(十三)注意时间和空间限制
1秒内最大循环次数不要超过1亿次。1亿次有可能超时也有可能不超时。但是一两千万次通常不会超时。
通常题目会限制内存不能超过256兆或512兆。所以要学会估计内存。比如全局数组int a[1000000]占内存100 0000 * 4 / (1024 * 1024) 兆 ≈ 4兆。

添加 家长论坛微信
全部 0条评论