最近偶爾看到羣裏在討論明明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組的同學相對經驗豐富,總的來說這樣的錯誤應該不會犯。
我們深表遺憾的同時,也希望後來者不要再犯這樣低級的錯誤。