2021秋软工实践第一次个人编程作业

xyyuan1 2021-09-20 13:10:40
这个作业属于哪个课程 构建之法-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/


正文

前置要求

Github初使用

  • 下载Git,学习Git基础命令,并创建GitHub仓库
  • 进行10次以上commit
  • (截图附于文末)

代码规范制定

作业部分

PSP表格

PSP2.1任务内容计划完成需要的时间(min)实际完成需要的时间(min)
Planning计划
Estimate估计这个任务需要多少时间,并规划大致工作步骤4060
Development开发
Analysis需求分析 (包括学习新技术)150240
Design Spec生成设计文档2030
Design Review设计复审 (和同事审核设计文档)00
Design具体设计180300
Coding具体编码180240
Code Review代码复审2020
test测试(自我测试,修改代码,提交修改120240
Reporting报告
Test Report测试报告6080
Size Measurement计算工作量2020
Postmortem & Process Improvement Plan事后总结 ,并提出过程改进计划6060
Summary合计8801290

解题思路

  • 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结构。通过上述的函数构造,完成了给出样例以及我自己样例的测试。

  • 流程图

img

核心代码

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;
}

单元测试

  • 通过案例及不同代码对代码进行测试,获得了较好的效果,已将部分测试代码上传至GitHub。
  • 样例测试

img

  • 自己代码测试

img

性能测试

img

  • 从性能测试的结果看,对于文件的输入和结果输出占了较大的时间,具体函数的实现用时都较少,可以对输入进行进一步的优化。

心得体会

  • 从总体上看,我个人认为这次的作业对我的帮助极大。

  • 1。这次编程作业清楚的暴露了我平时因疏于练习而导致的编程能力不足,在写代码的过程中经常感到吃力,有的问题即使有一定想法也不能很好的实现,提醒了我对于代码能力的锻炼重在平时。

  • 2.让我看到了自己和其他同学的差距,在写博客的时候已经有许多同学完成了作业,通过学习他们的博客,我学习到了很多新的思路,给我豁然开朗的感觉,同时他们的各种能力也令我钦佩,自己还有许多地方需要提升。

  • 3.锻炼了我的自学能力,之前的课程代码大部分都有老师教授,这次的作业则是需要自己查资料并且联系学过的知识来完成,对于各种编码方式和全新函数的学习,都要通过网络学习,为了实现不同功能,我也查找了不少的英文网站,对于检索查询资料的能力得到了提升。

  • 4.学习了在编码后进行测试完善,测试代码性能,这是我之前从来没使用过的,对代码的测试也是整个过程中不可或缺的一环,让我对于编码、项目的实现有了更加深入的理解。

  • 5.学习了GitHub的基本用法和部分Git命令,不断commit自己的代码,学习了程序员的基本操作,对于今后开源的编码方式有了更好的了解和掌握。

  • 路漫漫其修远兮,希望接下来的作业可以完成得越来越好,不断完善自己的能力。


创建GitHub仓库

img

        commit

img

                                   

...全文
498 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

189

社区成员

发帖
与我相关
我的任务
社区描述
福州大学软件工程教学,推行邹欣老师“构建之法”。
软件工程 高校
社区管理员
  • Dawnfox
  • REP1USONE
  • 纪华裕
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧