ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

软件构造 Lab 1

2022-06-08 01:01:33  阅读:227  来源: 互联网

标签:git Java 实验 构造 添加 3.2 Lab 软件 Problem


下面是实验一的实验报告,对其进行重新编排转化为markdown格式,并在重新回顾的过程又获得了新的感悟和思考。

image

2022年春季学期 计算学部《软件构造》课程

Lab 1实验报告

姓名 赵伟东
学号 120.........
班号 2003...
电子邮件 986579251@qq.com
手机号码 1660929....

目录

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

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

3 实验过程.................................................................................................................................................. 2

3.1 Magic Squares.................................................................................................................................. 2

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

3.1.2 generateMagicSquare()............................................................................................... 2

3.2 Turtle Graphics................................................................................................................................. 2

3.2.1 Problem 1: Clone and import................................................................................................ 3

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

3.2.3 Problem 5: Drawing polygons.............................................................................................. 3

3.2.4 Problem 6: Calculating Bearings.......................................................................................... 3

3.2.5 Problem 7: Convex Hulls....................................................................................................... 3

3.2.6 Problem 8: Personal art.......................................................................................................... 4

3.2.7 Submitting................................................................................................................................. 4

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 实验进度记录......................................................................................................................................... 7

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

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

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

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

1 实验目标概述

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

l 基本的 Java OO 编程

l 基于 Eclipse IDE 进行 Java 编程

l 基于 JUnit 的测试

l 基于 Git 的代码配置管理

2 实验环境配置

首先按照Lab0实验指导的提示,安装好JDK-11、Eclipse、IDEA和Git。然后再本地配置JDK环境变量,打开高级系统设置查看环境变量,再系统变量中新建环境变量JAVA_HOME,并将值链接到jdk-11.0.15所在的路径;再在Path变量中新建一个值,链接到%JAVA_HOME%\bin。

在了解了一些Java特性和Git的常用命令后,使用IDEA创建了新的项目,并书写了第一个Helloworld程序,初始化了本地仓库,跟踪并提交了文件并Push到了GitHub上。

按照实验指导配置下载Junit所需的jar包,并添加到测试类路径,按指导配置好Maven后,书写自己的test文件,对一个简单的数值返回函数进行测试。

特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

​ 由于之前安装过JDK-8,并且距本次实验时间较长,忘记了其安装路径,开始的时候不知道该先卸载JDK-8或者该怎么覆盖安装。通过查询资料得知,IDEA/Eclipse在开始一个工程的时候可以选择不同的JDK,所以只需要在环境变量增加对应的JDK即可,具体JDK的使用可以在创建工程或之后调整。

​ 指导中关于Java的教学都是英文,对于初学者不是很友好,可以自己借阅其他Java的指导书学习。

​ Git本地在与GitHub关联的时候,由于对命令掌握的不够,导致无法clone

​ 首先需要在终端执行ssh-keygen命令按几次回车生成公私钥,将.ssh/id_rsa.pub 文件中的公钥内容复制出来,在GitHub网页上添加公钥。然后够我们就可以克隆Github上的仓库到本地了。

在这里给出你的GitHub Lab1仓库的URL地址。

https://github.com/ComputerScienceHIT/HIT-Lab1-120L052314

3 实验过程

3.1 Magic Squares

Magic Squares是一个正整数组成的正方形,其每行、每列以及对角线的数字之和都相等。本次实验需要实现两个任务。

其一,编写一个函数来检查一个矩阵是否是Magic Squares,能将文本文件当作参数输入,并得到输出。并且能够处理输入文件的各种特殊情况并给出错误提示信息。

其二,对代码原本提供的generateMagicSquare函数进行扩写,使其能够产生一个MagicSquare并将其输出到6.txt文件中,

3.1.1 isLegalMagicSquare()

首先对行数和列数进行判断,创建两个BufferedReader对象来分别从文件中读取行数和列数。对于每一行使用String类的split方法,将分隔符设置为”\t”,来获取列数,如果行列数不同,返回false输出提示信息。

然后对每个元素进行判断,设置正则表达式match=”[\d](file://d)”来匹配整数,如果元素不匹配match或者小于0则返回false输出提示信息。

如果匹配都相等则将矩阵记录在二维数组中,分别计算行、列的和,以及对角线的和,如果出现不相等,返回false输出提示信息。

如果都相等则输出正确提示信息,返回true。

3.1.2 generateMagicSquare()

在理解了生成MagicSquare之后,添加写入文件步骤,加入try{}catch(){}语句处理异常,创建一个File对象,输入文件路径名。创建BufferWriter来写入文件,并使用”\t”来分隔数字,每行输入结束后使用”\n”换行。

3.2 Turtle Graphics

使用Turtle Graphics绘图工具,完成四个任务:绘制一个正方形;完善计算正多边形的函数,实现从内角到变数,从边数到内角的计算,并绘制正多边形;计算一系列点的凸包;绘制一个自定义绘画。

3.2.1 Problem 1: Clone and import

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

从GitHub获取该任务的代码:在GitHub打包下载代码。

在本地创建git仓库:

  1. git init初始化本地仓库

  2. git add remote添加远程库源

  3. 在远程仓库创建master分支

  4. git pull origin master将远程仓库同步到本地

  5. git add . 、git commit -m “” 、git push将本地文件加入到本地仓库,将本地仓库同步到远程仓库。

3.2.2 Problem 3: Turtle graphics and drawSquare

通过四次循环,每次使用forward前进,并使用turn旋转90°即可得到正方形

3.2.3 Problem 5: Drawing polygons

首先根据公式,正多边形的内角等于180-(360/边数)补全函数calculateRegularPolygonAngle。注意,返回值为double类型,应将180和360变为180.0和360.0

补全函数calculatePolygonSidesFromAngle,由上边的公式逆向递推即可,但应注意对double类型小数部分的处理

最后,补全drawRegularPolygon,根据输入多边形的边数,如果边数小于等于2或者边的长度为负,直接返回,否则循环sides次,每次向前sideLength,然后旋转内角180-内角的度数。

3.2.4 Problem 6: Calculating Bearings

首先,补全calculateBearingToPoint函数,通过调用Math类中的atan2来计算前进方向与x轴正向夹角,并把该角度转换为y轴正向的夹角,如果角度为负数的话,加上360来使度数处于0-360的范围。

然后补全函数calculateBearings,计算输入的列表中的每两个相邻点的夹角,保存在列表angle并返回

3.2.5 Problem 7: Convex Hulls

使用 gift-wrapping algorithm算法来计算给定集合的凸包,当点集中只有两个点、一个点或者没有点,直接返回点集。首先寻找最左侧的点,然后寻找该点到剩余点中偏转角度最小的一个点 (如果两个点偏转角度相同,则选取距离最远的那个),将找到的点作为下一个基点,直到下一个基点为最左侧的点,过程结束。

image

3.2.6 Problem 8: Personal art

通过循环,改变每次前进的距离和每次画笔的颜色画出多个不同大小的五角星,重叠在一起

image

3.2.7 Submitting

  1. 在HIT-Lab1-120L052314文件夹目录下打开git-bash

  2. git add . 对所有文件添加追踪

  3. git commit -m “P2” 提交到本地仓库并备注P2

  4. git push 同步到远程仓库

3.3 Social Network

实现FriendshipGraph类和Person类来表示一个社交网络中的无向图,图中每个节点代表一个人,每条边代表两个人之间具有社交关系,并且两个人之间应该有两条相互的边以便未来扩展到有向图。需要实现增加节点(即向社交网络中加入一个人)、增加边(即增加两个人的社交关系)、求两个人之间的距离对应的三个函数。

3.3.1 设计/实现FriendshipGraph类

FriendshipGraph类中首先要有一个列表用来存储Person节点,可以使用ArrayList类来实现,将变量名命名为Vertex。

实现FriendshipGraph类的第一个函数addVertex,输入一个Person对象,判断此对象中的人名是否在图中,如果在图中,抛出异常。否则使用List接口中的add方法将此对象添加到列表中。
image

然后实现函数addEdge,如果输入的Person对象是同一个,则抛出异常,否则调用Person对象的addFriend方法,将B添加为A的朋友,即在A对象的成员变量List Friends 中添加B。

image

最后实现函数getDistance函数,该函数输入两个Person对象,根据图中的距离返回一个整数。在查阅资料的过程中,发现接口List和Queue的实现类LinkedList可以实现双向队列,而接口List的实现类Stack在Java中使用的并不多,所以采用LinkedList来实现先广遍历来获取距离,并用HashMap类的键对值来记录距离。先将第一个对象加入LinkedList队列personQueue。当队列不为空时,将队列头元素删除,并将值赋给变量topPerson,遍历topPerson的friends,如果其friends未被访问,将其和此时的tempDis+1记录到HashMap中,并将此节点加入到遍历队列,如果这个过程中找到第二个对象,就根据键值对返回距离。遍历后如果没有找到第二个对象,返回-1。

为了便于添加测试范例,加入existP方法来判断Person对象是否在其中。

image

3.3.2 设计/实现Person类

首先很容易想到添加一个name成员变量,并就此创建一个构造函数来初始化。将name定义为private类型,所以添加了getName方法。最初考虑在FriendshipGraph类中添加Edge成员变量来记录社交关系,但其类型和维护以及距离的获取不容易实现,所以Person类中添加LinkList Friends成员对象,并添加getFriends方法来获取其Friends成员对象,添加addFriends方法来为对象添加朋友。

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

将实验指导中的案例复制到main方法中。

3.3.4 设计/实现测试用例

创建对象测试,调用exitsP方法和assertTrue检测是否成功创建。

加入社交关系测试,在一个图中添加几个节点,使用addEdge添加社交关系,创建一个LinkedList<Person>的临时变量,将一个对象的friends添加进去,调用getFriends和assertEquals方法来测试是否相同。

获取距离测试,添加不同的节点,使用assertEquals方法来测试同一个顶点的距离、两个相邻顶点之间及其反过来的距离,两个不相邻顶点之间及其反过来的距离,两个不连通的顶点之间的距离。

4 实验进度记录

日期 时间段 任务 实际完成情况
2022-04-29 18:30-19:30 初步尝试编写isLegalMagicSquare函数 延期1小时完成
2022-04-29 19:45-21:30 继续编写isLegalMagicSquare函数并对其进行测试 按计划完成
2022-04-29 22:00-23:00 编写generateMagicSquare函数并完成测试 按计划完成
2022-04-30 19:00-20:00 完成P2中的Problem0-5 延期半小时完成
2022-04-30 20:45-23:45 完成P2中剩下的problem并完成测试 延期一个小时完成
2022-05-01 22:45-0:00 编写FriendshipGraph类 遇到困难,没有完成
2022-05-05 20:00-21:00 编写Person类和FriendshipGraph类 按计划完成
2022-05-06 16:00-17:00 优化上边两个类并编写test测试用例 按计划完成

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

遇到的困难 解决途径
读入/写入操作 借阅相关Java指导书,学习相关类和方法
Git相关操作 在蓝桥云网站中,进行了学习和应用演练
对Java中的集合了解不够 借阅相关Java指导书,学习了接口和集合的相关知识,能初步应用List接口、Queue接口和Map接口以及对应的实现类和方法。
对于数学知识的补充 查询相关网站,复习了相关算法

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

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

本次实验收获了许多宝贵的经验,了解了Java的一些特性、方法与类库。逐渐熟悉了环境的配置与Git的使用,打开了我一直想去探索而没有走出去的领域。

同时也获得了许多教训。在编程知识方面,一定要多多阅读,全面地掌握其用法不能想当然地应用某个东西,非常容易出错。在环境配置和使用一个新工具时,也要多查阅资料,并学会取其精华去其糟粕,对比地去吸收知识。

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

(1) Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?

非常对味,我觉得Java用起来非常方便而且简洁明了,相比之下,之前学的C++给我一种庞大而复杂的感觉,不是说C++不好,许多功能在Java中都能更简易并且高效地实现,比如本次实验进行过程中阅读资料习得的泛型、接口和集合,在C++中也有对应的模板和多重继承等等,但是在C++的学习过程中,感觉到这些内容非常晦涩而不近人情,应用起来比较难,而Java则很形象地阐明了这些操作以及其用途。

(2) 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;

非常好用,尤其是自动提示与纠错功能,对于初学者十分友好。

但是由于其功能强大,刚开始的时候会给人一种眼花缭乱之感,还需进一步地学习

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

对于命令的掌握还不够,目前只是感觉到Git在远程上传和管理方面的价值,能较为便捷地上传和载入一个仓库来进行编程,并没有感受到版本控制的便捷。Github本身并没有给我太深刻的印象,我将其当作一个存储代码和代码版本控制的云端服务器,但是其社区让我感觉非常强大,我像是打开了新世界一般,畅游在这个社区,汲取着知识。

(4) 关于CMU和MIT的作业,你有何感受;

有一种循序渐进的过程,但是英文教程的障碍确实不小。

(5) 关于本实验的工作量、难度、deadline;

适中

(6) 关于初接触“软件构造”课程;

感觉就是从冰冷的代码逐渐变得生动,变得有意思,能够亦步亦趋地去应用这个东西,期待后面的课程与实验。

标签:git,Java,实验,构造,添加,3.2,Lab,软件,Problem
来源: https://www.cnblogs.com/hit-rhino54/p/16354000.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有