软件工程第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2020/
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
这个作业的目标 <制作一个程序统计和分析 GitHub 的用户行为数据。>
学号 <021800317>

PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 30
Estimate 估计这个任务需要多少时间 300
Development 开发 120 150
Analysis 需求分析 (包括学习新技术) 180 300
Design Spec 生成设计文档 15 40
Design Review 设计复审 5 20
Coding Standard 代码规范 (为目前的开发制定合适的规范) 5 15
Design 具体设计 10 30
Coding 具体编码 120 180
Code Review 代码复审 20 30
Test 测试(自我测试,修改代码,提交修改) 30 60
Reporting 报告 10 30
Test Report 测试报告 10 30
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 20 60
合计 575 985

解题思路

最开始拿到题目是完全没有头绪,因为我不会python和Java,据了解用C plus不好解决,更关键的是我对于python,Java等编程语言的开发工具完全不了解,更别说git操作,命令行操作等等。最近靠着在CSDN,博客园等网站论坛学习,找思路才勉强有了点思路。一开始打算试着搞懂助教的代码,但是太繁杂了,就转而向舍友同学求助顿时明白不少。

git使用截图

参考代码cmd运行截图

尝试命令行按行读取json文件

commit

实现过程

代码

初始化

def init(path):
os.getcwd() 
filelist = os.listdir(path)
f2=open('2020-01-01-15.json','w',encoding='utf-8')
for file in filelist:
    pathname=path+'\\'+file
    try:
        f=open(pathname,encoding='utf-8')
        for line in f:
            f2.write(line)
    finally:
        if f:
            f.clone()
return 0
  • 思路: os.listdir返回指定的文件夹包含的文件或文件夹的名字的列表,通过open函数打开json文件,write()函数向f2写入字符串,for in遍历读取文件写入数据,

统计

def one(data,repo,event):
ans=0
for da in data:
    if  repo!=da['repo']['name']:
        continue
    if  da['type'] == event:
        ans=ans+1
return ans
def two(data,username,event):
ans=0
for da in data:
    if  username!=da['actor']['login']:
        continue
    if  da['type'] == event:
        ans=ans+1
return ans
def three(data,username,repo,event):
ans=0
for da in data:
    if  username!=da['actor']['login']:
        continue
    if  repo!=da['repo']['name']:
        continue
    if  da['type'] == event:
        ans=ans+1
return ans
  • 思路:按照题目要求设计三个函数统计不同信息。根据json文件里所提供的信息和助教给的window批处理文件,event信息保存在'type'中,user保存在'actor''login',repo保存在'repo''name',在data中查找信息是否对应即可。

main函数

if __name__ == '__main__':

data=[]
username='0'
repo='0'
event='0'

try:
    f=open("2020-01-01-15.json", encoding='utf-8')
    for line in f:
            data.append(json.loads(line))	
finally:
    if f:
        f.close()
opt,arg= getopt.getopt(sys.argv[1:],'i:u:r:e:',['init=','user=','repo=','event='])
if opt in ("-i" , "--init"):
    init(opt[0][1])
    exit()
for opt,arg in opt:
    if opt in ("-u","--user"):
        username = arg
    elif opt in("-r","--repo"):
        repo = arg
    elif opt in ("-e","--event"):
        event = arg
if  username=='0':
    print(one(data,repo,event))
elif  repo=='0':
    print(two(data,username,event))
else:
    print(three(data , username , repo , event))

思路:在python文件中用if name == 'main':作为程序入口,即C语言中的main函数。设置初始变量,创建列表data,用open函数打开json文件,loads()函数用于读取字符型数据,append() 函数给列表添加新的对象。使用getopt模块获取命令行选项和参数,利用sys模块将命令行参数保存在opt, arg中。opts为分析出的格式信息,args为不符合长短选项字符的格式信息的命令行参数。先用if语句判断命令行指令是否要求初始化,下一步用for循环迭代判断命令行指令的要求统计的内容,再根据命令行提供的数据在data列表中迭代查找相应信息。

单元测试截图

  • 助教给的测试程序中那个叫run的window批处理文件我有稍微改动,多加自己编的几行命令。

性能测试

单元测试覆盖率

代码规范

https://github.com/PCWJSW/2020-personal-python/blob/master/codestyle.md

总结

这次作业的完成过程中我开始接触python3.8,git的使用,对于python编程也有所掌握,尤其是命令行指令,sys,getopt,os模块的了解和使用。明白了要多在CSDN等的网站学习。不过在作业花费的时间太多,遇到不会的点没有及时问同学导致浪费了时间,以后应当注意。

posted @ 2020-09-16 22:30  PCWJSW  阅读(35)  评论(1编辑  收藏