該項目主要是模擬Linux上面的wc命令,基本要求如下:
命令格式:
軟件工程第八版課后答案,
wc.exe [para] <filename> [para] <filename> ... -o <filename>
功能:
wc.exe -c file.c
:返回文件file.c的字符數軟件工程基礎第三版胡思康課后答案,
wc.exe -w file.c
:返回文件file.c的單詞總數
wc.exe -l file.c
:返回文件file.c的總行數
wc.exe -o outputFile.txt
:將結果輸出到指定文件
軟件工程大作業范例?要求:
-o
后面必須跟一個文件
-c -w -l
可以同時出現軟件工程第八版課后作業答案?
-c -w -l
可以合并成-wcl
,即命令可以連寫如果不指定輸出文件,則將結果默認保存在result.txt里面
PSP2.1 | PSP階段 | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 5 | 5 |
· Estimate | · 估計這個任務需要多少時間 | 5 | 5 |
Development | 開發 | 340 | 635 |
· Analysis | · 需求分析(包括學習新技術) | 20 | 30 |
· Design Spec | · 生成設計文檔 | 30 | 30 |
· Design Review | · 設計復審(和同事審核設計文檔) | 10 | 15 |
· Coding Standard | · 代碼規范(為目前的開發制定合適的規范) | 5 | 5 |
· Design | · 具體設計 | 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 | · 事后總結,并提出過程改進計劃 | 30 | 30 |
合計 | 405 | 690 |
? 由于自己對C語言比較熟悉(主要是C語言編譯過后就是exe,其他語言還要打包,就直接用C語言寫了),因此選擇用C語言來實現這個項目。剛拿到題的時候仔細分析了一下,發現在功能上的要求不高,甚至不用校驗單詞的有效性,凡是以空格和逗號隔開的都算是單詞,因此第一次作業的難點應該在于命令行參數的解析上面。
? 接下來我用C語言寫了一個簡單的demo,嘗試著梳理一下程序構建思路,應該如何設計,模塊怎樣劃分。demo中所有的功能都在main函數里面,沒有上傳到碼云。
寫好demo后,大致整理了一下解題思路:
? 根據項目的要求,該程序執行的大體流程為:首先用戶執行程序并附帶各種參數,程序首先要分析處理各種選項,校驗選項的有效性,并將各種參數和對應的文件聯系在一起,然后對不同的文件執行該文件對用的各種操作,然后將最終的結果一并保存在輸出文件中。
? 根據對程序執行流程的分析,由于不同的文件對應著不同的操作,因此需要將文件名和其對應的操作綁定在一起,由此想到了用結構體保存一個文件的相關信息,然后使用鏈表將各個文件連起來。待命令處理完畢后,只需遍歷鏈表,即可對各個文件執行相應的操作。文件的結構體如下:
struct Node
{bool _c; // 是否統計字符個數bool _w; // 是否統計單詞個數bool _l; // 是否統計行數bool _hasFile; //是否有正確的輸入文件char inFile[100]; //輸入文件的路徑int row; //行數int character; // 字符數int words; // 單詞數struct Node *next;
};
根據程序的執行流程,可以將程序劃分為以下幾個模塊:
主函數中主要是一些基本的處理和一些簡單的邏輯的處理,負責調用其他函數
? 對于用戶輸入的命令的處理,有很多種辦法,其中最常用的就是遍歷數組,或者將輸入的命令編程字符串,然后解析字符串,我選擇的是將用戶輸入的各種選項和命令拼接成一個字符串,然后遍歷整個字符串,并做相應的分析。
####(3).統計模塊
? 統計模塊主要就是對每個文件做相應的統計操作,包括對行數的統計,對單詞數的統計,對字符數的統計,每個功能寫在一個單獨的函數里面。統計完字符后順便將數據寫入文件。
// 對用戶輸入的命令進行分析
// 傳入的用戶輸入的命令的字符串,中間用空格隔開
// 如果是-開頭的,則認為是選項
// 如果檢測到-o,就立即讀取后面緊跟的輸出文件
// 如果不是-開頭的,就認為是輸入文件// 第二個參數是一串文件的頭結點
void analyseCommand(char commandStr[], struct Node *Head)
{// 遍歷整個字符串initFileNode(Head);struct Node *cur;cur = Head;for (int i = 0;; i++){// 讀出當前字符char c = commandStr[i];// 如果遍歷到了\0,說明字符串結束,則退出函數if (c == 0)return;// 如果c是-,則應該是一個選項if (c == '-'){i++;// 讀取出-后面的字符,并做判斷read:c = commandStr[i];// 如果-后面是c,就將_c置為trueif (c == 'c'){cur->_c = true;if (commandStr[++i] != ' '){goto read;}continue;}// 如果-后面是w,就將_w置為trueelse if (c == 'w'){cur->_w = true;if (commandStr[++i] != ' '){goto read;}continue;}// 如果-后面是l,就將_l置為trueelse if (c == 'l'){cur->_l = true;if (commandStr[++i] != ' '){goto read;}continue;}// 如果-后面是o,則后面緊跟的一個參數一定是filePath// 首先判斷后面是否有文件,如果有,就添加// 如果沒有,就報錯// 此時i的index是在選項上的else if (c == 'o'){i += 2; // 將i移動到char next = commandStr[i];if (next == '-' || next == '0'){printf("after -o must a para");exit(-1);}char path[100] = ""; // 用來存放輸出路徑for (int j = 0;; j++){// 讀取出命令中的文件名中的每一個字符char ch = commandStr[i++];// 如果讀取到了0,就說明文件名讀取結束,就退出if (ch == ' '){break;}path[j] = ch;}memset(outFile, 0, sizeof(outFile));strcpy(outFile, path);}else{// 如果-后面什么都沒有,就判定為錯誤printf("after - must a para");exit(-1);}}else{// 如果不是-,則判定為輸入文件// 此時i定位在輸入文件的第一個字符上char path[100] = "";for (int j = 0;; j++){char ch = commandStr[i++];if (ch == ' '){break;}path[j] = ch;}strcpy(cur->inFile, path);cur->_hasFile = true;struct Node *fileNode;fileNode = (struct Node *)malloc(sizeof(struct Node));initFileNode(fileNode);cur->next = fileNode;cur = fileNode;i--;}}// 檢測是否有輸入文件// if (strlen(cur->inFile) == 0)// {// printf("you do not have input file");// exit(-1);// }
}
代碼分析:該函數是這次作業中最重要的一個函數,因此單獨拿出來說一下。
要點說明:
1.使用for循環遍歷整個字符串
2.遇到-之后就認為是一個選項,就緊接著讀取他的后一個字符,如果是有效參數,就記錄在當前文件的結構體中,否則報錯
3.如果是-o,則認為后面緊跟著一個輸出文件,不做文件名有效性檢驗,不做權限檢查
4.如果是普通字符開頭,則認為是輸入文件,不做文件名有效性檢查,不做權限檢查
5.根據規則,輸出文件應該放在該文件對應參數的后面
6.遍歷完畢之后,就將相關數據都保存在了文件的結構體中,并連接成了鏈表,返回后可進行后期相關操作。
根據要求,根據如下條件設計測試:
是否有輸入
是否輸入-
-后是否有參數
是否統計行數
是否統計字符數
是否統計單詞數
是否支持命令連寫
是否支持多文件統計
是否有-o
-o后是否跟文件
根據以上條件,設計了如下批處理文件:
.\wc.exe
.\wc.exe -
.\wc.exe -l
.\wc.exe -c
.\wc.exe -w
.\wc.exe -lc
.\wc.exe -lw
.\wc.exe -cw
.\wc.exe -lcw
.\wc.exe -lcw -o
.\wc.exe -lcw -o res.txt
.\wc.exe -lcw file1.c
.\wc.exe -lcw file1.c -o
.\wc.exe -lcw file1.c -o res.txt
.\wc.exe -lcw file1.c file2.c -o res.txt
.\wc.exe -lcw file1.c -lcw file2.c -o res.txt
.\wc.exe -lcw file1.c -o -lcw file2.c -o res.txt
PAUSE
測試結果如下:
文件輸出結果:
《構建之法–現代軟件工程》 --鄒新 [第三版]
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态