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

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

姓名 孙楚芮
学号 120L020624
班号 2003010
电子邮件 2052399018@qq.com
手机号码 15204503697

1 实验目标概述

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

  • 基于 Idea 进行 Java 编程
  • 基于 JUnit 的测试
  • 基于 Git 的代码配置管理

2 实验环境配置

首先下载Idea安装包,同时下载JDK11,进行简单的环境配置之后完成了对Idea的配置,从而可以开始进行java编程。对于git的配置主要是生成了一个ssh,使用git remote 命令连接实验代码仓库之后每次push使用git push origin master 命令将代码push到仓库中的master分支上。

在这里给出你的GitHub Lab1仓库的URL地址:
https://github.com/ComputerScienceHIT/HIT-Lab1-120L020624

3 实验过程

3.1 Magic Squares

任务的第一部分是设计一个函数检测5个文本文件中的矩阵是否是幻方(幻方定义是首先为方阵,其次行列,对角线之和均相等)其中涉及对于非法输入的处理等;第二部分是使用给定的一个函数生成幻方,并检测,这一部分同样涉及对于非法输入的处理。

3.1.1 isLegalMagicSquare()

按步骤给出你的设计和实现思路/过程/结果。
首先,实验的第一步是读取txt文件中的内容部分,本代码中采用的是java.io.BufferedReader包中的函数实现这一功能的。当读取到信息后首先进行非法数据检测,如果出现小数点等非法字符或出现不是方阵或是数据没有以\t分割,分别输出错误信息并退出程序。在这一遍历过程中将txt中读到的数据填到一个二维数组中作为判断使用。
接下来判断是否是幻方,采用的方法是首先计算主对角线上的和作为比较标准,接着遍历计算每一行、每一列的和,如果与主对角线和不同,输出false,如果遍历结束发现都符合条件那么输出true。代码片段如下:
在这里插入图片描述

在这里插入图片描述

3.1.2 generateMagicSquare()

这一函数是按照劳伯法生成奇数阶幻方的。劳伯法主要思想是把1(或最小的数)放在第一行正中;每一个数放在前一个数的右上一格;若该数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;若该数数所要放的格已经超出了最右列那么就把它放在最左列,上一行;若该数所要放的格已经超出了顶行且超出了最右列,则放在底行左列;若该数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内,代码流程图如下:

在这里插入图片描述

这一函数如果输入的参数为偶数将会出现报错,主要原因的如果参数是偶数那么第一步找正中的过程将会找不到一个满足的格,那么将报错。如果是负数的话由于方阵不可能元素个数不可能是负数因此报错。对于这两种情况实验代码都进行输出错误原因后退出程序。

3.2 Turtle Graphics

这一部分一共八个任务,首先需要获取源代码,然后创建和管理本地仓库。画正方形、据内角求边数、据边数求内角,画正多边形,计算方位,计算凸包,个性创作。

3.2.1 Problem 1: Clone and import

如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
首先需要获取代码,采用的方法是将本地仓库与代码仓库连接之后使用git pull命令获取需要的代码文件。在本地使用git管理时需要先对需要管理的文件夹使用git init命令初始化之后,使用git add,git commit等命令进行管理。最后使用git push origin master命令将代码上传到github仓库中。

3.2.2 Problem 3: Turtle graphics and drawSquare

在这里插入图片描述

重复四次操作,每次执行前进一次,转270°角(即逆时针)一次,最后就可以画出一个正方形。

3.2.3 Problem 5: Drawing polygons

首先需要计算正多边形的每一个内角的大小,假设是正n边形,那么每一个内角的大小是360-360/n,计算出每一个内角大小之后,需要进行的是n次循环,每次循环执行前进与转角任务,其中每次转角的度数为360/n。根据这一思路就可以画出正n边形。
在这里插入图片描述

3.2.4 Problem 6: Calculating Bearings

首先需要处理的是计算两个点之间的转角,这一点可以先忽略现有转角,先计算从当前点到目标点需要的转角,这一转角使用Math包中的atan2函数实现,atan函数用于反正切值计算,这里我们由数学方法可得,当被转点的y坐标小于转点的y坐标时,需在所得角的基础上+180°,反之则不必。最后得到的角可能小于原转角,为了返回[0°,360°]以内的答案,我们将所得数+360°后对360取余,则答案正确。
在这里插入图片描述

3.2.5 Problem 7: Convex Hulls

这一部分需要对给定的点求凸包,也就是最少的点组成的多边形能够包含所有的点。这里我们应用网上提到的卷包裹算法,算法的具体流程为:第一步先选定最左上方的点,易知这个点一定在凸包上,而后每次循环都找到当前点转动角之差最小的转动角,易知以此法找到的点也在凸包上,重复上述操作则可找到所有凸包上的点。

在这里插入图片描述

上述这部分的最终结果如图(这里老师给出的测试样例特殊性过强,因此我额外给出了一个独有难度的测试样例)
在这里插入图片描述

3.2.6 Problem 8: Personal art

这一部分需要做的是自行设计并绘制一个图案,设计代码与画出的结果如下:
在这里插入图片描述

在这里插入图片描述

3.2.7 Submitting

如何通过Git提交当前版本到GitHub上你的Lab1仓库。
首先使用git remote命令连接实验代码仓库,之后将commit后的结果使用git push origin master提交到代码仓库中的master分支。

3.3 Social Network

需要实现的是一个社交网络的无向图,其中节点是每一个人,需要实现的函数功能是增加节点、增加两人之间的关系、求两人之间的距离,分别对应三个函数。

3.3.1设计/实现FriendshipGraph类

该类具有两个属性与三个方法。首先两个属性分别是People列表与已经存在的人名的集合member,后一个集合主要是为了处理两个人重名的不合法输入情况。在处理完输入不合法情况之后需要对三个方法进行处理。
addVertex方法只需要向People中添加需要加入的Person,并向member中添加该人的名字即可
addEdge方法只需要使用Person类中的addFriend方法实现即可。
getDistance方法并使用BFS,在BFS每一次执行中都比对当前的节点是不是所求节点,如果是直接输出距离,如果不是且该节点未访问过,那么将这个节点入栈,扫描完第一层所有的点后对距离值批量+1,直到寻找到待寻找节点或是寻找不到输出-1,代码片段如下:
在这里插入图片描述

3.3.2设计/实现Person类

首先Person类中有两个属性,分别是名字与朋友列表,分别为String与List。在定义了无参有参构造类(有参构造只可以通过名字)的同时,还有六个方法,分别是addFriend,getName,getFriends,setName,setFriends,print,功能分别是增加朋友,获得Person的name与获得Person的friend列表,设置姓名,设置friends列表,输出这个Person的全部信息。

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

使用的是pdf中给出的测试样例,首先定义Person,接着向生成的graph中添加节点、添加关系并测试两个人之间的关系是不是符合我们预先设定的值。

3.3.4设计/实现测试用例

设计的测试样例的图示如下:
Rachel<——————>Rose
|
Ben Krammer

测试结果如下:
在这里插入图片描述

4 实验进度记录

请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。

日期时间段任务实际完成情况
2021-05-0118:30-19:30编写问题1的isLegalMagicSquare函数并进行测试按计划完成
2021-05-0213:30-14:50编写P1剩余部分并完成P1测试完成
2021-05-0215:00-17:50编写P2的前五个问题完成
2021-05-0219:00-22:40编写结束P2与P3,并完成测试完成
2021-05-0314:00-17:00编写实验报告并检查代码准备提交完成

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

遇到的困难解决途径
部分时候github无法连接使用加速器或等待网络情况正常均可解决
不知道如何读取txt文件内数据参考网上代码,使用bufferedread类进行文件流操作,先读入一行,之后利用split将String转为数字
测试代码编写遇到困难观看上课的录屏并在网上查阅
项目的空间结构总是设置不好观看上课的录屏并在网上查阅
编写具体类遇到困难在网上查阅具体的工程方法

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

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

第一次实验对于java这种语言还不是很熟悉,正在处于边写实验边学习java的过程中。在编写实验一的过程中发现如果使用java的oop特性可以比较方便的完成一些程序的开发,同时看起来编程的思路也更加的清晰。同时在实验一中感受最深的就是对于异常的处理。在程序中可能会出现各种非法输入,作为代码开发者需要对于非法输入定义一种行为,可以是输出错误信息后退出程序,这也是代码的健壮性所要求的。同时通过实验一认识到了使用git管理文件的方便性。

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

  1. Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?
    感觉java在一些地方和c++相似,但是在大多数情况下显得更加方便一些。我现在还处于初学阶段,对我个人而言,感觉java是一门很优秀的编程语言。

  2. 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;
    个人感觉Eclipse在很多方面和IDEA还是存在较大差距,比较明显的一点就是代码补全功能,听说Eclipse的代码补全功能还是偏弱。但是Eclipse还是可以算是比较好用的。
    反观java就是功能极为强大,美中不足就是登陆进入需要繁琐的操作。

  3. 于Git和GitHub,是否感受到了它在版本控制方面的价值;
    Git管理文件十分方便。可以进行版本控制,时刻回滚到先前的版本

  4. 关于CMU和MIT的作业,你有何感受;
    可以做到很棒的实验受益匪浅。

  5. 关于本实验的工作量、难度、deadline;
    从这次难度来看难度与工作量都适中。
    时间比较紧张,因为本次实验与相对重要的考试安排比较近。

  6. 关于初接触“软件构造”课程;
    上课之初比较茫然,需要大量时间去学习。学习到了之前没有接触到的很多编程(尤其是java)方面的知识,对于软件构造有了初步的了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值