第二篇博客 wordcount

 

一、首先 附上Github項目地址:https://github.com/June1104/WordCountjava

二、psp表格git

PSP2.1表格github

PSP2.1函數

PSP階段學習

預估耗時測試

(分鐘)編碼

實際耗時spa

(分鐘).net

Planning命令行

計劃

   

· Estimate

· 估計這個任務須要多少時間

 1000 1200 

Development

開發

   

· Analysis

· 需求分析 (包括學習新技術)

 100 150 

· Design Spec

· 生成設計文檔

 30  50

· Design Review

· 設計複審 (和同事審覈設計文檔)

 20  20

· Coding Standard

· 代碼規範 (爲目前的開發制定合適的規範)

 10  20

· Design

· 具體設計

 100  120

· Coding

· 具體編碼

 500  700

· Code Review

· 代碼複審

 50  60

· Test

· 測試(自我測試,修改代碼,提交修改)

 80  100

Reporting

報告

   

· Test Report

· 測試報告

 60 60 

· Size Measurement

· 計算工做量

 20  25

· Postmortem & Process Improvement Plan

· 過後總結, 並提出過程改進計劃

 20  20

 三、思路大概就是開始先想着代碼功能,總結一下功能就是讀取文件,而後得到文件的字符數,單詞數,行數,以及擴展功能讀取當前目錄和子目錄下的文件,而後再返回更復雜的數據(代碼行 / 空行 / 註釋行)等。由於本身對java語言徹底不熟悉,只是在大二學面向對象的時候應付做業用過,相對來講可能還c熟悉一點(但其實掌握的也很差),因此相比之下就選擇了c,但其實做業作起來仍是蠻吃力的,想要什麼做用,就要百度各類不一樣的函數,好比打開文件的fopen函數,好比在識別命令行時的字符串比較函數strcmp等等。說到識別命令,那又是在寫代碼時遇到的一個大問題,在cmd裏輸入的不一樣命令,怎麼與代碼鏈接起來呢。後來百度到了「主函數main中變量(int argc,char *argv[])的含義」,看懂這個知識點後感受開始有點上手,因而慢慢的弄懂了這個問題。而後說回來,在讀取字符數、單詞數這些問題上,先是本身想了,須要判斷什麼條件,而後在百度的幫助下,完善思路,能夠正確的運行獲取結果。

四、程序實現過程大概就是從各類百度中開始學習,開始上手。代碼主要分紅了三個部分,把不一樣的功能寫在了三個文件裏,分別是主函數main.c、獲取字符數單詞數行數的功能wc.c和獲取文件的代碼函數file.c。主函數裏引用wc.c和file.c,主函數的主要流程就是判斷cmd命令,而後讀取文件,再根據wc.c函數判斷不一樣條件,獲得結果。

五、代碼說明

a、在int main(int argc, char **argv)函數中,根據命令中的.c格式和.txt格式初步判斷是要獲取的文件仍是輸出結果到哪一個文件。argv[]指向命令行的參數,當遍歷到.c格式時,就把該參數賦值爲文件路徑,以遍接下來獲取;當遍歷到.txt格式時,就把該參數賦值爲文件名。不然,輸出error。

for(i = 1; i < argc; ++i)/*argc是命令行總的參數個數*/
    {
        p = argv[i];
        while(*++p != NULL);
        if(strcmp(p - 2, ".c") == 0)
        {
            path = argv[i];
            end  = i;
        }

        if(strcmp(p - 4, ".txt") == 0)
        {
            if(strcmp(argv[i - 1], "-o") == 0)
                filename = argv[i];
            else
            {
                printf("error.\n");
                return EXIT_FAILURE;
            }
        }
    }

b、在file.c文件中的讀取文件函數,返回buf首地址,fopen函數此時打開文件,形式爲只讀「r」。把文件裏讀到的內容放到緩衝中,最後返回緩衝首地址(此段功能的代碼爲網上搜索得到),在wc.c中用這個首地址++來判斷各類不一樣條件。

char *readfile(char *path)/*返回buf首地址 參數是文件路徑*/
{
    FILE *fp ;
    int len;
    char *buf;

    if ((fp = fopen(path, "r") )== NULL)
    {
        printf("open file %s error.\n", path);
        exit(0);
    }

    len = filelength(fp);
    buf = (char *) malloc (len);
    fread(buf, sizeof(char), len, fp);
    fclose(fp);
    *(buf + len - 1) = '\0';
    return buf;
}

c、wc.c代碼中的主要函數就是統計文件中的字符數,單詞數和行數

    這裏是基本判斷 

int isalpha(char a){
    if ((a <= 'z'&&a>='a') || (a<='Z'&&a>='A'))
        return 1;
    return 0;
}/*判斷是不是單詞*/
int isspace(char c){
    if ((' ' == c) || ('\n' == c) || ('\t' == c) ||
        (',' == c) || (';' == c) || (')' == c) ||
        ('(' == c) || ('{' == c) || ('}' == c))
        return 1;
    return 0;
}/*判斷是不是分隔符*/

下面是計算字符數,單詞數,行數的方法。以參數buf遍歷,指針加一,字符數就加一;當碰見換行符時,行數加一;當是單詞且經過一個間隔符後,單詞數加一。

 while( (c = *buf++) != '\0')
    {
        ++info->nc;
        if('\n' == c)
            ++info->nl;
        if(isspace(c))
            state = OUT;
        else if(isalpha(c) && OUT == state)
        {
            state = IN;
            ++info->nw;
        }
    }

六、測試設計過程,對不一樣的功能,分別進行不一樣的測試,而後進行組合命令再測試不一樣的功能。

a、測試用例設計以下

不一樣輸入

結果

wc.exe -c test.c 
 test.c, 字符數:1386
wc.exe -w test.c
 test.c, 單詞數:131
wc.exe -l test.c
 test.c, 行數:59
wc.exe -l -w test.c
test.c, 行數:59

test.c, 單詞數:131

wc.exe -c test.c -o res.txt
 
wc.exe -c -w -l test.c

test.c, 字符數:1386

test.c, 單詞數:131

test.c, 行數:59

 
wc.exe -c -w -l test.c -o resl.txt
 
 
wc.exe -c -w -l test1.c

test1.c, 字符數:111
test1.c, 單詞數:14
test1.c, 行數:12

 
wc.exe -c -w -l test1.c -o res2.txt
 
wc.exe -c test2.c 
 open file test2.c error.

(備註,同一目錄下放了test.c和test.c1文件,沒有test.c2文件)

b、測試腳本文件爲test.bat,腳本中測試內容有

start wc.exe wc.exe -l test.c
start wc.exe wc.exe -w test.c
start wc.exe wc.exe -c test.c
wc.exe -l -w test.c
wc.exe -c test.c -o output.txt
wc.exe -c -w -l test.c
wc.exe -c -w -l test.c -o outputl.txt
wc.exe -c -w -l test1.c
wc.exe -c -w -l test1.c -o output2.txt
wc.exe -c test2.c

在cmd中運行test.bat 結果爲:

文件目錄截圖

cmd截圖

輸出txt文件截圖:

 

七、參考文獻連接

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/

http://www.jb51.net/article/107168.htm

https://baike.baidu.com/item/c%E8%AF%AD%E8%A8%80fopen%E5%87%BD%E6%95%B0/1775995?fr=aladdin

https://baike.baidu.com/item/strcmp/5495571?fr=aladdin

相關文章
相關標籤/搜索