zoukankan      html  css  js  c++  java
  • 软工实践寒假作业(2/2)

    这个作业属于哪个课程 福大20春软工S班
    这个作业要求在哪里 软工实践寒假作业(2/2)
    这个作业的目标 疫情统计系统
    作业正文 121沈明炜
    其他参考文献 博客园、百度、CSDN

    1.我的GitHub仓库

    仓库地址

    2.PSP表格

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

    3.解题思路描述

    确定使用java进行开发,根据要求是读取文件然后进行统计并且输出,所以可以先进行初始,然后读取文件,接着对读取的结果进行统计,然后将统计结果输出到指定文件。
    图片

    4.设计实现过程

    根据流程图解决问题
    图片

    5.代码说明

    • 新增province类
    //省份类
    class Province
    { 
        private String name;    //省份名称
    
        private int cure;    //治愈人数
    
        private int dead;    //死亡人数
        
        private int suspectedPatients;    //疑似人数
    
        private int infectionPatients;    //感染人数  
        
        public Province(String n)
        {
            name = n;
        }
        //感染人数增长
        public void addIp(String str)
        {
            str = str.substring(0, str.length()-1);
            infectionPatients += Integer.parseInt(str);
        }
        //感染人数减少
        public void removeIp(String str)
        {
            str = str.substring(0, str.length()-1);
            infectionPatients -= Integer.parseInt(str);
        }
        //疑似人数增长
        public void addSp(String str)
        {
            str = str.substring(0, str.length()-1);
            suspectedPatients += Integer.parseInt(str);
        }   
        //疑似人数减少
        public void removeSp(String str)
        {
            str = str.substring(0, str.length()-1);
            suspectedPatients -= Integer.parseInt(str);
        }
        //治愈人数增长
        public void cure(String str)
        {
            str = str.substring(0, str.length()-1);
            cure += Integer.parseInt(str);
            infectionPatients -= Integer.parseInt(str);
        }   
        //死亡人数增长
        public void dead(String str)
        {
            str = str.substring(0, str.length()-1);
            dead += Integer.parseInt(str);
            infectionPatients -= Integer.parseInt(str);
        }
        //省份情况
        public void output(boolean isOutput, String[] output, BufferedWriter bw) throws IOException
        {
            if (isOutput)
            {
                bw.write(name + " 感染患者 " + infectionPatients + "人 "
                    + "疑似患者 " + suspectedPatients + "人 "
                    + "治愈 " + cure + "人 "
                    + "死亡 " + dead + "人");
                bw.newLine();
            }        
            else
            {
                bw.write(name);
                for (int i = 0; i < 4; i ++ )
                {
                    switch (output[i])
                    {
                        case "ip":                  
                            bw.write(" 感染患者 " + infectionPatients + "人");           
                            break;
                        case "sp":                  
                            bw.write(" 疑似患者 " + suspectedPatients + "人");               
                            break;
                        case "cure":                    
                            bw.write(" 治愈 " + cure + "人");                  
                            break;
                        case "dead":                    
                            bw.write(" 死亡 " + dead + "人");          
                            break;
                        default:                
                            break;
                    }
                }
                bw.newLine();
            }       
        }       
        //全国
        public void allAdd(Province p)
        {
            this.infectionPatients += p.infectionPatients;
            this.suspectedPatients += p.suspectedPatients;
            this.cure += p.cure;
            this.dead += p.dead;
        }
    }
    
    • 初始化命令行如-province等
        //初始化
        public void init()
        {
            for (int i = 0; i < arg.length; i ++ )
            {           
                switch (arg[i])
                {
                    case "-date":
                        date = new String(arg[i+1]);
                        isRead = false; 
                        break;
                    case "-log":
                        logPath = new String(arg[i+1]);
                        break;
                    case "-out":
                        outputPath = new String(arg[i+1]);
                        break;
                    case "-type":
                        isOutput = false;
                        dealType(i+1);
                        break;
                    case "-province":
                        isOutputAll = false;
                        dealProvince(i+1);
                    default:    
                        break;
                }           
            }
        }
        //-province参数
        public void dealProvince(int index) 
        {
            while (index < arg.length)
            {
                switch (arg[index])
                {
                    case "-date":
                        return;
                    case "-log":
                        return;
                    case "-out":
                        return;
                    case "-type":
                        return;
                    default:
                        provinces.add(arg[index]);
                        map.put(arg[index], null);
                }   
                index ++ ;
            }               
        }
    
    • 读取文件及处理数据 deal函数处理所有的文件。
        //日志文件
        public void deal() throws IOException
        {               
            String logDate;     
            String[] sArray;
            File file = new File(logPath);
            File[] tempList = file.listFiles();
            
            if (!isRead)
            {
                logDate = new String(tempList[tempList.length-1].getName());                      
                sArray = logDate.split("\.");                    
                logDate = new String(sArray[0]);
                if ((logDate.compareTo(date)) < 0)
                {
                    isFinish = true;
                    System.out.println("日期超出范围!");
                    return;
                }
            }
    
            for (int i = 0; i < tempList.length; i ++ )                   
            {                
                logDate = new String(tempList[i].getName());                      
                sArray = logDate.split("\.");                    
                logDate = new String(sArray[0]);
                                                            
                if (isRead || (logDate.compareTo(date)) <= 0)                      
                {                 
                    BufferedReader br = null;               
                    String line = null;         
                    br = new BufferedReader(new InputStreamReader(new FileInputStream(tempList[i].toString()), "UTF-8"));  
                    
                    while ((line = br.readLine()) != null)
                    {
                        String[] array = line.split(" ");
                        dealOneLine(array);
                    }          
                    br.close();
                }                               
            }
            allStatistic();
        }
            
        private void dealOneLine(String[] array) 
        {
            if (array[0].equals("//"))
            {
                return;
            }
    
            if (map.get(array[0]) == null)
            {
                map.put(array[0], new Province(array[0]));  
            }
                            
            switch (array[1])
            {
                case "新增":
                    if (array[2].equals("疑似患者"))
                    {
                        map.get(array[0]).addSp(array[3]);
                    }
                    else
                    {
                        map.get(array[0]).addIp(array[3]);
                    }
                    break;
                case "感染患者":
                    map.get(array[0]).removeIp(array[4]);
                    if (map.get(array[3]) == null)
                        map.put(array[3], new Province(array[3]));
                    map.get(array[3]).addIp(array[4]);
                    break;
                case "疑似患者":
                    if (array[2].equals("流入"))
                    {
                        map.get(array[0]).removeSp(array[4]);
                        if (map.get(array[3]) == null)
                            map.put(array[3], new Province(array[3]));
                        map.get(array[3]).addSp(array[4]);
                    }
                    else
                    {
                        map.get(array[0]).addIp(array[3]);
                        map.get(array[0]).removeSp(array[3]);
                    }
                    break;
                case "死亡":
                    map.get(array[0]).dead(array[2]);
                    break;
                case "治愈":
                    map.get(array[0]).cure(array[2]);
                    break;
                case "排除":
                    map.get(array[0]).removeSp(array[3]);
                    break;
                default:
                    break;
            }   
        }
    
    • 将统计数据输出到指定文件
        //生成输出文件
        public void output() throws IOException
        {
            if (isFinish)
            {
                return;
            }
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8"));
            if (isOutputAll)
            {
                country.output(isOutput,output,bw);
                for (int i = 0; i < name.size(); i ++ )
                {   
                    if (map.get(name.get(i)) != null)
                    {
                        map.get(name.get(i)).output(isOutput, output, bw);
                    }                
                }
            }
            else
            {
                if (provinces.contains("全国"))
                {
                    country.output(isOutput,output,bw);
                }
                for (int i = 0; i < provinceName.length; i ++ )
                { 
                    if (provinces.contains(provinceName[i]))
                    {
                        if (map.get(name.get(i)) == null)
                        {
                            map.put(provinceName[i], new Province(provinceName[i]));
                        }
                        map.get(provinceName[i]).output(isOutput, output, bw);
                    }                
                }
            }
            bw.write("// 该文档并非真实数据,仅供测试使用");
            bw.close();
        }
    

    6.单元测试截图和描述

    • 测试listout1.txt
      图片
    • 测试listout2.txt
      图片
    • 测试listout3.txt
      图片
    • 测试默认日期、省份、类型
      图片
    • 测试全国,浙江,福建
      图片
    • 测试默认输出
      图片
    • 测试指定类型的输出
      图片

    7.单元测试覆盖率优化和性能测试,性能优化截图和描述

    • 性能测试
      图片

    8.代码规范链接

    代码规范

    9.心路历程与收获

      我在这次的作业中可以说是一波三折了,先是作业开始前浪了两天,要开始的时候电脑给我踹下床屏幕坏了,修了好几天,属实难受,到后面就只能赶工,但是后面发现越赶,出错越多,反而是让我的效率更低,而且因为赶工很多东西在网上搜索了,照本宣科,也来不及记忆就强行使用,直接导致的就是,原本我可能在这次作业中的收获是十分,现在可能只有3分,不仅过程难受,结局也难受。
      还有就是,我发现自己对java这门语言的掌握程度非常低,编程过程中一度想改为c++,几乎要实现什么功能都只能上网搜,看GitHub,参考代码,非常的难受,这也让我明白了耀掌握一门语言,一定要经常的去使用它,同时也让我对自己的拖延症有了一个新的程度的认识,真的不应该拖延工作,因为不知道什么时候意外状况就来了,要反思。

    10.技术路线图相关的5个仓库

    • 仓库1:记录了一些技术摘要,部分文章来自网络,本项目的目的力求分享精品技术干货,以Java为主
      java-bible
    • 仓库2:汇总java生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识
      technology-talk
    • 仓库3:Java Core Sprout:处于萌芽阶段的 Java 核心知识库。
      JCSprout
    • 仓库4:从Java基础、JavaWeb基础到常用的框架再到面试题都有完整的教程,几乎涵盖了Java后端必备的知识点
      3y
    • 仓库5: 一份涵盖大部分Java程序员所需要掌握的核心知识。
      JavaGuide
  • 相关阅读:
    java----session
    js封装成插件-------Canvas统计图插件编写
    js封装成插件
    js学习--变量作用域和作用域链
    学习js函数--自执行函数
    学习js函数--函数定义
    footer不满一屏时在最底部,超出一屏时在页面最下部
    ios 点击区域阴影问题
    提交表单后数据返回时间过长
    点击显示video
  • 原文地址:https://www.cnblogs.com/shenmw/p/12333049.html
Copyright © 2011-2022 走看看