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

kingmingdof 2021-09-19 17:30:05

第一次个人编程作业

这个作业属于哪个课程 福州大学软件工程社区 https://bbs.csdn.net/forums/fzuSoftwareEngineering2021
这个作业要求在哪里 2021秋软工实践第一次个人编程作业 https://bbs.csdn.net/topics/600574694
这个作业的目标完成编程目标,规范编程风格以及git工具使用和测试程序
学号 031902204 https://blog.csdn.net/m0_61536577?spm=1001.2101.3001.5343

编程相关文件地址

github仓库 https://github.com/gheao/2021-

使用用c++编写
提交截图

img

PSP表格

PSP预估耗时(h)实践耗时(h)
计划0.50.5
估计这个任务需要多少时间28.236.2
开发--
需求分析 (包括学习新技术)45
生成设计文档--
设计复审--
代码规范22
具体设计23
具体编码1518
代码复审--
测试25
报告0.50.5
测试报告--
计算工作量0.20.2
总结22
合计28.236.2

编程思路分析

  • 题目要求

    • 题目要求从给定路径读取文件,并且分析文件内容,统计其中的关键字,在统计关键字的基础上再查找Switch,Case,If_Else,If Else_If Else 的总数
  • 根据题目的要求,分成几个部分来考虑

    • 如何从指定的路径里读取到文件,并且读取文件的内容
    • 实现统计关键字总数
    • 实现Switch&Case的统计
    • 实现If_Else总数的统计以及If Else_If Else的统计
  • 在题目以外,还有git工具的使用以及代码书写规范以及程序的测试三部分

    • 通过git工具在github上创建仓库并且与本地仓库连接,通过本地仓库上传文件
    • 在编写代码的过程中遵守代码编写规范
    • 通过单元测试以及性能分析来分析代码
  • 按照计划,在实现基本功能的基础上迭代更新,最后实现编程目标

程序各个部分实现

1. 从指定的路径里读取到文件,并且读取文件的内容

通过查询支持文件读写的库函数,了解到在C++可以用ifstream类来实现文件的读入

    int Find_type;
    string File_p;
    cin >> File_p;
    ifstream finput(File_p);
    while (finput >> Text)
    {
        String_trim();
    }
2.统计关键字总数以及Switch&Case的统计

对读入的字符串进行修剪,然后判断字符串是否是关键字

对字符串修剪

void String_trim()
{
    int n = Text.size();
    string change;
    string otherchange;
    int first_change_flag=0;
    int level = if_else_level;
    int l_flag = else_flag;
    for (int i = 0; i < n; i++) 
{
        if (Text[i] <= 'z' && Text[i] >= 'A' && explain_flag_1 == 0 && explain_flag_2 == 0)
        {
            change = change + Text[i];
        }
                else
                {
                        if (first_change_flag == 0)
            {
                otherchange = change;
                first_change_flag = 1;
            }
            change = "\0";
        }
Search_and_Outfile(otherchange);
Search_and_Outfile(change);
}

查找符合条件的字符串并统计,此过程顺带统计了switch和case

void Search_and_Outfile(string s)
{    
    int l = s.size();
    if (l <= 1)
    {
        return;
    }
    for (int i = 0; i <= 31; i++)
    {
        if (s == Key_word[i])
        {
            if (s == "switch")
            {
                Case_num.push_back(Single_case_num);
                Switch_num++;
                Single_case_num = 0;
            }
            if (s == "case")
            {
                Single_case_num++;
            }
            Total_num++;
            break;
        }
    }
    return;
}
3.if_else和else_if判断

首先是要判别出 else if ,不能将这个字段当 else 和 if 判断。到这一步我发现我读取文件的方式似乎不太适合查找 else if字段。因为我当时读取文件的时候用的是字符串,字符串读取到空格就结束读取了,导致读取出来的字符串是一节一节的,不是按行读取的,这样的结构必须要在查询到 else 的下一个字符串时才能判断。为了解决这个问题,我用一个变量 tmp 来保存 else ,再增设一个判断括号的 flag 标志,遇到 if 和 else 根据 flag 和 tmp 来判断 else if。

大体代码如下

    if (Text == "else")
    {
        if (tmp != "else")
        {
            tmp = "else";
            else_flag = 0;
        }
        else if (l_flag == 1)
        {
            if_else_judge("else",0);
            tmp = "else";
            if (Text[n - 1] == 'e')
            {
                else_flag = 0;
            }
        }
    }
    else if (Text == "if")
    {
        if (l_flag == 1 && tmp == "else")
        {
            
            if_else_judge("else",level);
            tmp = "\0";
            else_flag = 0;
            if_else_judge("if",level);
        }
        else if (l_flag == 0 && tmp == "else")
        {
            if_else_judge("else_if",level);
            tmp = "\0";
            else_flag = 0;
        }
        else
        {
            if_else_judge("if",level);
        }
    }

实现了else if判断,接下来就是进行if else 和else if 判断
我用了两个栈来实现该判断。一个栈用来存放关键字类型,if用 i 表示,else if 用 c 表示。另一个栈用来存放它们各自的等级,等级遇到一个左括号加1遇到一个右括号减1。遇到else的时候,我们通过不断出栈来找到栈中的第一个 i 与其匹配,匹配过程中统计是否出现 c 符号,之后将与第一个 i 等级相同的元素全部删除。通过这两个栈,我们可以在找到else匹配的类型以及删除没有else的判断语句。

void if_else_judge(string s,int level)
{
    int if_top = 0;
    char if_char_top = 'i';
    int if_else_if_else_flag = 0;
    if (s == "if") {
        if_else_char_stack.push('i');
        if_else_stack.push(level);
    }
    else if (s == "else_if")
    {
        if_else_char_stack.push('c');
        if_else_stack.push(level);
    }
    else if (s == "else")
    {
        if_top = if_else_stack.top();
        while (!if_else_char_stack.empty()&&if_else_char_stack.top() != 'i')
        {
            if_else_if_else_flag = 1;
            if_else_char_stack.pop();
            if_else_stack.pop();
        }
        while (!if_else_stack.empty() && if_top == if_else_stack.top())
        {
            if_else_stack.pop();
            if_else_char_stack.pop();
        }
        if (if_else_if_else_flag == 1)
        {
            If_else_if_else_num++;
        }
        else
        {
            If_else_num++;
        }
    }
}

单元测试覆盖率以及性能优化

单元测试

img

性能

img

总结

第一次在 一个编程作业上花这么多时间,做完的时候感觉相当开心。这次编程也是出现了很多问题,比如在输文件路径的时候我在把一个txt文件命名的时候又加上txt后缀,变成text.txt.txt。输错路径好多次才发现这个问题。在编程的时候也是小错误不断,我认为这和我用按字符串读入的方式有关,但发现的时候太迟了,只能硬着头皮继续往下做下去,程序校错花了好长时间。除了天天守在编译器前受折磨以外,我还是有学到点东西的,学到git的使用以及一些新的函数之类的。
就写到这了,拜拜

img

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

189

社区成员

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

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