2022年春季学期
计算学部《软件构造》课程
Lab 1实验报告
姓名 | |
学号 | |
班号 | |
电子邮件 | |
手机号码 |
3.2.1 Problem 1: Clone and import 6
3.2.2 Problem 3: Turtle graphics and drawSquare 6
3.2.3 Problem 5: Drawing polygons 6
3.2.4 Problem 6: Calculating Bearings 7
3.2.5 Problem 7: Convex Hulls 8
3.2.6 Problem 8: Personal art 10
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开
发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够
为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。
另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
l 基本的 Java OO 编程
l 基于 Eclipse IDE 进行 Java 编程
l 基于 JUnit 的测试
l 基于 Git 的代码配置管理
2.实验环境配置
IDE使用了idea,其他使用了git,在命令行或powershell中使用
第一次使用java语言的ide,一开始下载了eclipse,后来根据个人喜好选择了idea
https://classroom.github.com/a/K_B5NllB
3.实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1Magic Squares
该任务分为两部分,第一部分是从给定的5个txt文件中读取矩阵,然后判断其是否满足magic square的要求,首先要求每行的数据由\t隔开,其次要求数据不为小数,不为字符,而应该为正整数,输入错误要给出相应的错误提示。输入正确的话要判断矩阵行、列、对角线之和是否都等于同一个整数,即magic square的要求。第二部分,在实现了读取并判断矩阵是否为magic square后,要利用给定的生成magic square函数生成一个矩阵并写入6.txt中,再对6.txt进行判断。3.1.1isLegalMagicSquare()
在写的时候,我是先考虑输入格式是否正确
读txt的时候,使用readline函数读入一行,然后判断是否用分隔符分开(利用了习题课讲到的matches函数,学习了一些正则语言的写法,构造了识别是否用分隔符分开的正则表达式)
然后利用用split将用分隔符分开的数据作为字符串读入str[]中,用lastn记录上一行读入的数据个数,每一次判断上下两行数据个数是否相同,不同则报错。如果数据数量没问题的话就判断每一行数据是否有错误,也是利用了正则表达式构造。
在读入过程中记录读入的行数,然后用最后一行数据个数作为列数比较(因为每一行数据都判断了是否相等,那么直接用最后一行数据数代表列数),如果矩阵行列数不同,则输入错误。
读入后将字符串用integeparse转为整数,存在一个二维数组中,然后对二维数组行列、对角线的和进行判断是否相等,返回true或者false。
3.1.2generateMagicSquare()
当n为偶数时,函数产生异常java.lang.ArrayIndexOutOfBoundsException即填充过程中在row++时发生数组越界访问。并且当n是负数时,不能有效处理非法输入,产生异常java.lang.NegativeArraySizeException即初始化了行列数为负数的数组。这导致了很差的健壮性。
在进行制造magic square前,利用两个if判断输入的n是否合理
3.2Turtle Graphics
主要任务:根据函数的注释补全代码,实现一系列绘图可能用到的功能。包括画出正方形、计算正多边形的内角、计算对应内角的正多边形边数、计算绘图时的角度转移、计算凸包、以及绘制自己独特的图形。
3.2.1Problem 1: Clone and import
直接在github上下载,或者git clone到本地
我第一步使用了直接下载,然后构造文件夹,在命令行中cd到该文件夹下,
利用git init初始化,然后利用git add,git status,git commit,git push,git log等操作进行实验
3.2.2Problem 3: Turtle graphics and drawSquare
这个就是根据注释,要画一个正方形,熟悉一下forward和turn的操作。
3.2.3Problem 5: Drawing polygons
先写给定边数求正多边形外角度数的函数
再利用这个函数去写一个画正多边形的函数
再写一个利用角度求边数的函数
这里用到了math.round函数,不然向下取整会出错误
3.2.4Problem 6: Calculating Bearings
这里查阅了一些计算数学三角函数的函数,然后进行编写
对一个点集的计算,利用current更新每一次的当前角度
3.2.5Problem 7: Convex Hulls
凸包算法,计算一个点集
首先是,如果点的个数小于2,直接返回。
算法中先寻找最左下方的点,然后对一些后面需要使用的数据初始化
这里是写好后的版本,每一次寻找偏移角度最小的点,以便于连线后其他更大角度的点都在里面,然后对于角度相同的点,选取离当前点距离大的,依次选择并把选择的点依次加入点集,如果最后一次加到了已经存在的点,说明这些点已经连线完成,退出循环。
3.2.6 Submitting
利用git add追踪git commit提交版本 git push -u 地址 master提交到仓库
3.3 Social Network
主要任务:设计Person类和FriendshipGraph类来模拟一个社交网络,并实现社交网络中需要的一些简单功能,包括添加人、添加社交关系以及计算两个人之间的距离。同时,编写测试程序来检查实现的正确性。
3.3.1设计/实现FriendshipGraph类
- 利用Hashmap存储信息,利用name作为key,Person类作为value
- 编写加点函数,在网络中加入一个点
判断是否存在相同name,相同则报错并退出
判断增加的边,利用Person类中每个点的出点集或入点集判断
第三个函数是计算两人社交最短距离,利用了先广搜索,在每增加一层时,将深度变量count+1,找到需要找的点时,返回count,没找到,返回-1,对于自己到自己的距离,定义为0
利用flag标志是否需要增加深度,例如距离点a搜出了b,c,那么记录b搜出的第一个点d,因为队列具有先进先出的性质,搜索到d时,深度+1,再将flag修改,在搜到d搜出的第一个点x时,记录下一层第一个点x,遇到x时深度才++,这是原创(但应该好多人已经写过了),还有一种方法是从a点搜起,记录每一个新搜的点的深度,但如此做要开辟一个数组。
3.3.2 设计/实现Person类
Name作为person的标识信息,flag_visit记录先广搜索中是否遍历,InOutdegrees分别记录出点集和入点集,addInedge和addoutdegree是入点集和出点集的增加操作。(没考虑绝交,没写删除操作,实验中也没有要求)
3.3.3 设计/实现客户端代码main()
一个社交网络例子
3.3.4 设计/实现测试用例
测试加点,增加li和wang,并用assert判断,后面这个增加wang是为了重复增加,但代码中由于ppt要求是检测到相同的输入 直接退出,就用了exit,而没用return false,(这种exit的测试直接中断了程序,不知道怎么写)
测试了正常状态加边,以及加入一些不存在的点,以及加入已经存在的边
计算距离,挑选了正常距离1,2,3自己到自己的距离0以及没有关系的点