软件构造 Lab-1 Report Template

1 实验目标概述

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

2 实验环境配置

简要陈述你配置本次实验所需开发、测试、运行环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

  1. 以前配置的是JDK13,卸载重装了JDK8。
  2. 下载eclipse并配置好JDK和Junit。
  3. 根据网上教程一步步下载并配置Git。

在这里给出你的GitHub Lab1仓库的URL地址(Lab1-学号)。
https://github.com/ComputerScienceHIT/Lab1-1180300410

3 实验过程

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

3.1 Magic Squares

A magic square of order n is an arrangement of n×n numbers, usually distinct integers, in a square, such that the n numbers in all rows, all columns, and both diagonals sum to the same constant.
根据实验指导书的摘要,Magic Squares是指行和列和对角和都相等的一个n*n正整数矩阵。本次任务是判断五个矩阵是否是符合规格的幻方,并用阶梯法生成了一个幻方。

3.1.1 isLegalMagicSquare()

实现思路:

  1. 采用FileReader、BufferedReader以及split的方法对文件进行读入与分割。
  2. 用正则式“[0-9]+”判断是否是正整数,“\d+\.+\d”判断是否是小数,“\d+\s+\d”判断是否用\t分隔,“[±]?[0-9]+”判断是否用了负数。
  3. 采用二维数组保存读入数据
  4. 判断该输入是不是n*n矩阵
  5. 用长度为2*length+2的数组分别保存行和(length个),列和(length个),对角线和(2个),并判断这个数组的每一个元素是否相同。若相同则是Magic Squares,否则不是。
    结果:
    yes, it is!
    yes, it is!
    not a matrix
    you use negative. use positive integer
    you use space. use tab

3.1.2 generateMagicSquare()

根据指导书的代码生成了一个新的符合规则矩阵。采用与读入时相似的BufferedWriter和FileWriter把结果写进6.txt,调用isLegalMagicSquare判断其是否是幻方。

结果:
68 81 94 107 120 1 14 27 40 53 66
80 93 106 119 11 13 26 39 52 65 67
92 105 118 10 12 25 38 51 64 77 79
104 117 9 22 24 37 50 63 76 78 91
116 8 21 23 36 49 62 75 88 90 103
7 20 33 35 48 61 74 87 89 102 115
19 32 34 47 60 73 86 99 101 114 6
31 44 46 59 72 85 98 100 113 5 18
43 45 58 71 84 97 110 112 4 17 30
55 57 70 83 96 109 111 3 16 29 42
56 69 82 95 108 121 2 15 28 41 54
yes, it is!

3.2 Turtle Graphics

通过角度的计算和移动长度的计算绘制图形。

3.2.1 Problem 1: Clone and import

https://github.com/rainywang/Spring2020_HITCS_SC_Lab1/tree/master/P2下载代码并解压放在src里,git init初始化仓库。

3.2.2 Problem 3: Turtle graphics and drawSquare

正方形很容易想到采用一个四次的循环,每次旋转90度。

3.2.3 Problem 5: Drawing polygons

根据多边形外角和等于180°这一公理计算出每次需要旋转的角度,再采用一个n次的循环绘制多边形。

3.2.4 Problem 6: Calculating Bearings

用一个循环调用calculateBearingToPoint计算需要转的角度。该函数的实现是先处理特殊情况(位于和坐标轴平行的直线上),然后采用atan函数计算arctan的值,减去当前朝向并关于360取余后则是需要旋转的角度。

3.2.5 Problem 7: Convex Hulls

用边界漫游法利用calculateBearingToPoint计算凸包。先选出最左下角的点,然后以这个点为起始点,逐步找出所有点中偏转最小的点并保存在集合里,直到某一次中找到的偏转最小的点就是起始点时终止。对于偏转角度相同的点,根据指导书要求,选择较远的那个点,距离使用abs(x2-x0)和abs(y2-y0)判断。

3.2.6 Problem 8: Personal art

for(int i = 0; i < 36; i++) {
        	drawRegularPolygon(turtle, 360, 2);
        	turtle.turn(10);
        	turtle.color(color[i % 10]);
        }

绘制了一个五彩的图形。
在这里插入图片描述

3.2.7 Submitting

在eclipse中右键项目,选择Team,commit。选择要提交的文件并写上message时候就可以提交。

3.3 Social Network

实际上是一个图的表示的问题。采用领接表表示法,并用BFS得到最短距离。

3.3.1 设计/实现FriendshipGraph类

用一个list保存每个人的信息,用map保存这张关系图。加点时在list中add此人并在map中给他建立一个空的映射。加边时在map中对应的list(领接表)中add这另一个人。getDistance采用BFS实现,若BFS没找到的则是距离是-1(没有关系)。并实现getList和getMap以方便测试时使用。

3.3.2 设计/实现Person类

Person只需要保存名字,用private String name。用构造函数实现对象的初始化。

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

	public static void main(String[] args) {
		FriendshipGraph graph = new FriendshipGraph();
		Person rachel = new Person("Rachel");
		Person ross = new Person("Ross");
		Person ben = new Person("Ben");
		Person kramer = new Person("Kramer");
		graph.addVertex(rachel);
		graph.addVertex(ross);
		graph.addVertex(ben);
		graph.addVertex(kramer);
		graph.addEdge(rachel, ross);
		graph.addEdge(ross, rachel);
		graph.addEdge(ben, ross);
		graph.addEdge(ross, ben);
		System.out.println(graph.getDistance(rachel, ross));
		System.out.println(graph.getDistance(rachel, ben));
		System.out.println(graph.getDistance(rachel, rachel));
		System.out.println(graph.getDistance(rachel, kramer));
	}

3.3.4 设计/实现测试用例

在这里插入图片描述

发布了3 篇原创文章 · 获赞 0 · 访问量 56

猜你喜欢

转载自blog.csdn.net/weixin_43957335/article/details/104719442
今日推荐