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

北冥有鱼-其名为嘉 2021-09-21 10:52:04
这个作业属于哪个课程 https://bbs.csdn.net/forums/fzuSoftwareEngineering2021?category=0
这个作业要求在哪里 https://bbs.csdn.net/topics/600574694
这个作业的目标完成代码编写、学习使用GitHub、进行代码规范、个人总结
学号031902227

一、PSP表格

Personal software process stages预估耗时(分钟)预估耗时(分钟)
Planning 计划4030
Estimate 估计这个任务需要多少时间
Development开发
Analysis 需求分析 (包括学习新技术)300420
Design Spec生成设计文档4090
Design Review 设计复审2020
Coding Standard 代码规范 (为目前的开发制定合适的规范)3030
Design具体设计6040
Coding具体编码300420
Code Review代码复审6090
Test测试(自我测试,修改代码,提交修改)120120
Reporting报告
Test Report 测试报告2030
Size Measurement计算工作量3030
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划4040
Total合计10601360

二、迭代过程
1. 基本要求输出
在进行基本要求输出的时候,我首先想到的是先将关键字列成一个关键字列表,然后进行文件导入,然后按行进行读取,之后读取完然后使用.replace() 和 .split()这两个函数将按行读入的代码,规范成字典,将规范后的字典与关键字列表进行对比,如果字典中的元素存在与关键字列表当中,则保存在字典里,并且该键的键值加一,否则删除该键,最后利用for循环统计关键字数;

def get_keyword_num ():
    num = 0
    key_word=['auto','break','case','char','const','continue','default','do','if','while','static','double','else','enum','extern','float','for','goto','int','long','register','return','short','signed','sizeof','struct','switch','typedef','union','unsigned','void','volatile']
    
    store={}  #创建一个字典保存文件中的关键字

    file = open("code.txt","r",encoding='utf-8')  #打开txt格式且编码为UTF-8d的文本

    while(1):
        lines = file.readlines()            #按行读入文件
        for line in lines:           #循环遍历每行的词语并统计个数
            line = line.replace(",","").replace(".","").replace("{"," ").replace("}"," ").replace(":","").replace(";","").replace("?","").replace("("," ").replace(")"," ")
            #将代码中的符号替换为空格
            count = line.split()   #提取出line中的单词组成列表

            for word in count:
                if len(word) < 2:   #排除单个字的干扰,使得输出结果为词语
                    continue 
                else:
                    store[word] = store.get(word,0)+1    #如果字典里键为word的值存在,则返回键的值并加一,否则,返回0,再加1

        for key in list(store.keys()):      #遍历字典的所有键,如果不是列表里的关键字则删除
            if key not in key_word:
                del store[key]
        
        if not lines:
            break

    for key in store:
        if key in key_word:
            num = num + store[key]            #统计关键词出现次数

    print("total num: ",num)
    print("switch num: ",store['switch'])
    file.close()
    return

2. 进阶要求
考虑到switch-case,所以我每找到一个switch或者case我就会保存在一个新创建的列表里面,遇到switch时还要继续使用num进行switch的个数统计

def get_switchcase_num(count):
    put = []
    for word in count:
        if word == "switch":
            put.append(word)
        if word == "case":
            put.append(word)
    return put
cun =0
    sum = 0                                  #统计siwitch和case关键词出现次数
    put_1.reverse()
    for word in put_1:
        if word == "switch":
            if cun != "0":
                put_2.append(cun)
            cun = 0 
            sum = sum + 1   
        if word == "case":
            cun = cun+1
    put_2.reverse()

统计case个数时同样也是用另一个新的列表,保存每个switch-case结构里面的case个数,这里我考虑到计数方标先将保存switch-case的列表反转了,在最后输出的的时候再把保存case个数的列表反转即可

3. 拔高要求&终极要求
在开始的时候我同样考虑到使用查找switch-case的方法,结果发现行不通,继而想到了就是在每行读入的时候先判断是否存在if、else if、else,这三个关键词,使用的是.find()函数,创建一个新的列表存放找到的if、else if、else,关键字,如果找到if 则标记0存入列表,找到else if标记1存入列表,找到else标记2存入列表。但是这里值得注意的是使用if - elif - else语句判断的时候先判断else if。

line_1 = " ".join(count)
            if line_1.find("else if") != -1:
                lay_1.append('1')
            elif line_1.find("if") != -1:
                lay_1.append('0')
            elif line_1.find("else") != -1:
                lay_1.append('2')
            else:
                continue

然后判断列表中是否存在if-else、if-elseif-else。我这里投机取巧了,默认了文件中的所有 if 和 else 都是有唯一匹配的。寻找完if-else语句后直接寻找 else 的个数,然后减去之前if - else 的个数得到 if - elseif- else 的个数。

    cun_1 = 0
    cun_2 = 0
    for x in range(len(lay_1)):
        if lay_1[x] == '0' and lay_1[x+1] == '2':
            cun_1 = cun_1 +1
        if lay_1[x] == '2':
            cun_2 = cun_2 + 1

- GitHub仓库代码

https://github.com/yogajia/yogajia

三、正确性与性能评测
运行程序的结果

img

使用了 import cProfile,进行了性能评测

img

GitHub提交代码,这里我是手动添加的,并没有使用git工具(狗头保命)。也是因为没有使用git工具,导致我每次修改后保存的代码文件被更新(直接在之前的代码里面修改,然后上传到GitHub,并没有该文件名)

img

四、问题与解决办法
最开始的时候在构思部分不知道怎么做,以及程序开始的时候是不知道如何导入文件,之后在网上查找相关信息,参考了如下博文 https://blog.csdn.net/weixin_43886356/article/details/86711012

解决了文件传入,按行读入,代码规范等问题;在检测程序的正确性时,突然无法运行,在vscode里面和终端都无法运行,然后就是检查环境配置问题,都没找到原因,无果,果断休息,第二天再打开时又好了(欣喜若狂);在写代码过程中最开始我是打算使用c++写的,但是写了一会发些python更好用,转为使用python,在网上查找资料,找到许多函数,极大提高了我的协作效率;在文件输出的时候,打算使用switch-case语句,后来发现python根本就没有这种语句,继而使用了if - elif - else 的语句。使用git工具生疏,开始不知道如何保存到GitHub的文件库中,最后尝试使用gittool 未果,直接手动上传文件。

五、个人总结
本次作业个人认为是比较难的。在实验过程中也曾多次因为不会写代码,而直接放弃到第二天再来写。本次的作业中的代码,比较杂,并没有很好的按照python的代码规范去写,但是我又不想改动,怕到时候手贱改不回来了,导致辛辛苦苦写的代码无法运行。我自己在这次作业中是有些畏难的,在作业刚发布没多久个人就感觉这个很难,我应该不会做,然后拖沓了两天在开始做的,做的时候参考过其他的一些代码,发现也并不是想象中的那么困难,即使在写代码的时候遇到问题,也会比较快的的找的新的解决办法,所以等下次作业发布的时候第一时间,就开始做,不在拖沓,即使你拖沓但是作业也是要完成的。

...全文
626 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
a1164520408 2021-09-29

1.总体逻辑清晰但是性能分析的内容欠佳
2.解决问题与总结的思路明确
中高分

  • 打赏
  • 举报
回复
SoftwareTeacher 2021-09-22

在作业刚发布没多久个人就感觉这个很难,我应该不会做


通过学习,就会了, 这就是上大学的部分意义吧。

  • 打赏
  • 举报
回复 1
@SoftwareTeacher 我会继续加油的,谢谢老师
  • 举报
回复
SoftwareTeacher 2021-10-01
@192.168.04.5 继续加油
  • 举报
回复
相关推荐
发帖
构建之法-2021秋-福州大学软件工程
加入

188

社区成员

福州大学软件工程教学,推行邹欣老师“构建之法”。
社区管理员
  • Dawnfox
  • REP1USONE
  • 纪华裕
帖子事件
创建了帖子
2021-09-21 10:52
社区公告
暂无公告