哈工大软件构造lab1---实验心得

  1. 实验目标概述

训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。

  1. 基本的Java OO编程
  2. 基于Eclipse IDE进行Java编程
  3. 基于JUnit的测试
  4. 基于Git的代码配置管理
  1. 实验环境配置

Eclipse IDE for java Developers-2022-03

Java SE 11.0.14

GitHub Desktop

在这里给出你的GitHub Lab1仓库的URL地址(Lab1-学号)。

  1. 实验过程

请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。

为了条理清晰,可根据需要在各节增加三级标题。

    1. Magic Squar

该任务的目标:设计isLegalMagicSquare()函数,判定给定的几个矩阵是否为magicsquare;将给定的生成奇数阶的magicsquare的generateMagicSquare()函数作为静态函数加入我的程序代码中,将生成的矩阵存入6.txt并调用isLegalMagicSquare()判断所生成的矩阵是否正确。该阶段涉及到文件读写操作、对某些特定函数的调用,对部分异常的处理(例如矩阵中有负数、浮点数,或是行列数不相等)等。

      1. isLegalMagicSquare()

根据实验要求,先判断给定的矩阵是否合理,即判断行列数是否相等、矩阵中是否有浮点数、负数等。设置一个整型变量n = 0,对于txt文件先按行读入,每读入一行n++,直到读完文件,此时n的值即为矩阵行数。然后,依旧是按行读入文件,每读入一行,将其存入String line中,并调用split(“\t”)将其分割并存入String[] line_cut,比较行数n与line_cut.length,不相等则输出错误提示并返回false,后经过测试,当文件未用“\t”进行分割时,也会导n != line_cut.length,因此在这里一并输出错误提示;然后判断line_cut中的每一个元素是否都是正整数,按位寻访line_cut,若出现某一位不在数字字符‘0’-‘9’中,则输出错误提示并返回false。综上所述,即有如下代码:

以上错误判断完毕后,将读入的文档存入矩阵magic中,并按照magic矩阵定义进行测试,若不符合magic矩阵定义,则返回false。注意,在此过程中,并未输出错误提示,表示矩阵本身不存在行列数不相等等错误。于是有以下代码:

      1. generateMagicSquare()

除该程序代码外,需对该函数的输入进行测试,以防输入为偶数或负数。该测试在main函数中完成,输入阶数为负数或偶数或输入阶数小于2时输出错误提示并予以重新输入,但是,如果输入根本并非整数,而是浮点数或字符时,则输出错误提示且不允许重新输入,于是有如下代码:

除此之外,还需要在函数中加入文件写入操作,将产生的magic矩阵存入6.txt以便于main函数中测试其生成的magic矩阵的正确性,添加的代码如下:

    1. Turtle Graphics

这个实验是MIT的经典实验,通过自己完成几个函数来层层递进,最后实现求闭包的算法,并绘制自己的图案。

      1. Problem 1: Clone and import

复制链接在cmd中运行即可下载文件

      1. Problem 3: Turtle graphics and drawSquare

该函数需要实现:已知边长,画出边长为指定数值的正方形。参数是海龟对象turtle和边长sideLength。循环执行,每次画笔直行sideLength距离,然后画笔方向旋转90度,循环执行4次后即可得到所需要的正方形,函数代码如下:

运行结果为(sideLength=40):

      1. Problem 5: Drawing polygons

首先,要求计算已知正多边形边数的内角度,该计算由已知公式可以推导,因此相关函数代码如下:

根据正方形的画法,只需要将画笔的转向角度设置为180 –内角度数,循环多边形边数次数即可。考虑到画笔转向既能是顺时针又能是逆时针,故在此声明:sides可为负数,且当sides为负整数时,代表着画笔将逆时针旋转,且旋转度数为180–内角度数,并且取sides的绝对值为正多边形边数。函数代码如下:

      1. Problem 6: Calculating Bearings

首先,已知起点和当前朝向角度,要求起点到终点需要转动的角度。根据几何运算,得函数代码如下:

上述问题的扩展:此时有若干个点,要求从第一个点开始到第二个点,再从第二个点到第三个点……以此类推每次转向的角度。以起点为第一个点,循环n-1次,每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中,将下一次的“起点”用当前“终点”更新,继续循环。程序代码如下:

      1. Problem 7: Convex Hulls

对于平面上的一些点,总可以找到这样一些点,由他们依次相连构成的凸多边形可以让其它所有点均在多边形内,这样的点集合和凸多边形是唯一的。在数学上,这样的方法很简单,只要取出平面上一条让所有点都在它一侧的直线,任取一点为轴,顺时针旋转,若碰到另外一个点,则以这个点为新的转轴,当再次碰到同一个点,则结束旋转,被碰到过的所有点即为凸包集合。只要对于一个点,找到其它所有点中和它的连线与之前找到它的连线夹角最大即可,多点共线的情况下只需要选取最远的点即可。

      1. Problem 8: Personal art

运行结果为:

      1. Submitting

通过Github桌面版进行提交:

    1. Social Network

该任务的目标:设计一张社交网络无向图,连接互为朋友的人与人,并且能计算任意两人之间需要的最少的关联路径。于是,该问题为最短路径问题,而构建的图为无向无权图,所以利用DFS深度优先遍历即可得到两点间的最短路径。

      1. 设计/实现FriendshipGraph

在FriendshipGraph中声明两个类第一个用来保存人的实例,另一个用来检测是否有重复名字。 

addVertex函数用来添加一个成员,先检查名字是否有重复。有则输出提示并推出程序。

addEdge函数是用来表明p1有一个朋友p2,调用Person类中的addFriend方法

getDistance函数是用来计算两个Person之间的距离。使用Queue和Map实现BFS求最短路。

      1. 设计/实现Person

定义了两个私有成员,同时定义了两个方法调用Person类的姓名和朋友列表。

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

由实验手册得:

运行结果为:

      1. 设计/实现测试用例
  1. testaddVertex
    我们调用addVertex函数,向交际网络中添加一个人,然后判断people中最后一个人是不是我们添加进去的。
  2. testaddEdge

我们调用addEdge函数,给其中两人添加关系,然后判断a的朋友列表中的最后一人是否是b。

  1. testgetDistance

建立了一个这样的交际网络:

  1. 实验进度记录

请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。

每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。

不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。

日期

时间段

任务

实际完成情况

2022-05-02

15:45-17:30

编写问题1的isLegalMagicSquare函数并进行测试

按计划完成

2022-05-02

18:30-19:30

编写问题1的generateMagicSquare()函数并进行测试

按计划完成

2022-05-02

19:30-23:00

编写问题2的函数并进行测试

延时一小时

2022-05-03

18:30-19:30

编写问题3的函数进行测试

按计划完成

2022-05-03

19:30-20:00

编写问题3的Test

按计划完成

  1. 实验过程中遇到的困难与解决途径

遇到的难点

解决途径

编写Convex Hulls函数时不了解概念,思路不清晰

在CSDN上学习思路,编写代码

在写java代码时不熟练,缺乏经验

多写多练,锻炼自己的代码编写经验

  1. 实验过程中收获的经验教训、感想
    1. 实验过程中收获的经验教训

在本次实验中锻炼了我的java代码编写能力,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。

    1. 针对以下方面的感受
  1. Java编程语言是否对你的口味?

对我的品味,但还缺少写java代码的经验。

  1. 关于Eclipse IDE

方便了我的代码编写过程,十分好用。

  1. 关于Git和GitHub

还需更多的使用才能更加熟练的操作。

  1. 关于CMU和MIT的作业

应该更多地学习其作业,锻炼我们的能力

  1. 关于本实验的工作量、难度、deadline

实验工作量略大,难度略高。Dealine略紧。

  1. 关于初接触“软件构造”课程

对这门课十分感兴趣

  1. 实验目标概述

训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。

  1. 基本的Java OO编程
  2. 基于Eclipse IDE进行Java编程
  3. 基于JUnit的测试
  4. 基于Git的代码配置管理
  1. 实验环境配置

Eclipse IDE for java Developers-2022-03

Java SE 11.0.14

GitHub Desktop

在这里给出你的GitHub Lab1仓库的URL地址(Lab1-学号)。

  1. 实验过程

请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。

为了条理清晰,可根据需要在各节增加三级标题。

    1. Magic Squar

该任务的目标:设计isLegalMagicSquare()函数,判定给定的几个矩阵是否为magicsquare;将给定的生成奇数阶的magicsquare的generateMagicSquare()函数作为静态函数加入我的程序代码中,将生成的矩阵存入6.txt并调用isLegalMagicSquare()判断所生成的矩阵是否正确。该阶段涉及到文件读写操作、对某些特定函数的调用,对部分异常的处理(例如矩阵中有负数、浮点数,或是行列数不相等)等。

      1. isLegalMagicSquare()

根据实验要求,先判断给定的矩阵是否合理,即判断行列数是否相等、矩阵中是否有浮点数、负数等。设置一个整型变量n = 0,对于txt文件先按行读入,每读入一行n++,直到读完文件,此时n的值即为矩阵行数。然后,依旧是按行读入文件,每读入一行,将其存入String line中,并调用split(“\t”)将其分割并存入String[] line_cut,比较行数n与line_cut.length,不相等则输出错误提示并返回false,后经过测试,当文件未用“\t”进行分割时,也会导n != line_cut.length,因此在这里一并输出错误提示;然后判断line_cut中的每一个元素是否都是正整数,按位寻访line_cut,若出现某一位不在数字字符‘0’-‘9’中,则输出错误提示并返回false。综上所述,即有如下代码:

以上错误判断完毕后,将读入的文档存入矩阵magic中,并按照magic矩阵定义进行测试,若不符合magic矩阵定义,则返回false。注意,在此过程中,并未输出错误提示,表示矩阵本身不存在行列数不相等等错误。于是有以下代码:

      1. generateMagicSquare()

除该程序代码外,需对该函数的输入进行测试,以防输入为偶数或负数。该测试在main函数中完成,输入阶数为负数或偶数或输入阶数小于2时输出错误提示并予以重新输入,但是,如果输入根本并非整数,而是浮点数或字符时,则输出错误提示且不允许重新输入,于是有如下代码:

除此之外,还需要在函数中加入文件写入操作,将产生的magic矩阵存入6.txt以便于main函数中测试其生成的magic矩阵的正确性,添加的代码如下:

    1. Turtle Graphics

这个实验是MIT的经典实验,通过自己完成几个函数来层层递进,最后实现求闭包的算法,并绘制自己的图案。

      1. Problem 1: Clone and import

复制链接在cmd中运行即可下载文件

      1. Problem 3: Turtle graphics and drawSquare

该函数需要实现:已知边长,画出边长为指定数值的正方形。参数是海龟对象turtle和边长sideLength。循环执行,每次画笔直行sideLength距离,然后画笔方向旋转90度,循环执行4次后即可得到所需要的正方形,函数代码如下:

运行结果为(sideLength=40):

      1. Problem 5: Drawing polygons

首先,要求计算已知正多边形边数的内角度,该计算由已知公式可以推导,因此相关函数代码如下:

根据正方形的画法,只需要将画笔的转向角度设置为180 –内角度数,循环多边形边数次数即可。考虑到画笔转向既能是顺时针又能是逆时针,故在此声明:sides可为负数,且当sides为负整数时,代表着画笔将逆时针旋转,且旋转度数为180–内角度数,并且取sides的绝对值为正多边形边数。函数代码如下:

      1. Problem 6: Calculating Bearings

首先,已知起点和当前朝向角度,要求起点到终点需要转动的角度。根据几何运算,得函数代码如下:

上述问题的扩展:此时有若干个点,要求从第一个点开始到第二个点,再从第二个点到第三个点……以此类推每次转向的角度。以起点为第一个点,循环n-1次,每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中,将下一次的“起点”用当前“终点”更新,继续循环。程序代码如下:

      1. Problem 7: Convex Hulls

对于平面上的一些点,总可以找到这样一些点,由他们依次相连构成的凸多边形可以让其它所有点均在多边形内,这样的点集合和凸多边形是唯一的。在数学上,这样的方法很简单,只要取出平面上一条让所有点都在它一侧的直线,任取一点为轴,顺时针旋转,若碰到另外一个点,则以这个点为新的转轴,当再次碰到同一个点,则结束旋转,被碰到过的所有点即为凸包集合。只要对于一个点,找到其它所有点中和它的连线与之前找到它的连线夹角最大即可,多点共线的情况下只需要选取最远的点即可。

      1. Problem 8: Personal art

运行结果为:

      1. Submitting

通过Github桌面版进行提交:

    1. Social Network

该任务的目标:设计一张社交网络无向图,连接互为朋友的人与人,并且能计算任意两人之间需要的最少的关联路径。于是,该问题为最短路径问题,而构建的图为无向无权图,所以利用DFS深度优先遍历即可得到两点间的最短路径。

      1. 设计/实现FriendshipGraph

在FriendshipGraph中声明两个类第一个用来保存人的实例,另一个用来检测是否有重复名字。 

addVertex函数用来添加一个成员,先检查名字是否有重复。有则输出提示并推出程序。

addEdge函数是用来表明p1有一个朋友p2,调用Person类中的addFriend方法

getDistance函数是用来计算两个Person之间的距离。使用Queue和Map实现BFS求最短路。

      1. 设计/实现Person

定义了两个私有成员,同时定义了两个方法调用Person类的姓名和朋友列表。

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

由实验手册得:

运行结果为:

      1. 设计/实现测试用例
  1. testaddVertex
    我们调用addVertex函数,向交际网络中添加一个人,然后判断people中最后一个人是不是我们添加进去的。
  2. testaddEdge

我们调用addEdge函数,给其中两人添加关系,然后判断a的朋友列表中的最后一人是否是b。

  1. testgetDistance

建立了一个这样的交际网络:

  1. 实验进度记录

请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。

每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。

不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。

日期

时间段

任务

实际完成情况

2022-05-02

15:45-17:30

编写问题1的isLegalMagicSquare函数并进行测试

按计划完成

2022-05-02

18:30-19:30

编写问题1的​​​​​​​generateMagicSquare()函数并进行测试

按计划完成

2022-05-02

19:30-23:00

编写问题2的函数并进行测试

延时一小时

2022-05-03

18:30-19:30

编写问题3的函数进行测试

按计划完成

2022-05-03

19:30-20:00

编写问题3的Test

按计划完成

  1. 实验过程中遇到的困难与解决途径

遇到的难点

解决途径

编写Convex Hulls函数时不了解概念,思路不清晰

在CSDN上学习思路,编写代码

在写java代码时不熟练,缺乏经验

多写多练,锻炼自己的代码编写经验

  1. 实验过程中收获的经验教训、感想
    1. 实验过程中收获的经验教训

在本次实验中锻炼了我的java代码编写能力,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。

    1. 针对以下方面的感受
  1. Java编程语言是否对你的口味?

对我的品味,但还缺少写java代码的经验。

  1. 关于Eclipse IDE

方便了我的代码编写过程,十分好用。

  1. 关于Git和GitHub

还需更多的使用才能更加熟练的操作。

  1. 关于CMU和MIT的作业

应该更多地学习其作业,锻炼我们的能力

  1. 关于本实验的工作量、难度、deadline

实验工作量略大,难度略高。Dealine略紧。

  1. 关于初接触“软件构造”课程

对这门课十分感兴趣

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值