软件构造 Lab 1实验报告

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

Lab 1实验报告

姓名 王雨宁
学号 1190201118
班号 1903006
电子邮件 1190201118@stu.hit.edu.cn
手机号码 15953147100

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 2
3.1 Magic Squares 2
3.1.1 isLegalMagicSquare() 2
3.1.2 generateMagicSquare() 3
3.2 Turtle Graphics 4
3.2.1 Problem 1: Clone and import 4
3.2.2 Problem 3: Turtle graphics and drawSquare 4
3.2.3 Problem 5: Drawing polygons 5
3.2.4 Problem 6: Calculating Bearings 5
3.2.5 Problem 7: Convex Hulls 6
3.2.6 Problem 8: Personal art 6
3.2.7 Submitting 7
3.3 Social Network 7
3.3.1 设计/实现FriendshipGraph类 7
3.3.2 设计/实现Person类 9
3.3.3 设计/实现客户端代码main() 9
3.3.4 设计/实现测试用例 10
4 实验进度记录 11
5 实验过程中遇到的困难与解决途径 11
6 实验过程中收获的经验、教训、感想 12
6.1 实验过程中收获的经验和教训 12
6.2 针对以下方面的感受 12

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

安装eclipseIDE,最近的eclipse不支持java8,所以找到2019年3月的版本下载并解压
按照实验手册0创建github仓库,在本地安装git。

在这里给出你的GitHub Lab1仓库的URL地址(Lab1-学号)。
http://github.com/ComputerScienceHIT/HIT-Lab1-1190201118
3 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1 Magic Squares
将从1到n^2的整数填入边长为n的方阵,使得方阵的每一行,列,对角线的和相等,应为 (1 + n^2) * n / 2。
3.1.1 isLegalMagicSquare()
首先从文件读入数据,读入的是字符串,分割再转化后放入int类型的二维数组中,在这个过程中进行输入正确性的判断。在判断问题类型时对于输入内容的问题可以使用正则表达式

读入的同时进行计数,判断输入的形状是否为方阵。
读入过程中如果输入有错,在读入完成后将问题分别输出,再返回false
将输入正确读入一个方阵后,就可以进行判断,先对第一行求和,得到一个基准,然后对每一行,每一列,对角线求和,与基准判断,有不想等就返回false。最后成功就返回true。
3.1.2 generateMagicSquare()

需要判断输入,不能为负数或负数,否则打印提示信息并返回false

在函数最后需要写入文件,每个数字之间用”\t”分隔。
由于函数从第一行n/2的位置开始,向右上方依次填入数字,当一个斜线上的数字填好后,也就是每填入n个数字,就到最后填入的一个格子的下面填入下一个数字,而这个移动到最后一个格子下面的动作是不判断边界的,所以有可能溢出。每n个数字的开始都相对于上n个数字的开始向左下方移动了一个“日”字。如果n为偶数,则其中某n个数字的开始恰好会溢出。
如果填入负数,在创建数组时会报错,数组大小不能为负数。

3.2 Turtle Graphics
使用turtle画图,turtle是一个海龟,通过转向和前进来在画布上画线来画出图形。
3.2.1 Problem 1: Clone and import
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。

进入实验手册上给的github地址,下载代码的zip包,在本地解压。将代码放到项目P2目录下,将代码中包名称错误前都加上P2.让项目路径正确。
在代码目录下使用git bash,使用git init指令创建仓库并进行配置,在git bash中使用git指令管理本地开发。

3.2.2 Problem 3: Turtle graphics and drawSquare
每走一个边长,转90度,走四次,转三次

3.2.3 Problem 5: Drawing polygons
正多边形内角的公式为:(sides - 2) * 180 / (float)sides。而在海归画正多边形时,应转的角度是多边形的外角。对于n变形,海归移动n次,转n-1次角度。

画一个正七边形

3.2.4 Problem 6: Calculating Bearings
a.
以向北为0°,首先计算需要去的位置的绝对角度,使用arccos计算,需要使用Math库,同时判断目标点和当前点横坐标的相对位置来判断象限。得到目标位置相对当前位置的绝对角度。

得到需要转向的绝对角度和当前角度后,两者相减,如果差大于0就返回差,如果差小于0还需要再加360°。

b.
利用a中的函数,迭代地求两点间需要转的角度。

3.2.5 Problem 7: Convex Hulls
求闭包时,首先找到纵坐标最高的点,然后以最高点为起点和当前点,向上为0度角和当前角度进行迭代:遍历所有点,找到相对当前点和当前角度需要顺时针转过角度最小的点(利用problem6 a中的函数),由于要求最小闭包,向同角度的点取最远的;然后将该点设为当前点,当前角度增加需要转的角度,将得到的点加入集合;直到当前点回到起始点,循环结束。

3.2.6 Problem 8: Personal art

3.2.7 Submitting
在git bush中,使用如下命令:
git chechout master切换分支
git add *
git commit -m ‘ ’
git push origin master
就可以成功提交到链接的github仓库的对应分支

3.3 Social Network
设计Person类和FriendshipGraph类,其中FriendshipGraph类中需要对Person对象进行操作。
3.3.1 设计/实现FriendshipGraph类
类中实例化两个ArrayList对象persons和names,分别储存Person对象和String对象(人名),persons存储graph的vertex,names确保没有同名的人。

3.3.1.1 addVertex
如果有同名的人,输出提示信息并退出,如果没有同名的人,就向persons和names对象中添加。

3.3.1.2 addEdge
首先需要判断person1和person2存在在persons对象中。然后调用Person对象的addFriend方法。否则输出提示信息并退出。

3.3.1.3 getDistance
首先判断person1和person2存在persons对象中,

然后判断person1和person2是否是同一个人,是就返回0,

否则使用广度优先搜索计算两者之间的距离。两者之间的距离最多为graph的人数-1,所以如果搜索人数-1次还没搜索到的话就说明两者距离为-1。

如果输入的点不存在,就输出提示信息并退出

3.3.2 设计/实现Person类
需要两个属性,分别为名字String name和朋友列表friends,

构造方法初始化name,确保没有重名的人

addFriend方法,向朋友列表

3.3.3 设计/实现客户端代码main()
复制实验说明中的代码

输出

3.3.4 设计/实现测试用例
绘制社交网络中有不相连的点,还有单向边。

对于addVertex方法,创建额外的ArrayList对象,和待测试的方法添加相同的点,与FriendshipGraph对象中的ArrayList对象进行比较。

对于addEdge方法,同样创建额外的ArrayList对象,对应加入的点,每个对象和对应的点添加相同的边,判断对应的Person对象的friends属性是否相同。

对于getDistanse方法,直接判断输出的数字是否正确。

4 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 时间段 任务 实际完成情况
2021-05-14 14:00-15:30 编写问题1的isLegalMagicSquare函数并进行测试 按计划完成
2021-05-14 16:00-17:00 编写问题1的要求二的注释和代码部分 按计划完成
2021-05-15 14:00-14:30 编写问题3的Person类 按计划完成
2021-05-15 15:00-17:00 编写问题3的FriendshipGraph类 按计划完成
2021-05-16 14:00-16:00 编写问题2的problem2-6 按计划完成
2021-05-17 14:00-17:00 编写问题2的problem7 按计划完成
2021-05-17 18:00-19:00 编写问题2的problem8 按计划完成
2021-05-18 18:00-19:00 编写问题3的FriendshipGraphTest类 按计划完成
5 实验过程中遇到的困难与解决途径
遇到的难点 解决途径
eclipse工作目录不能和项目目录为同一个文件夹
使用idea IDE
不熟悉JAVA语法和工具
百度,查看博客和教程
不熟悉git和github使用方法
菜鸟教程
6 实验过程中收获的经验、教训、感想
6.1 实验过程中收获的经验和教训
学习了JAVA语法和git使用方法。了解了不同IDE的一些区别。
要注意项目的包之间的相互依赖,注意相对路径。
要注意变量类型。
要注意变量声明仅在代码块之内有效。
6.2 针对以下方面的感受
(1) Java编程语言是否对你的口味?
很适合编写软件项目,相比其它语言,比C更“高级”,支持面向对象,比python更安全,适合项目开发。
(2) 关于Eclipse IDE
不如IDEA好用。
工作目录不能为项目目录很奇怪,不知道是不是我理解错了。
(3) 关于Git和GitHub
很好的代码管理工具。
(4) 关于CMU和MIT的作业
渐进的题目设计很适合一步步学习。
可以试着设计HIT的作业。
(5) 关于本实验的工作量、难度、deadline
工作量还好,难度适中,时间有点短,希望告知TA如何运行程序,以便自行检查提交的项目是否能够运行。
(6) 关于初接触“软件构造”课程
学习了软件构造的过程。
希望给出教学大纲,现在对课程内容还有疑惑。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值