天天看點

第16周-任務4-文檔的自動處理

【引子有些長】

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

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

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

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

  經過處理後,在ws_nocomment.nls中,以分号作為分隔符的注釋将全部不存在。即文檔變為:

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

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

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

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

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

【參考解答1】

【參考解答2】

【拓展提示】

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

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

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

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

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

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

  拓展五(選做):基于拓展四,做一個mfc程式,在對話框中選擇要處理的源檔案名,并指定目标檔案名後進行處理。如在圖1中點選按鈕“…”後,會利用圖2的視窗選擇檔案。(提示:請自行查找資料,學習有關mfc中關于通用對話框的内容。檔案對話框用的類是cfiledialog。通用對話框還包括顔色、字型、頁面設定、列印等對話框)。

第16周-任務4-文檔的自動處理

圖1

第16周-任務4-文檔的自動處理

圖2

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

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