CSP和NOIP中最常见的爆零问题——文件输入输出
前两年也做过好几个直播课,讲了这个问题,但是还是很多孩子和家长没有太重视,感觉还是文字更方便保存,再强调一下。
信息学比赛大家知道就是用计算机写代码来解决问题,比赛是在限定的时间内完成要求的题目,评判题目是否正确,得分多少,选手最后知道自己的成绩。而这个评判方式经过了很多次变化。
学校语数英的考试,最常用的就是老师判卷,信息学最早也是类似的。
我在高中1993年和1994年参加的两年省赛,判卷的方式也不一样。
第一年是比赛结束后,由判卷老师看每个选手的代码,给出成绩,所以老师会看思路,类似数学考试给过程分。选手们并不参与判卷,只是最终看到成绩。
第二年在比赛结束后,每个选手排队,判卷老师会到每个选手的机器上,运行程序,输入固定的几个测试点,比较标准答案和选手程序的结果,如果正确就给相应的分。选手能够看到评测的全过程。
相对来说,第二种方式没有主观因素,对每个人更公平,但是也有一个问题,就是运行每个选手的程序和输入测试点都是手工的,时间很长,容易出错,特别是现在的程序越来越复杂,输入和输出都很大,不可能再用手工输入和用眼睛来对比了。
因此现在的评测都是机器自动进行,但是因为比赛情况的不同,还是分成了不同的赛制,可以参考之前文章里的详细的介绍。
我所知道的计算机竞赛26——信息学比赛常用赛制
CSP/NOIP使用的赛制本质上是“高考赛制”,大家一起交卷,最后交给CCF一起判分。各地组织者只需要收集好选手的程序及时发给CCF,不需要网络等各种复杂的设置。因此组织全国大规模的比赛,这种赛制是目前最优的方式。
这种赛制简单来说就是要求选手把程序结果放到文件里,机器自动和正确结果进行比较,如果正确就给相应的分,最终得到成绩。选手平时练习并不会用这种方式,比赛时必须按照要求在代码里写重定向的语句。但是考试中没有反馈,只有考试结束之后才进行评测。
从选手的角度来看这种方式不稳定性极高,经常会出现爆零的情况,而一旦爆零,这一年的机会就没有了。所以对选手特别是新手来说,一定在考试之前反复练习,确保不出现低级出错。
最简单的方法,就是在int main()的主函数里,在最开始写上两句话:
freopen(“xxxx.in”,“r”,stdin);
freopen(“xxxx.out”,“w”,stdout);
其中xxxx是这道题的文件名,比赛中每道题目的描述里都会写。
同时头文件需要有
#include <cstdio>
这样写的作用就是把从屏幕输入输出变成了文件输入输出,方便机器统一测评,虽然是简单的两句话,但是初学者会遇到各种各样的问题,稍有不慎就爆零。
所以我们一直也在想各种办法让孩子们在比赛前好好练习,做到比赛的时候万无一失,前几年我们尝试了很多方式:在课堂上让孩子们跟着老师练;上课的时候使用这种赛制进行比赛;在比赛前开避坑的公开课反复强调重要性等。
今年,我们又让开发的小伙伴们做了一套模拟系统,选手们可以在网上练习,完全还原CSP/NOIP中文件输入输出方式,评测环境和官方最新的NOI2.0版本完全一致,希望让选手们提前发现问题。
我们前几年组织的智慧杯,爆零原因有80%都是因为文件输入输出错误。而且申述的环节中,大部分也都是对这个输入输出重定向不了解。
因此根据这些情况,在视频里复现了出来,希望给更多的选手提醒:
没有使用<cstdio>头文件
没有使用文件输入输出
输入输出文件名错误
文件输入输出位置写错
文件输入输出语句英文括号全部写成了中文括号
函数名freopen写错
输入输出文件名读写模式错误
选手在xxx.in和xxx.out的前面都加上了.\\,unix环境下评测编译错误
调试中文件输入输出注释了,忘记取消注释
强烈建议文件输入输出重定向用freopen()
在正式比赛前,大家记得一定要练习熟悉一下,千万不要在比赛中留下遗憾!具体方法如下:
CSP-J/S真题模拟系统进入路径
👇👇👇
1.登录有道小图灵官网-赛事专区:https://oj.youdao.com/contests