前言
“测试输入包含若干测试实例。当N为0时,输入结束,该实例不被处理。”这句话 是最早我对OJ的印象 以前也没见过这种输入要求, 做第一道题的时候就卡住了 上网看别人的代码 都有一句 while(scanf(“%d”,&n)!=EOF)”scanf 函数还能放while里啊… EOF是什么玩意儿呢…”
什么是OJ?
首先先介绍下什么是OJ吧(知道的同学可以跳过此部分) Online Judge系统(简称OJ)是一个在线的判题系统。用户可以在线提交程序多种程序(如C、C )源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。
一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被Online Judge系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件。最后系统返回给用户一个状态:通过(Accepted,AC)、答案错误(Wrong Answer,WA)、超时(Time Limit Exceed,TLE)、超过输出限制(Output Limit Exceed,OLE)、超内存(Memory Limit Exceed,MLE)、运行时错误(Runtime Error,RE)、格式错误(Presentation Error,PE)、或是无法编译(Compile Error,CE),并返回程序使用的内存、运行时间等信息。
Online Judge系统最初使用于ACM-ICPC国际大学生程序设计竞赛和OI信息学奥林匹克竞赛中的自动判题和排名。现广泛应用于世界各地高校学生程序设计的训练、参赛队员的训练和选拔、各种程序设计竞赛以及数据结构和算法的学习和作业的自动提交判断中。
知名的OJ有:RQNOJ,URAL,SPOJ,vijos,tyvj,USACO,sgu,pku(poj),zju(toj),tju,uva,HDU(HDOJ)等。
EOF是什么东东?
EOF 是一个宏 ,一般定义为-1。 1.EOF用来判断文件结束的标记(end of file) 用在文件操作中,可以查下msdn 看它的定义:EOF is returned by an I/O routine when the end-of-file (or in some cases, an error) is encountered 2.EOF表示输入流的结束。 3.在发送端套接字关闭后,接收端读套接字的read函数也会返回EOF.
while(scanf()!=EOF)流程图
我们学过的有三种循环:for,while,do-while。但while (scanf(“%d”, &n) != EOF)不像以上的任何一种,接下来看一下它的流程图:
OnlineJuge的评判时,该语句的作用
OJ评判的原理应该是这样的: 输入:通过管道命令,将一个包含若干测试用例的文件作 为【标准输入流】,所以需要while(scanf() != EOF)来判断测试文件是否读完。 输出:通过管道命令,将【标准输出流】,输出到一个文件中。 评判:将程序的【输出文件】与【正确答案文件】进行比对:如果一样,则返回程序正确提示;否则返回程序错误的提示。
使用原理
有人说 EOF等于-1 其实就是scanf函数的返回值 不等于-1时 继续进行循环
有人说 EOF是处理到文件结束 不用EOF也可以
……….
很多天后终于把这个弄明白了
scanf的返回值由后面的参数决定
scanf(“%d%d”, &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF,且返回值为int型.
总结
以上是我个人所述,若有什么不对的地方或者有补充的地方,还希望各位指点指点,大家可以一起学习,一起进步!