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組的同學相對經驗豐富,總的來說這樣的錯誤應該不會犯。

 

我們深表遺憾的同時,也希望後來者不要再犯這樣低級的錯誤。

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