哈工大软件构造Lab1
1 实验目标概述
本次实验通过求解三个问题,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
l 基本的Java OO编程
l 基于Eclipse IDE进行Java编程
l 基于JUnit的测试
l 基于Git的代码配置管理
2 实验环境配置
JDK环境,大一学习Javaee课程时配置的jdk8环境,环境变量等配置时遇到一些问题,通过网络搜索自学解决。
配置Eclipse环境时,一开始按照指导手册的教程一步步安装,中间导入URL等环节出现许多问题,于是直接放弃指导手册,自己一路点击next与finish进行安装,所幸成功安装eclipse。由于对全英文开发环境不太熟悉,网上搜索了eclipse简体中文环境的配置方法,具体参考
https://blog.csdn.net/qq_43015730/article/details/89225747
下载的eclipse自带Junit环境,但需要在eclipse设置中自行调用,一开始并不太懂应该怎么调用Junit,在运行P2的turtle的test文件时,因未配置Junit环境导致出错,在报错的行ctrl+1进行修改,成功配置Junit4环境。
在使用git的过程中遇到了非常多的问题,前后花了很长时间才将git环境配置好,一开始按照实验指导手册的Git指导书学习,但指导书内容过于繁杂,重点不突出,很多细节问题都没有解答,于是直接放弃指导书,同学间交流和网络上自行搜索成功配置好Git环境。
参考过非常多网站,如
https://www.cnblogs.com/dfsxh/articles/10959383.html
在这里给出你的GitHub Lab1仓库的URL地址。
https://github.com/ComputerScienceHIT/HIT-Lab1-1181910201
3 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1 Magic Squares
要求1:在 main()函数中调用五次 isLegalMagicSquare()函数,将 5 个文本文件名作为参数输入,读入文本数据,判断输入的数据能否构成一个MagicSquare,若是则返回true,若不是或格式错误,则返回false且说明原因。
要求2:对给出的generateMagicSquare函数扩展,根据参数n生成一个MagicSquare并写入文本6.txt中,然后判断其是否为MagicSquare。输入为奇数能生成MagicSquare返回true,输入偶数或者负数会返回false。
3.1.1 isLegalMagicSquare()
设计思路:首先读入txt文本文件,然后进行判断题目要求的三个条件:
1. 行列数不相等,并非矩阵:每读入一行row++,计算总行数,将每一行按照\t分隔存入数组,判断每一行的列数是否与行数相等,若存在不相等,返回false。
2. 矩阵中的某些数字并非正整数:每一行按照\t分隔存入数组后,判断数组元素有无”-”或”.”,有则说明有负数或小数,返回false
3. 数字之间并非使用\t 分割:对Integer.valueOf使用try catch方法,若不是以 \t作为分隔符则抛出异常信息,返回false。
对错误类型进行判断输出错误类型并返回false,当判断完毕没 格式错误时,将读入的数据存入到矩阵中,判断每一行,每一列,对角线的和是否相等,满足MagicSquare 则返回true,若有不相等则返回false
测试结果:

3.1.2 generatelMagicSquare()
流程图

合法输入判断

测试样例


3.2 Turtle Graphics
要求:1.完善drawSquare函数,画出一个正方形
2.完善calculateRegularPolygonAngle函数计算正多边形内角
3.完善calculatePolygonSidesFromAngle函数,由正多边形内角 得到边数
4.完善drawRegularPolygon函数,画正多边形
5.完善calculateBearingToPoint计算从一个点到另一个点所转过的角度,
6.完善calculateBearings函数,给定一组点,计算每次转过的角度并返回集合,
7.完善convexHull函数计算一系列点中的凸包,使用junit进行单元测试。
8.调用函数绘制自己的图形
3.2.1 Problem 1: Clone and import
从实验手册的网站git clone下载P2的包,解压导入eclipse项目中。
1.获取秘钥:
2.找到秘钥并复制添加到github上;
本地Git提交,push到GitHub:
1. git add ;
2. git commit -m " " ;
3. git push
参考https://www.cnblogs.com/dfsxh/articles/10959383.html
3.2.2 Problem 3: Turtle graphics and drawSquare
行进四次,每次转90度

测试结果

3.2.3 Problem 5: Drawing polygons
正多边形内角=(边数-2)*180/边数
画多边形时每次前进偏转外角度数即可


3.2.4 Problem 6: Calculating Bearings
调用atan2函数得到两点间偏转弧度,toDegree转换成角度,减去当前偏角即为偏转角度,计算一组点,反复调用两点的函数即可


3.2.5 Problem 7: Convex Hulls
利用Gift wrapping 算法计算凸包,先找到最左下角的点作为初始点加入集合,然后比较剩余点到此点的偏转角,找到偏转角最小的加入集合,当偏转角相同时,找到最长的一条边的点加入集合,直到返回初始点最后得到凸包的点集。
//这部分源代码过长贴不下,请看源文件
3.2.6 Problem 8: Personal art


3.2.7 Submitting
Junit测试

3.3Social Network
用Person和FriendshipGraph两个类模拟社交网络图,Person模拟图的顶点,FriendshipGraph模拟关系,getDistance能够计算出每两个Person之间的最短路径。
3.3.1设计/实现FriendshipGraph类
定义Person数组来储存所有的顶点,构造方法

addVertex添加对象,若新对象名字与已有名字重复,打印错误,退出

addEdge添加边(顶点间的关系),在Person a对象数组friend的里添加b,单向

因为边权重为1,可以使用广度优先搜索求两点间最短路径,调用类HashMap,用temp临时存储a1到各个点的最短距离,调用队列,将a1入队后按广度优先搜索的方法不断入队出队,更新temp中各顶点当前最短路径,直到有到a2的路径为止,返回最短距离

3.3.2设计/实现Person类

3.3.3设计/实现客户端代码main()

3.3.4设计/实现测试用例
给出你的设计和实现思路/过程/结果。
对于addVertex,设计用例,建立四个Person对象,执行addVertex,判断vertex里面这些对象。
对于addEdge,设计test用例,建立四个Person对象,执行addVertex后,执行addEdge然后判断每个对象的friend中是否包含即可。
对于getDistance,设计test用例t,建立四个Person对象,执行addVertex后,执行addEdge后,最短距离正确即可。



4 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
|
日期 |
时间段 |
任务 |
实际完成情况 |
|
2021-05-19 |
晚 |
配置环境 |
Git配置未完成 |
|
2021-05-20 |
18.:00- |
配置环境 |
完成 |
|
2021-05-21 |
10:00-13:00 |
编写P1的isLegalMagicSquare函数 |
完成 |
|
2021-05-21 |
15:00-16:00 |
编写P1的generateMagicSquare函数 |
完成 |
|
2021-05-22 |
10:00-14:00 |
完成P2 |
完成 |
|
2021-05-22 |
17:00-21:00 |
完成P3 |
完成 |
|
|
|
|
|
5 实验过程中遇到的困难与解决途径
|
遇到的困难 |
解决途径 |
|
Git配置出现问题
|
网上自己搜,与同学交流学习 |
|
P2测试类时出现问题
|
Eclipse的junit环境未设置,在报错的行ctrl+1进行修改,成功配置Junit4环境。 |
|
P2对礼物包装算法不熟悉
|
网络上搜索算法详细介绍,参考算法的相关代码编写 |
|
P3对Java的广度优先算法编写不太熟悉 |
查阅Java中队列,哈希表等相关类的介绍和用法,成功使用并优化了代码 |
6 实验过程中收获的经验、教训、感想
6.1 实验过程中收获的经验和教训
1.使用java次数少,对java语法不熟悉,许多地方代码优化不好
2.对Git配置不熟悉,出现许多问题
3.对java语言有了更深的理解。
6.2 针对以下方面的感受
(1) Java编程语言是否对你的口味? 还好,有一定java基础但不熟练,Java可使用的类与库非常多,相比c语言可以使代码的编写更加容易,代码更加简洁。
(2) 关于Eclipse IDE;以前用过,用户界面也比较良好,上手也容易,暂时未遇到太多问题
(3) 关于Git和GitHub;环境配置非常麻烦,实验手册的指导完全没有重点,不知道从哪学起,全依靠自己上网搜索和同学交流,希望这门课以后能把Git环境的配置详细地指导给大家,而不是直接照搬MIT的指导手册。
(4) 关于CMU和MIT的作业;虽然有一定难度,但层层递进,锻炼编程能力,Java编程的收获很大。
(5) 关于本实验的工作量、难度、deadline;有一定难度,工作量大,虽然两周时间实验其实还算充裕,但课程时间与其他课程ddl冲突,开课第一周恰逢自动机期末考试和csapp实验ddl,导致实际上的实验时间被大大缩短,希望教务处能平衡好这几门课ddl的冲突.
(6) 关于初接触“软件构造”课程;
实验收获还是很大的,但个人觉得平时上课讲的东西太抽象宽泛,缺乏实际联系,很难理解什么意思,很多同学也听得不知所云,应对考试也就是背知识点做题,很难有实际收获,然而这些部分却占了成绩的大头,希望课程考核和教学方式能有所改革,能更多侧重于实验部分或者提升平日课程内容的质量。



浙公网安备 33010602011771号