软件工程实践第二次作业——个人实战

222000135尼加提 学生 2023-06-12 21:45:08
这个作业属于哪个课程2023软工W班
这个作业要求在哪里软件工程实践——个人实战
这个作业的目标
其他参考文献

第二次作业—个人实战

1.Gitcode项目地址

地址: 点击这里

2.PSP表格

PSP阶段预估耗时(分钟)实际耗时(分钟)
Planning(计划)2525
• Estimate(估计这个任务需要多少时间)2525
Development(开发)710900
• Analysis(需求分析,包括学习新技术)6595
• Design Spec(生成设计文档)3035
• Design Review(设计复审)1015
• Coding Standard(代码规范,为目前的开发制定合适的规范)1520
• Design(具体设计)6070
• Coding(具体编码)450540
• Code Review(代码复审)5075
• Test(测试,自我测试,修改代码,提交修改)7070

3. 解题思路描述

. 使用 Python 爬虫框架,如 requests 和 BeautifulSoup,进行网页爬取

. 找到目标网页的 URL,并向该 URL 发送 GET 请求

. 获取响应内容,并使用 BeautifulSoup 进行 HTML 解析

img

指令解析:


public class Parser {

public static String parseCommand(String content) {

String[] parts = content.split(" ");

if (parts.length == 1 && (parts[0].equals("count") || parts[0].equals("players"))) {

return parts[0];

} else if (parts.length == 2 && parts[0].equals("team")) {

return "team";

} else if (parts.length == 2 && parts[0].equals("result")) {

return "result";

} else {

return "invalid";

}

}

}

JSON 解析:


public class Parser {

public static String parseJSON(String json, String command) {

if (command.equals("players")) {

return parsePlayers(json);

} else if (command.equals("result")) {

return parseResult(json);

} else {

return "invalid";

}

}

private static String parsePlayers(String json) {

JSONArray players = JSON.parseArray(json);

StringBuilder builder = new StringBuilder();

for (int i = 0; i < players.size(); i++) {

JSONObject player = players.getJSONObject(i);

String id = player.getString("id");

String name = player.getString("name");

String shortName = player.getString("short_name");

String teamId = player.getString("team_id");

builder.append(id).append(" ").append(name).append(" ").append(shortName).append(" ").append(teamId).append("\n");

}

return builder.toString();

}

private static String parseResult(String json) {

JSONObject obj = JSON.parseObject(json);

String date = obj.getString("date");

JSONArray games = obj.getJSONArray("games");

StringBuilder builder = new StringBuilder();

for (int i = 0; i < games.size(); i++) {

JSONObject game = games.getJSONObject(i);

String team1Id = game.getString("team1_id");

String team2Id = game.getString("team2_id");

int team1Score = game.getIntValue("team1_score");

int team2Score = game.getIntValue("team2_score");

builder.append(date).append(" ").append(team1Id).append(" ").append(team2Id).append(" ").append(team1Score).append(" ").append(team2Score).append("\n");

}

return builder.toString();

}

}

4接口设计和实现过程

1.类设计

//主类,包括main函数,传入实参input.txt和outp.txt

public class AOSearch {

public static void main(String[] args) {

Lib lib = new Lib();

List input_content = lib.input_txt_analyse(args[0]);

List output_content = lib.operate(input_content);

lib.output_txt_operate(output_content, args[1]);

}

}

//核心类,包括文件解析和指令解析的函数

public class Lib {

private List playersList;

private List resultList;

public Lib() {

playersList = new ArrayList<>();

resultList = new ArrayList<>();

}

public List operate(List input_content) {

List output_content = new ArrayList<>();

for (String content : input_content) {

String command = content_analyse(content);

switch (command) {

case "players":

String players_content = players_analyse();

output_content.add(players_content);

break;

case "result":

String date = content.split(" ")[1];

String result_content = result_analyse(date);

output_content.add(result_content);

break;

case "count":

int count = playersList.size();

output_content.add(String.valueOf(count));

break;

case "team":

String team_id = content.split(" ")[1];

List names = get_name(team_id, resultList.get(0));

if (names == null) {

output_content.add("Error: team not found!");

} else {

output_content.addAll(names);

}

break;

default:

output_content.add("Error: command not found!");

break;

}

}

return output_content;

}

//以下为之前的函数,无需更改

//功能:打开input.txt,按行读取文件

//参数:输入文件的路径

//返回:存放每行内容的List

public static List input_txt_analyse(String path) {

//...

}

//功能:解析input.txt的行内容

//参数:行内容

//返回:规定的指令类型

public static String content_analyse(String content) {

//...

}

//功能:解析players.json

//返回:存放players内容的字符串

public static String players_analyse() {

//...

}

//功能:解析result.json

//参数:日期

//返回:存放指定日期的比赛结果的字符串

public static String result_analyse(String date) {

//...

}

//功能:返回team_id对应的player名字并判断人数

//参数:team_id和result类

//返回:人名简写

public static List get_name(String team_id, JResult result) {

//...

}

//功能:将指令结果存入output.txt

//参数:存放对应指令的List集合,output.txt文档名字

public static void output_txt_operate(List input_content, String output_name) {

//...

}

}

//选手类,类成员名称与所需要的Json属性一一对应

public class JPlayers {

private String id;

private String name;

private String short_name;

private String team_id;

//...

}

//结果类,类成员名称与所需要的Json属性一一对应

public class JResult {

private String date;

private List games;

//...

}

public class JGame {

private String team1_id;

private String team2_id;

private int team1_score;

private int team2_score;

//...

}

5.心得体会

在开发过程中,文件划分和代码规范性都是非常重要的。一个良好的文件结构和规范的代码可以让程序更易于维护和扩展。因此,在开发前需要先思考如何划分文件,如何组织代码。此外,需要注意代码的规范性,包括变量命名、注释、缩进等方面。这不仅能提高代码的可读性,还能减少出错的概率。

另外,初期开发阶段应该抓住大体,让程序能够跑起来,而不是过于注重细节。当然,这并不意味着可以忽略细节,只是在不确定方向的情况下,应该先实现基本功能,然后再逐步完善。这样可以提高开发效率,并且不容易陷入无限调试的泥潭。

遇到问题时,首先应该自己尝试解决,但如果解决进展不顺,可以考虑与其他同学交流,或者寻求老师的帮助。在交流过程中,可能会得到新的启发,也能够扩展自己的知识面。除此之外,还可以参考一些经典的编程书籍,如《代码大全》、《重构》等,这些书籍可以帮助我们更好地理解编程思想和技巧,提升自己的编程能力。

...全文
712 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
代码下载地址: https://pan.quark.cn/s/ee8627e4e6d7 ABAP调试器是一种功能强大的工具,可用于在执行期间对ABAP代码进行检验。除了常规的核心功能(例如逐行运行代码以及检验变量、字段符号和引用的值)之外,它还提供了一些辅助性的特性,能够简化并压缩调试话的时长。并非所有使用者都熟悉这些辅助特性。SAP ABAP调试器是处理和优化ABAP代码开发与维护工作的核心资源,它配备了多样的功能来协助开发人员在运行状态下进行检验和排除故障。此资源着重阐述了ABAP调试器的一些高级特性,涵盖了深入分析调用堆栈、系统级调试、更新话调试以及提升调试效率的方法。 1. **深入分析调用堆栈**:除了常规的应用程序调试,开发人员有时需要对调用堆栈的内部层级进行深入调试,特别是在错误出现在异步执行的更新处理或系统级程序时。通过启用**系统级调试**,可以访问通常不公开的系统代码,但这也导致调用堆栈的显著增加,因此需要审慎操作。 2. **系统级调试**:对于不含业务逻辑的系统级程序,开发人员通常无需进行调试。然而,在特定情形下,例如进行错误追踪时,可能需要进入系统代码。借助调试器的“系统调试启用/禁用”选项,可以赋予对系统程序的调试权限。 3. **更新话调试**:在处理异步更新任务,例如持久化业务数据时,错误可能发生在更新任务内部。激活**更新话调试**,在更新任务完成后,调试器将自动启动,展示执行路径。比如,在变更成本中心后,通过输入调试指令 "/h" 启动调试,保存后能够看到更新过程中的错误。 4. **分析调用堆栈**:在进行深入调试时,调用堆栈是至关重要的。通过分析调用堆栈,能够定位到引发问题的具体位置,如在VB_V2_NORMAL...

688

社区成员

发帖
与我相关
我的任务
社区描述
2023年福州大学软件工程实践课程W班的教学社区
软件工程团队开发软件构建 高校 福建省·福州市
社区管理员
  • FZU_SE_teacherW
  • 张书旖
  • 郭渊伟
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧