189
社区成员




这个作业属于哪个课程 | 构建之法-2021秋-福州大学软件工程 https://bbs.csdn.net/forums/fzuSoftwareEngineering2021?category=0 |
---|---|
这个作业的要求在哪里 | 2021秋软工实践第一次个人编程作业 https://bbs.csdn.net/topics/600574694 |
这个作业的目标 | 实现一个程序功能,它可以对读入的C或C++代码文件进行不同等级的关键字提取。 |
学号 | 031902626 |
GitHub | https://github.com/xyyuan1/Fzu-Software-Engineering-homework1 |
个人主页:
GitHub
https://github.com/xyyuan1
博客园
https://www.cnblogs.com/xyyuan1/
PSP2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | ||
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 40 | 60 |
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 150 | 240 |
Design Spec | 生成设计文档 | 20 | 30 |
Design Review | 设计复审 (和同事审核设计文档) | 0 | 0 |
Design | 具体设计 | 180 | 300 |
Coding | 具体编码 | 180 | 240 |
Code Review | 代码复审 | 20 | 20 |
test | 测试(自我测试,修改代码,提交修改 | 120 | 240 |
Reporting | 报告 | ||
Test Report | 测试报告 | 60 | 80 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 60 | 60 |
Summary | 合计 | 880 | 1290 |
1.分解任务:刚看到这道题时,我先对题目的要求进行了浏览,找出我有困难的点,一是如何将.c文件传入、该用何种形式匹配,二是对于“关键字”的定义和对不同结构的判定。确定了难点,我大概想到要把文件转化为字符串的形式进行匹配,所以先对于代码的主体——“关键字”部分进行研究:
2.对于问题内容中的查找关键字部分,我第一想到的是以前C语言学习过的字符串匹配问题,遍历程序找出对应的关键字,进行记录。由此我想对所有关键字建一个表进行记录,基于我选择的编程语言是C++,C++面向对象编程的性质让我想到创建一个程序类,对程序对象建立对象数组进行记录,定义每个对象的性质分别是关键字(keyword)和出现次数(number),在遍历时遇到关键字就对该关键字的数量加一。但这时我遇到了困难,就是如何将对象数字中的关键字和程序中的相匹配,在这里查了许多资料,花了不少时间,后来在和同学交流讨论时,我了解到了find()函数,可以直接通过find函数对当前的字符串进行查找,若有关键字出现则返回正确值,解决了两者互相匹配的问题,接下来的问题就是如何把(.c)程序转化为字符串,化为我们可以进行匹配的模式,一开始我想的是将.c文件保存为.txt文件再进行读取,网络上用于打开文件的函数也是纷繁复杂,一开始我选择的是fopen()函数,但我并没有找到转为字符串的形式,仅仅只能将文件打开,接着我又转向in(),成功打开.txt文件,并通过getline()函数对文件进行按行读入,解决了输入的问题,可以开始写函数并进行测试。
先是基本要求:对于关键字进行记录,先初始化对象数组为32个关键字,遍历对象数组的关键字名,若通过find()函数找到,则对该对象的number加一,直到文件读取结束。对于进阶要求,先创建case_number数组,对每个switch若找到switch关键字,则转入swithc_search函数,对switch_number加一,若遇到case,则对当前switch的case_number数组加一,直到有新的switch出现。对于拔高要求,我的想法是和终极要求相结合解决,否则esle if的出现将影响对于单纯ifelse结构的判断,方法是创建一个栈,若if出现则入栈,else出现则出栈,记为ifelse结构,若二者中间出现elseif,则将此结构记为ifesleifelse结构。通过上述的函数构造,完成了给出样例以及我自己样例的测试。
basic requirements
C++
void Search_name(string str)
{
for (int i = 0; i < 32; i++)
{
if (str.find(p[i].name) != -1)
{
p[i].number++;
Switch_search(i);
Ifelse_search(i);
}
}
}
advanced requirements
C++
void Case_count(int);
void Switch_search(int i)
{
if (i == 25)//switch
{
switch_number++;
}
Case_count(i);
}
void Case_count(int i)
{
if (i == 2)//case
{
case_number[switch_number]++;//case_number+1 in this switch structure
}
}
further requirements & final requirements
C++
void Ifelse_search(int i)
{
if (i == 14)
{
If_flg = true;
}
if (i == 9)
{
Else_flg = true;
}
}
void Ifelse_judge()
{
if (If_flg == true && Else_flg == false)//only "if" in the line
{
flg = 0;
ifelse_number++;
Stack[top] = 1; //push if
top++;
}
if (If_flg == false && Else_flg == true)//only "else" in the line
{
top--;
Stack[top] = 0; //pop if
}
if (If_flg == true && Else_flg == true)//only "else if" in the line
{
if (flg == 0)
{
ifelse_number--;
ifelseifelse_number++;
flg = true;
}
}
If_flg = false;
Else_flg = false;
}
从总体上看,我个人认为这次的作业对我的帮助极大。
1。这次编程作业清楚的暴露了我平时因疏于练习而导致的编程能力不足,在写代码的过程中经常感到吃力,有的问题即使有一定想法也不能很好的实现,提醒了我对于代码能力的锻炼重在平时。
2.让我看到了自己和其他同学的差距,在写博客的时候已经有许多同学完成了作业,通过学习他们的博客,我学习到了很多新的思路,给我豁然开朗的感觉,同时他们的各种能力也令我钦佩,自己还有许多地方需要提升。
3.锻炼了我的自学能力,之前的课程代码大部分都有老师教授,这次的作业则是需要自己查资料并且联系学过的知识来完成,对于各种编码方式和全新函数的学习,都要通过网络学习,为了实现不同功能,我也查找了不少的英文网站,对于检索查询资料的能力得到了提升。
4.学习了在编码后进行测试完善,测试代码性能,这是我之前从来没使用过的,对代码的测试也是整个过程中不可或缺的一环,让我对于编码、项目的实现有了更加深入的理解。
5.学习了GitHub的基本用法和部分Git命令,不断commit自己的代码,学习了程序员的基本操作,对于今后开源的编码方式有了更好的了解和掌握。
路漫漫其修远兮,希望接下来的作业可以完成得越来越好,不断完善自己的能力。
创建GitHub仓库
commit