软件工程与UML第二次结对作业

作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/homework/11248
作业目标 学会跳过登录信息进行爬网页数据,熟悉 Git 操作
作业源代码 https://gitee.com/ouyang-xiaoyun/pair
队员1 211806399
队员2 211806425

一. 结对过程

  • 我来啦,我来啦,我带着我的大腿来啦!没错,依旧是熟悉的即将秃头的我带着熟悉的大腿赵贝贝出现啦!鉴于上次作业我抱的大腿令我很快乐,我决定了要一直抱着这个大腿!唉,你别跑啊,在跑我就躺地上碰瓷了(你不能因为我快秃头了就嫌弃我呀,嘤)。这次的结对过程就是很简单,我们互相认定了对方(主要是我死皮赖脸了)。这次的结对作业说实话很匆忙了。属实是我们都天真了,原本以为放假期间会有更多的时间去解决这个作业,于是我们前期大多只是进行了构思。But 我们忘记了我们有些私事放在了放假期间解决。由于双方都有些私事,导致我们时间上有些紧张。 We are fine! (并不)

二. 需求分析

  • 在码云上创建仓库,编写代码从网络上爬取云班课的数据,根据课堂完成部分进行经验值排序,以文本文件输出学号、姓名、经验值、最高经验值、最低经验值和计算出平均经验值。并通过 Git 将代码文件上传到远程码云仓库上。

三. 苦逼的码农过程(秃头警告)

  • 码云上建立仓库pair并添加 .gitignore 文件和开源 license

  • 新建配置文件夹 resour ,将配置文件 config.properties 放入文件夹中

    • 以下图片是配置文件 config.properties 的内容
  • 核心代码部分

    • 新建 Student 类存放学生的学号、姓名和经验值
    • 获取 cookies 和课堂完成部分的地址
String load = java.net.URLDecoder.decode("config.properties","utf-8");
String path = Team.class.getResource(load).getPath();
Properties config = new Properties();   	
config.load(new FileInputStream(path));
Document document =  Jsoup.connect(url)
    // 手动设置cookies
    .header("Cookie",config.getProperty("cookie"))
    .timeout(10000).get();
    //通过cookie获取所有活动的div
    Elements allDivs = document.getElementsByClass("interaction-row");
    //获取课堂完成部分的url(通过列表存储)
    ArrayList<String> urlList = new ArrayList<String>();
    for(int i = 0;i < allDivs.size();i++ ) {
	if (allDivs.text().contains("课堂完成部分")) {
	   String txt = allDivs.toString();
	   Pattern number = Pattern.compile("data-url=\"(\\S+)\"");
	   Matcher matcher = number.matcher(txt);
	     if (matcher.find()) {
	        //获取网页url以String类型
		String urlString = matcher.group(1);
		//获取正确的url
		String reallyUrl = urlString.replace("&amp;", "&");
		//url添加到urlList里
		urlList.add(reallyUrl);	
	}		
   }
}

* 获取每个同学的姓名、学号和经验值
for(int i=0;i<htmlList.size();i++) {
Document studentHtml = Jsoup.connect(urlList.get(i)).header("cookie",config.getProperty("cookie")).get();
Elements stuEle = studentHtml.getElementsByClass("homework-item");
for(Element stu : stuEle) {
    int exp = Integer.parseInt(sort(stu, "(\\d+) 分</span>"));
    stu = stu.getElementsByClass("member-message").first();
    String idStr = stu.select("div").last().text();
    String name = sort(stu, "color: #333;\">(\\S+)</span>");
    //将idStr转换为int类型
	int id = 0;
	if(!idStr.equals("")) {
	    id = Integer.parseInt(idStr);
	}			
	 // 将信息存入对象数组中
	int stuNo = -1;		
	if(!name.equals("")){
	// 对象数组全为空的时候,先放入一个Student对象
	    if (num == 0) {
		listStu[num] = new Student(id, name, exp);
		sum += exp;
		num++;
	    } else {
		stuNo = find(id,listStu,num);// 查询其是否在对象数组中,并记录其下标的值,不存在于数组中为-1
		// 未在对象数组中的,将其加入数组中
			if (stuNo == -1) {
				listStu[num] = new Student(id, name, exp);
				sum += exp;
				num++;
			}
			// 在数组中的,则更新他的经验值
			else {
				listStu[stuNo].setExp(exp + listStu[stuNo].getExp());
				sum += exp;
			}
		}
	}
    }
}
* 排序,生成文本文件输出最高分、最低分和平均值。
Arrays.sort(listStu);
File txt = new File("score.txt");	 		
PrintWriter out = new PrintWriter(new FileWriter(txt));
String first = "最高经验值为:"+listStu[0].getExp()+","+"最低经验值为:"+listStu[num-1].getExp()+","+"平均经验值为:"+sum/num;
out.print(first+"\n");	 		
for(Student stu:listStu)
    out.print(stu.toString()+"\n");
out.close();
* commit 记录

四. 时间规划和代码量

  • 时间规划
需求分析 3小时
准备时间(学习) 5小时
编码时间 5小时
写博客园 2小时
 这个表格不是特别准确,因为是两个人结对完成的,而且大多都是一边编码一边学习就有点分不太开。
  • 代码量

五. 结对感受

  • 这是我们第二次结对完成作业。说实话,体验并没有第一次好,可能是因为代码令人秃头?我们清楚老师作业中的需求是什么,但是,可能是之前的学习不够认真,基础不够扎实,还有对新知识的恐惧。从无到有总是最难的。前期过程中我们都有些逃避代码问题,去思考老师的需求,不愿面对代码。遇到问题也很无措。整个作业的过程都是硬着头皮上的。最后实现的功能也没有达到我们的期望,还是挺遗憾的吧。后面可能我们会再进行改进,加油吧,我和我的大腿!

六. 对对方的评价

  • 对贝贝(大腿)的评价,一个字好,两个字很好。我性格比较急,遇到事情比较容易烦躁,贝贝会给我一个比较安心的感觉。遇到问题有个人一起解决真的是太好了。
  • 我的小云说两个人一起秃头,她很厉害,写博客很溜,代码我碰到不会的就找她问意见,虽然最后还是有问题没解决,但是我们尽力了。真的尽力了!!!!!

七. 参考资料

posted @ 2020-10-03 23:59  欧阳小云  阅读(174)  评论(0编辑  收藏  举报