2022年春季学期计算学部《软件构造》课程Lab 1实验报告

本文记录了一次实验过程,涉及Java编程的MagicSquares验证、TurtleGraphics图形绘制与社交网络设计,通过解决实际问题提升编程技能和Git管理

目录

1 实验目标概述..................................................................................................... 1

2 实验环境配置..................................................................................................... 1

3 实验过程.............................................................................................................. 1

3.1 Magic Squares............................................................................................... 1

3.1.1 isLegalMagicSquare()................................................................ 2

3.1.2 generateMagicSquare()............................................................. 4

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............................................................ 4

3.2.4 Problem 6: Calculating Bearings........................................................ 5

3.2.5 Problem 7: Convex Hulls.................................................................... 5

3.2.6 Problem 8: Personal art........................................................................ 5

3.2.7 Submitting.............................................................................................. 5

3.3 Social Network.............................................................................................. 5

3.3.1 设计/实现FriendshipGraph类.................................................. 5

3.3.2 设计/实现Person类........................................................................ 6

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

3.3.4 设计/实现测试用例............................................................................ 6

4 实验进度记录..................................................................................................... 6

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

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

6.1 实验过程中收获的经验和教训(必答)............................................. 7

6.2 针对以下方面的感受(必答)............................................................... 7

  1. 实验目标概述

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

  1. 实验环境配置

https://github.com/ComputerScienceHIT/HIT-Lab1-L20L021201.git。

  1. 实验过程

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

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

    1. Magic Squares

在任务首先给出了幻方的定义,然后要求编程判断是否时幻方,并且对于不是幻方的情况指出是什么原因。用
抛出异常加异常处理的方式处理。最后还利用已有函数生成幻方,并用自己编写的函数判断。考察的是文件读写操作与java中基本操作的使用。;

      1. isLegalMagicSquare()

(1) 首先文件中按行据,每一行据存入字符串数组myLine,用整型line记录读入的行;

(2).split("\t")方法每行字符串myLine[i]分割粒度更小的字符串,用整型len记录当前行包含的分割后字符串个数不光判len是否line相等,若不相等据不以方形式组织,不符合幻方定

(3)保文件后,利用正[1-9][0-9]*断当前行每分割后字符串是否正整,若不符合则数据表示不符合幻方要求。若符合正,式利用Integer.valueOf方法将该分割字符串正整存入整形数组matrix

package Lab1;public class MagicSquare {
}
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {

// Complete the formingMagicSquare function below.
static int formingMagicSquare(int[][] s) {
int[][][] magicSquare = {{{8, 1, 6}, {3, 5, 7}, {4, 9, 2}}, {{4, 3, 8}, {9, 5, 1}, {2, 7, 6}},
{{2, 9, 4}, {7, 5, 3}, {6, 1, 8}}, {{6, 7, 2}, {1, 5, 9}, {8, 3, 4}},
{{6, 1, 8}, {7, 5, 3}, {2, 9, 4}}, {{8, 3, 4}, {1, 5, 9}, {6, 7, 2}},
        {{4, 9, 2}, {3, 5, 7}, {8, 1, 6}}, {{2, 7, 6}, {9, 5, 1}, {4, 3, 8}}};

int ans = Integer.MAX_VALUE;
    for (int i = 0; i < magicSquare.length; i++) {
int cost = 0;
      for (int j = 0; j < s.length; j++) {
        for (int k = 0; k < s[j].length; k++) {
if (s[j][k] != magicSquare[i][j][k]) {
cost += Math.abs(s[j][k] - magicSquare[i][j][k]);
}
}
}
ans = Math.min(ans, cost);
}
return ans;
}

private static final Scanner scanner = new Scanner(System.in);

public static void main(String[] args) throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(
new FileWriter(System.getenv("OUTPUT_PATH")));

int[][] s = new int[3][3];

    for (int i = 0; i < 3; i++) {
String[] sRowItems = scanner.nextLine().split(" ");
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

      for (int j = 0; j < 3; j++) {
int sItem = Integer.parseInt(sRowItems[j]);
s[i][j] = sItem;
}
}

int result = formingMagicSquare(s);

bufferedWriter.write(String.valueOf(result));
bufferedWriter.newLine();

bufferedWriter.close();

scanner.close();
}
}

      1. generateMagicSquare()

正奇数幻方的产生方法,也就是generateMagicSquare()使用的方法可以用口诀来概括:“一居上行正中央,依次斜填切莫忘;上出框时向下放,右出框时向左放;排重便在下格填,右上排重一个样”。

具体来说,添加代码判断输入的n不为负数或偶数后,函数generateMagicSquare首先将数字1放置在幻方最上方正中央位置,而后每次将下一个数放置在右斜上方位置,每放置n个数字行数加一。若到达第一行,则下一次到最后一行放置,否则行数减一;若到达最后一列,则下一次到第一列放置,否则列数加一。放完所有n*n个整数后,将矩阵输出到文件6.txt。

    1. Turtle Graphics

该实验的目的主要是通过Java实现一个简单的Turtle小程序并实现简单图形绘制的功能。

      1. Problem 1: Clone and import

从实验手册链接领取P2初始任务代码,克隆到本地仓库,导入eclipse项目目录

      1. Problem 3: Turtle graphics anddrawSquare

Turtle graphics实验任务组包含了“小海龟画图”GUI的简单Java实现版本。实验的主要任务是根据实验指导完成一些功能代码的阅读与补全。

函数drawSquare的实现要求利用forward和turn方法完成一个正方形的绘制。forward方法能够让小海龟在画面上前进给定单位距离,turn方法能够让小海龟又转向90度。

由于每次绘图开始时海龟朝向Y轴正方向,因此只需让小海龟前进sideLength个单位,再右转90度,重复4次即可完成一个正方形的绘制。

      1. Problem 5: Drawing polygons

首先完成函数calculateRegularPolygonAngle(int sides)的实现。该函数接收参数为多边形的边数,返回值为对应多边形内角大小(以度为单位),数值类型为double。由正多边形内角计算公式,可以直接返回180.0 * (sides – 2) / sides。

接下来,运行TurtleSoupTest.java文件,测试对函数calculateRegularPolygonAngle的实现是否正确。

保证该函数实现正确后,要求完成对函数drawRegularPolygon的实现,且需要用到calculateRegularPolygonAngle的实现。实现方法也十分简单:只需要首先利用函数calculateRegularPolygonAngle计算出正多边形内角度数angle,再将turtle朝向右转(450-angle)度,而后进行sides(边数)次循环,每次循环先用forward方法前进sideLength距离,再使用turn方法转向(180-angle)度即可。

      1. Problem 6: Calculating Bearings

该任务要求实现用于计算方位角的两个函数。

首先实现calculateBearingToPoint。该函数根据当前点,当前朝向与目标点坐标计算指向目标点的方位角。

直接利用Math.atan2函数计算出来由当前位置指向目的位置向量的与X轴正向的夹角,然后计算当前朝向的夹角,然后作差即可。主要不能出现负角度,可在适当时候增加360度达到此目的。

      1. Problem 7: Convex Hulls

利用Gift wrapping algorithm算法计算给定集合中的凸包,首先找到最左下角的点加入集合,然后比较剩余点到此点的偏转角,找到偏转角最小的加入集合,当偏转角相同时,找到距离当前点最远的点加入集合。而后选择最新加入集合的点为基点,比较剩余其他各点到该点的偏转角,同样按照上述方法找到符合条件的点。以此类推,直到之后找到符合条件的点为起始点,得到凸包的点集。

      1. Problem 8: Personal art

该部分要求利用以上实现各个函数实现个人图形的绘制。自由发挥即可。

      1. Submitting

如何通过Git提交当前版本到GitHub上你的Lab1仓库。

    1. Social Network

该任务要求实现Person和FriendshipGraph两个类,用FriendshipGraph来构建Person之间的关系来模拟一个社交网络,能够计算出每两个Person之间的社交距离

      1. 设计/实现FriendshipGraph类

设计思路:考虑将FriendshipGraph类的实现与Person类的实现尽量独立,减少耦合。FriendshipGraph中顶点代表个人Person,有向边(A,B)代表B是A的单向好友,顶点与边采用邻接表的数据结构存储。FriendshipGraph类中除去两个实例构造方法,还包含其他四个方法:

(1)addVertex向社交网络中添加个人节点;

(2)addEdge向社交网络中添加单向好友关系;

(3)getDistance获取图中两人之间好友关系的最短路径长度;

(4)main方法负责测试实验指导中给出的样例数据。

其中,getDistance部分采用广度优先搜索从起点先广搜索目标节点并获取最短路径长度。

      1. 设计/实现Person类

Person类包含两个属性,分别是String类型的name表示姓名,和boolean类型的valid表示身份的有效性。除此之外,Person包含4个方法:带姓名的构造方法,获取姓名方法getName,获取身份状态方法getStatus,以及否定身份方法denyStatus。加入身份有效性的考虑在于,在不使用static类型全局变量的前提下,校验不同Person之间姓名的互异性成为一个不容忽视的问题。引入身份有效性后,通过将Person加入到社交网络时的行为来判定个人身份的有效性,即判重。

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

直接复制实验指导的代码稍加修改即可。

      1. 设计/实现测试用例

分别对addVertex, addEdge, getDistance,main四个方法进行测试。

1)对于addVertex,设计test用例testaddVertex,内建四个Person对象全部执行addVertex,判断vertexsMap中是否包含这些对象即可。

2)对于addEdge,设计测试用testaddEdge,内建8个Person对象,执行addVertex后,执行addEdge然后判断他们的朋友中是否包含彼此即可。

3)对于getDistance,设计test用例testgetDistance,内建8个Person对象,执行addVertex,addEdge后,测试三种距离等价类:距离为-1,距离为0,距离为正整数。

4)对于main方法,设计测试用例testSampleCase,测试其中代码执行结果是否与原版实验指导给出的相同。

  1. 实验进度记录

日期

时间段

任务

实际完成情况

2022-04-29

18:30-19:30

github classroom导入项目

按计划完成

2022-05-01

14:20-17:00

编写问题1的isLegalMagicSquare函数并进行测试

按计划完成

2022-05-07

19:00-21:00

编写完成任务2,并且一起push,修改GitHub上的文件目录结

遇到困难,未完成

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

遇到的困难

解决途径

集成gitjunit

查阅csdn,,购买科学上网工具,自己动手解

Java的数据类型,类的构建方式,构造器不熟悉

看教程,看网课,问同学,自己动手试着更改

  1. 实验过程中收获的经验、教训、感想
    1. 实验过程中收获的经验和教训(必答)

通过这次实验,我对Java编程的基础知识有了更深刻的理解,对面向对象的编程思想有了更深刻的认识,同时,我学会了对git版本控制等新知识。我通过本次实验清晰认识到对程序进行单元测试的重要性。

    1. 针对以下方面的感受(必答)
  1. Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?

刚接触Java语言有些许的不习惯,对面向对象的编程思想认识不足。

  1. 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;

IDE

优势

不足

Eclipse

开源、免费、占用内存较少、一个页面可以打开多个项目

界面较为传统、代码提示不够智能

IntelliJ IDEA

界面美观、代码提示智能

专业版需要付费、占用内存较多、一个页面只能打开一个项目

  1. 关于Git和GitHub,是否感受到了它在版本控制方面的价值;

使用git可以轻松实现版本控制,修改过的程序git会自动检查、提交新版本时只需处理修改过的程序即可;使用GitHub托管平台可以轻松实现代码获取和提交,便于多人协作。

  1. 关于CMU和MIT的作业,你有何感受;

不错,很有意思

  1. 关于本实验的工作量、难度、deadline;

工作量适中,deadline也合适,不过对于自己这样基础较薄弱的同学,难度稍大, 自己会课下多加练习,以满足课程要求

  1. 关于初接触“软件构造”课程;

接触这门课之前,认为它是关于如何开发软件的,即教会我们写软件,但上了两堂课之后,发现这门课并不仅仅涵盖写软件这样浅层次的知识,更多的是在试图传授思维,让我们对软件开发进行具体实践的同时,能在宏观上把握一个软件的整体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值