acm競賽題目的輸入資料常要求有多組,并且格式多種多樣,這是初次登oj平台的同學的一個障礙。實際上,這些格式可以歸為固定的幾種類型,本文介紹各種類型的處理方法,以幫助同學們克服這些障礙。
實際上,這些模式不僅是oj平台上做題的需要。在平時的自由程式設計練習中,也可以自行使用這些模式,以提高調試程式的效率。對程式測試的意識也将在此過程中得到提升。
本文1-4部分介紹了幾種類型輸入的處理,第5部分介紹通過輸入重定向提高調試程式效率的方法。
1. 最簡單的輸入
例1:
這種最簡單的輸入,接受一組輸入,針對這組輸入計算出值即可。這與平時的程式設計并無差異。解決辦法是:
2. 一次運作,要輸入多組資料,直到讀至輸入檔案末尾(eof)為止
例2:
這種輸入包含多對輸入資料,需要構造一個循環讀取。因為沒有指出到底有多少對輸入,要有辦法判斷輸入何時結束。解決辦法是:
說明1:當讀到輸入結束時,cin >> a >> b傳回 0,循環也結束。
說明2:在調試程式時,鍵盤輸入的資料,用ctrl-z(即按住ctrl鍵不放,再按下z)組合作為輸入結束,此謂鍵盤輸入裝置的“檔案末尾”。
3. 一次運作,要輸入多組資料,組數由第一個輸入資料決定(在開始的時候輸入一個n,接下來是n組資料)
例3:
需要先讀入第一行确定組數n,而後寫一次執行n次的循環進行處理即可。解決辦法是:
4. 輸入不說明有多少組資料,但以某個特殊輸入為結束标志。平時做題中常見諸如“輸入學生成績,以-1結束”,沒有學生得-1分的,這個結束資料可以要得。
例4:
構造循環對資料進行處理,将是否遇到了要求結束的輸入,作為循環是否結束的依據。解決辦法是:
有關字元和字元串資料的輸入,在此不再多講,隻要将相關的函數用好即可,也可以找到相關資料參考。
5. 利用檔案重定向提高調試效率
程式設計得到正确結果前,往往需要多次運作程式,每次運作都需要花費不少的時間從鍵盤輸入資料。每次輸入的資料都是相同的時,會給人的心理帶來不爽的感覺,并造成時間上的浪費。無論平時練習還是acm競賽實戰,這些都是可以避免的。方法是,運用重定向。
用下面的形式調用函數freopen()會将标準輸入stdin重定向到檔案input.txt(這個名字可以自己定義)。
重定向後,原先從鍵盤(标準輸入的預設裝置)接受的輸入,将統統從檔案讀取input.txt讀取,這就是重定向。程式可以寫作:
于是,在運作程式前,将本該由鍵盤輸入的資料,寫到檔案input.txt中。而在運作程式時,資料将不再需要人去輸入。那個快,很享受。
需要注意的是,調試通過的程式,千萬不要直接送出到oj平台上去。如果競賽中這樣做了,罰你的20分鐘不要算到我的頭上。送出的程式要把輸入重定向的一行删除,這樣才算是符合要求的,可以獲得ac的程式。
除了删除那一行,還有一種簡單的做法是,送出前将這一行前加上注釋符"//",效果是一樣的。
還有用條件編譯處理的方法,暫不講了。
==================== 迂者 賀利堅 csdn部落格專欄=================
======== 為it菜鳥起飛鋪跑道,和學生一起享受快樂和激情的大學 =======