软件构造Lab1记录

First Post:

Last Update:

Word Count:
1.9k

Read Time:
7 min

软件构造Lab1记录

实验目标概述

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

实验环境配置

实验过程

Magic Squares

第一,设计算法来识别输入的矩阵是否是幻方,要保持正确性和健壮性;
第二,分析所给代码,画流程图,找出偶数负数报错的原因,并且把输入的矩阵保存为 6.txt,再用第一个问题中所设计的矩阵进行测试。

isLegalMagicSquare()

过程:

  1. 读取文件,如果找不到文件,提示错误信息,返回 false
  2. 判断文件中的元素是否用\t 分开,如果不是,提示错误信息,返回 false
  3. 判断元素是否全是正整数,如果不是,提示错误信息,返回 false
  4. 判断矩阵行列数是否相等,如果不相等,提示错误信息,返回 false
  5. 判断矩阵是否完整,如果缺项,提示错误信息,返回 false
  6. 累加各个行、列、对角线的所有元素和,比较是否相等:如果其中两个不相等,提示错误信息,返回 false;如果全相等,提示是幻方,返回 true
1
2
3
4
5
6
7
8
9
src/P1/txt/1.txt中的矩阵是幻方
src/P1/txt/2.txt中的矩阵是幻方
src/P1/txt/3.txt中的第19行未被\t分割为21部分
故其不是幻方
src/P1/txt/4.txt中的-35<0
故其不是幻方
src/P1/txt/5.txt中的第121行未被\t分割为121部分
故其不是幻方
请输入正奇数n,用以生成一个n*n的幻方

generateMagicSquare()

过程:

  1. 解释该函数如何生成 n×n 的幻方
  2. 给出注释
    
  3. 分析为何输入负数或者偶数时,会提示错误
    
  4. 在输入负数或者偶数时,提示错误信息,并返回 false
    
  5. 将生成的矩阵保存为 6.txt,并用 3.1.1 设计的函数中测试它。
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
请输入正奇数n,用以生成一个n*n的幻方
11
幻方生成成功!生成的幻方为:
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
正在生成文件6.txt以储存幻方
幻方储存成功!已写入6.txt!
src/P1/txt/6.txt中的矩阵是幻方

Turtle Graphics

该任务分为几个部分:首先要求学会从 github 上下载代码,然后要求利用已有的方法来绘画,包括画正方形,画正多边形,已知当前角度、起点、终点判断需要转过的角度,凸包问题,画出自己想画的图形。最后要求提交代码到 github上。

Problem 1: Clone and import

  1. 从 GitHub 获取该任务的代码:通过实验指导手册找到该任务的网站然后点击 Clone or download 后,再点击Download ZIP 即可
    
    1. 在本地创建 git 仓库、使用 IDEA 集成的 git 管理本地开发。
      

Problem 3: Turtle graphics and drawSquare

利 用 Turtle 类 中 给 的 forward(units) 和 turn(degrees) 方 法 , 来 完 成 drawSquare(Turtle turtle, int sideLength)方法,最后的输出要是一个正方形。实现方法很容易,先走 sideLength,顺时针转向 90,再走 sideLength,顺时针转向 90,然后走 sideLength,顺时针转向 90,最后走 sideLength 即可。

Problem 5: Drawing polygons

  1. double calculateRegularPolygonAngle(int sides);
    这个方法是根据正多边形的边数计算出多边形的内角公式是 double angle = 360 – 180/sides;
    
  2. int calculatePolygonSidesFromAngle(double angle);这个方法是根据正多边形的内角计算出边数
    公式是 int sides = Math.rint(180/(360 – angle));
    
  3. void drawRegularPolygon(Turtle turtle, int sides, int sideLength);这个方法是根据给定的多边形边数与边长画出一个正多边形
    

Problem 6: Calculating Bearings

  1. 实现 calculateBearingToPoint 方法题意是:给定当前的转角(与 y 轴正向夹角,顺时针为正),当前位置,目标位置,求出到目标位置所需要的转角。
    
    1. 实现 calculateBearings 方法 题意是:给定一个 x 坐标的列表,y 坐标的列表,组合为一些坐标位置,求出从上一个坐标位置到下一个坐标位置所需要的转角。
      

Problem 7: Convex Hulls

给定一些点的集合,求出这些点的凸包。通俗来讲,就是求出包围所有点的最小点集合。

Problem 8: Personal art

题目要求是:画一个自己想要的图形

Submitting

将本地项目文件连接到 github 指定仓库后,通过 IDEA 的提交与推送上传至github。

Social Network

建立一个图,来搭建社交网络,能实现添加点、边、求最短路径等操作。设计并实现 java 程序,包括 FriendshipGraph 类,Person 类,main()以及测试用例。

设计/实现 FriendshipGraph 类

  1. addvertex 函数:需要注意的是重复添加人名要返回错误信息;在此函数中扩展人名列表;图的矩阵要扩展,新的一列和新的一行除了对角线为 0,其他全为-1。
    
  2. addEdge 函数:需要注意自身不能与自身建边;两个人重复建边以最新的为准;不能与不存在的人建边。
    
  3. getDistance 函数:需要用 bfs(宽度优先搜索)来对两个人之间求距离,注意与不存在的人之间距离为-1;不可达的两个人之间距离为-1;自身到达自身距离为 0;
    

设计/实现 Person 类

1
2
3
4
5
6
7
8
9
10
11
12
public class Person {
private final String Name;
public Person (String Name) {
this.Name = Name;
}
public String getName() {
return this.Name;
}
public boolean isSameName(String Name) {
return this.Name.equals(Name);
}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class FriendshipGraph {
public static void main(String[] args) {
FriendshipGraph graph = new FriendshipGraph();
Person rachel = new Person("Rachel");
//Person ross = 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(ross, ben);
graph.addEdge(ben, ross);
System.out.println(graph.getDistance(rachel, ross)); //should print 1
System.out.println(graph.getDistance(rachel, ben)); //should print 2
System.out.println(graph.getDistance(rachel, rachel)); //should print 0
System.out.println(graph.getDistance(rachel, kramer)); //should print -1
}
}

设计/实现测试用例

  1. 对于 addvertex 函数要测试正常添加一个人(true)与重复添加一个人(false);
    
  2. 对于 addEdge 函数要测试两个人正常建立关系(true)、一个人与自己建立关系(false)、两个人重复建立关系(以最新关系为准)、不存在的人名(false);
    
  3. 对于 getDistance 函数要测试不可达关系、自身到达自身的距离、一个可达关系的距离、不存在的人名(false)。
    

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

  • 学习新的编程语言时候,要学会与之前学过的语言进行类比
  • 遇到不会的英文单词一定要立马查,不要靠猜词义,很容易理解错误