• 第一次个人编程作业


    第一次个人编程作业

    一、源码

    Github地址:https://github.com/wjx-1999/031702547


    二、psp表格

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

    三、计算模块接口的设计与实现过程

    前期准备

    首先接触到这个问题,最初是想要使用c++来实现的,后来发现输出还要用json的格式,要用c++手写json的输出,并参考了其他大佬的c++做法,这简直是噩梦难度,于是放弃了。暑假期间稍微学习了一部分的python,这时候就派上用场了。py里面有re、json、cpca模块,大大简化了问题难度。

    导入模块 主要功能
    re 提供各种正则表达式的操作
    json 将输出文件的格式转换为json
    cpca 用于提取简体中文字符串中省,市和区

    思路

    • 首先我们使用正则表达式,将输入的字符串切割得到姓名、电话、剩余的字符串s1
    • 接着使用cpca,将s1切割,得到了省、市、区、剩余部分s2
    • 对于剩余的部分,手动在分出镇、街道、乡等信息,得出一个五级地址

    模块接口设计

    接口 主要功能
    match_name_tel 得到姓名、电话信息
    transform 提取简体中文字符串中省,市和区
    address_book 得出五级地址
    json.dumps 输出json格式的数据

    实现过程

    得到姓名、电话、和省市区信息,相当于得到三级地址

    def match_name_tel(s: str):  # get name and phone number
        s = s.rstrip(".")
        match = s.split(",")
        name = match[0] #get name
        tel = re.search('d{11}', match[1]).group(0) #get phone number
        mat = re.split('d{11}', match[1])
        rest_addr = mat[0] + mat[1]  # join two string
        DataFrame = cpca.transform([rest_addr])  # use the ilst
        return (name, tel, DataFrame)
    

    剩余字串切割,得到五级地址

    def address_book(str0 : str):
        name, phone, tmp = match_name_tel(str0)
        newaddr = []
        str_rest = tmp.values[0]
        for addr in str_rest:
            newaddr.append(addr)
        # split the street	ownvillage
        lastaddr = newaddr.pop()
    
        if newaddr[0] == '北京市' or'天津市'or'上海市'or '重庆市' :
            str = newaddr[0].replace('市','')
            newaddr[0] = str
        address = newaddr
        addr_rest = lastaddr.split('街道', 1)
        if len(addr_rest) > 1:
            addr_rest[0] += "街道"
        else:
            addr_rest = lastaddr.split('镇', 1)
            if len(addr_rest) > 1:
                addr_rest[0] += "镇"
            else:
                addr_rest = lastaddr.split('乡', 1)
                if len(addr_rest) > 1:
                    addr_rest[0] += "乡"
                else:
                    addr_rest.insert(0, '')
        address = newaddr + addr_rest
        info = {
            "姓名": name,
            "手机": phone,
            "地址": address
        }
        # get the json type data
        info_data = json.dumps(info, ensure_ascii=False)
        print(info_data)
    

    四、计算模块接口部分的性能改进

    主要时间除了输入部分,主要就是直接调用cpca的transform函数,几乎占用了全部时间,除非我自己手动分析写一个类似的函数(主要还是懒啊),不然基本无法降低时间
    在这里插入图片描述
    这是用pycharm的profile出来的图片
    在这里插入图片描述

    五、计算模块部分单元测试展示

    部分例子
    1!伯诽,浙江杭州市下城区石桥街道石桥路344号天堂园社区汽轮宿14784456463舍5幢.
    1!蔡细披,上海市奉贤区泽丰路88弄恒13538603055盛豪庭.
    1!谢逐,广东省汕头澄海区竹林村德生巷8号竹林幼儿园13893984659.
    1!徐籍,天津市宁河区大15509925167北涧沽镇大北路宁河区大北涧沽镇中兴沽村村民委员会.
    1!乜吨铡,安徽省合肥市瑶海区长15646257573淮街道胜利路198号合肥元一希尔顿酒店.
    
    {"姓名": "伯诽", "手机": "14784456463", "地址": ["浙江省", "杭州市", "城区", "下城区石桥街道", "石桥路344号天堂园社区汽轮宿舍5幢"]}
    {"姓名": "蔡细披", "手机": "13538603055", "地址": ["上海", "上海市", "奉贤区", "", "泽丰路88弄恒盛豪庭"]}
    {"姓名": "谢逐", "手机": "13893984659", "地址": ["广东省", "汕头市", "澄海区", "", "竹林村德生巷8号竹林幼儿园"]}
    {"姓名": "徐籍", "手机": "15509925167", "地址": ["天津", "天津市", "", "宁河区大北涧沽镇", "大北路宁河区大北涧沽镇中兴沽村村民委员会"]}
    {"姓名": "乜吨铡", "手机": "15646257573", "地址": ["安徽省", "合肥市", "瑶海区", "长淮街道", "胜利路198号合肥元一希尔顿酒店"]}
    
    单元测试覆盖率

    在这里插入图片描述

    六、计算模块部分异常处理说明

    这个算法对于附加题部分时间没有继续做,他对于一些要输出七级的地址就会产生错误,后面需要花费时间继续完善

    3!蒯刑浦,白城市洮南市团结街道兴安南街5566号安泰社区公13949401891共事务服务中心.
    {"姓名": "蒯刑浦", "手机": "13949401891", "地址": ["吉林省", "白城市", "洮南市", "团结街道", "兴安南街5566号安泰社区公共事务服务中心"]}
    

    七、PSP表格

    见第二点。

    总结

    这次的个人编程作业,花费了许多的时间,比预期要多很多的时间,从复习py的语法知识,搭建环境,测试样例,验证结果等等,让自己对于py有了更近一步的深入了解。自己平时时间大部分都在实验室,应该要适当的平衡实验室与平时作业的关系,不能总是在最后时刻完成。

  • 相关阅读:
    CS Academy Round #65 Count Arrays (DP)
    Codeforces Gym 101194C Mr. Panda and Strips(2016 EC-Final,区间DP预处理 + 枚举剪枝)
    Codeforces 915F Imbalance Value of a Tree(并查集)
    HDU 4866 Shooting (主席树)
    玲珑杯 Round #5 Problem E Tetration (枚举 + 欧拉公式)
    Codeforces 906D Power Tower(欧拉函数 + 欧拉公式)
    第十三届北航程序设计竞赛决赛网络同步赛 B题 校赛签到(建树 + 打标记)
    TopCoder SRM 722 Div1 Problem 600 DominoTiling(简单插头DP)
    Codeforces 901C Bipartite Segments(Tarjan + 二分)
    supervisor安装与使用
  • 原文地址:https://www.cnblogs.com/wjx-1999/p/11609240.html
Copyright © 2020-2023  润新知