111
社区成员




这个作业属于哪个课程 | 2401_CS_SE_FZU |
---|---|
这个作业要求在哪里 | 软件工程实践第二次作业——个人实战 |
这个作业的目标 | 完成对2024年巴黎奥运会相关数据的收集,并实现一个能够对国家排名及奖牌个数统计的控制台程序。 |
其他参考文献 | 构建之法 |
目录
|
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 2690 | 3105 |
• Analysis | • 需求分析(包括学习新技术) | 1200 | 1300 |
• Design Spec | • 生成设计文档 | 30 | 45 |
• Design Review | • 设计复审 | 30 | 30 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 60 |
• Design | • 具体设计 | 60 | 50 |
• Coding | • 具体编码 | 600 | 720 |
• Code Review | • 代码复审 | 240 | 280 |
• Test | • 测试(自我测试,修改代码,提交修改) | 500 | 620 |
Reporting | 报告 | 110 | 90 |
• Test Report | • 测试报告 | 50 | 40 |
• Size Measurement | • 计算工作量 | 30 | 30 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 20 |
合计 | 2830 | 3225 |
首先需要获取网站的数据,存储到data目录中,随后根据input.txt中的内容,将处理好的数据输入到output.txt中
使用浏览器插件Instant Data Scraper 爬取每日赛程数据和奖牌榜数据,简单高效,但爬取后的数据还需要进一步修改来和输出要求相匹配
一共要实现两种功能,输出每日赛程和选手奖牌榜,要实现可以读入多行数据并判断每行输入是否合法,先检测total与schedule,若为total则输出选手奖牌榜,schedule需要跳过空格读取日期,还要判断日期是否合法,如果不合法输出N/A,其余输入都将报错输出Error和分隔符
读取奖牌榜文件并输出至输出文件
读取每日赛程文件并输出至输出文件
判断schedule 日期是否合法,如果日期不合法则返回false,但不会中止程序进行,保证了程序的连续性,从开始到结束能够平滑地运行,不会因为错误、异常或外部干扰而中断。
private static void processInput(String inputLine, String dataDirPath, BufferedWriter writer) throws IOException {
if ("total".equals(inputLine)) {
String rankFilePath = dataDirPath + File.separator + "rank.txt";
Lib.readRankFile(rankFilePath, writer);
} else if (inputLine.startsWith("schedule")) {
String[] parts = inputLine.split("\\s+", 2);
if (parts.length == 2) {
String date = parts[1];
if (Lib.isDuringOlympics(date)) {
String scheduleFilePath = dataDirPath + File.separator + date + ".txt";
Lib.readScheduleFile(scheduleFilePath, writer);
} else {
writer.write("N/A");
writer.newLine();
writer.write("-----");
writer.newLine();
}
} else {
writer.write("Error");
writer.newLine();
writer.write("-----");
writer.newLine();
}
} else {
writer.write("Error");
writer.newLine();
writer.write("-----");
writer.newLine();
}
}
public static void readRankFile(String rankFilePath, BufferedWriter writer) {
try (BufferedReader rankReader = new BufferedReader(new InputStreamReader(new FileInputStream(rankFilePath), StandardCharsets.UTF_8))) {
String line;
while ((line = rankReader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
} catch (IOException e) {
System.err.println("I/O error occurred: " + e.getMessage());
e.printStackTrace();
}
}
public static void readScheduleFile(String scheduleFilePath, BufferedWriter writer) {
try (BufferedReader scheduleReader = new BufferedReader(new InputStreamReader(new FileInputStream(scheduleFilePath), StandardCharsets.UTF_8))) {
String line;
while ((line = scheduleReader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
} catch (IOException e) {
System.err.println("I/O error occurred: " + e.getMessage());
e.printStackTrace();
}
}
public static boolean isDuringOlympics(String date) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("MMdd");
Date olympicStart = sdf.parse("0724");
Date olympicEnd = sdf.parse("0811");
Date givenDate = sdf.parse(date);
return givenDate.compareTo(olympicStart) >= 0 && givenDate.compareTo(olympicEnd) <= 0;
} catch (ParseException e) {
System.err.println("ParseException caught: " + e.getMessage());
e.printStackTrace();
return false;
}
}
使用了缓冲(Buffering)来提高 I/O 性能的,特别是在处理文件读写操作时。缓冲的基本原理是将数据暂存到内存中的一个缓冲区,当缓冲区满或者显式地调用刷新操作时,再将数据一次性写入到磁盘或从磁盘读取。这样可以减少实际的 I/O 操作次数,从而提高性能。提将小的、频繁的数据请求合并为较大的、
较少的传输,从而提高数据传输的效率。
使用Junit4框架
1.测试 "total" 指令读取排名文件
2.测试 "schedule" 指令与有效日期
3.测试 "schedule" 指令与无效日期
4.测试 "schedule" 指令缺少日期
5.测试未知指令
6.测试空行输入
7.测试 "total" 指令但文件不存在
8.测试 "schedule" 指令但文件不存在
9.测试输入包含额外空白
10.测试输入包含非预期字符
捕获IOException、ParseException、FileNotFoundException来实现,当文件未找到时会提示调用者"File not found",其他类型的I/O异常、解析字符串日期时也会提示调用者异常的出现
学习了爬虫技术和测试技术,编程方面难度不大,完成的也比较顺利,前期数据处理和后期的代码测试花费了大量时间,深刻体会到了项目开发的不容易,也对自己的能力有更深刻的认知,在软件开发这个领域,还有很多知识需要学习,还有很长的路要走。