软件构造实验一问题解决方法及经验教训
作者:互联网
软件构造实验一问题解决方法及经验教训
一:实验目标概述
1.本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
2.基本的 Java OO 编程
3.基于 Eclipse IDE 进行 Java 编程
4.基于 JUnit 的测试
5.基于 Git 的代码配置管理
二:实验环境配置
1.在官网上下载安装完成JDK,并配置其环境变量,在卸载JDK时要将设置的环境变量删除干净,方便后续JDK版本的安装。
删除JDK版本16安装符合要求的JDK10时,发生环境变量错误,原因为优先搜索的另一路径下的JDK,将“%JAVA_HOME%bin”的变量值提前。解决此问题。
2.官网下载并安装Eclipse。
发现无法打开Eclipse安装文件,解决方案,官网下载已经配置好的压缩包后解压到本地直接打开
这里给出链接:
https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2021-06/R/eclipse-java-2021-06-R-win32-x86_64.zip
直接打开使用eclipse.exe。
三:实验过程
3.1Magic Squares
幻方,n阶幻方即正方形含n*n个数,行列、对角线上的数字之和相同。
3.1.1isLegalMagicSquare()
本题要求在main()函数中五次调用isLegalMagicSquare()方法,将实验所给五个文本文档传入为参数,返回true 或 false,判断五个文本是否为幻方。
1.首先逐行读取文件,使用myLine.split(“\t”)以“\t”为分隔符得到一行的字符串数组,查看此行每个字符串数组中是否有非法符号,视为分隔符错误返回。
2.判断此行读取的字符串数组的个数是否与上一组相同,不同说明次两行列数不同,一定不为幻方,返回false。
3.判断是否为正整数,是,则将行字符串转化为正整数存入一int二维数组中
4.转化完成二维数组后,判断二维数组行列,对角线和是否相同。
5.返回判断结果。
3.1.2generateMagicSquare()
1.绘制该程序流程图:
2.该函数输入参数为正奇数,当输入参数错误时,“优雅”退出。
3.首先将第一行中间列赋值为1,每次取其右上角位置,存入的值加一,若当前为第一行,则下次跳转到最后一行,若为最后一列,则下次跳转到第一列,直到整个幻方赋值成功。
4.写入文件:
5.主函数中判断
3.2Turtle Graphics
利用所给的源文件,补全代码,实现相应绘图和求凸包的操作。
3.2.1Problem 1: Clone and import
1.在 Problem 1: Clone and import 中无法连接 MIT 的 didit 服务器,从助教所给连接处获得部分代码。
3.2.2Problem 3: Turtle graphics and drawSquare
1.由给定的前进方法forward、转向方法turn 实现图形绘制。
绘制正方形,即循环执行前进转向90°四次,完成绘制。
3.2.3Problem 5: Drawing polygons
1.绘制正多边形,要先根据数学知识补全计算正多边形内角的方法:
2.循环,绘制多边形:
3.2.4Problem 6: Calculating Bearings
1.建立起点与目标点的向量,求得与X轴正方向的夹角
2.转换为与Y轴正向的夹角
3.2.5Problem 7: Convex Hulls
1.使用Gift wrapping algorithm算法,顺时针求取凸包。
2.利用calculateBearingToPoint,每次选择转向角度最小的点,若两点极角相同,则选取距离最长的点。
3.利用一数组记录选取的点,确保不重复选取
4.直到起始点同样作为最后点被标记,退出循环。
3.2.6Problem 8: Personal art
1.利用color、turn、forward方法,选取六芒星作为绘制图案
3.2.7Submitting
1.首先在本地git init 建立一个仓库。
2.通过git add将文件上传至缓冲区
3.通过git commit上传至本地仓库
4.最终通过git push 上传至远程仓库
3.3Social Network
利用图结构实现简单社交网络,用其计算社交距离。
3.3.1设计/实现FriendshipGraph类
1.在FriendshipGraph里声明两个类,一个保存人的实例,另一利用哈希表检测确保无重名。
2.addVertex方法用来添加成员,同时检测是否重名,重名则提示退出,不重名则添加。
3.addEdge方法用来建立单向朋友关系(此任务要求能够拓展为有向图,无向图则调用两次,分别添加),people1认识people2,则将people2加入people1的朋友圈。调用person类addFriend方法。
4.getDistanc方法用于确定社交网络中的距离。使用广度优先搜索加队列的方式。
3.3.2设计/实现Person类
1.定义名字和朋友列表,下面建立调用两个成员的方法:
2.建立朋友列表、返回姓名、返回朋友列表、添加朋友。
3.3.3设计/实现客户端代码main()
1.根据实验手册,建立主函数:
3.3.4设计/实现测试用例
1.测试addVertex,添加Person类,查看最后一个成员是否正确:
2.测试addEdge,判断朋友列表最后一个成员是否正确。
3.测试社交距离是否正确:建立一图结构,测试两人间距离:
4.结果:测试通过。
四:实验过程中遇到的困难与解决途径
1.配置JDK环境失败,找不到JDK位置
寻求同学帮助,更改路径搜索优先级
2.Eclipse 无法安装
CSDN查询,下载压缩包使用
3.MagicSquare程序报错
读取方法使用错误,将null误当成字符串“null”
4.Turtle Graphic凸包 利用Graham-Scan方法略显繁琐
采用Gift wrapping algorithm算法,顺时针求取凸包
五:实验过程中收获的经验、教训、感想
(1)Java编程语言是否对你的口味?
符合,但目前使用很不熟悉,对其了解极其有限,有很多方法和类无法熟练调用,难以增加编程效率。
(2)关于Eclipse IDE
很好用,同样很不熟悉,只是了解简单的操作,无法有效利用。
(3)关于Git和GitHub
很方便,待熟练运用
(4)关于CMU和MIT的作业
设置的很巧妙,适合有一定编程基础,但不熟悉java编程的学习。美中不足的是英文原文外加一些偏僻专用词汇,理解其意思十分困难,编程且练习英语。
(5)关于本实验的工作量、难度、deadline
难度适中,但个人认为老师可以多给些提示,不熟练java编程的有些困难。工作量适中,由于课程推迟原因,原本两周的实验时间留给我们的只有一周,边做实验边学习java,还要写实验报告,学习Git等新的知识和软件配置使用方法等,很大压力。
(6)关于初接触“软件构造”课程
个人认为前几节课是在宏观角度介绍软件构造,但与实验内容关系不大。
标签:JDK,经验教训,代码,编程,实验,构造,3.2,软件,方法 来源: https://blog.csdn.net/zijin__/article/details/118330600