根据实验手册简要撰写。
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开
发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够
为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。
另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
1.基本的 Java OO 编程
2. 基于 Eclipse IDE 进行 Java 编程
3. 基于 JUnit 的测试
4. 基于 Git 的代码配置管理
简要陈述你配置本次实验所需开发、测试、运行环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
在本次实验中,我首先尝试在电脑中已经下载好的eclipse中进行编程,但发现eclipse软件的环境高配置并不正确,在上网查阅大量资料、并和同学交流后发现,由于下载时间过长,且当初是以Java EE为目标进行的下载,目前在电脑中的eclipse软件已经不能正常使用,而重新下载或删除都可能会遇到目前的遗留问题。因此在和同学讨论之后,我打算下载idea作为我的java编程IDE。之后根据实验手册的说明指导下载了Git,并因为找不到到底应该在idea中输入Git相关的哪个路径卸载并重新下载了两遍。之后上网搜集资料,并成功配置JDK11,并初步温习、了解了java相关库的引入、引用等操作。
困难1:在eclipse中始终无法run程序,上网搜索不到具体资料,大部分内容与遇到的问题相关度很低。
解决方法:下载idea作为我的javaIDE
困难2:在idea中难以成功配置Git,多次删除、重新下载、切换版本后均无效果。
解决方法:在与正确完成Git配置的同学进行软件比对之后,穷举每一个可能正确的文件对应地址,最终成功配置JDK。
在这里给出你的GitHub Lab1仓库的URL地址。
https://github.com/ComputerScienceHIT/HIT-Lab1-120L021816
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
在这里简要概述你对该任务的理解。
该问题要求程序能够判断一个矩阵是否是magic square,即幻方,并要求这个程序具有十足的健壮性,能够对输入的字符种类(是否是数字,是否是制表符,制表符有几个)进行判断,对矩阵的行数和列数(行数和列数是否相等,是否有空元素)进行判断,以及程序本身的目的:对输入的矩阵是否是magic square进行判断。
这个任务要求我们有对输入值进行判断,对程序健壮性的深层次理解,相比之下编程难技术要求并不是那么明显。
按步骤给出你的设计和实现思路/过程/结果。
- 首先建立能从磁盘中读取文件的程序模块,利用Scanner函数读取对应相对地址中的文件(如src/P1/1.txt),用System.out.print()输出结果,观察这一步是否完成。
- 接着尝试对文件的读取方式进行改进,如用file.nextLine()对程序进行以行为单位的读取,或者用useDelimiter(“\t”)进行以制表符为间隔符的读取,进行后续处理难易度上的脑内比较。
- 之后编写判断是否为magicsquare的程序,在一开始的时候,我的想法是按照C语言那样将文件的读取变量转化为数组,然后按照数组的方式对数字、制表符以及其他符号分别处理;但在之后和同学的讨论中,我发现了java里的数据结构List也可以很好地完成这项任务,于是我就重新编写这一模块,并且最终采用了用split函数对列表进行操作,最终判断是否为magicsquare的程序。前后两种程序都很成功。
- 再之后对步骤2所说的各种异常情况进行测试,并对异常情况进行分类,用不同的文字提示进行区分。
按步骤给出你的设计和实现思路/过程/结果。
- 大致阅览代码,并按照实验手册的提示输入正奇数,观察代码生成结果,理解程序代码,并添加注释。
- 分析n为偶数和n为负数两种异常情况,得出相应结论。(在给出的函数中,当row=n-1而i%n==0时,row值会++到n,而合法的row下标最多为n-1,所以数组会越界。而数组下标本身就不能是负数。)
- 在generateMagicSquare()方法中添加n的判定语句,对n为偶数或负数的情况作出相应处理。
在这里简要概述你对该任务的理解。
该任务是MIT计算机专业的作业之一,该任务以著名的简单绘图库Turtle为例,对我们引用外部库、处理外部函数和对自己撰写的函数进行测试的能力提出了一定的要求。虽然每一个编程任务都与Turtle库有关,但实际上完成任务的大部分时间都是在设计编程。
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
在相关网页教程的指导下,我很快找到了相关仓库,并在相关仓库页面点击Code,成功以压缩包形式下载了该任务代码,并复制到了正确的位置。在本地创建仓库过程中,我遇到了一些困难,包括之前遇到了一部分配置环境问题。为了解决这些问题,我下载了github桌面版,并在本地同步了需要提交作业的库。在完成这些之后,我可以很好地使用git管理本地开发。
-
-
- Problem 3: Turtle graphics and drawSquare
-
- 根据题述,以及几何学常识,得知旋转的角度为90度,需要前进的距离为sidelength,需要重复这段操作的次数为4,于宁程序进行验证,遂完成该问题。
- 根据题述,以及几何学常识,容易知道题干描述中的公式为“多边形内角和=(边数+2)*180(单位:度)”,根据这个公式分别编写calculateRegular PolygonAngle(int sides)与calculatePolygonSidesFromAngle (double angle),使用TurtleSoupTest文件来测试结果。
- 验证测试结果之后编写drawRegularPolygon()方法,大体思路与问题3相同,并测试
- 根据题述,以及几何学常识,容易知道由x,y坐标得到角度的方法是反三角函数,上网查阅相关资料,如函数原型。推理出反正切值和题目要求的angle值的对应关系:所求角度值=(450-currrentBearing-Math.toDegrees(Math.atan(y/x)))%360
- 验证测试结果之后编写calculateBearings()方法,并测试
- 根据题述,可知,题干要求是在给定的点集中选取一些点,使得这些点围成的多边形是凸多边形,并且包含给定的所有点。我对这个要求进行了思考。
- 在这个模型中,选取某个点,接下来应该连接哪个点?要想连接到最外围的点,要连接的点的连线,与目前的方向的夹角,应该是最小的。
- 那在这个模型中,应该是从哪一个点开始最好呢?这个点一定是要在凸多边形上的,那么什么样的点一定是在凸多边形上的呢?最远的点,也就是距离原点距离最远的点是在凸多边形上的。因此,应该先找出距。离原点最远的点,然后从那个点开始构建多边形。
- 完善代码,进行相关检查与测试。
- 对目前Turtle库给出的函数进行评估,得出结论:Turtle函数绘制几何形体明显要比绘制生活物品容易,并且使用不同的颜色、巧妙地利用循环语句能明显增加绘制的观赏性,于是得出大体方案:设计循环,根据循环变量的值来切换颜色。
- 在得出大致方案之后即上网进行对比,并对网上给出的代码进行很大程度的改进,最后完成任务。
如何通过Git提交当前版本到GitHub上你的Lab1仓库。
- 使用Github Desktop,登录账号后将目标库调整至HIT-Lab1-120L021816,点击Fetch Origin将Idea提交的程序传给网络上的Github库。
在这里简要概述你对该任务的理解。
这个问题是无向图的最短路径求解问题,是上学期数据结构作业的简化版本。但即使难度偏简单,在java的环境下,也不失为一个好的复习项目。而编写类方法并在其他文件中引用对大部分同学来说也是一次崭新的体验。
-
-
- 设计/实现FriendshipGraph类
-
给出你的设计和实现思路/过程/结果。
在addVertex与addEdge部分,我主要仿照了P2中Point.java的写法,自己编写一个FriendshipGraph类,并写出了相关方法。这部分难度比较简单,更重要的是模仿和学习。
在getDistance部分,需要编写一个无向图的最短路径算法。实现这个程序的算法要比Dijkstra算法,与Floyd-Warshall算法都要简单。这是由于只需要求解给出顶点对之间的最短路径,也是因为FriendshipGraph类所包含的边没有加权,有边连接的两个点距离默认为1。因此只需要从起点开始进行先广搜索,用队列去查找有没有终点(由于题干中要求按照有向图的方式添加边,因此有必要区分起点和终点)。如此循环,直到找到终点,或是发现在某次循环之后存放已查找过顶点的集合元素数没有增加(即没有找到这个元素)。按照这样的逻辑进行编程,就可以完成目标。
-
-
- 设计/实现Person类
-
给出你的设计和实现思路/过程/结果。
Person类明显要比FriendshipGraph类简单,只需要仿照Point.java进行编写即可。不过要注意的是按照题述里给的格式,Person类生成时还要有姓名这一项内容,即题述代码里用双引号括起的那一部分。此外,为了FriendshipGraph类的编写,我还在Person类下生成了一个列表。
-
-
- 设计/实现客户端代码main()
-
给出你的设计和实现思路/过程/结果。
客户端代码,需要的是能让人看懂是什么样的,说明全部功能,并且最好美观一些,在硬难度方面反而不大。只要对照方法、一项一项核对功能,就可以做好。
-
-
- 设计/实现测试用例
-
给出你的设计和实现思路/过程/结果。
测试用例需要包括顶点连接的情况,顶点不连接的情况,起点与终点相同的情况,起点不存在或终点不存在的情况,测试时都要顾及到。
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 任务 | 实际完成情况 |
2022-04-24 | 23:30-0:05 | 第一次下载Git,Junit等插件,发现eclipse等存在的问题 | 按计划完成 |
2022-04-25 | 11:04-12:30 | 编写问题1的isMagicSquare函数并进行测试 | 按计划完成 |
2022-04-25 | 14:58-16:23 | 与同学讨论,将isMagicSquare函数中生成二维数组的部分由数组相关算法变为列表相关算法 | 在因为困赖了一会床之后,按计划完成 |
2022-04-25 | 16:24-19:15 | 进行Github Lab1库的相关操作(修改名称,下载Github Desktop,建立idea与Github的联系) | 按计划完成 |
2022-04-25 | 21:11-23:56 | 进行P2 | 由于和同学聊天讨论题目只完成了实验手册的阅读,基本上等于没做 |
2022-04-26 | 9:03-9:33 | 阅读P2延伸网页Problem1-4,并完成Problem 3 | 按计划完成 |
2022-04-26 | 9:45-10:32 | 进行P2的Problem5 | Github Desktop上传突然出现问题,进行调试,未完成 |
2022-04-26 | 10:37-11:04 | 完成Problem5,并测试 | 按计划完成 |
2022-04-26 | 14:10-15:56 | 完成Problem6,并测试 | 按计划完成 |
2022-04-26 | 16:30-20:01 | 完成Problem7,并测试 | 延后1小时完成 |
2022-04-26 | 20:02-20:38 | 完成Problem8,并测试 | 按计划完成 |
2022-04-27 | 7:59-9:57 | 编写问题3的addVertex函数,addEdge函数,编写FriengshipGraph与Person的生成方法 | 按计划完成 |
2022-04-27 | 10:14-12:38 | 编写问题3的getDistance方法 | 延后1小时完成 |
2022-04-27 | 15:00-23:44 | 写报告 | 延后2小时完成 |
遇到的困难 | 解决途径 |
在eclipse中始终无法run程序,上网搜索不到具体资料,大部分内容与遇到的问题相关度很低。 | 下载idea作为我的javaIDE |
在idea中难以成功配置Git,多次删除、重新下载、切换版本后均无效果。 | 在idea中难以成功配置Git,多次删除、重新下载、切换版本后均无效果。 |
在问题1中,用数组方式生成矩阵时间复杂度太大 | 上网学习java List,改用列表生成矩阵 |
Github Desktop中,文件总是上传失败 | 多次尝试,或者用手机流量共享热点传输 |
在问题3中,用列表计算最短路径时间复杂度太大 | 改用队列Queue与LinkedList结合进行操作 |
- 在已知的数据结构不能很好地完成任务时,可以上网搜索一下对应语言的数据结构。
- 要勤上网搜索问题
- 但是有些问题上网搜索不到贴近的答案,也有善于向同学请教
- 要自己多思考,不要一不会了就上网搜东西,自己思考出来的东西才是自己的。
- Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?
由于我之前使用的主要是C语言,我并没有感受到太大的不好,但就是不能用指针了感觉有些可惜。另外,Java的赋值方式,和输入输出函数都有些繁琐,其他的都很好,列表和队列的应用也在编程过程中帮了我很大的忙。
- 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;
由于我编程是用IDEA进行的,所以我只能说IDEA的优势与不足。
IDE的优势,自然是广大的插件体系与可选项提示目录,可以帮助我这种初学者很好地选择语句,是一个不错的参考。另外IDE的颜色切换也很不错。
至于IDE的劣势,可能就是它自身只是文本编辑器,需要很多插件才能运转。而配置环境,下载插件的过程通常是漫长而又痛苦的,难度也相当大。就让我在现在卸掉IDEA以及相关配件,重新下载一遍,我是很没有把握能够装好的。
- 关于Git和GitHub,是否感受到了它在版本控制方面的价值;
确实,只要我想,我可以将很多版本直接上传到广大的云空间,并且可以挑选版本进行下载。
- 关于CMU和MIT的作业,你有何感受;
文字叙述详细,规则阐述清晰,学生知道什么能做什么不能做,什么该做什么不该做,每一步的引导详细具体,只要不是像我这样看不懂英文的,都可以很轻松的解决。
- 关于本实验的工作量、难度、deadline;
工作量无疑是大的,之前我的几个计算机系统实验和上学期的数字电路实验没一个花费这么长时间的。难度尚可,不算太难,对我的难度主要是在配置环境和搜索代码上。不过deadline和自动机考试重了,可以试着延后1-2天,否则可能会有做题不认真、死线冲锋等情况。
- 关于初接触“软件构造”课程;
课程,听不懂。
进度,太快了。
问题,不知从何问起。
实验,只得当作预习。