許林瑜:代碼的基礎功能編寫(我一開始沒認真看用DEVC++寫的。。。和VS環境差的有點多) ,博客碼字
楊吉:負責代碼優化,在VS2017上分裝接口(填個人坑)
together:找邏輯錯誤,作單元測試git
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
Planning | 計劃 | ||
•EStimate | • 估計這個任務須要多少時間 | 60 | 80 |
Development | 開發 | ||
• Analysis | • 需求分析 (包括學習新技術) | 60 | 60 |
• Design Spec | • 生成設計文檔 | 60 | 40 |
• Design Review | • 設計複審 | 120 | 110 |
• Coding Standard | • 代碼規範 (爲目前的開發制定合適的規範) | 60 | 50 |
• Design | • 具體設計 | 120 | 120 |
• Coding | • 具體編碼 | 120 | 150 |
• Code Review | • 代碼複審 | 60 | 120 |
• Test | • 測試(自我測試,修改代碼,提交修改) | 60 | 50 |
Reporting | 報告 | ||
• Test Repor | • 測試報告 | 40 | 50 |
• Size Measurement | • 計算工做量 | 30 | 20 |
• Postmortem & Process Improvement Plan | • 過後總結, 並提出過程改進計劃 | 60 | 50 |
合計 | 790 | 850 |
typedef struct word //定義結構體用於存儲單詞結構 { char w[Word_Max]; //單詞 int count; //個數 };
單詞采用字符數組記錄,Word_Max爲預約義的單詞數最大長度,單詞出現頻率用整型count存儲。github
性能分析
數組
對list鏈表排序網絡
void sortWord(list<words> &a) {//對單詞出現次數排序 a.sort([](words x, words y) { 重寫list中的sort()函數 if (x.times != y.times) return x.times > y.times; else { if (x.s[0] > 90 && y.s[0] < 91) return (x.s[0] - 32) < y.s[0]; else if (x.s[0] < 91 && y.s[0] > 91) return x.s[0] < (y.s[0] - 32); else return x.s[0] < y.s[0]; } }); }
判斷單詞是否合法數據結構
int isRightWord(string s)//判斷是不是符合定義的單詞 { if (s.size() < 4) return 0; //單詞長度不知足return int i; int x = 0; for (i = 0; i < 4; i++) { if (s[i] <= 'z' && s[i] >= 'a') x++; else if (s[i] <= 'Z' && s[i] >= 'A') x++; } if (x != 4 ) //用x統計單詞是否以四個字母開頭 return 0; else return 1; }
判斷字符的ASCII碼是否符合函數
int isLlegal(char a) { //判斷字符的ASCII碼是否符合 if (a <= 'z' && a >= 'a') { return 1; } else if (a <= 'Z' && a >= 'A') { return 1; } else if ('0' <= a && a <= '9') { return 1; } else return 0; }
鏈表中插入單詞並計數工具
void addToList(list<words> &a, string s) { int i = 1; for (auto &x : a) { if (s == x.s) { x.times++; i = 0; break; } } if (i == 1) { a.push_back(words(s, 1));// 遍歷一遍,若是沒有出現重複單詞就在鏈表尾部插入 } }
分割單詞(設置全局變量,每分割一次就COUNT++)性能
void IsWord(string s, list<words>&a) //統計單詞 { int i = 0, j = 0; string word; for (int k = 0; k < s.size(); k++) { if (!isLlegal(s[k])) //若是不知足單詞組成則分割單詞,判斷是否爲合法單詞是否要插入 { if (isRightWord(word)) { addToList(a, word); } word = ""; } else { word.push_back(s[k]); 未完成分割單詞則把字符讀入字符串最尾 } } }
統計函數(主要是添加全局變量,在讀取文本是每getline()一次就COUNT++)單元測試
int countLines(string s) { ifstream pFile; string buffer; pFile.open(s); // 打開文件 int count = 0; for (string temp; getline(pFile, temp);) //將論文讀入字符串 { if (temp != "") { buffer += temp; count++; } } cout << "lines:" << count << endl; pFile.close(); return count; }
單元測試用的是Visual Studio 2017上自帶的C++單元測試功能
在原有的項目下新建UnitTest1項目,並將引用指向原來的項目
在unittest1.cpp中使用宏"TEST_METHOD"包裹方法將不一樣的函數分紅獨立的測試單元學習
#include "stdafx.h" #include "CppUnitTest.h" #include "../core/core.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; namespace UnitTest1 { TEST_CLASS(UnitTest1) { public: TEST_METHOD(TestMethod1) { std::string textString = "asd31111"; Assert::AreEqual(isRightWord(textString), 0); } TEST_METHOD(TestMethod2) { std::string textText = "a.txt"; Assert::AreEqual(countLines(textText), 3) } }; }
使用了Assert中的Assert::AreEqual();來對輸入與輸出是否相等進行判斷。測試了ASCII和單詞判斷的函數。可是由於仍是第一次使用單元測試這種作法因此只是初步的測試了一下,更多的測試仍是用比較老土的那種方法。
測試的數據主要就是針對不一樣的函數進行測試,由局部基礎的邏輯函數進行測試,一步步測試到整個項目;
- 測試判斷ASCII碼的函數就是用不一樣的輸入 好比:A a @ # 空字符等去判斷返回值是否正確
- 判斷是不是合法的單詞事用不一樣的字符串進行測試 好比:12asjda , ada , hhhh(asdsad) ,asdajsdja2019 ,adadad;等對常見的字符輸入進行測試,觀測返回值是否正確。
- 判斷排序,字符串分割等函數是否正確,主要是去網上找了英文論文做爲輸入,而後觀測輸出數據與人爲數的數據是否有誤差,好比排序。是否按要求輸出,替換文中的單詞如win(10)次
adsada(10)次是否會正確排序。還測試了空文件,以及較大的文件。