软构实验Lab1过程与感想

 大二专业分流到软件工程专业,现在中有机会领略到作为软件工程专业大名鼎鼎的软件构造课程了。早在半年前就听班级同学说没有经过软构拷打的软工学生是不合格的,本来不以为然,现在轮到我们亲自面对时确实感受到了恐怖之处。由于本人之前并没有学过JAVA,是在开学第一个月突击学完的,同时也感谢老师考虑到很多同学没有JAVA基础,实验比过去延期了整整三个礼拜才开。虽然有了一个月的学习,但还是有挺多的不足,遇到了不少问题,但明显感觉,想要快速提高能力,这种高强度的实验是很有必要的,以下为我的实验过程和感想。

目录

1 实验目标概述

2 实验环境配置

3 实验过程

3.1 Magic Squares

3.1.1 isLegalMagicSquare()

3.1.2 generateMagicSquare()

3.2 Turtle Graphics

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

3.2.5 Problem 7: Convex Hulls

3.2.6 Problem 8: Personal art

3.2.7 Submitting

3.3 Social Network

3.3.1 设计/实现FriendshipGraph类

3.3.2 设计/实现Person类

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

3.3.4 设计/实现测试用例

4 实验进度记录

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

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


 

1 实验目标概述

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

  1. 基本的 Java OO 编程
  2. 基于 Eclipse IDE 进行 Java 编程
  3. 基于 JUnit 的测试
  4. 基于 Git 的代码配置管理

 

2.实验环境配置

这次实验我选择了使用IntelliJ IDEA来进行,Java版本为Java8,JUnit版本为JUnit4,并按照要求使用Git进行项目版本管理。

1.IntelliJ IDEA的安装与配置

打开浏览器输入JetBrains: Essential tools for software developers and teams,进入 Jetbrains官网,点击 Developer Tools,再点击 Intellij IDEA,点击中间的 Download,进入IDEA下载界面。

 

选择左边的 Ultimate 版本进行下载安装。Ultimate 版本为旗舰版,需要付费,包括完整的功能Community 版本为社区版,免费,只支持部分功能。这里我们选择左边 Ultimate 版本进行下载,然后进行激活

 

之后直接安装即可,只需要在中途将安装路径从默认的C盘改到D盘。

 

之后即可运行IDEA,在激活完成之后,按照教程调整IDEA的配置,并调整个性化页面背景,设置自动导包,设置编码格式UTF-8,设置文件模板,调整不同类型语句的字体颜色,这些都可以在菜单File->Settings里调整。

 

2.配置JUnit

原本我直接按照网上的教程去安装配置,但后来发现IDEA自己就有安装途径,只要安装JUnitGenerator V2.0,即可实现JUnit4的安装

 

3.配置Java

遇到的困难:刚开始由于实验要求还没有下发,我安装了Java17,后来得知实验要求后又重新下载配置了Java8,需要对环境进行修改,对目前不太了解这方面的我来说经常操作错误,并因为认知错误,以为只能有一种版本存在,所以我先查询了彻底删除Java17的方法,做了很多无用功。

解决方法:上CSDN查询相关教程,按照步骤来发现也不难。

 

遇到的困难:在配置环境变量的时候,由于以前使用的python以及matlab也有相关设置,导致我在配置的时候出现了混乱,并由于第一次下载的jdk使用了默认安装目录,导致我始终找不到位置,给配置JAVA_HOME造成了麻烦,不得不重新下载Java8重新配置。

解决方法:根据教程重新配置,并将JAVA_HOME放在了第一位。

 

4.Git配置

直接上官网下载Windows用户的版本,安装。

 

进入git-bash进行本地设置,设置用户,注册邮箱,初始化本地仓库,新建远程仓库,并建立远程连接,以便后续进行commit和push。

如下显示则已经完成远程仓库连接。

 

5.GitHub Lab1仓库的URL地址

https://github.com/ComputerScienceHIT/HIT-Lab1-2021110706

3.实验过程

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

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

Magic Squares

本实验任务是编写一个程序读取给定的txt文档中记录的矩阵信息,并判断这个矩阵是否为一个合法的幻方。幻方是一种将数字安排在正方形格子中,使行/列/对角线上的数字和相等的矩阵。我们首先要对输入进行判断,判断输入数据是否合法,是否符合矩阵/幻方的元素要求。然后才是对各行各列对角线的和进行计算判断,判断是否满足幻方的数学性质。最后我们需要设计generateMagicSquare()函数去生成一个幻方存入文本文件并进行判断。

      1. isLegalMagicSquare()

设计分析:该函数要求判断一个矩阵是否为幻方,输入参数为txt文件的文件路径,函数返回一个boolean值,若符合要求返回true,否则返回false。

实现思路:

1.读入文件,文件处理,进行输入判断

第一次循环读入文件,按\t分割可得第一行元素个数,作为矩阵的列数N。并由此创建int型二维数组。可实现任意大小矩阵的读入。

 

第二次循环读入文件用于将文件按行转换,通过split(”\t”)方法将文件按照制表符分割,存入字符串数组,同时对字符串是否存在“-”,“.”进行判断,以此判断是否存在负数和小数,分别进行提醒。

再将String[] 转换为int[][],通过Integer.valueOf(String)方法将字符串转换为整型数字,并对数字进行检验,查看是否存在0,若存在则提示。

 

 

2.对矩阵行列数进行判断

在上述第一次循环中得到矩阵的列数,在第二次循环中每读入一行令行数+1,即可得到行数,判断行列数是否相同,不同则给出提示。

 

3.对幻方数学性质(行、列、对角线和相等)进行判断

首先计算两个对角线和是否相同,如果不同则直接提示错误,如果相同则记录对角线和为sum,作为之后判断行列和的标准,之后循环计算每行(列)和,分别与sum进行比较,一旦有一行不相同则直接提示错误

 

共存在以下几种报错:

Existing negative numbers(存在负数)

Existing floating-point numbers(存在小数)

The delimiter is illegal(输入不合法)

Such square doesn't  exist(行列数不同,不存在矩阵)

The square is empty(矩阵输入为空)

Sums are different(行/列/对角线 和不同)

运行结果:

运行结果正确,并能给出正确的报错,结果如下:

 

      1. generateMagicSquare()

设计分析:生成一个行列数为奇数的幻方并写入文件。输入参数为行列数n,返回Boolean型判断是否生成成功。

实现思路:

1.实验已给出源代码,只需要对代码进行注释

该函数逻辑为:分析该函数的内容,给定一个参数n作为幻方的行列数,将初始位置为(0, n / 2)(即第一行的中间位置为初始),按照1—n*n整数顺序依次填写,每次填入的数字都在上个数字的右上一格,如果已在最上方则跳转到最下行,如果已在最右列则跳转到最左列,每循环n次即把一个斜对角线填满,需要换行到下一行。当循环n的平方次后,即对整个矩阵赋完了值,且满足每行每列以及两条对角线之和均相同的约束。

函数流程图如下所示:

 

2.再在函数中加入将生成幻方写入文件6.txt的功能即可,即在循环输出的语句下再加一句文件写入操作语句。需要注意的是,写入文本文件时注意要在每个数字中间加上\t,符合读入要求,便于之后判断。

 

3.异常含义与产生原因

a)若输入的n为偶数 ,产生的异常是数组下标越界问题:因为row == 0 时,row 会变为 n – 1;此时有可 能在进行循环时,i 正好整除 n,则 row ++会使 magic 数组下标越界。 现在分析这种情况只有偶数可以发生异常。首先 row 的变化只有三种情况:

(1)i 整除 n

(2)i 不整除 n 且 row 等于 0

(3)i 不整除 n 且 row 不等于 0。

在偶数 n 的情况下,row 有可能在越界的。

b)若输入的 n 为负数,产生的异常是数组大小为负数的异常:因为在函数内部根据 n 申请了一个 int[][] 二维数组square,n不能为负数,若 n 为负数,数组申请报错.

对上述异常进行拓展,进行提示而不是直接抛出异常并非法退出

运行结果如下:

 

 

4.运行结果

运行结果正确,打印的结果:

 

写入文本文件6.txt的结果:

 

3.2Turtle Graphics

本实验的需要实现的功能是绘制正方形,正多边形的生成,以及自由绘制图形。要求我们熟悉Turtle Graphics的各种函数接口以及Math库函数(如Math.pow()、Math.round()、Math.atans()等等)。其涉及的问题有:正多边形角度与边数的关系,以及循环寻找最小偏转角。在本实验中存在许多不同的函数输入输出为int double 数据类型,而且相同数据可能有时要用int型,有时用double型,要注意函数的要求。

​​​​​​​3.2.1Problem 1: Clone and import

如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。

  1. 打开目标存储文件夹,右键点击Git Bash,输入git clone https://github.com/ComputerScienceHIT/HIT-Lab1-2021110706.git
  2. 从报告里的链接上获取了源文件,在IDEA里建立了相关文件夹后,把下载的源文件放到对应文件夹里,IDEA刷新后修改包名并使用。

先用Git创建本地仓库,然后和远程仓库连接,此步骤已在上面git配置里完成。实现一个功能后用git add 上传项目文件,然后commit、push提交到远程仓库上。

完成后结果如下

 

 

​​​​​​​3.2.2Problem 3: Turtle graphics and drawSquare

设计分析:该函数要求画一个正方形,输入参数Turtle对象以及前进步长sideLength。首先为海龟画笔设置颜色(黑色),进行4次循环,每走一次步长就转向90°,即可完成正方形绘制。

运行结果:

 

​​​​​​​3.2.3Problem 5: Drawing polygons

设计分析: 需要实现绘制正多边形的功能。

首先需要实现实现calculateRegularPolygonAngle函数,计算正多边形内角的公式为:(double) 180.0 - (double) 360.0 / sides

通过JUnit运行TurtleSoupTest结果为:

 

而通过内角求边数则比较简单,只要360°/内角 即可,结果如下:

 

最后,我们需要实现绘制正多边形。输入参数:正多边形边数,步长。

原理同正方形绘制,只要前进步长,旋转对应角度(180°-内角),循环边数次即可。

绘制正八边形,步长100结果如下:

 

​​​​​​​3.2.4Problem 6: Calculating Bearings

设计分析:需要实现从起点到终点的偏转角计算(起点有初始角),输入参数:当前朝向角度,起点x、y坐标,终点x、y坐标。

实现思路:

  1. 首先通过始末点坐标,计算这条边与x轴正方向的夹角targetBearing
  2. 计算初始朝向与x轴正方向的夹角currentBearing。

注意:Turtle中0°指向直角坐标中的90°,夹角指的是与直角坐标y轴的顺时针方向的夹角,要修正为直角坐标的角,又由于直角坐标增加是逆时针方向,而Turtle是顺时针方向,角度计算注意添加负号。

  1. 最后调整为0-360°之间(计算出的偏转角可能小于0°)。

 

 

而calculateBearings则可以通过循环调用上述函数,每次输入参数为xCoords和yCoords的前一个坐标与后一个坐标,通过上一个函数计算旋转角度并存储到List中。

 

 

​​​​​​​3.2.5Problem 7: Convex Hulls

设计分析:需要实现凸包问题,运用礼品包装算法。

以下为示例:

 

礼品包装算法:首先寻找最左下的点,然后以该点为起始点,建立极坐标系,在其他所有点中,逆时针方向极角最小的点即为下一个点,以下一个点为新的起始点,重复以上步骤,直至再次找到最初的起始点,则循环完成,实现对其余点的包装。

注意点:在比较极角的时候不是单纯的比较与正方向的夹角大小,而要求所指向的偏转角需要大于上条边的偏转角,否则会选到错误的点。即比较的是偏转角的极角,而非正方形的极角。

运行结果:

 

​​​​​​​3.2.6Problem 8: Personal art

本问题要求自行绘制图形

首先通过增加正多边形的边数,可以近似实现画圆,然后每次循环画一个圆,画完一个圆旋转一度,重复360次即可近似画成圆盘,再调整步长,可以重复绘制小圆盘,再通过步数调整颜色

 

即可绘成如下 靶型图:

 

​​​​​​​3.2.7Submitting

在master文件夹右键点击打开Git Bash,与远程仓库建立连接,如下即为完成建立(在Git配置中已经写过,不再赘述)

 

之后使用git add指令和git commit指令跟踪src文件夹并且上传至本地仓库。

之后使用git push origin master指令将代码push到远程仓库Lab1,就完成本项任务了。

​​​​​​​3.3Social Network

实验要求我们完成一个社交关系记录图的任务,需要我们建立两个类。一个类是社交任务类(Person),另一个是社交关系图类(FriendshipGraph)类。然后通过在主方法中输入社交关系来构建这个关系图,并计算社交距离。

本质上就是实现有向图(可拓展到无向图)的设计,以及最短路径算法,我采用了邻接表来存储社交网络图,采用广度优先搜索算法实现计算最短路径。(缺点:只能实现无权图的计算,但是符合社交网络的规则。

3.3.1设计/实现FriendshipGraph类

设计分析:该类的实际意义是一张社交网络图,包括了代表每个Person的点、代表每两个Person之间联系的边、以及建立点和联系和计算距离的方法。

实现思路:

只要实现以下三种函数功能:addVertex、addEdge、getDistance

addVertex(Person p)方法:我使用List再存储每一个人的社交圈。在这个方法中先判断这个人是否已经存在于这个社交关系图中,若已经存在则输出重复添加,否则将其添加到这个图中。

addEdge(Person p1, Person p2)方法:首先判断p1和p2这两个人是否存在,若否,则输出不存在这两个人。函数使用graph.get(People1).add(People2),可以得到People1的朋友列表,在该朋友列表中添加新的朋友People2。

getDistance(Person People1, Person People2)方法:该函数首先声明一个ArrayList<Person> visited_Person数据结构,来保存已访问过的成员对象。使用邻接表广度搜索的方法,借助队列,先将起点入队,然后执行循环,直到队列为空前:弹出队列头元素,计算当前距离,把弹出点的所有“朋友”入队,并加入visited_Person中,设置距离为先前计算的距离+1。直到找到目标点,返回当前距离。若直到队列为空仍未找到目标点,返回 -1。

​​​​​​​3.3.2设计/实现Person类

设计分析:

Person类的设计相对来说比较简单,

保存对象名字的字符串private String Name

得到当前对象名字的方法getName()

 

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

给出你的设计和实现思路/过程/结果。

报告已给出代码:

 

​​​​​​​3.3.4设计/实现测试用例

有三个测试类

第一个就是报告给出的上述代码,结果为:

 

第二个是对添加的person存在相同名字情况的判断,

结果为:

 

 

第三个测试是自己设置一系列的点和边,测试getdistance方法:

 

 

运行的结果为:

 

4.实验进度记录

请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。

日期

时间段

任务

实际完成情况

2023-03-13

21:00-:22:30

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

按计划完成

2023-03-14

19:30-:22:30

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

准时完成

2023-03-15

18:00-:22:30

完成问题2的problem1、3、5、6

准时完成

2023-03-16

16:00-:17:30,18:00-:20:30

完成问题2的problem7,编写convexHull函数,并进行测试

准时完成

2023-03-16

21:00-:22:30

完成问题2的problem8,编写drawPersonalArt函数

准时完成

2023-03-17

10:00-:13:30

14:30-18;00

19:00-21;00

完成问题3 的friendGraph类,和person类

准时完成

2023-03-18

10:00-:13:30

14:30-18;00

19:00-21;00

完成问题3 的测试类,并对之前问题的代码进行测试,修改,完善。

勉强完成

 

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

遇到的困难

解决途径

刚开始由于实验要求还没有下发,我安装了Java17,后来得知实验要求后又重新下载配置了Java8,需要对环境进行修改,对目前不太了解这方面的我来说经常操作错误,并因为认知错误,以为只能有一种版本存在,所以我先查询了彻底删除Java17的方法,做了很多无用功。

上CSDN查询相关教程,按照步骤来发现也不难。

在配置环境变量的时候,由于以前使用的python以及matlab也有相关设置,导致我在配置的时候出现了混乱,并由于第一次下载的jdk使用了默认安装目录,导致我始终找不到位置,给配置JAVA_HOME造成了麻烦,不得不重新下载Java8重新配置。

根据教程重新配置,并将JAVA_HOME放在了第一位。

Maven配置出现错误

请教同学完成

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

       总结来说,这次Lab1难度是有的,但是比起后面的Lab2,Lab3确实差了一筹。但是对于我来说还是很有挑战性的,由于只学了一个月的JAVA,我也仅仅只是懂得了JAVA的基础语法,而且有明显的感觉,JAVA和C语言的语法非常的相似,这也是让的我们学过C语言的同学上手非常之快,所以基本函数体只要我们了解运行的过程和原理,就不会有太大的难度,感觉比较难的地方在于对各种配置的不熟悉,比如Java8的的安装,IDEA的配置,git的配置以及如何在IDEA中使用git,Maven的配置,java各个包之间import啊package啊之类的,并没有课程去仔细讲解的知识点,都是十分让我困扰的事情。因为有很多问题是网上的教程中没有出现的,导致需要我花费大量的时间去搜索去解决,但另一方面来说,这也是对我信息检索能力的一种锻炼,日后的工作学习不可能有攻略能够完全覆盖,总会有各种各样的麻烦出现让我们头疼,但是就像我们的老师在第一节课上所说,人生就是如此,总会有困难浮现,我们面对这种看似超过我们能力范围的实验,需要的不是放弃,不是埋怨,不是想着向老师求情不断降低实验难度,而是需要我们在这种高压之下磨练能力,思考应该有什么方法来解决这个问题,需要的是我们以不变应万变,不断锻炼自己应对困难的反应力与解决能力,这或许才是这次实验带给我们的更宝贵的财富。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lyg809073256

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值