2020年春季学期
计算机学院《软件构造》课程
Lab 1实验报告
姓名 | 麦昌瀚 |
学号 | 190110920 |
班号 | 7 |
电子邮件 | 835889372@qq.com |
手机号码 |
3.1.2 generateMagicSquare(). 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
本次实验通过求解三个问题,训练基本 Java编程技能,能够利用 Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用 Git作为代码配置管理的工具,学会 Git的基本使用方法。
1、基本的 Java OO编程
2、基于 Eclipse IDE进行 Java编程
3、基于 JUnit的测试
4、基于 Git的代码配置管理
简要陈述你配置本次实验所需开发、测试、运行环境的过程,必要时可以给出屏幕截图。特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
由于之前已经安装过jdk,所以此次我直接打开高级系统设置查看环境变量路径,并在命令行窗口检查确认jdk为1.8版本。随后在lab0的实验报告中根据给出的网址下载安装了ecilpse,在git官网下载安装了git-bash。
难点:由于实验指导书安装eclipse的教程充斥着大量晦涩难懂的英文和复杂操作,所以结合csdn的教程顺利安装好程序并初步掌握eclipse的使用和java基础编程。
GitHub Lab1仓库的URL地址(Lab1-学号)
https://github.com/ComputerScienceHIT/HIT-Lab1-190110920
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
MagicSquare是一个正整数组成的正方形,他的每一行、每一列和对角线的数字之和都相等。
任务一:编写一个Java程序(Magicsquare.java)用于检查矩阵的行/列/对角线值,该程序能够从五个已经提供的txt文档中读入数据,来判断输入的数据能否构成一个MagicSquare,若是则返回true,若不是则返回false且说明原因。
任务二:对给出的generateMagicSquare函数进行扩充,使之能够产生一个MagicSquare并且将其输入到文本6.txt中,然后对其判断是否为MagicSquare。并且满足若输入的为奇数能产生MagicSquare,而输入偶数或者负数会返回false。
首先需要判断读入的数据能否构成一个矩阵。根据实验手册,需要判断的三张错误:
行列数不相等:逐行读取得知总行数,然后对每一行按照\t进行分割得出列数,判断每一列是否与行数相等,若有一列不相等,则返回false。
矩阵中某些数字不是正整数:按照\t将分割后的字符串装入数组中,然后判断这些字符串是否包含”.”或者”-”,若包含,则返回false。
不是以\t作为分隔符:按照\t将分割后的字符串装入数组中,然后判断这些字符串是否包含空格,若包含,则返回false。
可以构成矩阵时,读入文件中的数字,用二维数组表示矩阵,分别计算矩阵每一行、每一列、对角线的和是否相等来判断能否构成MagicSquare,并返回true。
使用try-catch组合,若文件读取本身出现问题,呈现相关错误信息
输出的结果:
输入的 n不合法时(n为偶数、n为负数等)提示错误并“优雅的”退出:
将产生的 magic square写入文件\src\P1\txt\6.txt中并检验
实现一个绘图工具Trurtle Graphics,需要我们完成的任务为:画出一个正方形,计算正多边形内角,由正多边形内角得到边数,计算从一个点到另外一个点所需要转过的角度,给定一系列点计算每次转过的角度并返回在集合中,计算一系列点中的凸包,调用函数绘制个人艺术作品,使用junit进行单元测试。
从github上获取代码:网页download。
从本地创建git仓库:1、git init初始化本地仓库2、git add remote添加远程库源3、在远程仓库创建master分支4、git pull origin master将远程仓库同步到本地5、git add * ->git commit -m “……”->git push将本地文件加入到本地仓库,将本地仓库同步到远程仓库。
-
-
- Problem 3: Turtle graphics and drawSquare
-
通过四次循环,使用forward、turn函数每次前进+转90°就可以得到正方形。
补全calculateRegularPolygonAngle。正多边形的内角等于180 – 360./ 边数
补全calculatePolygonSidesFromAngle。知道正多边形的内角求边数,由前句进行简单数学公式转换即可
补全drawRegularPolygon。画出指定边长的正多边形。调用calculateRegularPolygonAngle(sides)计算正多边形的内角,调用forward和turn函数进行前进和转向。
补全calculateBearingToPoint。该函数利用atan2函数计算前进方向与x轴正向夹角,之后再把该角度转换成与y轴正向的夹角,注意如果出现负数要再加上360°。
补全calculateBearings。对列表中的每两个相邻点调用calculateBearingToPoint计算夹角,列表保存并返回
计算给定集合中的凸包需要利用Gift wrapping algorithm算法。点数少于3个时直接得凸包,否则先找到最左下角的点加入集合:
然后比较剩余点到此点的偏转角,找到偏转角最小的加入集合,当偏转角相同时,需要找到最长的一条边的点加入集合,当回到起点时终止程序,最后即可得到凸包的点集:
经计算后绘制得到一个顶角竖直向上的五色正五角星:
(1).打开git-bash
(2).cd /D/P2
(3).git add .HIT- Lab1-190110920
(4).git commit –m “P2”
(5)git push origin master
实现并测试Friendship Graph类和Person类,模拟社交网络,可以计算图中两个人之间的距离。
-
-
- 设计/实现FriendshipGraph类
-
1.定义一个Person集合来储存所有人的对象,定义一个String集合来储存所有已经存在的名字并进行初始化:
2.函数addVertex:增加一个人的对象。 实现此功能需要注意用来增加的Person对象是否已经存在,所以需要在开始判断name中是否已经有了匹配的的名字,若已经存在,则输出“输入人名重复”并结束程序,若没有则将待增加的新的Person对象加入people集合中,对象的名字加入name集合中:
3.函数addEdge:增加一条有向边。实现此功能只需要调用Person类的addnewfriend方法即可
4.函数:getDistance:得到两个人之间的最短距离。使用广度优先搜索方式求最短路径的方法。若两个Person对象为同一个,则返回0。然后定义一个Map集合way和一个Person队列thequeue,队列thequeue用来储存广搜的遍历结果,theway的Map集合用来储存广搜的所有元素及他们与第一个元素的距离。具体实现为将第一个元素c1入队,并且把c1和下标0入集合,当队列非空时,弹出队首元素top,并且得到top在集合theway中的下标distance,然后只要队首元素的所有朋友friend,中的元素与c2不同就全部入队,这些元素及下标distance+1放入集合。队列非空则继续执行以上步骤,直到找到某个元素与c2相同并且返回这个元素在集合way中的下标。如果直到队列为空还没找到c2,则返回-1:
-
-
- 设计/实现Person类
-
1.定义String变量name储存名字,定义一个Person的集合friend,定义一个
2.构造方法:依据输入的字符串初始化这个名字,并且将这个名字加入集合friend中:
3.增加本人新朋友addnewfriend:直接将新Person对象加入friend中即可
4.得到本人的名字getname:直接返回name
5.得到本人的朋友列表getthisfriend,直接返回friends
-
-
- 设计/实现客户端代码main()
-
输出结果为:
-
-
- 设计/实现测试用例
-
创建对象测试public void addVertextest()
加入朋友关系测试public void addEdgetest()
覆盖每个顶点先建立交际网,再测试距离是否正确public void getDistancetest()
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 任务 | 实际完成情况 |
2021-05-13 | 15:45-17:00 | 尝试初步编写问题1的isLegalMagicSquare函数 | 按计划完成 |
2021-05-16 | 14:00-16:00 | 编写问题1的isLegalMagicSquare函数并完成测试 | 延期1小时完成 |
2021-05-20 | 15:45-17:00 | 编写问题1的generateMagicSquare函数并完成测试 | 按计划完成 |
2021-05-20 | 19:00-20:00 | 尝试了解第二题的概况并完成1-4 | 延期1小时完成 |
2021-05-21 | 15:00-17:00 | 完成P2的凸包和个人艺术设计,并经过调试后通过了自带的测试 | 按计划完成 |
2021-05-22 | 13:00-17:00 | 完成P3的Person类和FriendshipGraph类 | 按计划完成 |
2021-05-22 | 19:00-20:00 | 完成P3的测试 | 按计划完成 |
2021-05-23 | 19:00-21:00 | 完成收尾工作 | 按计划完成 |
遇到的难点 | 解决途径 |
初次接触java,文件读写出现很多问题 | 通过查阅资料理解了flie类和bufferreader类等的关系与使用 |
p2的英文教程在初次接触时造成了许多困难 | 经过耐心阅读领会了题目的意思和大致目标 |
…… | …… |
此次实验初次使用java,我对众多语法和结构不熟悉。但是在一段时间的钻研后,我学到了java领域的许多新奇知识,并逐渐熟悉了git、eclipse和junit的使用,受益匪浅。
- Java编程语言是否对你的口味?
第一印象不错,具有面向对象编程固有的许多优点与特色
- 关于Eclipse IDE
对于初学者十分友好,自动提示与纠错功能非常强大
- 关于Git和GitHub
较为生疏,还需要深入研究
- 关于CMU和MIT的作业
英文教程障碍较大
- 关于本实验的工作量、难度、deadline
适中
- 关于初接触“软件构造”课程
收获颇丰
其他收获:
Scanner cannot be resolved to a type
刚开始接触java,这个问题非常简单但是在网上怎么也找不到答案
Scanner类使用前需要将其导入。
在代码的最前端加入
import java.util.Scanner;
即可