C語言代碼統(tǒng)計器_第1頁
C語言代碼統(tǒng)計器_第2頁
C語言代碼統(tǒng)計器_第3頁
C語言代碼統(tǒng)計器_第4頁
C語言代碼統(tǒng)計器_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、摘 要本課題的主要任務是開發(fā)一款代碼行數(shù)統(tǒng)計器,專門用于統(tǒng)計C語言或C+語言程序代碼文件。該統(tǒng)計器的主要功能是統(tǒng)計代碼文件的文件行數(shù)、有效代碼行數(shù)、注釋行數(shù)、空白行數(shù),以及計算代碼的注釋率。和那些只能統(tǒng)計單個文件的統(tǒng)計器不同,這款統(tǒng)計器能夠接受文件夾路徑,批量統(tǒng)計整個文件夾的所有文件,包括子文件夾中的有效文件。這樣可以大大的提高統(tǒng)計效率,節(jié)約用戶的時間,使編程人員能集中更多精力編寫程序。該統(tǒng)計器在測試時統(tǒng)計了大量的文件,基本上沒有錯誤,精度相當高,用戶可安全使用。本課題所用的編譯環(huán)境是C-free 5,最終結果exe可執(zhí)行文件。目 錄第1章 緒論1第2章 需求分析22.1可行性分析22.2整體

2、功能2第3章 關鍵技術33.1文件操作33.1.1文件的打開與讀取33.1.2遍歷文件夾33.2變量處理43.3錯誤識別與防范43.3.1內存錯誤43.3.2用戶輸入有誤4第4章 概要設計54.1.1路徑判斷54.1.2遍歷文件64.1.3字符判斷74.1.4信息統(tǒng)計輸出8第5章 詳細設計105.1文件類型判斷105.2遍歷文件夾105.3文件字符的判斷和變量處理115.3.1定義變量115.3.2注釋標記125.3.3Space和tab125.3.4轉義字符125.3.5其他字符13第6章 設計結果和使用說明146.1程序運行界面146.2使用說明15第7章 總結16致謝18參考文獻19附錄

3、A201第1章 緒論隨著計算機技術的發(fā)展與普及,越來越多的人開始學習編程技術。而C語言是在國內外廣泛使用的一種計算機語言,它憑借自己功能豐富、使用靈活、可移植性強等優(yōu)點,不僅為計算機專業(yè)工作者所使用,還博得了廣大計算機應用人員以及計算機愛好者的青睞。但在項目開發(fā)的時候,項目負責人經常需要審查代碼、統(tǒng)計各種相關信息(如:代碼總行數(shù)、注釋行數(shù)、注釋率等),其中項目的源代碼行數(shù)和注釋率是非常重要的項目健康度指標,一般來說,比較理想的注釋率在20%30%,這樣的代碼比較容易維護。因此,為了減少編程人員的工作量,提高工作效率,就需要設計一種專門的軟件來替代項目開發(fā)人員統(tǒng)計代碼行數(shù)以及注釋行數(shù)等相關信息。

4、這款C語言代碼統(tǒng)計器能夠接收用戶輸入的文件夾路徑,批量統(tǒng)計整個文件夾的所有文件,更大程度地提高了項目開發(fā)人員的工作效率。第2章 需求分析2.1 可行性分析前面已經說過,現(xiàn)在使用計算機編程的人已經越來越多了,其中使用C語言或C+語言編程的更是占了很大的比列。由于C語言的編寫工程很大,但有時卻需要統(tǒng)計一些其中的有關信息。如果用人工統(tǒng)計的話,既浪費時間,也浪費編程人員的精力,降低工作效率。所以現(xiàn)在對一些輔助型的軟件需求量特別大。面對這樣的現(xiàn)狀,這款C&C+代碼統(tǒng)計器應運而生。它能夠彌補人力的不足,大大地提高了人們的工作效率,使程序員能集中精力編寫更多有用的程序。另一方面,這個代碼統(tǒng)計器占用空

5、間很小,電腦的要求很低并且很便攜,更能使大多數(shù)人接受,而且使用簡單,更便于推廣??傮w來說,這款代碼統(tǒng)計器滿足了當前大多數(shù)編程人員的部分需求,并且憑借著它獨自的特點使大多數(shù)人能夠接受。2.2 整體功能這款C&C+代碼統(tǒng)計器是用純C編寫的控制臺程序,它既能單獨地夠統(tǒng)計單個文件,還能批量統(tǒng)計整個文件夾中所有文件,這也是前面說的提高效率的關鍵地方。主要統(tǒng)計的項目有:文件總數(shù)、代碼總行數(shù)、有效代碼總行數(shù)、注釋行數(shù)、空白行數(shù)以及注釋率等,由此看出,該統(tǒng)計器不僅可以用在它的本職工作(統(tǒng)計代碼行數(shù)),還能用來統(tǒng)計一個文件夾中的所有文件個數(shù)。除了以上功能,該統(tǒng)計器還有以下優(yōu)點:操作簡單,用戶既可以手動輸

6、入所需統(tǒng)計的文件或文件夾路徑,也可以直接將文件或文件夾拖入特定區(qū)域進行統(tǒng)計,方便快捷。由于該代碼統(tǒng)計器是在DOS下運行的控制臺程序,所以運行速度比Windows程序要快很多,這也彌補了它在界面上的劣勢。第3章 關鍵技術3.1 文件操作前面已經說到,文件操作很重要,特別是文件夾的遍歷問題。3.1.1 文件的打開與讀取在C標準庫函數(shù)中,頭文件<stdio.h>下包含了各種輸入輸出函數(shù),其中就包括了實現(xiàn)文件操作的一系列函數(shù):FILE *fopen(char *filename, char *mode) :以指定的方式打開一個文件。在該代碼統(tǒng)計器的程序中,是以只讀(r)方式打開一個文件的。

7、為什么選只讀呢?因為以只讀方式打開的文件,無論是否有其他程序在使用它,都不會影響到對它的統(tǒng)計,這樣使用起來也是更加的方便。int fgetc(FILE *fp) :從文件中當前位置讀一個字符。由于該程序中需要連續(xù)讀取兩個字符,而這個函數(shù)在讀取時會自動移動文件內部指針,所以必須采取特殊措施才能實現(xiàn)連續(xù)讀取。該程序是將文件打開兩次,兩個指針一前一后交替讀取字符,從而達到連續(xù)讀取的目的。int fclose(void) :關閉所有已打開的文件。文件打開之后一定要關閉,否則將會使數(shù)據丟失。3.1.2 遍歷文件夾 在頭文件< io.h>中,定義了一個結構體:struct _finddata_

8、t unsigned attrib; time_t time_create; time_t time_access; time_t time_write; _fsize_t size; char name260;并且定義函數(shù) long _cdecl _findfirst(const char *, struct _finddata_t *),利用該函數(shù),能夠對一個文件夾路徑進行檢索,返回所給文件夾路徑的子文件或子文件夾指針。從而,我們就可以從這個返回的結構體指針中獲取文件夾子目錄的全部相關信息,例如:文件或文件夾名、文件類型、文件大小以及更改日期等得知這些信息之后,我們只需要對不同類型的文件分

9、別進行處理,就能實現(xiàn)對整個目錄的遍歷。這個程序是采用遞歸算法,如果所給文件夾的子目錄是文件,則直接統(tǒng)計;如果所給文件夾的子目錄是文件夾,則將對子文件夾的路徑繼續(xù)調用該函數(shù),直至沒有子文件夾為止。3.2 變量處理由于要統(tǒng)計代碼源文件中的文件行數(shù)、代碼函數(shù)、注釋行數(shù)、空白行數(shù)等信息,則需要使用多個變量來分別統(tǒng)計各種信息。并且,有些變量不只在一個函數(shù)中使用,有些變量在遞歸時不能改變它的值。為此,在該統(tǒng)計器的程序設計中,一共使用了五個全局變量、九個靜態(tài)變量。其中,五個全局變量分別統(tǒng)計用戶輸入的文件夾中的文件總數(shù)、總代碼行數(shù)、總有效代碼行數(shù)、總注釋行數(shù)、總空白行數(shù);九個靜態(tài)變量位于字符判斷的模塊,分別用

10、來統(tǒng)計單個文件的代碼行數(shù)、有效代碼行數(shù)、注釋行數(shù)、注釋率,以及用來標記字符是否在注釋中、是否在字符串中、該行是否有注釋、是否有代碼等。這樣做減少了函數(shù)之間值的地址的傳遞,出錯也就更少,安全性也就越高。3.3 錯誤識別與防范3.3.1 內存錯誤C語言中,指針一直都是最容易出錯的地方。為了防止指針出錯,本程序在關鍵處使用了C標準庫函數(shù)中,<assert.h>頭文件下void assert(int exp) 這個函數(shù),它是用于表達式結果的正確性測試并且當表達式結果為假時使程序終止。本程序總共在三個地方使用到了它:1、 在接受用戶所輸入的文件(夾)路徑,將該路徑傳遞給一個數(shù)組時,用于判斷數(shù)

11、組下標是否越界。2、 在遞歸遍歷文件夾時,函數(shù)入口參數(shù)是一個指針變量,接受文件夾路徑。此處是用它來防止指針為空的情況。3、 在判斷文件是否為C或C+代碼文件時,和第二種情況差不多,也是用來防止接收的文件名指針為空。3.3.2 用戶輸入有誤為了讓用戶更好地使用軟件,就需要有很好的人機對話,當用戶輸入錯誤信息的時候,就應該有所提示。這款軟件能識別用戶所輸入的參數(shù)是否為文件(夾)路徑,并且會給出相應的語言提示。并且,當用戶所輸入的文件或文件夾路徑不存在時,也會給出相應的提示或警告,從而不會出現(xiàn)統(tǒng)計對象出錯等現(xiàn)象。第4章 概要設計4.1.1 路徑判斷為了高效統(tǒng)計用戶所需的代碼文件,就要求統(tǒng)計器能夠批量

12、統(tǒng)計文件夾。因此,首要任務就是要識別用戶輸入的信息,看用戶所給的路徑名是文件還是文件夾,從而做出相應的處理,該部分流程圖如下:判斷完用戶所輸路徑后,就需要對其分開處理。因為該代碼統(tǒng)計器是專門用來統(tǒng)計C語言或C+語言的,所以當接收路徑名為文件時,就需要判斷該文件的種類,如果是C或C+程序代碼文件,則直接進行統(tǒng)計;否則報錯,提示用戶文件格式不正確。該部分流程圖如下:4.1.2 遍歷文件因為要實現(xiàn)批量處理文件,所以如果用戶輸入的是文件夾路徑,就需要對該文件中的所有文件進行遍歷,包括子文件夾中的所有文件,再分別統(tǒng)計出各個文件的相關信息。文件遍歷是一個很關鍵的部分,遍歷是否完全關系到統(tǒng)計的精確度,該統(tǒng)計

13、器采用的是遞歸遍歷法,其流程如下:4.1.3 字符判斷如果說文件遍歷很重要,那么對文件字符的判斷則是整個程序的核心部分。因為這部分直接關系到單個文件的統(tǒng)計是否正確。由于代碼中存在許多關鍵字符,如:“/*”,“*/”,“/”等,這都需要兩個字符連續(xù)判斷,所以在讀取時,需要從文件中連續(xù)讀取兩個字符。該部分還關系到了文件的打開與讀取,以及文件有效性的判斷和從文件中讀取字符,大致流程如下:字符判斷又分為幾大類:1、 注釋符:“/*”、“*/”、“/”;2、 引號:單引號和雙引號;3、 空白:空格和制表符;4、 轉義字符:如“”;5、 換行符:回車鍵;6、 其它一般字符。這些字符的判斷以及相應的處理在后

14、面會相對詳細的給出說明,這里就不贅述。4.1.4 信息統(tǒng)計輸出字符判段以及相應的處理后,就需要對文件行數(shù)、有效代碼行數(shù)、注釋率等一系列信息進行統(tǒng)計并輸出,然后結束。大致流程如下:這就是該代碼統(tǒng)計器的設計思路,至于一些關鍵部分的處理,接下來會有詳細的說明。第5章 詳細設計該代碼統(tǒng)計器的關鍵部分有三個:文件類型的判斷、文件夾的遍歷、文件字符的判斷和變量處理。5.1 文件類型判斷C和C+源代碼文件加起來一共有三類,分別是以.C、.H、.CPP為后綴名,有了這個依據,我們就能準確地從一系列文件中找出我們所需要的這三種文件。在設計程序時,為了避免有些文件對判斷的干擾(比如:文件名為 *ctxt 這樣的文

15、件),我們是從文件名末尾開始判斷的。由于由函數(shù)接收來的文件名是正常次序的,因此需要另外設定函數(shù)將文件名字符串倒置,然后再依據文件名后綴來進行判斷篩選。值得一提的是,文件命名時不區(qū)別字母大小寫,所以在判斷之前要做一下簡單的處理,那就是把文件名字符串的字符全部轉換成小寫或大寫,這樣就避免了同樣的事代碼寫兩遍,顯得啰嗦復雜,不簡明,使用函數(shù)為“stdio.h”頭文件下的strlwr( )函數(shù)。具體的字符串倒置和判斷方法見附錄A,代碼中的子函數(shù)int FileJudge(char const *p)部分。單獨將此部分提出來用一個子函數(shù)實現(xiàn)的目的是:以后如果增加了對其它語言的程序代碼文件的統(tǒng)計,只需在此

16、模塊的文件類型的判斷語句上增加一種或幾種文件類型就行了,而不需要改動整個程序5.2 遍歷文件夾前面已經粗略提到過遍歷文件夾的方法,這里再做具體的說明。前面講過在頭文件< io.h>中,定義了一個結構體:struct _finddata_tUnsigned attrib; /* Attributes, see constants above. */time_ttime_create;time_ttime_access; /* always midnight local time */time_ttime_write;_fsize_t size;char nameFILENAME_MA

17、X; /* may include spaces. */;并且定義了:int _cdecl _MINGW_NOTHROW _findfirst(const char *, struct _finddata_t *);int _cdecl _MINGW_NOTHROW _findnext (long, struct _finddata_t*);int _cdecl _MINGW_NOTHROW _findclose (long) 這三個函數(shù)。利用這三個函數(shù),就能夠實現(xiàn)對一個文件夾路徑進行檢索,并返回所給文件夾路徑的子文件或子文件夾指針,并且關閉文件夾。從而,我們就可以從這個返回的結構體指針中獲取

18、文件夾子目錄的全部相關信息,例如:文件或文件夾名、文件類型、文件大小以及更改日期等。有了這些信息,我們就能準確的對整個文件夾子目錄中的各個元素進行判斷,也就實現(xiàn)了給定目錄下的文件遍歷了。具體實現(xiàn)的過程請參閱附錄A,代碼中子函數(shù)int TraverseFile (char const *path)部分。正如代碼所示,該代碼統(tǒng)計器是采用遞歸算法來遍歷文件夾的,即如果用戶輸入的文件夾路徑下,有子文件夾,則再對該子文件夾調用上述函數(shù),直至某一子文件夾沒有子文件夾為止。這段代碼中出現(xiàn)的 FileStatistic() 函數(shù),是寫代碼時自定義的用來對單個文件進行統(tǒng)計的子函數(shù),詳細定義請參閱附錄A中的相應部

19、分;MAX_PATH 是宏定義的一個常數(shù),用于接收文件夾路徑,MAX_PATH的定義的值為1024;另外在文件類型判斷處還出現(xiàn)了_A_SUBDIR、_A_ARCH等參數(shù),這是在頭文件中已經宏定義好的文件的類型,具體定義如下:#define _A_NORMAL 0x00 /* Normal file - No read/write restrictions */#define _A_RDONLY 0x01 /* Read only file */#define _A_HIDDEN 0x02 /* Hidden file */#define _A_SYSTEM 0x04 /* System fil

20、e */#define _A_SUBDIR 0x10 /* Subdirectory */#define _A_ARCH 0x20 /* Archive file */以上部分就是該代碼統(tǒng)計器十分關鍵的部分,如果不能實現(xiàn)該部分的功能,即就不能實現(xiàn)文件夾的遍歷,就不能對文件夾批量處理,程序的速度就不能提高。5.3 文件字符的判斷和變量處理這部分是整個項目程序的核心部分,該模塊基本上實現(xiàn)了對單個文件的統(tǒng)計,所以內容比較多,這里分開來闡述。5.3.1 定義變量要想統(tǒng)計一個文件的代碼行數(shù)、注釋行數(shù)、空白行數(shù)、有效代碼行數(shù)等很多相關信息,必然要用許多變量來分開處理。在該模塊程序設計中,一共涉及到了十一個

21、靜態(tài)變量,它們分別如下:int static iCountNote = 0; /*統(tǒng)計注釋行數(shù) */int static iCountCode = 0; /*統(tǒng)計有效代碼行數(shù) */int static iCountblank = 0; /*統(tǒng)計空白行數(shù) */int static iCountAll = 0; /*統(tǒng)計代碼總行數(shù) */int static iHaveCode = 0; /*判斷該行是否有代碼 */int static iHaveNote = 0; /*判斷該行是否有注釋*/ int static iC_or_N2 = 0, iC_or_N = 0; /* 判斷字符是否在注釋中 *

22、/int static iQuotation_mark1 = 0, iQuotation_mark2 = 0; /*判斷字符是否在引號中 */int static i = 1;各個變量的作用在上述代碼也有注釋,這里不再贅述。有必要說明的是,這里全都定義成了靜態(tài)變量,這樣做的目的是在遞歸調用該函數(shù)時,保持這些變量不改變,其作用相當于全局變量。只不過和全局變量相比,它只用于定義它的函數(shù)函數(shù)本身,不能被其它函數(shù)使用,但它更加節(jié)約計算機內存空間,也不容易出錯,函數(shù)可移植性也大大增強了。詳細使用見附錄A中相應部分。5.3.2 注釋標記在C和C+語言程序代碼中,一共有兩種注釋方式:“/*.*/”、“/.”

23、,既然要統(tǒng)計注釋行數(shù),則需要對這兩種特殊標記作出相應處理,該部分十分關鍵,它不僅是注釋標記,同時也作為代碼的標記,如果一個判斷錯誤,就會導致整個結果出錯,程序中該部分關鍵代碼如下:else if ('/' = ch && '*' = NextCh && !iQuotation_mark1 && !iQuotation_mark2 && !iC_or_N2 ) if (iHaveNote = 0) i = 0; iC_or_N = 1; iHaveNote = 1; 這里只說明了“/*/”的處理,“/

24、.”同理。其中有兩個判斷處有iQuotation_mark1、iQuotation_mark2這兩個變量的判斷,其目的是為了避免出現(xiàn)以下情況:“fhsdjkgdfj /* gdfgf */ gfgdfgdfgsgf / ” 即在字符串中出現(xiàn)注釋標記符。另外還有兩處出現(xiàn)如下語句:if (iHaveNote = 0) i = 0; 這里設置i這個變量是為了讓“/”、“/*”綁定在一起,具體實現(xiàn)方法是在i為0的時候不執(zhí)行任何語句,這樣該函數(shù)接收的兩個字符就會相當于沒接收。這是為了避免“/*/”這樣的字符串,有了這個i的判斷后,就不會出現(xiàn)統(tǒng)計完“/*”馬上統(tǒng)計“*/”的情況,而是跳過“*/”統(tǒng)計下一對

25、字符。5.3.3 Space和tab對于這兩個特殊的字符,在程序設計時不對它做任何處理,因為空白既不算注釋,也不算代碼,它是特殊的存在。5.3.4 轉義字符有幾個特殊的轉義字符:“”、“”、“”,這三個字符它們會互相干擾,比如在字符串中出現(xiàn)“” ,就會導致字符串的邊界判斷出錯,所以把它們單獨列出來處理。再比如在引號中如果出現(xiàn)了“/*”字符,就不能算作注釋,這些都要特殊考慮特殊處理。大致代碼如下:else if ('' = ch && '"' = NextCh && (iQuotation_mark1 | iQuotati

26、on_mark2) /* 排除轉義字符"在字符串中的干擾*/ i = 0;else if ('' = ch && '' = NextCh && (iQuotation_mark1 | iQuotation_mark2) /* 排除轉義字符在字符串中的干擾*/ i = 0;這里只說了雙引號的處理,單引號同樣的處理,這里不再贅述。5.3.5 其他字符換行符是統(tǒng)計行數(shù)的最終標記,所有的行數(shù)統(tǒng)計基本都在這里進行,它只是根據各個參數(shù)的數(shù)值,再來對統(tǒng)計的數(shù)據進行自加。由于換一行之后,所有情況都是未知的,所以在換行符這里還要對各個數(shù)據

27、進行初始化。剩余的字符有兩種處理:如果當前不在代碼中(即iC_or_N = 0 && iC_or_N2 = 0),則這些字符算代碼;否則,這些字符算注釋。第6章 設計結果和使用說明6.1 程序運行界面開始界面:單個文件統(tǒng)計界面:文件夾統(tǒng)計界面:上圖是對文件夾中子文件夾的文件進行統(tǒng)計上圖是輸出整個文件夾的整體信息6.2 使用說明該統(tǒng)計器由于是控制臺程序,所以操作十分簡單。用戶可以按照提示在指定位置輸入需要統(tǒng)計的文件或文件夾路徑,然后鍵入回車鍵,則程序就會自動運行并輸出用戶所需信息;用戶還可以直接將需要統(tǒng)計的文件或文件夾拖入運行界面中,再鍵入回車鍵,即可統(tǒng)計出相關信息。統(tǒng)計并顯示的

28、數(shù)據分別是:1、 單個文件:代碼行數(shù)、有效代碼行數(shù)、注釋行數(shù)、空白行數(shù)、注釋率;2、 文件夾:除了該文件夾中所有文件的相關信息外,還統(tǒng)計了文件夾中的文件總數(shù)、代碼總行數(shù)、有效代碼總行數(shù)、總注釋行數(shù)、總空白行數(shù)、還有總注釋率。用戶可以根據這些數(shù)據來審查自己的代碼以及項目的健康度指標(注釋率)。 第7章 總結致謝參考文獻1 譚浩強著 C程序設計(第三版)清華清華出版社2 美 K.N.King,呂秀鋒譯 C語言程序設計現(xiàn)代方法人民郵電出版社3 C語言庫函數(shù)大全附錄A/* Function name: CharJudge* Descriptions: 判斷文件中的單個字符,并改變相關的變量*/int

29、CharJudge(char ch, char NextCh, int k) int static iCountNote = 0; /* 統(tǒng)計注釋行數(shù) */ int static iCountCode = 0; /* 統(tǒng)計有效代碼行數(shù) */ int static iCountblank = 0; /* 統(tǒng)計空白行數(shù) */ int static iCountAll = 0; /* 統(tǒng)計代碼總行數(shù) */ int static iHaveCode = 0; /* 判斷該行是否有代碼 */ int static iHaveNote = 0; /* 判斷該行是否有注釋 */ int static iC_

30、or_N2 = 0, iC_or_N = 0; /* 判斷字符是否在注釋中 */ int static iQuotation_mark1 = 0, iQuotation_mark2 = 0; int static i = 1; /* * 對各種字符作出判斷 ,并改變相關參數(shù) */ if (k = 0) if (i = 0) i = 1; else if (' ' = ch | 9 = ch); /* 對空格和tab符不做任何處理 */ else if ('/' = ch && '*' = NextCh && !iQ

31、uotation_mark1 && !iQuotation_mark2 && !iC_or_N2 ) if (iHaveNote = 0) i = 0; iC_or_N = 1; iHaveNote = 1; else if ('/' = ch && '/' = NextCh && !iQuotation_mark1 && !iQuotation_mark2 && !iC_or_N ) if (iHaveNote = 0) i = 0; iC_or_N2 = 1; i

32、HaveNote = 1; else if (39 = ch && !iQuotation_mark2) if ( !iC_or_N && !iC_or_N2) iQuotation_mark1 = !iQuotation_mark1; else if ('' = ch && '"' = NextCh && (iQuotation_mark1 | iQuotation_mark2) /*排除轉義字符"在字符串中的干擾*/ i = 0; else if ('' =

33、ch && 39 = NextCh && (iQuotation_mark1 | iQuotation_mark2) i = 0; else if ('' = ch && '' = NextCh && (iQuotation_mark1 | iQuotation_mark2) /*排除轉義字符在字符串中的干擾*/ i = 0; else if ('"' = ch && !iQuotation_mark1) if ( !iC_or_N && !

34、iC_or_N2) iQuotation_mark2 = !iQuotation_mark2; else if ('*' = ch && '/' = NextCh && iC_or_N) iC_or_N = 0; iHaveNote = 1; i = 0; else if ('n' = ch) /* 以回車為標記,進行行數(shù)統(tǒng)計 */ if (iHaveNote) /* 如果該行有注釋,注釋行加一 */ iCountNote+; if (iHaveCode) /* 如果該行有代碼,代碼行加一 */ iCountCod

35、e+; if (!iHaveCode && !iHaveNote) /* 若該行無注釋無代碼,空白行加一*/ iCountblank+; iHaveNote = 0; iHaveCode = 0; iC_or_N2 = 0; iCountAll+; else if ( !iC_or_N && !iC_or_N2 ) iHaveCode = 1; else iHaveNote = 1; else if(k = 1) /* 對統(tǒng)計數(shù)據的變量進行初始化 */ iCountNote = 0; iCountCode = 0; iCountblank = 0; iCount

36、All = 0; iHaveCode = 0; iHaveNote = 0; iC_or_N2 = 0; iC_or_N = 0; iQuotation_mark1 = 0; iQuotation_mark2 = 0; i = 1; else /* 根據k的值返回所需的變量值 */ switch (k) case 2: return iCountAll; break; case 3: return iCountCode; break; case 4: return iCountNote; break; case 5: return iCountblank; break; case 6: ret

37、urn iHaveNote; break; case 7: return iHaveCode; break; default: break; return 1;/* Function name: FileJudge* Descriptions: 判斷待統(tǒng)計的文件是否為C語言代碼文件(后綴名為.c或.h.或cpp)*/int FileJudge(char const *p) char str255 = 0; int i = 0; strcpy(str, p); strlwr(str); /* 將文件名字符串轉化成小寫 */ i = strlen(str) - 1; if ( 'c' = stri && '.' = stri-1 ) return 1; else if ( 'p' = stri && 'p' = stri-1 && 'c' = stri-2 && '.' = stri-3 ) return 1; else if ( 'h' = stri && '.&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論