- 算法競賽寶典(第一部):語言及算法入門
- 張新華
- 1497字
- 2021-03-19 19:27:46
制作測試數據
為了驗證所寫程序的正確性,需要使用記事本等純文本編輯軟件自制測試數據進行自我測試。為方便測試起見,一般自制的測試數據文件與可執行文件保存在于同一目錄下,如圖3.1所示。

圖3.1
例如,某道題為求兩數之和,題目名為sum,則可做N組輸入測試數據sum1.in、sum2.in、sum3.in…再做與之相對應的標準答案文件sum1.ans、sum2.ans、sum3.ans…當然,必須保證自制的標準答案文件必須完全正確。例如sum1.in和sum2.ans的內容可與圖3.2所示的相似。

圖3.2
sum.cpp的代碼內容可能如圖3.3所示:

圖3.3
程序中輸入輸出語句的格式必須嚴格匹配題目要求的輸入輸出文件格式。同理,為了驗證程序是否正確,自制的若干組測試數據文件和答案文件,其測試數據也必須嚴格匹配題目要求,否則會發生讀取錯誤。
注意測試數據文件的后綴名是否正確,特別是當操作系統默認設置為隱含文件后綴名時,完全文件名為sum.txt的文件,在屏幕上僅顯示該文件名為sum,這往往導致在修改文件名時,看似將文件名修改成了sum.in,但實則該文件名為sum.in.txt。
現在的問題是,我寫好了十多組測試數據,難道需要手工一個一個去測試嗎?不會這么麻煩吧?
在平時的訓練中,有現成的各類測試軟件如Cena等,可以幫助我們自動測試程序的正確性。但是在正式比賽環境中,不可能給選手提供測試軟件和正式測試數據,因此需要選手現場編寫批處理文件和自制測試數據自我測試。例如有源程序名為sum.cpp,編譯生成名為sum.exe的可執行文件。現有十組自制測試數據,輸入數據文件分別為sum1.in、sum2.in、…sum10.in,輸出答案文件分別為sum1.ans、sum2.ans、…sum10.ans,則可據此使用記事本等純文本編輯軟件(注意:不是Dev-C++),建立批處理文件如下所示:
1 @echo off 2 if "%1" == "" goto loop 3 4 copy sum%1.in sum.in > nul 5 echo Problem Test %1 6 7 time/t 8 sum 9 time/t 10 11 fc sum.out sum%1.ans 12 del sum.in 13 del sum.out 14 15 pause 16 goto end 17 :loop 18 for %%i in (1 2 3 4 5 6 7 8 9 10) do call %0 %%i 19 :end
@echo off表示關閉輸出結果顯示。
if "%1"==""goto loop,其中%1為變量,在批處理文件運行時,將依次賦值為1,2,…,10。當批處理文件第一次運行時,由于%1為空值,所以將跳至第17行,即loop這一段。
copy a%1.in a.in>nul表示將某個輸入文件(例如a1.in)拷貝復制為a.in。
echo Problem Test %1:在屏幕上顯示echo后面的字符串,如“Problem Test 5”等,其中5為%1這個變量在當時的實際值。
time/t獲取當前時間并輸出到屏幕。
第8行即為運行已編譯好的可執行文件a.exe。該可執行文件執行后,將從新生成的a.in中獲取數據,最后將運行輸出結果寫入文件a.out中。
fc a.out a%1.ans為比較語句,即比較a.out與相應的答案文件是否有異同。
第12行和第13行刪除a.in和a.out文件。
pause為暫停命令,當用戶按回車鍵后,程序將繼續運行。
for %%i in(1 2 3 4 5 6 7 8 9 10)do call %0 %%i表示批處理文件將運行十次,變量名將依次賦值為1,2,…,10。
該文件以后綴名.bat的形式例如test.bat保存在相同目錄下,正確的批處理文件的圖標應為兩個嚙合的齒輪,如圖3.4所示。

圖3.4
雙擊運行test.bat,程序將運行并自動測試每一組測試數據,如圖3.5所示。

圖3.5
根據實際測試,批處理文件中的比較命令對換行符不敏感,所以測試時注意最后的換行符陷阱。
程序的運行時間多少對于選手來說尤為重要,下例為獲取程序運行時間的程序:
1 /* 2 程序名稱: 獲取程序運行時間 3 程序說明: 應用函數clock() 4 */ 5 #include <iostream> 6 using namespace std; 7 8 int main() 9 { 10 clock_t time; //如果僅僅判斷該程序運行全部時間,則無須設time, 11 time=clock(); //在末行直接輸出clock()的值即可 12 cout<<time<<endl; 13 Sleep(1000); //休眠1秒,Sleep首字母應大寫 14 cout<<clock()-time<<"毫秒"<<endl; 15 system("pause"); 16 return 0; 17 }
說明:此程序在某些版本的Dev-C++下無法運行,需加上Windows.h頭文件。但要注意的是,Windows.h是無法在Linux平臺上編譯通過的,因此比賽時切勿使用此頭文件。
另外,與自我測試不同的是,在正式比賽中,只允許選手提交程序的源文件,不允許提交自制的測試數據及可執行文件,且每個源文件分別保存在一個單獨文件中。例如有選手考號為zj_123,所提交三道題的程序名分別為proble1、proble2、proble3,則一般提交的格式如圖3.6所示。

圖3.6
- DevOps for Networking
- Network Automation Cookbook
- OpenShift在企業中的實踐:PaaS DevOps微服務(第2版)
- 微信小程序入門指南
- C# 8.0核心技術指南(原書第8版)
- 機器學習與R語言實戰
- Visual FoxPro程序設計習題集及實驗指導(第四版)
- Building Android UIs with Custom Views
- 寫給大家看的Midjourney設計書
- Android Game Programming by Example
- Apache Solr PHP Integration
- Python編程基礎教程
- 3ds Max 2018從入門到精通
- C++服務器開發精髓
- Raspberry Pi開發實戰