CSP分数出来了,有多少同学因为没用cstdio爆了0?

最近偶尔看到群里在讨论明明DevC++下测试可以运行的程序为何CCF测出来是0分呢?

当然原因可能有很多,我们这里仅仅来讨论其中一种情况,那就是因为缺少freopen的头文件而爆0的情况,缺少头文件显然是会CE(Compile Error),连验证程序的正确性的机会都没有。

#include<iostream>
#include<string>
using namespace std;
int main()
{
  freopen("number.in","r",stdin);
  freopen("number.out","w",stdout);
  string s;
  long long ans=0;
  cin>>s;
  for(int i=0;i<s.size();i++)
  {
    if(s[i]=='1')ans++;
  }
  cout<<ans;
  return 0;
}

这是从浙江赛区CSP-J选手中,随机找的因为这个原因爆0的程序(oitiku.com上测试也是CE,相信大家已经深深感受到了NOIP信息网估分的强大,打CALL)

CE的原因是缺少头文件,为何DevC++能编译通过呢?我们尝试了不同版本的G++在Linux下进行程序编译,发现G++4.8.4版本编译会缺少头文件而编译过不去,但是4.9.2以及更高的版本编译是过的去。另外我们也应该注意到到DevCpp的编译选项那边编译会帮我们自动连接了很多include文件。

的确考试时候的工具可以通过编译,到了评测就CE,而且还是g++版本的问题,的确会让人不爽。有兴趣的老师可以尝试更高版本的g++,根据CCF提供的终端运行命令行尝试对爆0同学程序的编译。

在g++ 4.8.4版本下对于freopen,可以使用的头文件有#include <bits/stdc++.h>,  #include <cstdio>,#include <stdio.h>,#include<fstream>

#include <bits/stdc++.h>  “万能头文件”,一劳永逸,基本上竞赛所要使用的大部分库都被囊括其中,以前我们是这样的:

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
using namespace std;

int main(){
    ...
    return 0;
}

现在大部分同学写程序大都是这样的:

#include<bits/stdc++.h>
using namespace std;

int main(){
    ...
    return 0;
}

如果你不使用万能头文件,那么你最好有头文件#include <cstdio>或者#include <stdio.h>

 

详细请看:http://www.cplusplus.com/reference/cstdio/freopen/

你想使用freopen,自然需要把它的头文件include进来。

 

如果你即不使用万能头文件,你又不用cstdio,好吧,其实还可以使用fstream头文件,为什么fstream也使用freopen呢?

首先参考CCF NOILinux评测标准:

然后我们查看一下gcc4.8.4中的fstream文件,发现fstream中也引用了cstdio,因此使用fstream头文件的同学也可以使用freopen。

 

所以理论上,凡是没有使用万能头文件bits/stdc++.h或者cstdio或者fstream的,但是使用了freopen关键字的应该都会因为CE而直接爆0。

我们对浙江省CSP-J的同学们的程序(来源:http://zhejiang.xiaoxiaotong.org/FileNotice/Detail?lnArticleID=244818)做了筛选,理论上因为freopen的头文件爆0的程序有:

 

./ZJ-00019/number/number.cpp

./ZJ-00019/transfer/transfer.cpp

./ZJ-00062/number/number.cpp

./ZJ-00125/number/number.cpp

./ZJ-00125/transfer/transfer.cpp

./ZJ-00145/CSP-J/number/number.cpp

./ZJ-00145/CSP-J/souvenir/souvenir.cpp

./ZJ-00145/CSP-J/transfer/transfer.cpp

./ZJ-00145/CSP-J/work/work.cpp

./ZJ-00153/number/number.cpp

./ZJ-00240/number/number.cpp

./ZJ-00240/souvenir/souvenir.cpp

./ZJ-00240/transfer/transfer.cpp

./ZJ-00240/work/work.cpp

./ZJ-00241/number/number.cpp

./ZJ-00241/souvenir/souvenir.cpp

./ZJ-00241/transfer/transfer.cpp

./ZJ-00241/work/work.cpp

./ZJ-00251/number/number.cpp

./ZJ-00277/souvenir/souvenir.cpp

./ZJ-00319/number/number.cpp

./ZJ-00319/souvenir/souvenir.cpp

./ZJ-00319/work/work.cpp

./ZJ-00340/number/number.cpp

./ZJ-00340/souvenir/souvenir.cpp

./ZJ-00340/transfer/transfer.cpp

./ZJ-00340/work/work.cpp

./ZJ-00362/number/number.cpp

./ZJ-00362/souvenir/souvenir.cpp

./ZJ-00362/transfer/transfer.cpp

./ZJ-00362/work/work.cpp

./ZJ-00428/number/number.cpp

./ZJ-00428/souvenir/souvenir.cpp

./ZJ-00428/transfer/transfer.cpp

./ZJ-00428/work/work.cpp

./ZJ-00444/number/number.cpp

./ZJ-00444/souvenir/souvenir.cpp

./ZJ-00444/transfer/transfer.cpp

./ZJ-00444/work/work.cpp

./ZJ-00448/number/number.cpp

./ZJ-00460/souvenir/souvenir.cpp

./ZJ-00460/work/work.cpp

./ZJ-00461/number/number.cpp

./ZJ-00461/souvenir/souvenir.cpp

./ZJ-00461/transfer/transfer.cpp

./ZJ-00461/work/work.cpp

./ZJ-00500/number/number.cpp

./ZJ-00500/transfer/transfer.cpp

./ZJ-00500/work/work.cpp

./ZJ-00504/number/number.cpp

./ZJ-00504/souvenir/souvenir.cpp

./ZJ-00504/transfer/transfer.cpp

./ZJ-00504/work/work.cpp

./ZJ-00507/number/number.cpp

./ZJ-00507/souvenir/souvenir.cpp

./ZJ-00507/transfer/transfer.cpp

./ZJ-00512/number/number.cpp

./ZJ-00551/number/number.cpp

./ZJ-00551/souvenir/souvenir.cpp

./ZJ-00551/transfer/transfer.cpp

./ZJ-00551/work/work.cpp

./ZJ-00566/number/number.cpp

./ZJ-00566/souvenir/souvenir.cpp

./ZJ-00566/transfer/transfer.cpp

./ZJ-00572/number/number.cpp

./ZJ-00582/number/number.cpp

./ZJ-00582/transfer/transfer.cpp

./ZJ-00585/number/number.cpp

./ZJ-00585/souvenir/souvenir.cpp

./ZJ-00585/transfer/transfer.cpp

./ZJ-00585/work/work.cpp

./ZJ-00616/number/number.cpp

./ZJ-00616/souvenir/souvenir.cpp

./ZJ-00616/transfer/transfer.cpp

./ZJ-00616/work/work.cpp

./ZJ-00649/number/number.cpp

./ZJ-00649/transfer/transfer.cpp

./ZJ-00649/work/work.cpp

./ZJ-00650/number/number.cpp

./ZJ-00727/number/number.cpp

./ZJ-00727/souvenir/souvenir.cpp

./ZJ-00727/transfer/transfer.cpp

./ZJ-00737/number/number.cpp

./ZJ-00737/souvenir/souvenir.cpp

./ZJ-00737/transfer/transfer.cpp

./ZJ-00737/work/work.cpp

./ZJ-00774/number/number.cpp

./ZJ-00783/souvenir/souvenir.cpp

./ZJ-00816/souvenir/souvenir.cpp

./ZJ-00831/number/number.cpp

./ZJ-00831/transfer/transfer.cpp

./ZJ-00863/number/number.cpp

./ZJ-00912/number/number.cpp

./ZJ-00912/souvenir/souvenir.cpp

./ZJ-00916/number/number.cpp

./ZJ-00916/souvenir/souvenir.cpp

./ZJ-00916/transfer/transfer.cpp

./ZJ-00949/transfer/transfer.cpp

./ZJ-00964/number/number.cpp

./ZJ-00964/transfer/transfer.cpp

./ZJ-01064/number/number.cpp

./ZJ-01064/souvenir/souvenir.cpp

./ZJ-01064/transfer/transfer.cpp

./ZJ-01064/work/work.cpp

./ZJ-01075/ZJ-01075/number/number.cpp

./ZJ-01075/number/number.cpp

./ZJ-01125/number/number.cpp

./ZJ-01125/souvenir/souvenir.cpp

./ZJ-01125/transfer/transfer.cpp

./ZJ-01125/work/work.cpp

./ZJ-01143/number/number.cpp

./ZJ-01143/souvenir/souvenir.cpp

./ZJ-01143/work/work.cpp

 

作为优秀参赛省份的浙江省尚且有同学因此爆0,其他省份可能也会有类似情况发生。CSP-S组的同学相对经验丰富,总的来说这样的错误应该不会犯。

 

我们深表遗憾的同时,也希望后来者不要再犯这样低级的错误。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章