专业的编程技术博客社区

网站首页 > 博客文章 正文

考前必看!NOIP中最常见的“爆零”问题——文件输入输出

baijin 2024-08-31 16:13:21 博客文章 2 ℃ 0 评论


考前必看!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中文件输入输出方式,系统用这种方式来评测,希望每个孩子在比赛前一定要多练习,提前发现问题,千万不要在比赛中留下遗憾!


我们前几年组织的智慧杯,爆零原因有80%都是因为文件输入输出错误。而且申述的环节中,大部分也都是对这个输入输出重定向不了解。


文件输入输出中常见错误:


  • 没有使用<cstdio>头文件
  • 没有使用文件输入输出
  • 输入输出文件名错误
  • 文件输入输出位置写错
  • 文件输入输出语句英文括号全部写成了中文括号
  • 函数名freopen写错
  • 输入输出文件名读写模式错误
  • 选手在xxx.in和xxx.out的前面都加上了.\\,unix环境下评测编译错误
  • 调试中文件输入输出注释了,忘记取消注释
  • 强烈建议文件输入输出重定向用freopen()

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表