2020年春季学期
计算机学院《软件构造》课程

Lab 1实验报告

目录

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

1.实验目标概述

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

基本的Java OO编程

基于Eclipse IDE进行Java编程

基于JUnit的测试

基于Git的代码配置管理

  1. 实验环境配置

首先,在实验教程中指定的MIT网站上下载Eclipse、JDK和Git并安装。

在为JDK配置环境变量的时候,在系统环境变量中新建一个叫“JAVA_HOME”的环境变量,变量值为JDK的安装路径。然后在Path的环境变量中添加一个“%JAVA_HOME%bin”的变量值。

  1. 实验过程

    1. Magic Squares

Magic Squares即幻方,类似数独游戏

  1. isLegalMagicSquare()

首先,我们先将文档中的矩阵读入并以字符串的形式存储(每行为一个字符串)

然后,我们将以字符串形式存储在result中的矩阵转化为整型矩阵并在此期间检查矩阵输入及矩阵大小是否合法,若非法则返回false并在命令行打印Invalid Input或Invalid Metrics。

最后,分别从行、列、对角线对矩阵进行求和,检查其是否相等

  1. generateMagicSquare()

流程图如下所示

(1)两个Exception原因及解决方案

NegativeArraySizeException:NegativeArraySizeException产生的原因在于修改前的函数未经检查直接使用n作为数组下标,当n为负数时,则会抛出此异常

ArrayIndexOutOfBoundsException:ArrayIndexOutOfBoundsException产生的原因是数组下标越界,当n为偶数时,如下图所示,以2为例。当填写2×1单元时,i%n==0,此时row++==2,则会导致数组越界。

为解决上述问题并“优雅”地退出程序,我们应在函数起始时判断n的范围,若n的范围非法,则返回false并在命令行打印错误信息,如下图所示。

(2)函数拓展有以下两点,一是在函数初始时加入对n范围的判断,该部分已在(1)中详细说明;二是文件输出,由于函数中已有命令行输出函数,文件输出在命令行输出的基础上加入文件操作即可,代码如下:

文件、命令行输出及测试结果如下

  1. Turtle Graphics

根据代码注释提示补全代码从而实现一个绘制工具Turtle Graphics。
1、从Github上获取任务的源代码,在本地创建git仓库,使用git管理本地开发
2、画出正四边形。
3、完成正多边形内角和外角的计算
4、计算向量之间的夹角
5、计算凸包
6、绘制自己的图形

  1. Problem 1: Clone and import

如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。

  1. Problem 3: Turtle graphics and drawSquare

该问题是通过turtle画一个边长为sideLength的正方形,实现方法比较简单,前进四次并转弯三次即可完成,代码如下图所示。

  1. Problem 5: Drawing polygons

使用turtle画正多边形,首先需要根据正多边形的边数计算其内角大小,计算公式:angle=180-360∕sⅈdes  ,源码如下图所示:

然后编写由边数计算角度的函数(不明所以),源码如下图所示:

类似上节实验,正多边形可以使用for循环完成,如下图所示

  1. Problem 6: Calculating Bearings

该部分首先需要补全calculateBearingToPoint方法,该方法的几何推导如下图所示:

完成推导后,即可利用Java进行实现,代码如下所示:

该部分还需要补全calculateBearings方法,该方法直接在calculateBearingToPoint方法基础上迭代即可,源码如下图所示:

  1. Problem 7: Convex Hulls

本次实验中,使用贪心策略计算凸包:

①选取点集中最左下的点为初始基点,并将其加入凸包

②从初始基点开始,依次搜索点集中每个点并计算其偏移角,找出点集中相对基点最小偏移角所对应的点,将其作为新的基点并加入凸包

③依次进行搜索,直到某次所得基点已经在凸包中,结束算法

算法主循环如上图所示,我们使用temp记录搜索过程中每个点相对于基点的偏移角,并用angle记录最小偏移角,用temp1记录其对应顶点。

注意到:每次循环都将angle设置为9999.0是为了接受搜索的第一个顶点

  1. Problem 8: Personal art

选取红色画出如图所示嵌套的三角形(由于不能使用递归,无法对其进行全填充)

  1. Submitting

git add *->git commit -m “”->git push提交到Lab1仓库

  1. Social Network

本处社交网络可以通过有向图建模,每个Person为图中的一个节点。若两个Person有关联,则图中对应的两个顶点之间有边。

  1. 设计/实现FriendshipGraph类

分析需求可知,FriendshipGraph类需要存储以Person类为节点的图,并且需要实现图边和点的添加,以及先广搜索。

故本实验中FriendshipGraph类将各Person节点,以HashMap的形式存储,并且使用addVertex方法增加节点,addEdge方法增加边,getDistance方法计算两点最短路径,即先广搜索。

addVertex方法如下图所示,接收到输入后,首先判断其是否已经在点集中,若在则终止函数并返回false,否则将其存入Vertex中并返回true

addEdge方法如下图所示,接收到输入后,首先判断其是否在点集中,若不在则提示错误并返回false;若在点集中则继续执行。随后判断输入两点间是否已经存在边,若存在则提示错误并返回false,否则将边加入到边集中。

getDistance方法分为三部,预处理部分为后续步骤申请队列、临时变量等组件;先广搜索部分使用先广搜索算法对图进行遍历,同时使用标志变量dot对先广搜索深度进行记录;后处理部分则主要将先广搜索部分设置的标志变量更改为最初的状态,以便于下次使用。

本方法中仅展示先广搜索这一核心部分,如下图所示。

  1. 设计/实现Person类

分析需求可知,Person类为FriendshipGraph类的节点,本实验中图采用邻接表的形式存于Person类中,即Person类中的成员变量inEdgeoutEdge。由于Person类中成员变量以及方法比较简单,本处不再赘述。

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

由实验手册,main()代码如下图所示

如果将测试代码第十行注释掉,输出结果为-1,-1,0,-1。

如果不满足每个人名字不同,addVertex方法会提示错误并终止此次执行

  1. 设计/实现测试用例

测试方法中前两者较为简单,在此不做介绍,这里主要介绍对getDistance方法的测试

getDistance方法的代码如上图所示

上述代码构建如上图所示的社交网络图

测试结果如下所示

  1. 实验进度记录

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

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

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

日期

时间段

任务

实际完成情况

2021-05-19

13:00-15:10

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

按计划完成

2021-05-19

20:00-22:00

编写Person类及FriendshipGraph类

按计划完成

2021-05-20

16:00-20:00

编写Turtle部分

按计划完成

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

遇到的难点

解决途径

Java的文件操作

Java文件操作不输出

在CSDN上查找相关操作,并与同学进行讨论

经查阅资料得知,FileWriter必须关闭才会在文件中输出,之前C代码从来不关闭文件的习惯需要改改了

calculateBearingToPoint方法中atan返回值值域为(-pi/2,pi/2),导致旋转角不是一一映射

使用atan2方法,该函数返回值值域为(-pi,pi)

FriendshipGraph类中存储图的顶点使用什么数据结构

Java我不太熟悉,知道Python中有字典数据结构,查找资料后发现Java中的Map可以实现类似的功能,故使用Map

哈工大软件构造Lab1实验报告相关推荐

  1. 哈工大软件构造lab2实验报告

    1 实验目标概述 2 实验环境配置 3 实验过程 3.1 Poetic Walks 3.1.1 Get the code and prepare Git repository 3.1.2 Proble ...

  2. 软件构造Lab1——实验报告

    1. 实验目标概述 本次实验通过求解四个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测 ...

  3. 2022哈工大软件构造lab1小结(知识点)

    哈工大软件构造lab1小结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 问题一 使用的库 异常处理机制 字符串内容检查 写入文件 问题二 problem 3:画一 ...

  4. 软件构造lab2 - 实验报告

    软件构造lab2 - 实验报告 1.实验目标概述 2.环境配置 3.实验过程 3.1Poetic Walks 3.1.1Get the code and prepare Git repository ...

  5. 软件构造Lab1实验总结

    软件构造Lab1实验总结 1 实验目标概述 本次实验通过求解四个问题,训练基本 Java 编程技能,能够利用 Java OO 开 发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够 ...

  6. 哈工大2020软件构造Lab2实验报告

    本项目于3.17日实验课验收,请放心参考 参考时文中有给出一些建议,请查看 基本更新完成 2020春计算机学院<软件构造>课程Lab2实验报告 Software Construction ...

  7. [HITSC]哈工大2020春软件构造Lab3实验报告

    Github地址 1 实验目标概述 本次实验覆盖课程第 3.4.5 章的内容,目标是编写具有可复用性和可维护 性的软件,主要使用以下软件构造技术: 子类型.泛型.多态.重写.重载 继承.代理.组合 常 ...

  8. HIT 软件构造 lab3实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 3实验报告 姓名 赵旭东 学号 1180300223 班号 1803002 电子邮件 1264887178@qq.com 手机号码 ...

  9. 哈工大软件构造lab1

    2020年春季学期 计算机学院<软件构造>课程 Lab 1实验报告 姓名 麦昌瀚 学号 190110920 班号 7 电子邮件 835889372@qq.com 手机号码 目录 1 实验目 ...

最新文章

  1. UVA 11210 Chinese Mahjong
  2. activiti5第四弹----serviceTask中的java服务任务
  3. 新鲜出炉的2012年8月桌面日历壁纸免费下载
  4. 【转载】关闭ftp中mput的上传确认提示:prompt
  5. mybatis 映射问题(mysql date与java Date类型格式错误)
  6. ➤mobi➢azw3➢epub⇨电子书阅读器 转换器
  7. ug许可证服务器注册表删除,ug许可证卸载工具
  8. 毕业论文中word的使用1-代码域标公式
  9. ThinkPad R400 T400 详细拆机图解超精华
  10. Word 文档中的图片另存为 .jpg 格式图片方法
  11. 老域名抢注技巧是什么?
  12. 移动ChemDraw结构有什么方法
  13. matlab 矩阵处理,matlab矩阵处理
  14. 2021年金属非金属矿山(露天矿山)安全管理人员最新解析及金属非金属矿山(露天矿山)安全管理人员模拟考试
  15. 性别平等进展倒退136年!疫情引发女性经济衰退;阿斯利康与丹纳赫雷度米特、路胜达成合作 | 美通社头条...
  16. 毕业设计 —— 基于STM32手势控制显示系统的设计
  17. 【听】百年孤独,拉丁美洲悲剧奋斗史
  18. opencv,sobel求梯度,C++实现
  19. PHP工资管理系统、考勤管理系统、薪资管理系统
  20. 苹果seo_1+X网店运营推广中级标品新品seo优化

热门文章

  1. 前端工程师的摸鱼日常(12)
  2. Infragistics控件使用
  3. 计算机网络总结(1)
  4. 百度搜索排名API接口PC返回JSON数据格式
  5. 支付宝VIE的罪与罚
  6. 单元测试需要异步测试时使用的WaitCallbackHelper等待线程方法
  7. 成长-技术人员的成长
  8. 为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz?
  9. 公司要新招美女跟我学docker,你来吗?
  10. form表单提交且接口回调显示提交成功