天天看點

2013級C++第15周(春)項目——輸入輸出流及檔案檔案操作

第一部分 閱讀程式(運作程式時,由上面的連結下載下傳源代碼)

1、閱讀教材例13.1到例13.7的程式,根據所用到的函數在功能上的限制,自己設計輸入的測試資料,運作程式。

(1)與自己的期望結果相對照,了解各個函數的用法;

(2)深入了解資料流類在設計時,為應用程式開發者提供的便利。

2、閱讀教材例13.11到例13.13的程式并運作程式。對每一個例題,重點關注下面的問題:

(1)本例對檔案進行了哪些操作,檔案采用了哪種打開方式?

(2)本例題中如何實作從檔案中輸入/向檔案輸出?用到了哪種運算符或函數? 

3、閱讀下面的兩段程式,說出程式的功能,并在上機時驗證(請自建a.txt)。

第二部分 實踐項目

【項目1-工資資料的輸入】

(1)輸入若幹職工的工資(1000-10000的數字),将這些數字按降序排序後輸出。請在下面程式基礎上開展工作。

輸入樣例:

3736.98 9169.35 5595.57 1006 6631.19 5917.13 6076.89 9692.97 9771.73^z

輸出樣例:

9771.73 9692.97 9169.35 6631.19 6076.89 5917.13 5595.57 3736.98 1006

提示:用上面的形式,可以輸入不确定個數的資料。用鍵盤輸入時,需要用^z作為結束。

(2)在軟體開發過程中,為了調試程式,常常需要多次運作程式。多次運作的輸入常相同,不免感到麻煩,尤其當資料量還偏多之時。人在做着毫無技術含量的事情!

  可以用的簡便方法是,用輸入重定向避免這種重複:請自建一個檔案a.txt,包含上面輸入樣例中的資料,在(1)的程式中,while之前加句freopen("a.txt","r",stdin);,return 0;之前加一句fclose(stdin);,然後運作程式……。要習慣用這種方式。

  提示1:oj快手們常用的做法是,開考之前,做一個程式模闆如下,這樣可以提高效率。這個技巧可以用于考試,隻要将輸入樣例中的輸入放入檔案即可不過送出時務必注意将freopen一行加上注釋。

  (3)在實際的應用中,資料并不是從鍵盤輸入。輸入重定向的方式也并非“正當”的管道。工程中的做法是将資料放入專門的檔案等待處理。

  下載下傳檔案salary.txt,其中有不超過500名職工的工資。程式設計式讀入這些職工的工資,将按降序排序後顯示并儲存到檔案ordered_salary.txt中。

【項目2-用檔案儲存的學生名單】

  檔案score.dat中儲存的是若幹名學生的姓名和c++課、高數和英語成績。

  (1)定義學生類,其中包含姓名、c++課、高數和英語成績及總分資料成員,成員函數根據需要确定。

  (2)用對象數組進行存儲學生的成績,讀入成績并計算總分;将總分高于平均總分且沒挂科的同學的資訊儲存到檔案pass_score.dat中。

  讨論:學生人數和總分的另外一種解決方法是用全局變量。但這兩種資訊與學生有關,是學生的“屬性”,成為學生類的資料成員合适;這兩種資訊由學生整體決定,用作靜态資料成員合适。檢視教材中的相關部分,複習如何進行處理。

【項目3-oop版電子詞典】

  做一個簡單的電子詞典。在檔案dictionary.txt中,儲存的是英漢對照的一個詞典,詞彙量近8000個,英文、中文釋義與詞性間用’\t’隔開。

  程式設計式,由使用者輸入英文詞,顯示詞性和中文釋義。

  提示1:如果要用oop完成這個詞典(當然也可以用oo方法實作),可以定義一個word類表示一個詞條,其中的資料成員string english; 表示英文單詞,string chinese;表示對應中文意思,string word_class;表示該詞的詞性;還可以定義一個dictionary類,用來表示詞典,其中word words[8000]成員表示詞典中的詞條,int wordsnum;表示詞典中的詞條數,在構造函數中從檔案讀入詞條,而專門增加一個成員函數用于查單詞。

  提示2:檔案中的詞彙已經排序,故在查找時,用二分查找法提高效率。

  提示3:這樣的項目,最好用多檔案的形式組織

  【項目3拓展1(選做)】使這個詞典,讀入一篇文章,輸出對其中的所詞的解釋。例如,對aboutcpp.txt,輸出如下左圖結果所示(也可以看到其中待改進的地方)。

  【項目3拓展2(選做)】試用wxwidgets做一個視窗版的電子詞典,如下右圖所示:

  

2013級C++第15周(春)項目——輸入輸出流及檔案檔案操作

【項目4-處理c++源代碼的程式】

  在codeblocks等ide中都提供了代碼格式整理的功能。完成這種功能的程式,操作的資料是用c++寫的源代碼檔案。c++源檔案是一種文本檔案,可以通過程式進行操作。

  內建開發環境(ide)對對程式進行編譯,操作的“資料”是源程式。編譯中,要對源程式進行詞法檢查和文法檢查,後續還要進行目标代碼生成、代碼優化等工作。相關的技術将在《編譯原理》課中學習。這些技術可以用在很多領域,當然也能夠讓我們對于程式設計語言有更深的了解。

  本項目将以c++源程式為操作對象,完成對源程式的一系列處理。各功能可以分别編制一個程式實作(建議用這種簡單的方案),也可以将其內建在一起(向着自己做出ide努力)。

  (1)讀入一個c++程式,判斷其中是否隻有一個main()函數,輸出“暫時沒有發現問題”,或者“沒有main()函數”,或者“不能定義多個main()函數”;

  提示1:簡單處理,可以隻比較判斷”main()”,考慮實際上的各種可能,main後面的括号中有任意多個空格及void的都應該算在内。建議按最簡單的情形處理。

  提示2:建議設計一個函數,将讀到的代碼與字元串”main()”進行比較。函數用于判斷s1是否“包含”在讀入的一行s2中,調用時,形參s1處的實參用”main()”即可,這樣寫提升了“抽象”級别,更容易實作,對應更高的代碼品質。

  (2)讀入一個c++程式,使程式中的所有左花括号“{”和右花括号“}”都單獨占一行,新程式儲存到另一個.cpp檔案中,并在螢幕上顯示處理過的程式,顯示時加上行号。

  (3)讀入一個c++程式,輸入m、n兩個數字,從第m行起的n行代碼将作為注釋使用(即在這些行前面加上”//”),新程式儲存到另一個.cpp檔案中,并在螢幕上顯示處理過的程式,顯示時加上行号。

  (4)(選做)讀入一個c++程式,将程式中的所有注釋(包括//形式和/*...*/形式的)删除,新程式儲存到另一個.cpp檔案中,并在螢幕上顯示處理過的程式,顯示時加上行号。

  (5)(選做)讀入一個c++程式,使程式中:(1)所有左花括号“{”和右花括号“}”都單獨占一行;(2)每個語句單獨占一行;(3)各行采用統一的縮格排放(每遇一個“{”,其下一行的程式,在第一個有意義的符号前的空格數增加4(也可以是增加一個’\t’),每遇一個“}”,其下一行的程式,在第一個有意義的符号前的空格數減少4(也可以是一個’\t’))。

  (6)(選做)基于(5),用wxwidgets設計界面,在對話框中選擇要處理的源檔案名,并指定目标檔案名後進行處理。如在下圖中點選按鈕“…”後,會利用“打開檔案對話框”(wxfiledialog)視窗選擇檔案。

2013級C++第15周(春)項目——輸入輸出流及檔案檔案操作

繼續閱讀