




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、摘要本課題的主要任務(wù)是開(kāi)發(fā)一款代碼行數(shù)統(tǒng)計(jì)器,專門(mén)用于統(tǒng)計(jì)C語(yǔ)言或C+語(yǔ)言程序代碼文件。該統(tǒng)計(jì)器的主要功能是統(tǒng)計(jì)代碼文件的文件行數(shù)、有效代碼行數(shù)、注釋行數(shù)、空白行數(shù),以及計(jì)算代碼的注釋率。和那些只能統(tǒng)計(jì)單個(gè)文件的統(tǒng)計(jì)器不同,這款統(tǒng)計(jì)器能夠接受文件夾路徑,批量統(tǒng)計(jì)整個(gè)文件夾的所有文件,包括子文件夾中的有效文件。這樣可以大大的提高統(tǒng)計(jì)效率,節(jié)約用戶的時(shí)間,使編程人員能集中更多精力編寫(xiě)程序。該統(tǒng)計(jì)器在測(cè)試時(shí)統(tǒng)計(jì)了大量的文件,基本上沒(méi)有錯(cuò)誤,精度相當(dāng)高,用戶可安全使用。本課題所用的編譯環(huán)境是C-free5,最終結(jié)果exe可執(zhí)行文件。精選范本1章緒論.0.第2章需求分析1.2.1 可行性分析1.2.2
2、整體功能1.第3章關(guān)鍵技術(shù)2.3.1 文件操作23.1.1 文件的打開(kāi)與讀取23.1.2 遍歷文件夾23.2 變量處理33.3 錯(cuò)誤識(shí)別與防范33.3.1 內(nèi)存錯(cuò)誤33.3.2 用戶輸入有誤3第4章概要設(shè)計(jì)4.4.1.1 路徑判斷44.1.2 遍歷文件54.1.3 字符判斷64.1.4 信息統(tǒng)計(jì)輸出7第5章詳細(xì)設(shè)計(jì)95.1 文件類型判斷95.2 遍歷文件夾95.3 文件字符的判斷和變量處理1.05.3.1 定義變量1.05.3.2 注釋標(biāo)記1.15.3.3 Space和tab1.15.3.4 轉(zhuǎn)義字符1.15.3.5 其他字符1.2第6章設(shè)計(jì)結(jié)果和使用說(shuō)明136.1 程序運(yùn)行界面1.36.2
3、使用說(shuō)明1.4第7章總結(jié)16致謝17參考文獻(xiàn)1819附錄A第1章緒論隨著計(jì)算機(jī)技術(shù)的發(fā)展與普及,越來(lái)越多的人開(kāi)始學(xué)習(xí)編程技術(shù)。而C語(yǔ)言是在國(guó)內(nèi)外廣泛使用的一種計(jì)算機(jī)語(yǔ)言,它憑借自己功能豐富、使用靈活、可移植性強(qiáng)等優(yōu)點(diǎn),不僅為計(jì)算機(jī)專業(yè)工作者所使用,還博得了廣大計(jì)算機(jī)應(yīng)用人員以及計(jì)算機(jī)愛(ài)好者的青睞。但在項(xiàng)目開(kāi)發(fā)的時(shí)候,項(xiàng)目負(fù)責(zé)人經(jīng)常需要審查代碼、統(tǒng)計(jì)各種相關(guān)信息(如:代碼總行數(shù)、注釋行數(shù)、注釋率等),其中項(xiàng)目的源代碼行數(shù)和注釋率是非常重要的項(xiàng)目健康度指標(biāo),一般來(lái)說(shuō),比較理想的注釋率在20%30%,這樣的代碼比較容易維護(hù)。因此,為了減少編程人員的工作量,提高工作效率,就需要設(shè)計(jì)一種專門(mén)的軟件來(lái)替代
4、項(xiàng)目開(kāi)發(fā)人員統(tǒng)計(jì)代碼行數(shù)以及注釋行數(shù)等相關(guān)信息。這款C語(yǔ)言代碼統(tǒng)計(jì)器能夠接收用戶輸入的文件夾路徑,批量統(tǒng)計(jì)整個(gè)文件夾的所有文件,更大程度地提高了項(xiàng)目開(kāi)發(fā)人員的工作效率。第2章需求分析2.1 可行性分析前面已經(jīng)說(shuō)過(guò),現(xiàn)在使用計(jì)算機(jī)編程的人已經(jīng)越來(lái)越多了,其中使用C語(yǔ)言或C+語(yǔ)言編程的更是占了很大的比列。由于C語(yǔ)言的編寫(xiě)工程很大,但有時(shí)卻需要統(tǒng)計(jì)一些其中的有關(guān)信息。如果用人工統(tǒng)計(jì)的話,既浪費(fèi)時(shí)間,也浪費(fèi)編程人員的精力,降低工作效率。所以現(xiàn)在對(duì)一些輔助型的軟件需求量特別大。面對(duì)這樣的現(xiàn)狀,這款C&C+代碼統(tǒng)計(jì)器應(yīng)運(yùn)而生。它能夠彌補(bǔ)人力的不足,大大地提高了人們的工作效率,使程序員能集中精力編寫(xiě)更多有用
5、的程序。另一方面,這個(gè)代碼統(tǒng)計(jì)器占用空間很小,電腦的要求很低并且很便攜,更能使大多數(shù)人接受,而且使用簡(jiǎn)單,更便于推廣??傮w來(lái)說(shuō),這款代碼統(tǒng)計(jì)器滿足了當(dāng)前大多數(shù)編程人員的部分需求,并且憑借著它獨(dú)自的特點(diǎn)使大多數(shù)人能夠接受。2.2 整體功能這款C&C+代碼統(tǒng)計(jì)器是用純C編寫(xiě)的控制臺(tái)程序,它既能單獨(dú)地夠統(tǒng)計(jì)單個(gè)文件,還能批量統(tǒng)計(jì)整個(gè)文件夾中所有文件,這也是前面說(shuō)的提高效率的關(guān)鍵地方。主要統(tǒng)計(jì)的項(xiàng)目有:文件總數(shù)、代碼總行數(shù)、有效代碼總行數(shù)、注釋行數(shù)、空白行數(shù)以及注釋率等,由此看出,該統(tǒng)計(jì)器不僅可以用在它的本職工作(統(tǒng)計(jì)代碼行數(shù)),還能用來(lái)統(tǒng)計(jì)一個(gè)文件夾中的所有文件個(gè)數(shù)。除了以上功能,該統(tǒng)計(jì)器還有以下優(yōu)
6、點(diǎn):操作簡(jiǎn)單,用戶既可以手動(dòng)輸入所需統(tǒng)計(jì)的文件或文件夾路徑,也可以直接將文件或文件夾拖入特定區(qū)域進(jìn)行統(tǒng)計(jì),方便快捷。由于該代碼統(tǒng)計(jì)器是在DOS下運(yùn)行的控制臺(tái)程序,所以運(yùn)行速度比Windows程序要快很多,這也彌補(bǔ)了它在界面上的劣勢(shì)。第3章關(guān)鍵技術(shù)3.1 文件操作前面已經(jīng)說(shuō)到,文件操作很重要,特別是文件夾的遍歷問(wèn)題。3.1.1 文件的打開(kāi)與讀取在C標(biāo)準(zhǔn)庫(kù)函數(shù)中,頭文件下包含了各種輸入輸出函數(shù),其中就包括了實(shí)現(xiàn)文件操作的一系列函數(shù):FILE*fopen(charfilename,char*mode):以指定的方式打開(kāi)一個(gè)文件。在該代碼統(tǒng)計(jì)器的程序中,是以只讀(r)方式打開(kāi)一個(gè)文件的。為什么選只讀呢
7、?因?yàn)橐灾蛔x方式打開(kāi)的文件,無(wú)論是否有其他程序在使用它,都不會(huì)影響到對(duì)它的統(tǒng)計(jì),這樣使用起來(lái)也是更加的方便。intfgetc(FILE*fp):從文件中當(dāng)前位置讀一個(gè)字符。由于該程序中需要連續(xù)讀取兩個(gè)字符,而這個(gè)函數(shù)在讀取時(shí)會(huì)自動(dòng)移動(dòng)文件內(nèi)部指針,所以必須采取特殊措施才能實(shí)現(xiàn)連續(xù)讀取。該程序是將文件打開(kāi)兩次,兩個(gè)指針一前一后交替讀取字符,從而達(dá)到連續(xù)讀取的目的。intfclose(void):關(guān)閉所有已打開(kāi)的文件。文件打開(kāi)之后一定要關(guān)閉,否則將會(huì)使數(shù)據(jù)丟失。3.1.2 遍歷文件夾在頭文件io.h中,定義了一個(gè)結(jié)構(gòu)體:struct_finddata_tunsignedattrib;time_tt
8、ime_create;time_ttime_access;time_ttime_write;_fsize_tsize;charname260;;并且定義函數(shù)long_cdecl_findfirst(constchar*,struct_finddata_t*),利用該函數(shù),能夠?qū)σ粋€(gè)文件夾路徑進(jìn)行檢索,返回所給文件夾路徑的子文件或子文件夾指針。從而,我們就可以從這個(gè)返回的結(jié)構(gòu)體指針中獲取文件夾子目錄的全部相關(guān)信息,例如:文件或文件夾名、文件類型、文件大小以及更改日期等得知這些信息之后,我們只需要對(duì)不同類型的文件分別進(jìn)行處理,就能實(shí)現(xiàn)對(duì)整個(gè)目錄的遍歷。這個(gè)程序是采用遞歸算法,如果所給文件夾的子目錄
9、是文件,則直接統(tǒng)計(jì);如果所給文件夾的子目錄是文件夾,則將對(duì)子文件夾的路徑繼續(xù)調(diào)用該函數(shù),直至沒(méi)有子文件夾為止。3.2 變量處理由于要統(tǒng)計(jì)代碼源文件中的文件行數(shù)、代碼函數(shù)、注釋行數(shù)、空白行數(shù)等信息,則需要使用多個(gè)變量來(lái)分別統(tǒng)計(jì)各種信息。并且,有些變量不只在一個(gè)函數(shù)中使用,有些變量在遞歸時(shí)不能改變它的值。為此,在該統(tǒng)計(jì)器的程序設(shè)計(jì)中,一共使用了五個(gè)全局變量、九個(gè)靜態(tài)變量。其中,五個(gè)全局變量分別統(tǒng)計(jì)用戶輸入的文件夾中的文件總數(shù)、總代碼行數(shù)、總有效代碼行數(shù)、總注釋行數(shù)、總空白行數(shù);九個(gè)靜態(tài)變量位于字符判斷的模塊,分別用來(lái)統(tǒng)計(jì)單個(gè)文件的代碼行數(shù)、有效代碼行數(shù)、注釋行數(shù)、注釋率,以及用來(lái)標(biāo)記字符是否在注釋
10、中、是否在字符串中、該行是否有注釋、是否有代碼等。這樣做減少了函數(shù)之間值的地址的傳遞,出錯(cuò)也就更少,安全性也就越高。3.3 錯(cuò)誤識(shí)別與防范3.3.1 內(nèi)存錯(cuò)誤C語(yǔ)言中,指針一直都是最容易出錯(cuò)的地方。為了防止指針出錯(cuò),本程序在關(guān)鍵處使用了C標(biāo)準(zhǔn)庫(kù)函數(shù)中,assert.h頭文件下voidassert(intexp)這個(gè)函數(shù),它是用于表達(dá)式結(jié)果的正確性測(cè)試并且當(dāng)表達(dá)式結(jié)果為假時(shí)使程序終止。本程序總共在三個(gè)地方使用到了它:1、 在接受用戶所輸入的文件(夾)路徑,將該路徑傳遞給一個(gè)數(shù)組時(shí),用于判斷數(shù)組下標(biāo)是否越界。2、 在遞歸遍歷文件夾時(shí),函數(shù)入口參數(shù)是一個(gè)指針變量,接受文件夾路徑。此處是用它來(lái)防止指針
11、為空的情況。3、 在判斷文件是否為C或C+代碼文件時(shí),和第二種情況差不多,也是用來(lái)防止接收的文件名指針為空。3.3.2 用戶輸入有誤為了讓用戶更好地使用軟件,就需要有很好的人機(jī)對(duì)話,當(dāng)用戶輸入錯(cuò)誤信息的時(shí)候,就應(yīng)該有所提示。這款軟件能識(shí)別用戶所輸入的參數(shù)是否為文件(夾)路徑,并且會(huì)給出相應(yīng)的語(yǔ)言提示。并且,當(dāng)用戶所輸入的文件或文件夾路徑不存在時(shí),也會(huì)給出相應(yīng)的提示或警告,從而不會(huì)出現(xiàn)統(tǒng)計(jì)對(duì)象出錯(cuò)等現(xiàn)象。第4章概要設(shè)計(jì)4.1.1路徑判斷為了高效統(tǒng)計(jì)用戶所需的代碼文件,就要求統(tǒng)計(jì)器能夠批量統(tǒng)計(jì)文件夾。因此,首要任務(wù)就是要識(shí)別用戶輸入的信息,看用戶所給的路徑名是文件還是文件夾,從而做出相應(yīng)的處理,該
12、部分流程圖如下:開(kāi)始全局變量:GiCountFileGiNoleGiCode()=_filcnamc|該路彳空是丈件火判斷完用戶所輸路徑后,就需要對(duì)其分開(kāi)處理。因?yàn)樵摯a統(tǒng)計(jì)器是專門(mén)用來(lái)統(tǒng)計(jì)C語(yǔ)言或C+語(yǔ)言的,所以當(dāng)接收路徑名為文件時(shí),就需要判斷該文件的種類,如果是C或C+程序代碼文件,則直接進(jìn)行統(tǒng)計(jì);否則報(bào)錯(cuò),提示用戶文件格式不正確。該部分流程圖如下:提取格式不F確一N4.1.2遍歷文件因?yàn)橐獙?shí)現(xiàn)批量處理文件,所以如果用戶輸入的是文件夾路徑,就需要對(duì)該文件中的所有文件進(jìn)行遍歷,包括子文件夾中的所有文件,再分別統(tǒng)計(jì)出各個(gè)文件的相關(guān)信息。文件遍歷是一個(gè)很關(guān)鍵的部分,遍歷是否完全關(guān)系到統(tǒng)計(jì)的精確度
13、,該統(tǒng)計(jì)器采用的是遞歸遍歷法,其流程如下:輸事當(dāng)告4.1.3 字符判斷如果說(shuō)文件遍歷很重要,那么對(duì)文件字符的判斷則是整個(gè)程序的核心部分。因?yàn)檫@部分直接關(guān)系到單個(gè)文件的統(tǒng)計(jì)是否正確。由于代碼中存在許多關(guān)鍵字符,如:7*,“*/”:“”等,這都需要兩個(gè)字符連續(xù)判斷,所以在讀取時(shí),需要從文件中連續(xù)讀取兩個(gè)字符。該部分還關(guān)系到了文件的打開(kāi)與讀取,以及文件有效性的判斷和從文件中讀取字符,大致流程如下:FILE岬】=NULL,fp2=NULL,*p=NULL;chareh,NexiCh;提小警3 ,文件不存在從該文件中讀取字符fgctc(p) = chigctc(p) = NcxtCh判斷字符V字符判斷又
14、分為幾大類:1、 注釋符:“/*”*/2、引號(hào):?jiǎn)我?hào)和雙引號(hào);3、空白:空格和制表符;4、轉(zhuǎn)義字符:如“”;5、換行符:回車鍵;6、其它一般字符。這些字符的判斷以及相應(yīng)的處理在后面會(huì)相對(duì)詳細(xì)的給出說(shuō)明,這里就不贅述。4.1.4 信息統(tǒng)計(jì)輸出字符判段以及相應(yīng)的處理后,就需要對(duì)文件行數(shù)、有效代碼行數(shù)、注釋率等一系列信息進(jìn)行統(tǒng)計(jì)并輸出,然后結(jié)束。大致流程如下:這就是該代碼統(tǒng)計(jì)器的設(shè)計(jì)思路,至于一些關(guān)鍵部分的處理,接下來(lái)會(huì)有詳細(xì)的說(shuō)明。第5章詳細(xì)設(shè)計(jì)該代碼統(tǒng)計(jì)器的關(guān)鍵部分有三個(gè):文件類型的判斷、文件夾的遍歷、文件字符的判斷和變量處理。5.1 文件類型判斷C和C+源代碼文件加起來(lái)一共有三類,分別是以.
15、C、.H、.CPP為后綴名,有了這個(gè)依據(jù),我們就能準(zhǔn)確地從一系列文件中找出我們所需要的這三種文件。在設(shè)計(jì)程序時(shí),為了避免有些文件對(duì)判斷的干擾(比如:文件名為*.c.txt這樣的文件),我們是從文件名末尾開(kāi)始判斷的。由于由函數(shù)接收來(lái)的文件名是正常次序的,因此需要另外設(shè)定函數(shù)將文件名字符串倒置,然后再依據(jù)文件名后綴來(lái)進(jìn)行判斷篩選。值得一提的是,文件命名時(shí)不區(qū)別字母大小寫(xiě),所以在判斷之前要做一下簡(jiǎn)單的處理,那就是把文件名字符串的字符全部轉(zhuǎn)換成小寫(xiě)或大寫(xiě),這樣就避免了同樣的事代碼寫(xiě)兩遍,顯得啰嗦復(fù)雜,不簡(jiǎn)明,使用函數(shù)為“stdio.h”頭文件下的strlwr()函數(shù)。具體的字符串倒置和判斷方法見(jiàn)附錄A
16、,代碼中的子函數(shù)intFileJudge(charconst*p)部分。單獨(dú)將此部分提出來(lái)用一個(gè)子函數(shù)實(shí)現(xiàn)的目的是:以后如果增加了對(duì)其它語(yǔ)言的程序代碼文件的統(tǒng)計(jì),只需在此模塊的文件類型的判斷語(yǔ)句上增加一種或幾種文件類型就行了,而不需要改動(dòng)整個(gè)程序5.2 遍歷文件夾前面已經(jīng)粗略提到過(guò)遍歷文件夾的方法,這里再做具體的說(shuō)明。前面講過(guò)在頭文件io.h中,定義了一個(gè)結(jié)構(gòu)體:struct_finddata_tUnsignedattrib;/*Attributes,seeconstantsabove.*/time_ttime_create;time_ttime_access;/*alwaysmidnight
17、localtime*/time_ttime_write;_fsize_tsize;charnameFILENAME_MAX;/*mayincludespaces.*/;并且定義了:int_cdecl_MINGW_NOTHROW_findfirst(constchar*,struct_finddata_t*);int_cdecl_MINGW_NOTHROW_findnext(long,struct_finddata_t*);int_cdecl_MINGW_NOTHROW_findclose(long)這三個(gè)函數(shù)。利用這三個(gè)函數(shù),就能夠?qū)崿F(xiàn)對(duì)一個(gè)文件夾路徑進(jìn)行檢索,并返回所給文件夾路徑的子文件或子
18、文件夾指針,并且關(guān)閉文件夾。從而,我們就可以從這個(gè)返回的結(jié)構(gòu)體指針中獲取文件夾子目錄的全部相關(guān)信息,例如:文件或文件夾名、文件類型、文件大小以及更改日期也就實(shí)現(xiàn)等。有了這些信息,我們就能準(zhǔn)確的對(duì)整個(gè)文件夾子目錄中的各個(gè)元素進(jìn)行判斷,了給定目錄下的文件遍歷了。具體實(shí)現(xiàn)的過(guò)程請(qǐng)參閱附錄A,代碼中子函數(shù)intTraverseFile(charconst*path)部分。正如代碼所示,該代碼統(tǒng)計(jì)器是采用遞歸算法來(lái)遍歷文件夾的,即如果用戶輸入的文件夾路徑下,有子文件夾,則再對(duì)該子文件夾調(diào)用上述函數(shù),直至某一子文件夾沒(méi)有子文件夾為止。這段代碼中出現(xiàn)的FileStatistic()函數(shù),是寫(xiě)代碼時(shí)自定義的用
19、來(lái)對(duì)單個(gè)文件進(jìn)行統(tǒng)計(jì)的子函數(shù),詳細(xì)定義請(qǐng)參閱附錄A中的相應(yīng)部分;MAX_PATH是宏定義的一個(gè)常數(shù),用于接收文件夾路徑,MAX_PATH的定義的值為1024;另外在文件類型判斷處還出現(xiàn)了_A_SUBDIR、_A_ARCH等參數(shù),這是在頭文件中已經(jīng)宏定義好的文件的類型,具體定義如下:#define_A_NORMAL0x00/*Normalfile-Noread/writerestrictions*/#define_A_RDONLY0x01/*Readonlyfile*/#define_A_HIDDEN0x02/*Hiddenfile*/#define_A_SYSTEM0x04/*Systemfi
20、le*/#define_A_SUBDIR0x10/*Subdirectory*/#define_A_ARCH0x20/*Archivefile*/以上部分就是該代碼統(tǒng)計(jì)器十分關(guān)鍵的部分,如果不能實(shí)現(xiàn)該部分的功能,即就不能實(shí)現(xiàn)文件夾的遍歷,就不能對(duì)文件夾批量處理,程序的速度就不能提高。5.3 文件字符的判斷和變量處理這部分是整個(gè)項(xiàng)目程序的核心部分,該模塊基本上實(shí)現(xiàn)了對(duì)單個(gè)文件的統(tǒng)計(jì),所以內(nèi)容比較多,這里分開(kāi)來(lái)闡述。5.3.1 定義變量要想統(tǒng)計(jì)一個(gè)文件的代碼行數(shù)、注釋行數(shù)、空白行數(shù)、有效代碼行數(shù)等很多相關(guān)信息,一共涉及到了十一個(gè)靜態(tài)變量,它們必然要用許多變量來(lái)分開(kāi)處理。在該模塊程序設(shè)計(jì)中,分別如下
21、:intstaticiCountNote=0;/*統(tǒng)計(jì)注釋行數(shù)*/intstaticiCountCode=0;/*統(tǒng)計(jì)有效代碼行數(shù)*/intstaticiCountblank=0;/*統(tǒng)計(jì)空白行數(shù)*/intstaticiCountAll=0;/*統(tǒng)計(jì)代碼總行數(shù)*/intstaticiHaveCode=0;/*判斷該行是否有代碼*/intstaticiHaveNote=0;/*判斷該行是否有注釋*/intstaticiC_or_N2=0,iC_or_N=0;/*判斷字符是否在注釋中*/intstaticiQuotation_mark1=0,iQuotation_mark2=0;/*判斷字符是否在
22、引號(hào)中*/intstatici=1;各個(gè)變量的作用在上述代碼也有注釋,這里不再贅述。有必要說(shuō)明的是,這里全都定義成了靜態(tài)變量,這樣做的目的是在遞歸調(diào)用該函數(shù)時(shí),保持這些變量不改變,其作用相當(dāng)于全局變量。只不過(guò)和全局變量相比,它只用于定義它的函數(shù)函數(shù)本身,不能被其它函數(shù)使用,但它更加節(jié)約計(jì)算機(jī)內(nèi)存空間,也不容易出錯(cuò),函數(shù)可移植性也大大增強(qiáng)了。詳細(xì)使用見(jiàn)附錄A中相應(yīng)部分。5.3.2 注釋標(biāo)記在C和C+語(yǔ)言程序代碼中,一共有兩種注釋方式:/*.*/、/.”,既然要統(tǒng)計(jì)注釋行數(shù),則需要對(duì)這兩種特殊標(biāo)記作出相應(yīng)處理,該部分十分關(guān)鍵,它不僅是注釋標(biāo)記,同時(shí)也作為代碼的標(biāo)記,如果一個(gè)判斷錯(cuò)誤,就會(huì)導(dǎo)致整個(gè)結(jié)
23、果出錯(cuò),程序中該部分關(guān)鍵代碼如下:elseif(/=ch&*=NextCh&!iQuotation_mark1&!iQuotation_mark2&!iC_or_N2)if(iHaveNote=0)i=0;iC_or_N=1;iHaveNote=1;這里只說(shuō)明了/*/”的處理,“,同理。其中有兩個(gè)判斷處有iQuotation_mark1、iQuotation_mark2這兩個(gè)變量的判斷,其目的是為了避免出現(xiàn)以下情況:“fhsdjkgdfj/*gdfgf*/gfgdfgdfgsgf/”即在字符串中出現(xiàn)注釋標(biāo)記符。另外還有兩處出現(xiàn)如下語(yǔ)句:if(iHaveNote=0)i=0;這里設(shè)置i這個(gè)變量是
24、為了讓“”、/*”綁定在一起,具體實(shí)現(xiàn)方法是在i為0的時(shí)候不執(zhí)行任何語(yǔ)句,這樣該函數(shù)接收的兩個(gè)字符就會(huì)相當(dāng)于沒(méi)接收。這是為了避免7*/這樣的字符串,有了這個(gè)i的判斷后,就不會(huì)出現(xiàn)統(tǒng)計(jì)完“/*”馬上統(tǒng)計(jì)“*/”的情況,而是跳過(guò)“*/”統(tǒng)計(jì)下一對(duì)字符。5.3.3 Space和tab對(duì)于這兩個(gè)特殊的字符,在程序設(shè)計(jì)時(shí)不對(duì)它做任何處理,因?yàn)榭瞻准炔凰阕⑨?,也不算代碼,它是特殊的存在。5.3.4 轉(zhuǎn)義字符有幾個(gè)特殊的轉(zhuǎn)義字符:“”、“”、“”,這三個(gè)字符它們會(huì)互相干擾,比如在字符串中出現(xiàn)“”,就會(huì)導(dǎo)致字符串的邊界判斷出錯(cuò),所以把它們單獨(dú)列出來(lái)處理。再比如在引號(hào)中如果出現(xiàn)了“/*”字符,就不能算作注釋,這
25、些都要特殊考慮特殊處理。大致代碼如下:elseif(=ch&=NextCh&(iQuotation_mark1|iQuotation_mark2)/*排除轉(zhuǎn)義字符在字符串中的干擾*/i=0;elseif(=ch&=NextCh&(iQuotation_mark1|iQuotation_mark2)/*排除轉(zhuǎn)義字符在字符串中的干擾*/i=0;這里只說(shuō)了雙引號(hào)的處理,單引號(hào)同樣的處理,這里不再贅述。5.3.5其他字符換行符是統(tǒng)計(jì)行數(shù)的最終標(biāo)記,所有的行數(shù)統(tǒng)計(jì)基本都在這里進(jìn)行,它只是根據(jù)各個(gè)參數(shù)的數(shù)值,再來(lái)對(duì)統(tǒng)計(jì)的數(shù)據(jù)進(jìn)行自加。由于換一行之后,所有情況都是未知的,所以在換行符這里還要對(duì)各個(gè)數(shù)據(jù)進(jìn)行初
26、始化。剩余的字符有兩種處理:如果當(dāng)前不在代碼中(即iC_or_N=0&iC_or_N2=0),則這些字符算代碼;否則,這些字符算注釋。第6章設(shè)計(jì)結(jié)果和使用說(shuō)明6.1程序運(yùn)行界面開(kāi)始界面:E c: Docu*ent j and 5佇十七1大口44:1力:1/工:1大。八桌面-請(qǐng)輸入你要統(tǒng)計(jì)的文件路徑單個(gè)文件統(tǒng)計(jì)界面:文件夾統(tǒng)計(jì)界面:,輸入你要筑計(jì)的 DrMrecfr代碼124行有城代碼92行注釋30行室白18行江稀率24.1935文件D : xtestxtestl-c代有注空注i 率釋芻釋文件D : XleKLMBsl2XtesL6 _U-T-T -21代”114行IW行注眸率1S.78,S文件
27、D : XtestXtest2Jtest7ch圖是對(duì)文件夾中子文件夾的文件進(jìn)行統(tǒng)計(jì)C : Docu*crkt s and SettinsAdinistratorWlt55-上圖是輸出整個(gè)文件夾的整體信息6.2使用說(shuō)明該統(tǒng)計(jì)器由于是控制臺(tái)程序,所以操作十分簡(jiǎn)單。用戶可以按照提示在指定位置輸入需要統(tǒng)計(jì)的文件或文件夾路徑,然后鍵入回車鍵,則程序就會(huì)自動(dòng)運(yùn)行并輸出用戶所需信息;用戶還可以直接將需要統(tǒng)計(jì)的文件或文件夾拖入運(yùn)行界面中,再鍵入回車鍵,即可統(tǒng)計(jì)出相關(guān)信息。統(tǒng)計(jì)并顯示的數(shù)據(jù)分別是:1、單個(gè)文件:代碼行數(shù)、有效代碼行數(shù)、注釋行數(shù)、空白行數(shù)、注釋率;2、文件夾:除了該文件夾中所有文件的相關(guān)信息外,還
28、統(tǒng)計(jì)了文件夾中的文件總數(shù)、代碼總行數(shù)、有效代碼總行數(shù)、總注釋行數(shù)、總空白行數(shù)、還有總注釋率。用戶可以根據(jù)這些數(shù)據(jù)來(lái)審查自己的代碼以及項(xiàng)目的健康度指標(biāo)(注釋率)。第7章總結(jié)精選范本致謝參考文獻(xiàn)1譚浩強(qiáng)著C程序設(shè)計(jì)(第三版)清華清華出版社2美K.N.King,呂秀鋒譯C語(yǔ)言程序設(shè)計(jì)現(xiàn)代方法人民郵電出版社3C語(yǔ)言庫(kù)函數(shù)大全精選范本附錄A/*Functionname:CharJudge*Descriptions:判斷文件中的單個(gè)字符,并改變相關(guān)的變量*/*intCharJudgecharch,charNextCh,intk)intstaticiCountNote=0;/*統(tǒng)計(jì)注釋行數(shù)*/intstat
29、iciCountCode=0;/*統(tǒng)計(jì)有效代碼行數(shù)*/intstaticiCountblank=a/*統(tǒng)計(jì)空白行數(shù)*/intstaticiCountAll=a/*統(tǒng)計(jì)代碼總行數(shù)*/intstaticiHaveCode=0;/*判斷該行是否有代碼*/intstaticiHaveNote=0;/*判斷該行是否有注釋*/intstaticiC_or_N2=0,iC_or_N=0/*判斷字符是否在注釋中*/intstaticiQuotation_mark1=0,iQuotation_mark2=aintstatici=1;/*對(duì)各種字符作出判斷,并改變相關(guān)參數(shù)*/if(k=0)if(i=0)i=1;e
30、lseif(=ch|9=ch);/*對(duì)空格和tab符不做任何處理*/elseif(/=ch&*=NextCh&!iQuotation_mark1&!iQuotation_mark2&!iC_or_N2)if(iHaveNote=0)i=0;iC_or_N=1;iHaveNote=1;elseif(/=ch&/=NextCh&!iQuotation_mark1&!iQuotation_mark2&!iC_or_N)if(iHaveNote=0)i=0;iC_or_N2=1;iHaveNote=1;elseif(39=ch&!iQuotation_mark2)if(!iC_or_N&!iC_or_
31、N2)iQuotation_mark1=!iQuotation_mark1;elseif(=ch&=NextCh&(iQuotation_mark1|iQuotation_mark2)/*排除轉(zhuǎn)義字符在字符串中的干擾*/i=0;elseif(=ch&39=NextCh&(iQuotation_mark11|iQuotation_mark2)i=0;elseif(=ch&=NextCh&(iQuotation_mark1|iQuotation_mark2)/*排除轉(zhuǎn)義字符在字符串中的干擾*/i=0;elseif(=ch&!iQuotation_mark1)if(!iC_or_N&!iC_or_N
32、2)iQuotationmark2=!iQuotationmark2;iC_or_N)/* 以回車為標(biāo)記,進(jìn)行行數(shù)統(tǒng)計(jì)*/* 如果該行有注釋,注釋行加一*/* 如果該行有代碼,dt碼行加一*/* 若該行無(wú)注釋無(wú)代碼,空白行加一 */elseif(*=ch&/=NextCh&iC_or_N=0;iHaveNote=1;i=0;elseif(n=ch)if(iHaveNote)iCountNote+;if(iHaveCode)iCountCode+;if(!iHaveCode&!iHaveNote)iCountblank+;iHaveNote=0;iHaveCode=0;iC_or_N2=0;iC
33、ountAll+;elsif(!iC_or_N&!iC_or_N2)iHaveCode=1;elsiHaveNote=1;elseif(k=1)/*對(duì)統(tǒng)計(jì)數(shù)據(jù)的變量進(jìn)行初始化*/iCountNote=0;iCountCode=0;iCountblank=0;iCountAll=0;iHaveCode=0;iHaveNote=QiC_or_N2=0;iC_or_N=0;iQuotation_mark1=0;iQuotation_mark2=0;i=1;els/*根據(jù)k的值返回所需的變量值*/switch(k)case2returniCountAll;break;case3returniCountCode;break;case4returniCountNote;breakcase5returniCountblank;break;case6returniHaveNote;break;case7returniHaveCode;break;default:breakreturn1;/*Functionname:FileJudge*Descriptions:判斷待統(tǒng)計(jì)的文件是否為C語(yǔ)言代碼文件(后綴
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上半年安徽安慶市直事業(yè)單位招聘筆試易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安慶市市直事業(yè)單位招考易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧波經(jīng)理學(xué)院招考工作人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 【2025】年滁州市軌道交通運(yùn)營(yíng)有限公司社會(huì)招聘筆試考點(diǎn)考試試題及答案
- 2024福建福旅樂(lè)養(yǎng)健康科技有限公司福清分公司招聘1人筆試參考題庫(kù)附帶答案詳解
- 2025年鉆石彩寶合作協(xié)議書(shū)
- 2024福建省電子信息應(yīng)用技術(shù)研究院有限公司招聘2人筆試參考題庫(kù)附帶答案詳解
- 廣東省廉江市實(shí)驗(yàn)學(xué)校高中政治3.2樹(shù)立正確的消費(fèi)觀同步訓(xùn)練必修1
- 江蘇專用版2024高考語(yǔ)文二輪復(fù)習(xí)專題一文言文閱讀訓(xùn)練三翻譯文言句子教案
- 初中語(yǔ)文生活美文短信中的溫暖與智慧
- 裝配式建筑預(yù)制混凝土構(gòu)件連接方式全解課件
- 建筑消防性能化設(shè)計(jì)評(píng)估課件
- 二DNA的結(jié)構(gòu)和復(fù)制課件
- XX省血液調(diào)配管理辦法
- 科創(chuàng)板問(wèn)題測(cè)試題庫(kù)300題試題及答案
- 微信開(kāi)放平臺(tái)網(wǎng)站信息登記表
- 商業(yè)銀行員工輕微違規(guī)行為積分管理辦法
- JJG 700 -2016氣相色譜儀檢定規(guī)程-(高清現(xiàn)行)
- 壓力容器安全檢查表
- 供應(yīng)商反向評(píng)估表
- 曲線帶式輸送機(jī)的設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論