其他分享
首页 > 其他分享> > 2021-09-20

2021-09-20

作者:互联网

这个作业属于那个课程构建之法-2021年秋-福州大学软件工程
这个作业要求在哪里2021年秋软工实践第一次个人编程作业
这个作业的目标实现一个程序功能,它可以对读入的 C或C++代码文件进行不同等级的关键字提取;学会使用 Git 进行版本控制
学号031902110

GitHub 仓库

文章目录

一、PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划4560
Estimate估计这个任务需要多少时间3025
Development开发
Analysis需求分析 (包括学习新技术)200250
Design Spec生成设计文档
Design Review设计复审 (审核设计文档)
Coding Standard代码规范 (为目前的开发制定合适的规范)6075
Design具体设计60200
Coding具体编码16802000
Code Review代码复审100100
Test测试(自我测试,修改代码,提交修改)180240
Reporting报告
Test Report测试报告
Size Measurement计算工作量6060
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划9090
合计25053100

二、解题思路

当拿到题目的时候,分析题目要求。题目共分为 4 个要求,逐步实现每个要求,先从基础的开始。

1. 文本的读取及处理

2. 基础要求

3. 进阶要求

4. 拔高和终极要求

三、设计实现过程

1. 代码组织

在这里插入图片描述

2. 函数流程图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、代码说明

1. 文本读入函数


def get_text():
    file = open(sys.argv[1], "r", encoding="UTF-8")  # 用 UTF-8 格式打开防止乱码
    txt = file.read()
    for ch in '!#$%&()+,-.:;<=>?@[\\]^_{|}~':
        # 考虑注释和引号,不能去掉符号 * / “
        txt = txt.replace(ch, " ")  # 将符号替换成空格
    file.close()
    return txt

2. 去除注释、双引号字符串



def words_filter():
    txt = get_text().replace("else if", "elseif")
    separator = [r'//.*', r'\/\*(?:[^\*]|\*+[^\/\*])*\*+\/', r'".*"']
    # 分别以  //单行注释  /* 多行注释*/  "引号" 作为分隔符
    for sp in separator:
        wordlist = re.split(sp, txt)  # 运用正则表达式匹配分隔文本
        txt = ""
        for word in wordlist:  # 重新拼接字符串
            txt = txt + word
    wordlist = txt.split()
    return wordlist


words = words_filter()
filterwords = []

3. 统计关键字个数



def first_level():
    keywords = {"auto", "break", "case", "char", "const",
                "continue", "default", "do", "double", "else",
                "enum", "extern", "float", "for", "goto",
                "if", "int", "long", "register", "return",
                "short", "signed", "sizeof", "static", "struct",
                "switch", "typedef", "union", "unsigned",
                "void", "volatile", "while", "elseif"
                }  # 把 else if 合并 成 elseif 作为一个关键字,为拔高和终极要求做准备
    counts = {}  # 关键字字典
    cnt = 0
    for word in words:
    	# 设置条件过滤字符串,保留关键字
        if len(word) == 1 or (word not in keywords):
            continue
        counts[word] = counts.get(word, 0) + 1  
        filterwords.append(word)
        cnt = cnt + 1
    cnt = cnt + counts.get("elseif", 0)  # elseif 合并后要多算一次
    print("total num: {}".format(cnt))
    return counts

4. 计算 switch case 个数



def second_level(counts):
    num = counts.get("switch", 0)
    print("switch num: {}".format(num))
    if num == 0:
        print("case num: {}".format(num))
        return
    count = []
    flag = -1
    for word in words:
        if word == "switch":  # 遇到 switch, count[]列表元素加 1
            count.append(0)
            flag += 1
        elif word == "case":
            count[flag] += 1
        else:
            continue
    print("case num: ", end="")
    print(" ".join(str(x) for x in count))

5. 计算 if else 和 if, elseif, else



def last_level():
    stack = []
    if_else_num = 0
    if_elseif_else_num = 0
    for word in filterwords:
        if word == "if":  # 遇到 if 就把它入栈
            stack.append(word)
        elif word == "elseif" and stack[-1] != "elseif":  # 连续 elseif 入栈一个就行
            stack.append(word)
        elif word == "else":  # 遇到 else 查看栈顶关键字
            if stack[-1] == "if":  # 是 if 直接出栈,if else 结构加 1
                stack.pop()
                if_else_num += 1
            elif stack[-1] == "elseif":  # 栈顶是 elseif 连续出栈两个元素
                stack.pop()
                stack.pop()
                if_elseif_else_num += 1
    print("if-else num: {}".format(if_else_num))
    if sys.argv[2] == '4':
        print("if-elseif-else num: {}".format(if_elseif_else_num))

五、单元测试截图和描述

在这里插入图片描述
单元测试结果和预期一致

六、性能测试

在这里插入图片描述

七、总结

标签:word,09,else,关键字,num,2021,elseif,20,txt
来源: https://blog.csdn.net/weixin_45829989/article/details/120393326