2021秋软工实践第一次个人编程作业
这个作业属于哪个课程 | 构建之法-2021秋-福州大学软件工程 |
---|---|
这个作业要求在哪里 | 2021秋软工实践第一次个人编程作业 |
这个作业的目标 | 熟悉git和github的简易运用 |
学号 | 081900426 |
项目地址 | github仓库 |
PSP 表格
PSP | Personal Software Process Stages | Estimated time(min) | Time(min) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
Estimate | 估计这个任务需要多少时间 | 960 | - |
Development | 开发 | - | - |
Analysis | 需求分析 (包括学习新技术) | 360 | 480 |
Design Spec | 生成设计文档 | 20 | 20 |
Dsign Review | 设计复审 | 20 | 20 |
Coding Standard | 代码规范 | 30 | 60 |
Design | 具体设计 | 30 | 60 |
Coding | 具体编码 | 240 | 240 |
Code Review | 代码复审 | 45 | 60 |
Test | 测试(包括修改代码) | 60 | 90 |
Test Report | 测试报告 | 20 | 20 |
Postmortem & Process Improvement Plan· Design Review | 事后总结, 并提出过程改进计划 | 30 | 30 |
Summary | 合计 | 875 | 1110 |
解题思路描述
- 拿到本题后先进行分析,通过已有的知识是否可以解决问题,是否需要学习新的字符分析库。经过分析,通过c++标准库就可以解决。
- 本题需要我们练习运用git和github,但是我对git不熟悉,需要寻找一些git的资料。以下列出个人认为git快速入门的资源。
Pro Git(中文版)
详细理解git原理十分重要,可以加速掌握运用
VScode 结合git的全面使用流程(上)
用vscode可以方便管理仓库,可以简化操作,不用记忆部分git命令,还能pull request和查看issue
GitHub官方教程配套系列视频
很短很生动
设计实现过程
任务目标1,2可以一起实现,3,4需要栈来实现,初计划是把1,2目标的实现放在一个头文件中,3,4目标的实现放在一个头文件中,然后再用一个文件写交互和查询等级。这样前期可以不用太过考虑输入输出。
rank12的实现
- 运用一个Input_KeyWords类来封装读入关键词并保存在unordered_set中
- 运用一个count类来读取需要提取关键词的cpp文件,并进行计数
处理函数的流程图
switch case详细参见代码,比较简单但是画图比较密集就暂且省略。
rank34的实现
- 使用ifstream和getline一行一行的读入并进行处理
- 设计栈操作处理if else和{}
- 输入处理判断
处理函数的流程图
关键代码介绍
//栈设计
void sta_input(char c)
{
if (sta.empty())
{
sta.push(c);
return;
}
switch (c)
{
case '}':
while (sta.top() != '{')
{
sta.pop();
}
sta.pop();
break;
case '{':
sta.push('{');
break;
case '1':
sta.push('1');
break;
case '2':
sta.push('2');
break;
case '3':
int count = 0;
while (sta.top() != '1')
{
++count;
sta.pop();
}
sta.pop();
if (count > 0)
++if_else_if_else_num;
else
++if_else_num;
break;
}
}
因为if else else if根据{}来划分空间,所以必须把{}也进行入栈出栈操作,if设为1,else if设为2,else设为3,只有出现else才进行计数,根据栈顶top是if还是else if来判断属于if else还是if elseif if。出现}就把{}之间的全部出栈。具体代码详见github
//读入处理判断
string str;
while (getline(input, str))
{
auto cur = begin(str);
while (cur != end(str))
{
//去空格
while (*cur == ' ')
{
++cur;
}
//判断是不是ifelse
if (isalnum(*cur))
{
if (str.substr(cur - begin(str), 2) == "if")
{
sta_input('1');
cur += 2;
}
else if (str.substr(cur - begin(str), 4) == "else")
{
if (str.substr(cur - begin(str), 7) == "else if")
{
sta_input('2');
cur += 7;
}
else
{
sta_input('3');
cur += 4;
}
}
else
{
while (isalnum(*cur))
{
cur++;
}
}
}
//判断符号
else if (*cur == '{')
{
sta_input('{');
++cur;
}
else if (*cur == '}')
{
sta_input('}');
++cur;
}
else
++cur;
}
}
和流程图介绍的一样,具体实现使用isalnum来判断字母数字,用string类的函数来进行截取字符串比较等操作
//输入输出界面
cout << "请输入您需要的关键字查找等级" << endl;
int rank = 1;
cin >> rank;
if (rank > 4 || rank < 1)
{
cout << "请输入[1,4]的数字" << endl;
}
Input_KeyWords key("key.txt");
auto key_set = key.read();
cout << "请输入您要提取的cpp文件路径" << endl;
string address;
cin >> address;
Count code(address);
code.count_total(key_set);
code.output(rank);
if (rank >= 3)
{
ifstream input2(address);
if_else(input2);
cout << "if-else num: " << if_else_num << endl;
if (rank == 4)
cout << "if-elseif-else num: " << if_else_if_else_num << endl;
}
rank12和34分别进行处理,1和2一起运算只有输出差别,3和4也是一起运算只有输出差别
可改进的地方
- rank12和rank34分别处理,但是1和2,3和4没有分开处理,只是在输出处分离,可以进一步修改
- rank12和rank34的读取方式不同,程序不太好看,封装的不是很合理
- 因为rank12和34不统一,用户交互部分的代码不是很简洁需要改进
- 因为时间关系,设计不够合理,代码可扩展性偏差,可能不能适应新的需求,这点可以通过后期的重构部分代码实现。
代码规范
详情请见《谷歌C++ 开发风格指南》
git开发流程简介
本次开发在git的学习与使用上耗费了最多的时间我觉得有必要简述一下运用git开发的流程
- 初始化git,并在github上创建远程库,通过ssh进行连接
ssh连接的方法可以参照该文 GitHub如何配置SSH Key - 创建master本地库,然后第一次commit,并推送到github的远程库,这里命名为origin
- 创建.gitignore文件,来指定不add的文件,譬如可执行文件
- 创建分支if_else开发rank34的内容
可以在这里切换支路 - 如果项目较大版本较多,可以打上tag
- 处理pull request,将if_else支路整合进master,并处理冲突
- 处理issue(可以创建一个新支路来处理)
- 写README.md来介绍项目然后发布
最后发布如下
单元测试
- 作业样例输出
得到的结果准确无误。
性能测试
作业总结
困难与解决
- 因为我开发用vscode比较上手,所以基本只用vscode实现,很多插件没有中文教程,要啃很久才能学会,但是总体来说vscode还是很方便的
- 算法不是拿手,要想很久,对于比较复杂的关系会搅的一团乱,最后看了一些帖子有了一点灵感之后再画图一部分一部分的解决,就写的非常快了
总体感受
- 本次作业学习了运用git和github工作的简单流程,感受到了git的强大安全,未之后的多人开发打好了一定的基础
- 学习新知识花费了太多的时间,对于代码来不及进一步的打磨是这次最大的问题,对于各种新工具的运用不是很熟练,影响了工作进度
- 写报告和文档的时间比想象中的多得多,不是写完代码就万事大吉
- 这次作业总体收获很大,也认识到自己很多不足,对计划的执行力也没有想象的高。