软工实践寒假作业(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+"人 "+"
");
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+"
");
}
}
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+"人 "+"
");
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+"
");
}
}
else if(cmd_province.contains(province[i]))
{
if(type.size()==0)
out.write(province[i]+" "+"感染患者"+infected_num+"人 "+"疑似患者"+suspected_num+"人 "+"治愈"+cure_num+"人 "
+"死亡"+death_num+"人 "+"
");
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+"
");
}
}
}
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。