哈工大软件构造Lab1

2021年春季学期
计算学部《软件构造》课程

 

 

 

 

Lab 1实验报告

 

 

 

 

 

 

 

 

姓名

李金宣

学号

1181910201

班号

1903002

电子邮件

 

手机号码

 

 


 

目录

 

 

 

1 实验目标概述

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

l 基本的Java OO编程

l 基于Eclipse IDE进行Java编程

l 基于JUnit的测试

l 基于Git的代码配置管理

2 实验环境配置

JDK环境,大一学习Javaee课程时配置的jdk8环境,环境变量等配置时遇到一些问题,通过网络搜索自学解决。

配置Eclipse环境时,一开始按照指导手册的教程一步步安装,中间导入URL等环节出现许多问题,于是直接放弃指导手册,自己一路点击next与finish进行安装,所幸成功安装eclipse。由于对全英文开发环境不太熟悉,网上搜索了eclipse简体中文环境的配置方法,具体参考

https://blog.csdn.net/qq_43015730/article/details/89225747

下载的eclipse自带Junit环境,但需要在eclipse设置中自行调用,一开始并不太懂应该怎么调用Junit,在运行P2的turtle的test文件时,因未配置Junit环境导致出错,在报错的行ctrl+1进行修改,成功配置Junit4环境。

在使用git的过程中遇到了非常多的问题,前后花了很长时间才将git环境配置好,一开始按照实验指导手册的Git指导书学习,但指导书内容过于繁杂,重点不突出,很多细节问题都没有解答,于是直接放弃指导书,同学间交流和网络上自行搜索成功配置好Git环境。

参考过非常多网站,如

https://www.cnblogs.com/dfsxh/articles/10959383.html

 

在这里给出你的GitHub Lab1仓库的URL地址。

https://github.com/ComputerScienceHIT/HIT-Lab1-1181910201

 

3 实验过程

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

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

3.1  Magic Squares

要求1:在 main()函数中调用五次 isLegalMagicSquare()函数,将 5 个文本文件名作为参数输入,读入文本数据,判断输入的数据能否构成一个MagicSquare,若是则返回true,若不是或格式错误,则返回false且说明原因。

要求2:对给出的generateMagicSquare函数扩展,根据参数n生成一个MagicSquare并写入文本6.txt中,然后判断其是否为MagicSquare。输入为奇数能生成MagicSquare返回true,输入偶数或者负数会返回false。

 

3.1.1 isLegalMagicSquare()

设计思路:首先读入txt文本文件,然后进行判断题目要求的三个条件:

1.   行列数不相等,并非矩阵:每读入一行row++,计算总行数,将每一行按照\t分隔存入数组,判断每一行的列数是否与行数相等,若存在不相等,返回false。

2.   矩阵中的某些数字并非正整数:每一行按照\t分隔存入数组后,判断数组元素有无”-”或”.”,有则说明有负数或小数,返回false

3.   数字之间并非使用\t 分割:对Integer.valueOf使用try catch方法,若不是以     \t作为分隔符则抛出异常信息,返回false。

对错误类型进行判断输出错误类型并返回false,当判断完毕没  格式错误时,将读入的数据存入到矩阵中,判断每一行,每一列,对角线的和是否相等,满足MagicSquare 则返回true,若有不相等则返回false

测试结果:

 

3.1.2 generatelMagicSquare()

流程图

合法输入判断

测试样例

3.2  Turtle Graphics

完善并使用绘图工具Trurtle Graphics

要求:1.完善drawSquare函数,画出一个正方形

2.完善calculateRegularPolygonAngle函数计算正多边形内角

3.完善calculatePolygonSidesFromAngle函数,由正多边形内角         得到边数

4.完善drawRegularPolygon函数,画正多边形

5.完善calculateBearingToPoint计算从一个点到另一个点所转过的角度,

6.完善calculateBearings函数,给定一组点,计算每次转过的角度并返回集合,

7.完善convexHull函数计算一系列点中的凸包,使用junit进行单元测试。

8.调用函数绘制自己的图形

3.2.1  Problem 1: Clone and import

从实验手册的网站git clone下载P2的包,解压导入eclipse项目中。

1.获取秘钥:

2.找到秘钥并复制添加到github上;

本地Git提交,push到GitHub:

1. git add ;

2. git commit -m "   " ;

3. git push

参考https://www.cnblogs.com/dfsxh/articles/10959383.html

3.2.2 Problem 3: Turtle graphics and drawSquare

行进四次,每次转90度

 

测试结果

3.2.3 Problem 5: Drawing polygons

正多边形内角=(边数-2)*180/边数

画多边形时每次前进偏转外角度数即可

 

3.2.4 Problem 6: Calculating Bearings

调用atan2函数得到两点间偏转弧度,toDegree转换成角度,减去当前偏角即为偏转角度,计算一组点,反复调用两点的函数即可

 

 

 

3.2.5 Problem 7: Convex Hulls

利用Gift wrapping 算法计算凸包,先找到最左下角的点作为初始点加入集合,然后比较剩余点到此点的偏转角,找到偏转角最小的加入集合,当偏转角相同时,找到最长的一条边的点加入集合,直到返回初始点最后得到凸包的点集。

//这部分源代码过长贴不下,请看源文件

3.2.6 Problem 8: Personal art 

3.2.7 Submitting

Junit测试

3.3Social Network

用Person和FriendshipGraph两个类模拟社交网络图,Person模拟图的顶点,FriendshipGraph模拟关系,getDistance能够计算出每两个Person之间的最短路径。

3.3.1设计/实现FriendshipGraph类

定义Person数组来储存所有的顶点,构造方法

addVertex添加对象,若新对象名字与已有名字重复,打印错误,退出

addEdge添加边(顶点间的关系),在Person a对象数组friend的里添加b,单向

因为边权重为1,可以使用广度优先搜索求两点间最短路径,调用类HashMap,用temp临时存储a1到各个点的最短距离,调用队列,将a1入队后按广度优先搜索的方法不断入队出队,更新temp中各顶点当前最短路径,直到有到a2的路径为止,返回最短距离

3.3.2设计/实现Person类

 

 

 

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

直接复制实验手册的代码,对界面稍加修改即可

3.3.4设计/实现测试用例

给出你的设计和实现思路/过程/结果。

对于addVertex,设计用例,建立四个Person对象,执行addVertex,判断vertex里面这些对象。

对于addEdge,设计test用例,建立四个Person对象,执行addVertex后,执行addEdge然后判断每个对象的friend中是否包含即可。

对于getDistance,设计test用例t,建立四个Person对象,执行addVertex后,执行addEdge后,最短距离正确即可。

4 实验进度记录

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

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

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

日期

时间段

任务

实际完成情况

2021-05-19

配置环境

Git配置未完成

2021-05-20

18.:00-

配置环境

完成

2021-05-21

10:00-13:00

编写P1的isLegalMagicSquare函数

完成

2021-05-21

15:00-16:00

编写P1的generateMagicSquare函数

完成

2021-05-22

10:00-14:00

完成P2

完成

2021-05-22

17:00-21:00

完成P3

完成

 

 

 

 

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

遇到的困难

解决途径

Git配置出现问题

 

 

网上自己搜,与同学交流学习

P2测试类时出现问题

 

 

Eclipse的junit环境未设置,在报错的行ctrl+1进行修改,成功配置Junit4环境。

 

P2对礼物包装算法不熟悉

 

网络上搜索算法详细介绍,参考算法的相关代码编写

P3对Java的广度优先算法编写不太熟悉

查阅Java中队列,哈希表等相关类的介绍和用法,成功使用并优化了代码

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

6.1 实验过程中收获的经验和教训

1.使用java次数少,对java语法不熟悉,许多地方代码优化不好

2.对Git配置不熟悉,出现许多问题

3.对java语言有了更深的理解。

 

6.2 针对以下方面的感受

(1)   Java编程语言是否对你的口味? 还好,有一定java基础但不熟练,Java可使用的类与库非常多,相比c语言可以使代码的编写更加容易,代码更加简洁。

(2)   关于Eclipse IDE;以前用过,用户界面也比较良好,上手也容易,暂时未遇到太多问题

(3)   关于Git和GitHub;环境配置非常麻烦,实验手册的指导完全没有重点,不知道从哪学起,全依靠自己上网搜索和同学交流,希望这门课以后能把Git环境的配置详细地指导给大家,而不是直接照搬MIT的指导手册。

(4)   关于CMU和MIT的作业;虽然有一定难度,但层层递进,锻炼编程能力,Java编程的收获很大。

(5)   关于本实验的工作量、难度、deadline;有一定难度,工作量大,虽然两周时间实验其实还算充裕,但课程时间与其他课程ddl冲突,开课第一周恰逢自动机期末考试和csapp实验ddl,导致实际上的实验时间被大大缩短,希望教务处能平衡好这几门课ddl的冲突.

(6)   关于初接触“软件构造”课程;

实验收获还是很大的,但个人觉得平时上课讲的东西太抽象宽泛,缺乏实际联系,很难理解什么意思,很多同学也听得不知所云,应对考试也就是背知识点做题,很难有实际收获,然而这些部分却占了成绩的大头,希望课程考核和教学方式能有所改革,能更多侧重于实验部分或者提升平日课程内容的质量。

 

posted @ 2021-06-29 22:09  YukiYuki123  阅读(223)  评论(0)    收藏  举报