HIT软件构造lab1心得

1实验目标概述
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
基本的 Java OO 编程
基于 Eclipse IDE 进行 Java 编程
基于 JUnit 的测试
基于 Git 的代码配置管理
2实验环境配置
安装Eclipse、JDK和Git

1、在配置Eclipse时,通过Window–Preferences–Java–Installed JREs–添加已安装好的jdk的路径,配置jdk

2、学习了一些Git指令,如3.2 Problrm 2 中初始化一个本地仓库,并将Lab1 push到本地仓库中。
3、学习了Junit测试project,在要使用Junit的project名上,右键–properties–java build path–libraries–Add External JARs–点击Junit包。在3.2和3.3中书写并使用Junit进行测试。

3实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1Magic Squares
该任务有两个要求:
1、实现从txt文本中读取数据并保存,判断其是否为魔方阵
2、创建一个阶数为n,且n为奇数的魔方阵,并根据1的代码判断这个魔方阵是否满足定义。在给出的代码中添加注释,并将创建出的魔方阵保存到6.txt文本中,当程序异常时,“优雅的”退出——函数输出 false 结束,并非非法退出。
3.1.1isLegalMagicSquare()
1、该函数:boolean isLegalMagicSquare(String fileName)接受一个文件名,并且返回一个布尔结果(True/False),通过文件名+文件相对路径,函数读取文本中的数据,保存在一个二维数组中,进行判断该文本中的数据是否为魔方阵。
2、在函数:void main(String[] args) throws IOException中定义fileName并传输给isLegalMagicSquare,通过 “src/P1/” + fileName 找到文本文件。
3、首先将数据按行存储在一个可动态修改的数组中,并且通过“\t”分隔符将数据存入一个二维数组中。
4、对存入的数据进行判断:
(1)判断文本中的数据是否合理:
①判断文本中数据是否重复;
②判断文本中数据是否均大于0;
③判断数据中是否含有小数;
④判断是否有文按“\t”分割存储的数据;
(2)判断数据是否满足每行、列和两条对角线之和均相等。
3.1.2generateMagicSquare()
函数注释:

第0行中间,放置1。
向当前位置的右上方放置下一个数;若下一个位置超出数组下标范围,则将魔方阵沿行、列方向看成环形,下标再从0开始计数
若当前放置数是n的倍数,表示一条对角线已满,则下一个位置是本列的下一行
采用二维数组存放幻方阵,元素下标i,j沿行、列方向看成环形变化规律如下:
i = (i-1+n)%n; //向上一行
j = (j+1)%n; //向右一列
1、在调用函数generateMagicSquare()前,先对输入的n值进行判断,将大于0且是奇数的n传输到函数中。
2、首先构造出n*n的魔方阵
3、将魔方阵写入6.txt中
4、输出生成的魔方阵
5、调用函数IsLegalMagicSquare()判断6.txt中的数据是否是魔方阵
6、结果

关于异常产生的分析:

数组越界,原因是在生成函数中,i<=square,计算机面对非整数时常用的方法是向下取整,输入奇数时col = n / 2的值会向下取整,而square = n*n,所以此时i即使=square,数组也不会越界,而如果输入为偶数时,当i = square时就会发生越界 ,原因是在下标为n的数组中放入了大于n个的数据

此时数组下标为负值,输入的n为负值循环时数组下标为负,所以产生异常。
3.2Turtle Graphics
获取turtle包,熟悉Turtle Gragpics的各种函数接口,调用已有的函数,实现java语言的绘图功能,并用java给出的.Math库里的函数实现一些简单的计算功能。
3.2.1Problem 1: Clone and import
3.2.1.1从GitHub获取该任务的代码

https://github.com/rainywang/Spring2021_HITCS_SC_Lab1/tree/master/P2获取代码。将turtle包和rules包存入本地文件夹中,在Eclipse中,File–import–General–File system–Browse…–找到本地文件夹并将turtle包和rules包复制到eclipse-workspace/TurtleGragphics.java/src/中,完成将实验需要的库导入。
3.2.1.2在本地创建Git仓库:
右键Project TurtleGragphics.java–Team–Share Project…–Git–next–Finish
3.2.1.3使用git管理本地开发。
右键Project TurtleGragphics.java–Team->commit->Staged Changes->Commit Message->Commit(推到本地仓库)
3.2.2Problem 3: Turtle graphics and drawSquare
3.2.2.1提供两个函数
forward(units) :
在当前方向上按单位像素移动turtlre,其中单位是一个整数。按照最初的标志惯例,turtle从朝上开始。
turn(degrees) :
更改当前朝向,向右顺时针旋转,其中度数是double型。
3.2.2.2
调用forward()、turn()函数,画正方形,需要顺时针旋转90°前进sideLength,循环4次

下图为边长sideLength为100的正方形

3.2.3Problem 5: Drawing polygons
3.2.3.1已知正多边形边数sides,求内角的度数
由数学公式推导得 内角度数=(double)((sides-2)*180.0/sides)

运行TurtleSoupTest中的Junit测试calculateRegularPolygonAngle():右键TurtleSoupTest.java–Run as–1 JUnit Test

3.2.3.2 drawRegularPolygon(Turtle, int, int),已知正多边形的内角、边数、边长,画出这个正多边形(转动的角度=180°- 内角)

Main函数,在main中输入得到正多边形的边数和边长

3.2.3.3 示例
边长为50的正六边形

边长为60的正八边形

3.2.4Problem 6: Calculating Bearings
3.2.4.1calculateBearingToPoint(double, int, int, int, int)计算turtle从当前位置和朝向到终点顺时针需要转过的角
首先计算过两点的线段与x轴正方向形成的夹角,这里使用了Main.atan(x,y)函数,在与currentBearing相减,此时要注意:
1、判断起点和终点是否重合
2、夹角和turtle转过的角度范围都是[0.0,360.0)
3、turtle朝向是上,而x轴正方向是向右,turtle是顺时针旋转(角度由小到大),坐标轴是逆时针旋转(角度由小到大)。所以currentBearing要减去90再取相反数。即currentBearing = 90 - currentBearing。

Junit测试

3.2.4.2public static List calculateBearings(List xCoords, List yCoords)
该函数使用List 存放每次调用calculateBearingToPoint返回的值,依次对相邻节点调用calculateBearingToPoint,在下一次循环,这一次的终点会被覆盖为下一次的起点,假设初始的起点为(0,0),总共由n个点,则有n-1次调用,在for循环中i=1,所以共循环n-2次。

Junit测试

3.2.5Problem 7: Convex Hulls
算法:边界漫游法
时间复杂度:T(n)= O(n^2)
1、首先遍历所有的点,找到最左下角的点
2、以找到的点为基点,y轴正向为目前偏移角,开始依次找顺势针转角最小的点, 记录这个点并将它加入到凸包集合中,以这次的偏向角累加上之前的角度度作为下一次 的目前偏向角。
3、循环直到再次遇到最左下角为止退出

Junit测试

3.2.6Problem 8: Personal art

3.2.7Submitting
如何通过Git提交当前版本到GitHub上你的Lab1仓库。

3.3Social Network
熟悉和掌握java中的数据结构类型,本项目要求我们掌握图的遍历,求两点之间的最短路径。
利用图来实现人与人之间的关系,并能任意计算出人与人之间的情况(有无联系),基于FriendshipGraph类和Person类
3.3.1设计/实现FriendshipGraph类
FriendshipGraph类中包含图中所有点,每个点代表了一个Person,包含Person之间的边,并且可以计算两点之间的距离
1、addVertex()对Person名字进行判重:用哈希集合记录下所有Person的名字,当有新的Person加入时则判断是否已经在集合中。

2、addEdge()将两个Person之间进行联系,在图中,两个点之间的有向边表示两个Person之间有联系,而联系是双向的,所以在计算边数时需要加两个方向的边。

3、getDistance(),计算任意两个Person之间的距离,若没有任何联系则输出-1。使用BFS算法。

3.3.2设计/实现Person类
给出将每个人对应到一个Person上,并保存名字,调用每个Person姓名和朋友列表
3.3.3设计/实现客户端代码main()
由Lab1手册得:

结果为:

3.3.4设计/实现测试用例
3.3.4.1addVertexTest()函数
调用addVertex()函数,添加一个人,并判断Person中最后一个是不是这个人

3.3.4.23.3.4.2addEdgeTest()
调用addEdge()函数,给两个人添加联系,并判断xw中的朋友最后一个人是不是wy

3.3.4.3getDistanceTest()
调用getDistance()函数,增加了a,b,c三人,并添加关系,判断与我们添加的关系是否一致

Junit测试:

4实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 时间段 任务 实际完成情况
2021-05-11 13:30-15:30 编写3.1.1 isLegalMagicSquare() 按计划完成
2021-05-12 16:00-20:00 编写generateMagicSquare(),
完成3.1 延期1小时完成
2021-05-16 13:00-20:00 3.2 Problem1-Problem6 按计划完成
2021-05-18 13:30-17:30 3.2 Problem7 按计划完成
2021-05-19 16:00-20:00 3.2 完成 按计划完成
2021-05-20 16:00-22:00 3.3 3.3.1FriendshipGraph类 按计划完成
2021-05-21 18:00-23:00 3.3.2设计/实现Person类 按计划完成
2021-05-22 8:00-15:30 3.3完成 延期1小时完成
2021-05-23 8:00-14:00 完成Lab1实验报告 按计划完成
5实验过程中遇到的困难与解决途径
遇到的困难 解决途径

Junit测试
在3.2中test开始处是规定好的文件格式,添加Junit4后即可测试,在3.3中自己写测试的时候没有注意格式导致不成功,在与3.2中对比后,成功写出了可以进行junit测试的test.java文件
凸包问题难以解决
通过查询资料得到许多解决凸包问题的算法

6实验过程中收获的经验、教训、感想
6.1实验过程中收获的经验和教训
6.2针对以下方面的感受
(1)Java编程语言是否对你的口味?
第一次接触java,对其中的许多函数还不了解,只能从头开始学习。使用c语言完成的一些非常复杂的数据结构在java库中已经存在,对使用非常方便,这次实验让我受益匪浅。
(2)关于Eclipse IDE;
初次使用Eclipse,许多操作并不了解,而网络上对它的细致的、系统的描述也比较少,只能通过一点点查询来了解java文件运行出错时可能的原因。让我比较印象深刻的是,eclipse对可能为空的字符串非常严格,只有在判断其不为空时,才能继续运行。
(3)关于Git和GitHub;
Git之前从未接触过,它可以在本地构建仓库更新版本,对Github也是知之甚少,这次实验我也只是学会创建了一个账号。
(4)关于CMU和MIT的作业;
全英文让我理解起来比较困难,只能反复的读题去理解题意
(5)关于本实验的工作量、难度、deadline;
对于初次接触java语言的我来说,有些吃力,deadline比较合理,因为平时周末基本没有课,没有实验的话可能也不会起早。
(6)关于初接触“软件构造”课程;
之前没有系统的了解过这门课程,但经过这几周的学习,让我对它愈发感兴趣起来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值