哈工大软件构造 第一次实验报告
2021年春季学期
计算学部《软件构造》课程
Lab 1实验报告
|
姓名 |
|
|
学号 |
|
|
班号 |
|
|
电子邮件 |
|
|
手机号码 |
|
目录
3.2.1 Problem 1: Clone and import 7
3.2.2 Problem 3: Turtle graphics and drawSquare. 7
3.2.3 Problem 5: Drawing polygons 7
3.2.4 Problem 6: Calculating Bearings 7
3.2.5 Problem 7: Convex Hulls 8
3.2.6 Problem 8: Personal art 9
3.3.1 设计/实现FriendshipGraph类.. 10
1 实验目标概述
本次实验通过求解三个问题,训练基本的Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够 为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。 另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
2 实验环境配置
简要陈述你配置本次实验所需开发、测试、运行环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
本次实验使用Eclipse完成。新建Java项目之后直接编写代码即可。当全部代码编写完毕之后将源文件复制到git本地仓库在推送到远程服务器。
通过查找资料发现java的包名称需要和所在文件夹名称一致,代码文件中需要包含同名称的类。
由于在使用git之前已经阅读过使用说明(https://www.git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E8%8E%B7%E5%8F%96-Git-%E4%BB%93%E5%BA%93),所以并未遇到特别难以解决的问题。剩下的问题均能够通过在搜索引擎上搜索快速得到答案,故未全部详细记录。
在这里给出你的GitHub Lab1仓库的URL地址。
https://github.com/ComputerScienceHIT/HIT-Lab1-1190201117.git
3 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1 Magic Squares
需要按照题目要求设计一个识别/生成幻方的程序。其中幻方的要求是每行、列、对角线元素之和都相同(注意,题目中说的是“usually distinct numbers”而非“distinct numbers”,因此全部元素都相同的方阵也可以看做是一个幻方)。
程序需要从文件中读入幻方信息,并调用isLegalMagicSquare()方法。isLegalMagicSquare()接受需要读入的文件名,如果该文件中所存的数据构成一个幻方则返回true,否则返回false。
3.1.1 isLegalMagicSquare()
思路:首先按行读入文件内容,判断每行元素是否含有非法字符(数字间空格/其他字符等),并将每行内容存入矩阵。当输入合法后,比较行列数是否相同,再比较上一步所得矩阵的每行/列/对角线元素和,如果矩阵是方阵且元素和全部相等则返回true,否则返回false。
过程:首先利用readArr()从缓存读入数据,并转化成矩阵
然后检查输入是否为空,行列数是否相等
最后判断元素和是否相等。
利用BigInteger处理数据以防止整数过大造成溢出。
3.1.2 generateMagicSquare()
程序从第一行中间开始,向着右上斜线方向依次填满方格。流程图如下。
3.2 Turtle Graphics
根据提示补全代码,实现下列功能:
1、画出正四边形。
2、完成正多边形内角和外角的计算
3、计算向量之间的夹角
4、计算凸包
5、绘制自己的图形
3.2.1 Problem 1: Clone and import
由于git服务器响应缓慢,clone操作无法正常进行。在github下载项目的zip包之后解压,在本地git init ,git remote add 远程仓库,git pull lab master之后即可同步本地与远程仓库,加入zip包中的文件之后再git add . ,git commit,git push lab master。至此项目导入完毕并和远程仓库保持一致。(这里远程仓库的名字叫lab)
3.2.2 Problem 3: Turtle graphics and drawSquare
顾名思义forward意为向前走,turn意为转向,分别向前走并转向四次即可画出正方形。
3.2.3 Problem 5: Drawing polygons
类似地,计算出每次转向角度再不断转向直行即可画出正多边形。
分别补全下列代码
首先计算转向角度,再画多边形。
3.2.4 Problem 6: Calculating Bearings
由于题目未说清要求,通过猜测,结合样例发现若干没有说清楚的细节如下:
给定当前角度(可能是在某个坐标系内的参数,通过样例发现xOy坐标系中y轴正方向是0度的朝向),计算从当前位置转向下一位置需要转过的角度(只能按顺时针方向旋转)。
问题可以通过余弦定理解决。
如图所示,A,B分别是当前点和下一个点,AB长度是确定的。并且当前朝向AC方向。容易知道转过的角度是角A的大小。由于AC的长度不固定,所以可以取一个便于计算的值。用余弦定理可以得到结果。
calculateBearings只需要对若干个点重复做calculateBearingToPoint()即可。
3.2.5 Problem 7: Convex Hulls
这里利用包礼物算法计算凸包。首先找到最左下方的点(这可以通过比较坐标得到),初始方向指向凸包外侧(不妨就设成x轴负方向即270度方向),每次循环找到从当前点出发到下一个点时,转动角度最小的那个(如果有两个及以上的点满足条件,选距离最远的那个),将这一点加入结果,更新当前点和当前朝向之后重复操作,直到转回初始的点。
3.2.6 Problem 8: Personal art
随便画些东西。这里画了一个多角形。每次更改朝向并画直线,一直到转够整数圈之后停止。翻了翻代码,发现DrawableTurtle第35行可以修改初始点位置,利用这个可以解决画出画布的问题。
3.2.7 Submitting
将代码加入本地文件夹后git add *,git commit -m“xxx”,git push lab master即可。(这里远程仓库的名字是lab)
3.3 Social Network
建立一个有向图模型表示人际关系。人与人之间的距离用有向图中从一方到达另一方经过的最小边数确定。并且人们的名字不能重复。
3.3.1 设计/实现FriendshipGraph类
类中的两个变量,name_list用来记录人名,p_list用来记录人。
addEdge和addVertex分别加入边和顶点。addEdge判断端点是否存在,addVertex判断重名。
getDistance用BFS来实现。
3.3.2 设计/实现Person类
_name存放自己的名字,friends存放好友列表。
getFriend和setFriend函数分别获取好友和添加好友。
3.3.3 设计/实现客户端代码main()
根据实验手册得到如下代码:
3.3.4 设计/实现测试用例
测试addVertex和addEdge
测试getDistance。
测试结果。
4 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
|
日期 |
时间段 |
任务 |
实际完成情况 |
|
2021-05-11 |
13:45-15:30 |
学习Java的基本语法,学会使用文件读写功能,并读取文件。 |
按计划完成 |
|
2021-05-12 |
10:00-12:00 |
将文件数据读入并转换成大整数,存储进二维可变长数组中;添加判断输入合法性的功能以及验证和是否相同的功能。 |
按计划完成 |
|
2021-05-13 |
23:00-24:00 |
修改读取文件的bug,测试了生成幻方的函数。 |
按计划完成 |
|
2021-05-14 |
19:00-20:00 |
完成至P2的问题6 |
按计划完成 |
|
2021-05-15 |
19:00-20:00 |
解决凸包,完成P2 |
按计划完成 |
|
2021-05-18 |
13:45-15:30 |
写完P3 |
按计划完成 |
|
2021-05-18 |
19:00-20:00 |
调试全部项目,完工 |
按计划完成 |
|
2021-05-22 |
14:50-15:00 |
写报告时发现代码有考虑不周之处,修改之 |
按计划完成 |
5 实验过程中遇到的困难与解决途径
|
遇到的困难 |
解决途径 |
|
不会用java
|
通过百度自学,问学长 |
|
不会用git
|
通过官方文档自学 |
|
P3不会写测试用例
|
参考P2代码,自己摸索,不行就百度 |
6 实验过程中收获的经验、教训、感想
6.1 实验过程中收获的经验和教训
经验:学习了使用Java语言和git工具。
教训:不要等到最后一天再写报告。
6.2 针对以下方面的感受
- Java编程语言是否对你的口味?
比较方便,但是不如C++自由(不可以直接修改内存)
- 关于Eclipse IDE;
中规中矩,有时感觉挺毒瘤(代码窗口不小心关掉之后找不到如何打开,只能重启)。当然,这是由于个人原因导致的。
- 关于Git和GitHub;
挺好用的工具,就是github访问太慢了且很玄学,不如换成gitee。
- 关于CMU和MIT的作业;
MIT的作业比较有新意,介绍了turtle(虽然是阉割版本),挺有意思。
- 关于本实验的工作量、难度、deadline;
都适中。
- 关于初接触“软件构造”课程;
与预期基本一致。

浙公网安备 33010602011771号