软工实践寒假作业(2/2)-疫情统计程序
这个作业属于哪个课程 | 2020春|S班 |
---|---|
这个作业要求在哪里 | 软工实践寒假作业(2/2) |
这个作业的目标 | 学习单元测试的基础理论和相应技术、对程序进行测试的覆盖率分析和性能分析并优化、学习Personal Software Process (PSP, 个人开发流程,或称个体软件过程) |
作业正文 | .... |
其他参考文献 | Commint|.gitignore|gitDesktop |
Part-1 GitHub仓库地址
Part-2 PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 50 |
Estimate | 估计这个任务需要多少时间 | 1850 | 1805 |
Development | 开发 | 800 | 850 |
Analysis | 需求分析 (包括学习新技术) | 300 | 270 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 | 30 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 40 |
Design | 具体设计 | 90 | 150 |
Coding | 具体编码 | 360 | 480 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | 150 | 150 |
Test Repor | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 50 |
合计 | 2050 | 1805 |
Part-3 设计思路
1.将命令行的每个参数都设一个变量,参数有值存入,无值为空。
2.建立一个HashMap<String,List
3.读取log文件,获取文件名,文件名按 “.”分割开,判断文件日期与-date参数日期
4.读取log文件内容,按空格分隔开,判断内容属于哪种情况。并执行相应操作
5.输出文件内容,统计Map中需要的省份
Part-4 实现过程
Part-5 代码说明
建立一个HashMap,每个省份都是key,Value值为感染患者、疑似患者、自愈、死亡的人数的一个list表
public static String[] province =new String[]{ "安徽","北京","重庆","福建","甘肃", "广东","广西","贵州","海南","河北", "河南","黑龙江","湖北","湖南","吉林", "江苏","江西","辽宁","内蒙古","宁夏", "青海","山东","山西","陕西","上海", "四川","天津","西藏","新疆","云南","浙江"}; public static Map<String, List<Integer>> province_map=new HashMap<>(); List<Integer> put_list=new ArrayList<>(); for(int i=0;i<4;i++) put_list.add(0);//4数字个顺序表示感染患者、疑似患者、治愈、死亡 for(int i=0;i<province.length;i++ ) province_map.put(province[i],put_list);
日期比较方法
public static boolean CompareDate(String data1, String date2) { DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); try { Date dt1 = df.parse(data1); Date dt2 = df.parse(date2); if (dt1.getTime() > dt2.getTime()) return true; else if (dt1.getTime() < dt2.getTime()) return false; } catch (Exception exception) { exception.printStackTrace(); } return true;
统计人数方法
private static void CalcPeople(String line) { String[] arr = line.trim().split("\\s+");//字符串按空格分割开 String[] str = arr[arr.length - 1].trim().split("人"); int people_num = Integer.parseInt(str[0].trim());//获得人数 if (arr[1].equals("新增")) { if (arr[2].equals("感染患者")) { List<Integer> list = new ArrayList<>(); list.addAll(province_map.get(arr[0])); int value = list.get(0).intValue(); list.set(0, value + people_num); province_map.put(arr[0], list); } else if (arr[2].equals("疑似患者")) { List<Integer> list = new ArrayList<>(); list.addAll(province_map.get(arr[0])); int value = list.get(1).intValue(); list.set(1, value + people_num); province_map.put(arr[0], list); } } else if (arr[2].equals("流入")) { if (arr[1].equals("感染患者")) { List<Integer> list = new ArrayList<>(); list.addAll(province_map.get(arr[0])); int value = list.get(0).intValue(); list.set(0, value - people_num); province_map.put(arr[0], list); List<Integer> list1 = new ArrayList<>(); list1.addAll(province_map.get(arr[3])); int value1 = list1.get(0).intValue(); list1.set(0, value1 + people_num); province_map.put(arr[3], list1); } else if (arr[1].equals("疑似患者")) { List<Integer> list = new ArrayList<>(); list.addAll(province_map.get(arr[0])); int value = list.get(1).intValue(); list.set(1, value - people_num); province_map.put(arr[0], list); List<Integer> list1 = new ArrayList<>(); list1.addAll(province_map.get(arr[3])); int value1 = list1.get(1).intValue(); list1.set(1, value1 + people_num); province_map.put(arr[3], list1); } } else if (arr[1].equals("死亡")) { List<Integer> list = new ArrayList<>(); list.addAll(province_map.get(arr[0])); int value = list.get(3).intValue(); int value1 = list.get(0).intValue(); list.set(3, value + people_num); list.set(0, value1 - people_num); province_map.put(arr[0], list); } else if (arr[1].equals("治愈")) { List<Integer> list = new ArrayList<>(); list.addAll(province_map.get(arr[0])); int value = list.get(2).intValue(); int value1 = list.get(0).intValue(); list.set(2, value + people_num); list.set(0, value1 - people_num); province_map.put(arr[0], list); } else if (arr[1].equals("排除")) { List<Integer> list = new ArrayList<>(); list.addAll(province_map.get(arr[0])); int value = list.get(1).intValue(); list.set(1, value - people_num); province_map.put(arr[0], list); } else if (arr[1].equals("疑似患者")&&arr[2].equals("确诊感染")) { List<Integer> list = new ArrayList<>(); list.addAll(province_map.get(arr[0])); int value = list.get(1).intValue();//疑似 int value1 = list.get(0).intValue();//确诊 list.set(1, value - people_num); list.set(0, value1 + people_num); province_map.put(arr[0], list); } }
输出文件方法
private static void WriteFile(String file_path) { int infected_num=0,suspected_num=0,cure_num=0,death_num=0; try { File writeName = new File(file_path); // 相对路径,如果没有则要建立一个新的output.txt文件 writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖 try (FileWriter writer = new FileWriter(writeName); BufferedWriter out = new BufferedWriter(writer) ) { for(int i=0;i<province.length;i++) { List<Integer> list = province_map.get(province[i]); infected_num = infected_num + list.get(0); suspected_num = suspected_num + list.get(1); cure_num = cure_num + list.get(2); death_num = death_num + list.get(3); } if(cmd_province.contains("全国")||cmd_province.size()==0) { String name="全国"; if(type.size()==0) out.write("全国"+" "+"感染患者"+infected_num+"人 "+"疑似患者"+suspected_num+"人 "+"治愈"+cure_num+"人 " +"死亡"+death_num+"人 "+"\n"); else { for (int n = 0; n < type.size(); n++) { if (type.get(n).equals("ip")) name = name + " 感染患者" + infected_num + "人"; if (type.get(n).equals("sp")) name = name + " 疑似患者" + suspected_num + "人"; if (type.get(n).equals("cure")) name = name + " 治愈" + cure_num + "人"; if (type.get(n).equals("dead")) name = name + " 死亡" + death_num + "人"; } out.write(name+"\n"); } } for(int i=0;i<province.length;i++) { List<Integer> list=province_map.get(province[i]); infected_num=list.get(0); suspected_num=list.get(1); cure_num=list.get(2); death_num=list.get(3); if(cmd_province.size()==0&&((list.get(0)!=0)||(list.get(1)!=0)||(list.get(2)!=0)||(list.get(3)!=0))) { if(type.size()==0) out.write(province[i]+" "+"感染患者"+infected_num+"人 "+"疑似患者"+suspected_num+"人 "+"治愈"+cure_num+"人 " +"死亡"+death_num+"人 "+"\n"); else { String name=province[i]; for(int n=0;n<type.size();n++) { if(type.get(n).equals("ip")) name=name+" 感染患者"+infected_num+"人"; if(type.get(n).equals("sp")) name=name+" 疑似患者"+suspected_num+"人"; if(type.get(n).equals("cure")) name=name+" 治愈"+cure_num+"人"; if(type.get(n).equals("dead")) name=name+" 死亡"+death_num+"人"; } out.write(name+"\n"); } } else if(cmd_province.contains(province[i])) { if(type.size()==0) out.write(province[i]+" "+"感染患者"+infected_num+"人 "+"疑似患者"+suspected_num+"人 "+"治愈"+cure_num+"人 " +"死亡"+death_num+"人 "+"\n"); else { String name=province[i]; for(int n=0;n<type.size();n++) { if(type.get(n).equals("ip")) name=name+" 感染患者"+infected_num+"人"; if(type.get(n).equals("sp")) name=name+" 疑似患者"+suspected_num+"人"; if(type.get(n).equals("cure")) name=name+" 治愈"+cure_num+"人"; if(type.get(n).equals("dead")) name=name+" 死亡"+death_num+"人"; } out.write(name+"\n"); } } } out.write("// 该文档并非真实数据,仅供测试使用"); out.flush(); // 把缓存区内容压入文件 } } catch (IOException e) { e.printStackTrace(); } }
Part-6 单元测试
测试 -date参数
测试 -type -province -date
测试 -date -province
Part-7代码规范
代码规范
Part-8心路历程
学习了很多,提升了自己解决分析题目的能力,第一次看到的感觉就是害怕,有太多自己不会的东西PSP、单元测试优化和性能测试。自己通过百度寻找资源慢慢了解获得了许多的成就感吧,希望自己在以后面对困难的时候不要感到恐惧,要慢慢的,自己一步一步的去克服,战胜它
Part-9FFmpeg学习的相关仓库
android端基于FFmpeg实现
简介:android端基于FFmpeg实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编解码、转Gif动图、画面拼接、视频倒播;音视频合成与分离;音视频解码、同步与播放;FFmpeg本地推流、H264与RTMP实时推流直播;OpenGL+GPUImage实时滤镜;
PHP-FFmpeg
简介:基于PHP实现FFmpeg项目
FFmpegMediaPlayer
简介:FFmpeg实现的播放器
音视频学习实践,从移植ffmpeg库到android平台,混合编译x264库以及fdk-aac库
简介:音视频学习实践,从移植ffmpeg库到android平台,混合编译x264库以及fdk-aac库,到相机音频采集编码推流到RTMP服务器的学习记录
视频直播和播放转码器框架
简介:本demo中的FFmpeg已经编译过了,可以随意拖入到项目中,添加需要的库文件和框架就可以build success。
来源:https://www.cnblogs.com/yexianduan/p/12342533.html