目录
1 实验目标概述… 1
2 实验环境配置… 1
3 实验过程… 1
3.1 Magic Squares 1
3.1.1 isLegalMagicSquare(). 1
3.1.2 generateMagicSquare(). 1
3.2 Turtle Graphics 1
3.2.1 Problem 1: Clone and import 2
3.2.2 Problem 3: Turtle graphics and drawSquare. 2
3.2.3 Problem 5: Drawing polygons 2
3.2.4 Problem 6: Calculating Bearings 2
3.2.5 Problem 7: Convex Hulls 2
3.2.6 Problem 8: Personal art 2
3.2.7 Submitting. 2
3.3 Social Network. 2
3.3.1 设计/实现FriendshipGraph类… 2
3.3.2 设计/实现Person类… 2
3.3.3 设计/实现客户端代码main(). 2
3.3.4 设计/实现测试用例… 3
4 实验进度记录… 3
5 实验过程中遇到的困难与解决途径… 3
6 实验过程中收获的经验、教训、感想… 3
6.1 实验过程中收获的经验和教训(必答)… 3
6.2 针对以下方面的感受(必答)… 3
- 实验目标概述
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。
另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
- 实验环境配置
简要陈述你配置本次实验所需开发、测试、运行环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
在这里给出你的GitHub Lab1仓库的URL地址:
https://github.com/ComputerScienceHIT/HIT-Lab1-120L020131.git
https://github.com/ComputerScienceHIT/HIT-Lab1-120L020131
开发测试环境:IDEA2022
- 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
-
- Magic Squares
本实验通过读入文件判断是否是“Magic Square”,重点有:
1.读入文件操作;
2.判断文件中数字排版是否符合规则;
3.判断得到的数字是否是矩阵,如果是矩阵则判断是否是“Magic Square”。
再加上后面的generateMagicSquare()生成函数,本问题一共有4个重点。
-
-
- isLegalMagicSquare()
-
按步骤给出你的设计和实现思路/过程/结果。
首先是读入文件操作,将txt中的文件读入到程序中
然后利用正则表达式逐行读判断读入的是否是数字、是否是采用制表符分开数字以及数字是否符合规则,如果都符合则存入二维数组中,并检测矩阵是否是正方形。
最后判断矩阵是否是magic square,较简单,不过多阐述,详见代码部分
-
-
- generateMagicSquare()
-
绘制部分省略。
解释:按一条斜线填充,我们以n个数字一组,按这种方式每次填充保证了每行或每列所填充的数字与均值的差距都不同,从-(n-1)/2到(n-1)/2,这样就确保了每行或每列的平均值最后相同。对角线上的数字同理。所以最终能得到 “magic square”。
测试结果:
每行每列或对角线之和都是65,成功。
扩展:(1)写入文件
使用相应方法,修改一下函数的循环内容即可
(2)以false退出
这个也简单,用if判定即可
然后是利用之前写的函数进行判断,直接调用即可
结果正常。
-
- Turtle Graphics
该任务需要掌握git用法,同时使用java实现给定功能,具体如下:
-
-
- Problem 1: Clone and import
-
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发:
使用git clone指令获取P2相关文件
由于我移动了文件位置,所以重新创建一个git 仓库:使用cd指令进入仓库后使用git init创建.git子目录,然后开始后续工作。
-
-
- Problem 3: Turtle graphics and drawSquare
-
由于本人使用的是idea进行开发,首先将所有package turtle改成package P2.turtle确保正常。
接下来是进行drawSquare函数的开发,只需要调用forward()移动边长长度然后调用turn()转90°,循环四次即可。
- Problem 5: Drawing polygons
先计算内角,然后计算turn需要的转向角(或者直接计算外角),然后仿照drawSquare()即可。
以五边形为例:
此外TurtleSoup.java中还有一个要求里没有提到(或者是我没找到)的calculatePolygonSidesFromAngle函数,一并实现(计算外角除360即可),测试成功:
- Problem 6: Calculating Bearings
先计算两点形成的直线与y轴的夹角,再减去初始朝向角即可得到需要的角度,如果是负数则再加上360即可。
30初始角度,从(0,1)到(0,0)的测试结果正确
接下来写calculateBearings,简单运用上文写的函数即可。
以[0,0,1,1]和[1,0,0,1]测试,得到
正确。
Test里也通过:
- Problem 7: Convex Hulls
这是一个凸包问题,这里采用经典的gift-wrapping 算法,即先找到最左边的一个点(这个点显然在边界上),然后从这个点开始每次遍历所有点,把转动角(用上文的calculateBearingToPoint函数计算)最小的点加入到Set中,然后再以这个点为起点继续遍历,直到形成一个封闭图形为止,平均时间复杂度为O(nlogn)。(不到3个点时,所有点均应该在Set中,这个要特殊考虑)
具体实现见代码,test测试通过:
自此所有测试均通过。
- Problem 8: Personal art
画了一个12芒星
- Submitting
首先git clone 仓库到本地,然后将要上传的复制到目录中,commit后使用git push -u origin master指令上传即可
-
- Social Network
这是一个图论问题,包含添加顶点、添加边、计算距离。
-
-
- 设计/实现FriendshipGraph类
-
构建数据结构“图”即可,包含addVertex和addEdge 使用常规的图操作即可。
其中addVertex检测加入的新Person的name是否与已有重复,如果重复则返回false。(n为图包含节点数,虽然本任务不会使用,但仍加入以便未来拓展)
getDistance方法采用改造的广度优先搜索算法,具体的改动是:新建一个临时队列用于保存广度搜索得到的下一层结果,当一层扫描完毕后,将临时队列里的元素赋予广搜使用的队列继续广搜。这样的好处是在已知起点终点的情况下,使得distance便于计算,具体代码见github上文件。
-
-
- 设计/实现Person类
-
Person类包含name以及朋友列表friends即可。
-
-
- 设计/实现客户端代码main()
-
按照实验手册上构建即可。
-
-
- 设计/实现测试用例
-
首先测试addVertex和addEdge,只需新建一个列表,逐条加入Person并同步检查相应方法是否有效即可。
验证getDistance时的图:
比较有代表性的测试是:A到A(测试自己)、A到B(测试相邻)、A到D(测试是否按最短路径走)、A到G(同上)、A到F(不相连的情况)
构建相应测试代码测试即可。
发现是idea必须把turtle改成P2.turtle才能正常编译 |
- 实验过程中收获的经验、教训、感想
- 实验过程中收获的经验和教训(必答)
学会了很多java知识以及git知识,详细了解到了github这个 站,收获了很多新的编程机巧,回忆了许多已经学过的编程技巧,自学能力有了飞的突破
-
- 针对以下方面的感受(必答)
- Java编程语言是否对你的口味熟悉的其他编程语言相比,Java有何优势和不足li>
Java语言很不错,作为一款适合OOP的语言,比C语言使用函数方便,不足在缺少了指针,很多地方需要用别的方法代替。
- 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;
优势:比起记事本编程给用户提供了良好的编程环境。
不足:Eclipse高版本不支持低版本java,导致很多同学按照教程上安装时出现问题,IDEA收费。
- 关于Git和GitHub,是否感受到了它在版本控制方面的价值;
现阶段由于工程量小没有明显感受,相信以后会感受到的
- 关于CMU和MIT的作业,你有何感受;
作业不错,但建议HIT进行本地化,而不是直接照搬。
- 关于本实验的工作量、难度、deadline;
工作量:大;难度:对新接触java的同学来说难度不小;deadline:触底完成,时间全花在学java上,建议延长时间。
- 关于初接触“软件构造”课程;
课挺好,唯一的问题是没有提前告知必须使用java(提前一周不算,至少提前到开学前,毕竟同学们的自学能力因人而异);此外希望同步修改Eclipse等软件的使用教程,按教程上的步骤根本安装不了。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览93633 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!