天天看點

C02-程式設計基礎提高班(C++)第14周上機任務-檔案操作

第14周:閱讀教材第13章(p417-458),主要内容是輸入輸出,重點是檔案的操作,完成第14周上機任務;

【任務1】漲工資

從檔案salary.txt中讀入500名勞工的工資,全部增加100元後進行排序,将排序後的結果在螢幕上輸出,并儲存到檔案ordered_salary.txt中。

【任務2】學生成績排序

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

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

(2)讀入這名學生的成績,用對象數組進行存儲。

(3)求出各科和總分的最高分。

(4)請按總分的降序(高成績在前,低成績在後)排序

(5)在螢幕上顯示各科及總分的最高分,排序後的成績單(包括總分)儲存到檔案odered_score.dat中。

【任務3】電子詞典

做一個簡單的電子詞典。在檔案dictionary.txt中,儲存的是英漢對照的一個詞典,詞彙量近8000個,英文、中文釋義與詞性間用’\t’隔開。建一個表示詞條的類word,word類的一個對象可以描述一個詞,類對象數組可以存儲詞庫。将檔案中的内容讀到對象數組中,由使用者輸入英文詞,顯示中文釋義。

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

拓展1:允許使用者運作程式後,連續地查詞典,直到輸入”0000”結束。

拓展2:試着做一個視窗版的電子詞典。

拓展3:使這個詞典,讀入一篇文章,輸出其中的所有名詞(或動詞,或全部實詞)。——搜尋引擎用類似的功能,用于篩去虛詞,因為并不是所有詞都值得索引。

【任務4】文檔的自動處理:要求編寫c++程式,讀wolfsheep.nls,去除其中所有的注釋,并儲存到檔案ws_nocomment.nls中。

netlogo(http://ccl.northwestern.edu/netlogo/)是一個用來對自然和社會現象進行仿真的可程式設計模組化環境。netlogo 特别适合對随時間演化的複雜系統進行模組化。模組化人員能夠向成百上千的獨立運作的“主體”(agent)發出指令,使探究微觀層面上的個體行為與宏觀模式之間的聯系成為可能。netlogo 有詳盡的文檔和教學材料。它還帶着一個模型庫,庫中包含許多已經寫好的仿真模型,可以直接使用也可修改。這些仿真模型覆寫自然和社會科學的許多領域,包括生物和醫學,實體和化學,數學和計算機科學,以及經濟學和社會心理學等。

netlogo是我近年來科研工作常用的一個仿真平台,建議同學們不妨有時間玩一玩。本任務不是要讓同學們用netlogo程式設計,而是用c++程式設計去處理netlogo源程式。

在netlogo中,代碼的注釋以分号開始。例如,檔案wolfsheep.nls中是一個模拟生态系統中狼、羊、草地保持生态平衡的一部分代碼,其中,每一行分号之後的文字全是注釋。

要次明确要求:編寫c++程式,讀wolfsheep.nls,去除其中所有的注釋,并儲存到檔案ws_nocomment.nls中。

例如,wolfsheep.nls中下面的一段代碼:

ask patches [ set pcolor green ]

; check grass? switch.

; if it is true, then grass grows and the sheep eat it. else, then the sheep don't need to eat

if grass? [

  ask patches [

    set countdown random grass-regrowth-time ; initialize grass grow clocks randomly

    set pcolor one-of [green brown]

  ]

]

經過處理後,在ws_nocomment.nls中,上面劃線部分的注釋将全部不存在。

提示1:任務的另一種直白的解讀是:讀入每一行,複制每一行分号前面的部分。或者說,讀入每一行,逐個複制檔案中的字元,如果出現分号,分号及其後的文字将不再複制。

提示2:任務0中的某些程式可供參考,它們做了本題中的部分工作。

任務的最低要求:去除注釋,如果注釋單獨占一行,保留白行;

任務的較高要求:當注釋單獨占一行時,去除注釋後,空行将不再保留。注釋單獨占一行,即本行在分号之前,除了空格與tab(即’\t’)外,不出現其他任何符号。

任務的最高要求:見拓展三,消除出現這種bug的可能。

任務4拓展提示:

這部分的思路和體會可以用于一切由計算機自動處理文檔的場所合。想想目前網際網路的熱潮,包括搜尋引擎、自然語言處理,甚至語音識别等,都要涉及到對文本的處理。

這部分拓展利用對源代碼的處理進一步做些體驗,讓計算機自動處理源代碼也是業内的一個重要領域(想想你送出一個c++程式,編譯系統能為你檢查文法錯誤,能将c++代碼轉換為計算機能夠識别和執行的機器代碼——将來學習到《編譯系統》有關的知識時,千萬别說沒用和枯燥)。要處理的c++源程式請自己準備。

拓展一:讀入一個c++程式,将其單行的注釋(即 每一行“//”後面的内容)删除後儲存;

拓展二:寫一個程式,它能“剝”去c++源程式中的所有注釋(包括//形式和/*...*/形式的)。

拓展三:修正上面所有程式中的一個bug。如果字元串中包含表示注釋的符号,如netlogo程式中的字元串”this is a comment; that not”,c++程式中的字元串”words after // is comment.”,按照前面的處理會釀成大禍:将分号或//及其後面的符号全部删除後,表示字元串結束的雙引号将不存在,破壞了字元串的完整性,同時程式将無法通過編譯。

拓展四:基于上面的任一個程式,要處理的檔案名和儲存後的檔案名由使用者輸入,并完成處理。

拓展五:跳出殺戮源代碼中注釋的行為,為程式的每一行後面都加上“//”,以友善程式員精心注釋(練練而已,要每行代碼後都寫注釋,勤奮過頭了)。

拓展六:簡單處理一般的文本。某些作者在寫作中,無意中會在行首加入個數不定的各種非法符号,如多個空格、tab符号、#、$等等。現在規定每一行必須以字母開頭,請程式設計式讓計算機自動整理這些不規矩的文本。提示:你要先做這麼一個不規矩的文本。更高要求:規矩的文本每行前要有兩個空格。

【任務5】學生成績處理:儲存為二進制檔案

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

(2)讀入學生的成績,并求出總分,用對象數組進行存儲。

(3)将所有資料儲存到一個二進制檔案binary_score.dat中,最後在檔案中寫入你自己的各科成績(咱不謙虛,也求個好運,全100分)。

(4)為驗證輸出檔案正确,再将binary_score.dat中的記錄逐一讀出到學生對象中并輸出檢視。

所用檔案上傳csdn資源在遭删除,需要者私信告知email,單獨寄送。

  

繼續閱讀