Word Count作业
Word Count作業(yè)
一.個人Gitee地址:https://gitee.com/Changyu-Guo
二.項目簡介
該項目主要是模擬Linux上面的wc命令,基本要求如下:
命令格式:
wc.exe [para] <filename> [para] <filename> ... -o <filename>
功能:
wc.exe -c file.c:返回文件file.c的字符數(shù)
wc.exe -w file.c:返回文件file.c的單詞總數(shù)
wc.exe -l file.c:返回文件file.c的總行數(shù)
wc.exe -o outputFile.txt:將結(jié)果輸出到指定文件
要求:
-o后面必須跟一個文件
-c -w -l可以同時出現(xiàn)
-c -w -l可以合并成 -wcl,即命令可以連寫
如果不指定輸出文件,則將結(jié)果默認保存在result.txt里面
三.PSP2.1表格
| Planning | 計劃 | 5 | 5 |
| · Estimate | · 估計這個任務(wù)需要多少時間 | 5 | 5 |
| Development | 開發(fā) | 340 | 635 |
| · Analysis | · 需求分析(包括學習新技術(shù)) | 20 | 30 |
| · Design Spec | · 生成設(shè)計文檔 | 30 | 30 |
| · Design Review | · 設(shè)計復審(和同事審核設(shè)計文檔) | 10 | 15 |
| · Coding Standard | · 代碼規(guī)范(為目前的開發(fā)制定合適的規(guī)范) | 5 | 5 |
| · Design | · 具體設(shè)計 | 15 | 20 |
| · Coding | · 具體編碼 | 200 | 400 |
| · Code Review | · 代碼復審 | 40 | 30 |
| · Test | · 測試(自我測試,修改代碼,提交修改) | 20 | 30 |
| Reporting | 報告 | 60 | 50 |
| · Test Report | · 測試報告 | 20 | 15 |
| · Size Measurement | · 計算工作量 | 10 | 5 |
| · Postmortem & Process improvement Plan | · 事后總結(jié),并提出過程改進計劃 | 30 | 30 |
| ? | 合計 | 405 | 690 |
四.解題思路
? 由于自己對C語言比較熟悉(主要是C語言編譯過后就是exe,其他語言還要打包,就直接用C語言寫了),因此選擇用C語言來實現(xiàn)這個項目。剛拿到題的時候仔細分析了一下,發(fā)現(xiàn)在功能上的要求不高,甚至不用校驗單詞的有效性,凡是以空格和逗號隔開的都算是單詞,因此第一次作業(yè)的難點應(yīng)該在于命令行參數(shù)的解析上面。
? 接下來我用C語言寫了一個簡單的demo,嘗試著梳理一下程序構(gòu)建思路,應(yīng)該如何設(shè)計,模塊怎樣劃分。demo中所有的功能都在main函數(shù)里面,沒有上傳到碼云。
寫好demo后,大致整理了一下解題思路:
1.程序執(zhí)行流程分析
? 根據(jù)項目的要求,該程序執(zhí)行的大體流程為:首先用戶執(zhí)行程序并附帶各種參數(shù),程序首先要分析處理各種選項,校驗選項的有效性,并將各種參數(shù)和對應(yīng)的文件聯(lián)系在一起,然后對不同的文件執(zhí)行該文件對用的各種操作,然后將最終的結(jié)果一并保存在輸出文件中。
2.數(shù)據(jù)結(jié)構(gòu)設(shè)計
? 根據(jù)對程序執(zhí)行流程的分析,由于不同的文件對應(yīng)著不同的操作,因此需要將文件名和其對應(yīng)的操作綁定在一起,由此想到了用結(jié)構(gòu)體保存一個文件的相關(guān)信息,然后使用鏈表將各個文件連起來。待命令處理完畢后,只需遍歷鏈表,即可對各個文件執(zhí)行相應(yīng)的操作。文件的結(jié)構(gòu)體如下:
// 命令結(jié)構(gòu)體 // 解析命令時存儲相關(guān)信息 struct Node {bool _c;bool _w;bool _l;bool _hasFile;char inFile[100];int row;int character;int words;struct Node *next; };?
3.模塊劃分
根據(jù)程序的執(zhí)行流程,可以將程序劃分為以下幾個模塊:
(1).主函數(shù)
主函數(shù)中主要是一些基本的處理和一些簡單的邏輯的處理,負責調(diào)用其他函數(shù)
(2).命令處理模塊
? 對于用戶輸入的命令的處理,有很多種辦法,其中最常用的就是遍歷數(shù)組,或者將輸入的命令編程字符串,然后解析字符串,我選擇的是將用戶輸入的各種選項和命令拼接成一個字符串,然后遍歷整個字符串,并做相應(yīng)的分析。
(3).統(tǒng)計模塊
? 統(tǒng)計模塊主要就是對每個文件做相應(yīng)的統(tǒng)計操作,包括對行數(shù)的統(tǒng)計,對單詞數(shù)的統(tǒng)計,對字符數(shù)的統(tǒng)計,每個功能寫在一個單獨的函數(shù)里面。統(tǒng)計完字符后順便將數(shù)據(jù)寫入文件。
五.關(guān)鍵代碼分析
1.命令處理函數(shù)
1 // 對用戶輸入的命令進行分析 2 // 傳入的用戶輸入的命令的字符串,中間用空格隔開 3 // 如果是-開頭的,則認為是選項 4 // 如果檢測到-o,就立即讀取后面緊跟的輸出文件 5 // 如果不是-開頭的,就認為是輸入文件 6 7 // 第二個參數(shù)是一串文件的頭結(jié)點 8 void analyseCommand(char commandStr[], struct Node *Head) 9 { 10 // 遍歷整個字符串 11 initFileNode(Head); 12 struct Node *cur; 13 cur = Head; 14 for (int i = 0;; i++) 15 { 16 // 讀出當前字符 17 char c = commandStr[i]; 18 // 如果遍歷到了\0,說明字符串結(jié)束,則退出函數(shù) 19 if (c == 0) 20 return; 21 // 如果c是-,則應(yīng)該是一個選項 22 if (c == '-') 23 { 24 i++; 25 // 讀取出-后面的字符,并做判斷 26 read: 27 c = commandStr[i]; 28 // 如果-后面是c,就將_c置為true 29 if (c == 'c') 30 { 31 cur->_c = true; 32 if (commandStr[++i] != ' ') 33 { 34 goto read; 35 } 36 continue; 37 } 38 // 如果-后面是w,就將_w置為true 39 else if (c == 'w') 40 { 41 cur->_w = true; 42 if (commandStr[++i] != ' ') 43 { 44 goto read; 45 } 46 continue; 47 } 48 // 如果-后面是l,就將_l置為true 49 else if (c == 'l') 50 { 51 cur->_l = true; 52 if (commandStr[++i] != ' ') 53 { 54 goto read; 55 } 56 continue; 57 } 58 // 如果-后面是o,則后面緊跟的一個參數(shù)一定是filePath 59 // 首先判斷后面是否有文件,如果有,就添加 60 // 如果沒有,就報錯 61 // 此時i的index是在選項上的 62 else if (c == 'o') 63 { 64 i += 2; // 將i移動到 65 char next = commandStr[i]; 66 if (next == '-' || next == '0') 67 { 68 printf("after -o must a para\n"); 69 exit(-1); 70 } 71 char path[100] = ""; // 用來存放輸出路徑 72 for (int j = 0;; j++) 73 { 74 // 讀取出命令中的文件名中的每一個字符 75 char ch = commandStr[i++]; 76 77 // 如果讀取到了0,就說明文件名讀取結(jié)束,就退出 78 if (ch == ' ') 79 { 80 break; 81 } 82 path[j] = ch; 83 } 84 memset(outFile, 0, sizeof(outFile)); 85 strcpy(outFile, path); 86 } 87 else 88 { 89 // 如果-后面什么都沒有,就判定為錯誤 90 printf("after - must a para\n"); 91 exit(-1); 92 } 93 } 94 else 95 { 96 // 如果不是-,則判定為輸入文件 97 // 此時i定位在輸入文件的第一個字符上 98 char path[100] = ""; 99 for (int j = 0;; j++) 100 { 101 char ch = commandStr[i++]; 102 if (ch == ' ') 103 { 104 break; 105 } 106 path[j] = ch; 107 } 108 strcpy(cur->inFile, path); 109 cur->_hasFile = true; 110 struct Node *fileNode; 111 fileNode = (struct Node *)malloc(sizeof(struct Node)); 112 initFileNode(fileNode); 113 cur->next = fileNode; 114 cur = fileNode; 115 i--; 116 } 117 } 118 // 檢測是否有輸入文件 119 // if (strlen(cur->inFile) == 0) 120 // { 121 // printf("you do not have input file"); 122 // exit(-1); 123 // } 124 }?
代碼分析:該函數(shù)是這次作業(yè)中最重要的一個函數(shù),因此單獨拿出來說一下。
要點說明:
1.使用for循環(huán)遍歷整個字符串
2.遇到-之后就認為是一個選項,就緊接著讀取他的后一個字符,如果是有效參數(shù),就記錄在當前文件的結(jié)構(gòu)體中,否則報錯
3.如果是-o,則認為后面緊跟著一個輸出文件,不做文件名有效性檢驗,不做權(quán)限檢查
4.如果是普通字符開頭,則認為是輸入文件,不做文件名有效性檢查,不做權(quán)限檢查
5.根據(jù)規(guī)則,輸出文件應(yīng)該放在該文件對應(yīng)參數(shù)的后面
6.遍歷完畢之后,就將相關(guān)數(shù)據(jù)都保存在了文件的結(jié)構(gòu)體中,并連接成了鏈表,返回后可進行后期相關(guān)操作。
六.測試設(shè)計
根據(jù)要求,根據(jù)如下條件設(shè)計測試:
是否有輸入
是否輸入-
-后是否有參數(shù)
是否統(tǒng)計行數(shù)
是否統(tǒng)計字符數(shù)
是否統(tǒng)計單詞數(shù)
是否支持命令連寫
是否支持多文件統(tǒng)計
是否有-o
-o后是否跟文件
根據(jù)以上條件,設(shè)計了如下批處理文件:
1 .\wc.exe 2 .\wc.exe - 3 .\wc.exe -l 4 .\wc.exe -c 5 .\wc.exe -w 6 .\wc.exe -lc 7 .\wc.exe -lw 8 .\wc.exe -cw 9 .\wc.exe -lcw 10 .\wc.exe -lcw -o 11 .\wc.exe -lcw -o res.txt 12 .\wc.exe -lcw file1.c 13 .\wc.exe -lcw file1.c -o 14 .\wc.exe -lcw file1.c -o res.txt 15 .\wc.exe -lcw file1.c file2.c -o res.txt 16 .\wc.exe -lcw file1.c -lcw file2.c -o res.txt 17 .\wc.exe -lcw file1.c -o -lcw file2.c -o res.txt 18 PAUSE?
測試結(jié)果如下:
文件輸出結(jié)果:
七.參考文獻
《構(gòu)建之法--現(xiàn)代軟件工程》 --鄒新 [第三版]
?
博客園把我的格式變成了這個樣子
(哇的一聲就哭出來了)
轉(zhuǎn)載于:https://www.cnblogs.com/guochangyu/p/9695176.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Word Count作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 极简Markdown程序员简历模板
- 下一篇: Fiddler的使用介绍及抓包分析(详解