许林瑜:代码的基础功能编写(我一开始没认真看用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)次是否会正确排序。还测试了空文件,以及较大的文件。