3.2.1 Problem 1: Clone and import
3.2.2 Problem 3: Turtle graphics and drawSquare
3.2.3 Problem 5: Drawing polygons
3.2.4 Problem 6: Calculating Bearings
实验目标概述
本次实验通过求解三个问题,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
l 基本的Java OO编程
l 基于Eclipse IDE进行Java编程
l 基于JUnit的测试
l 基于Git的代码配置管理
实验环境配置
通过LAB0中的流程与方法下载并安装了Eclipse,但是由于一开始从官网上下载的exe文件无法正常运行,于是下载了压缩包解压安装。并且根据CSDN相关教程调试安装了环境。
又因为要求使用GIT,于是去b站上找了GIT相关的教程进行学习。
实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
Magic Squares
该任务分为两个子任务:1、从五个提供的txt文档文件中读入数据并判断能否构成MagicSquare,是则返回true,不是则返回false。(MagicSquare为每一行每一列每斜对角线数字之和都相等的n*n型矩阵,且矩阵中的数字均为非负整数,且n为正奇数。)2、对已知的generateMagicSquare函数进行修改,能苟产生一个用户指定阶数的MagicSquare,将其写入到文本6.txt中,然后判断是否为MagicSquare。并且满足若输入的为奇数能产生,而输入偶数或者负数会返回false推出。
isLegalMagicSquare()
按步骤给出你的设计和实现思路/过程/结果。
通过试验手册可知我们需要判断甄别1、行列数不相等2、、矩阵中的某些数字并非正整数3、数字之间并非使用\t 分割这三类错误,若没有错误,则判断其每一行每一列每斜对角线数字之和是否都相等。
对于判断行列数是否相等,我用一个初始化为0的变量hang,让它在每读一行数据不为空时加一(即为行数),然后让另一变量lie等于用\t符号分隔开来的每一行字符串数量(即为列数)。然后判断是否相等即可。
对于判断某些数是否为正整数,我是对于每一行用\t符号分割的字符串数组中的每一个字符串每一位字符进行是否为数字的判断,若有不是数字的,说明并非正整数。
对于判断是否用\t分割,若不是以\t作为分隔符,则以\t分割的字符串会在运行Integer.valueOfs时报错。
然后计算每一行每一列每斜对角线数字之和是否相等即可。
-
-
- generateMagicSquare()
-
按步骤给出你的设计和实现思路/过程/结果。
对该函数做扩展:(1) 将产生的 magic square 写入文件\src\P1\txt\6.txt中;(2) 当输入的 n 不合法时(n 为偶数、n 为负数等),不要该函数抛出异常并非法退出,而是提示错误并“优雅的”退出——函数输出 false 结束。只需要在开始判断n是否合法且增加写入文件的操作即可。
开头判断是否为正奇数;最后加入写入文件操作。
Turtle Graphics
该任务需要从GITHUB获取代码创建仓库并按要求填写空缺的函数然后上传。
Problem 1: Clone and import
首先clone代码文件并建立本地库:
随后导入eclipse进行开发。
Problem 3: Turtle graphics and drawSquare
重复四次前进转向操作即可。
Problem 5: Drawing polygons
通过正多边形内角和公式计算内角和再除以边数再用180度减去结果即为转向所需的角度,然后用边数作为循环次数重复前进转向操作即可。
Problem 6: Calculating Bearings
用atan2函数得到弧度再转换成角度,若角度为负值,则加上360。对点数分类讨论:点数多于等于2时循环调用计算角度的函数,且若之前累加和超过360度则减去360直到小于360度作为初始角度;点数等于一时返回空。
Problem 7: Convex Hulls
利用礼品包裹算法计算凸包,先取最左下点,然后计算其余每个点的俯角,取最小的那个叫对应的点,重复之直至回到起点。
Problem 8: Personal art
其中每根线条颜色均由随机数选取。(图片由于过于难看就不传了)
Submitting
通过GIT的add\commit\push origin master指令进行上传.
Social Network
任务要求实现Person和FriendshipGraph两个类,用FriendshipGraph来构建Person之间的关系来模拟社交网络并且计算出任意两顶点之间的最短路径。同时编写test用例测试之。
设计/实现FriendshipGraph类
实现功能为:添加顶点并判断是否重复、添加新关系(新边)、计算两点之间最短路径。其中计算两点间最短路经使用的是以广度优先搜索的最短路径算法。(将初始点入队列,取其所有可达的节点,初始化一个以点为关键字的哈希表,其value为从初始点到达其的最短路径长,初始点最短路径长为0,后面运算时各节点的最短路径长为父节点最短路径长+1,当遇到目标点时返回长,否则返回-1,若目标与初始点相同,则返回0)
设计/实现Person类
这个类中要实现的功能为:定义人名、加入新关系(由他出发的)、返回由他出发的所有关系。
设计/实现客户端代码main()
其基本已由试验手册给出。
设计/实现测试用例
我将对三个函数的测试同时在一个test中完成。
实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
日期 | 时间段 | 任务 | 实际完成情况 |
2021-05-21 | 19:00-19:30 | 编写问题1的isLegalMagicSquare函数并进行测试 | 延期半小时完成 |
2021-5-22 | 9:00-9:30 | 编写问题1的generate, | 按时完成 |
2021-5-22 | 20:00-20:30 | 编写问题2除包装算法相关函数其他函数 | 按时完成 |
2021-5-22 | 20:30-21:00 | 编写礼品包装算法相关函数 | 延期一小时完成 |
2021-5-23 | 9:00-9:30 | 编写问题3除了test以外的两个类 | 延期20分钟完成 |
2021-5-23 | 10:00-10:30 | 编写test | 按时完成 |
实验过程中遇到的困难与解决途径
遇到的难点 | 解决途径 |
不会使用JAVA语言
| 从中国大学MOOC上找到相关课程视频学习 |
不会使用GIT
| 从B站上找到相关视频学习 |
eclipse无法安装
| 寻找了压缩包解压安装 |
|
|
实验过程中收获的经验、教训、感想
实验过程中收获的经验和教训
这次试验让我学习了许多关于JAVA面向对象与GIT指令等的知识,对JAVA面向对象的特征有了更加深刻的理解.
- 针对以下方面的感受
- Java编程语言是否对你的口味?
是,这种面向对象的编程方式与众多的函数让我感觉到了不同于C的编程风格,也使得许多原本在C中需要花费大力气进行编写的程序简单了很多。
关于Eclipse IDE
感觉很智能。
关于Git和GitHub
目前了解尚浅,只会上传作业。
关于CMU和MIT的作业
纯英文有些吃力。
关于本实验的工作量、难度、deadline
这次实验工作量大,尤其和另外一门课的考试穿插,时间有点紧张。
关于初接触“软件构造”课程
初接触软件构造课程还是颇有难度,要学许多GIT等方面的新的知识、指令等。尤其在我原本不会JAVA的情况下,时间更加紧张。要是老师实验课时能详细讲解一下关于作业上传要求等具体的操作方法和格式就更好了。