1 实验环境配置
根据lab0的指导,下载安装了git。原先安装的是eclipse2020和jdk15,基于对jdk低版本的要求,重新安装了jdk10.0.2,并更新eclipse至2021-03。
这里花了一些时间,因为eclipse和jdk的版本匹配问题,后来发现可以在创建项目时设置项目对应的jdk版本而解决。
2 具体过程
2.1 Magic Squares
实验的任务包括:①编写isLegalMagicSquare()方法,判断一个n×n矩阵是不是一个Magic Square,若是返回true,不是则返回false;②解读给出的用于生成Magic Square的generateMagicSquare()方法,并对其进行完善,增加判断输入n是否合法、将生成的Magic Square存储到6.txt的功能。
2.1.1 isLegalMagicSquare()
首先,创建文件流,读取文本。再利用readLine(),计算行数。
接着依次测试3个错误。测试错误1:行列数不相等。利用readLine()产生行的循环,再利用split()在每一行分割字符从而判断每一行有几个字符(即得该行的列数)。测试错误2:矩阵中含有非正整数。利用readLine()和split()方法,以行为循环,切分字符,一个一个检查字符中是否存在”.”、”-”,来判断是否存在非整数或负数。测试错误3:数字之间并非使用\t分割。利用readLine()和split()方法,以行为循环,切分字符,利用Integer.valueOf()方法一个一个地将数值存储到矩阵matrix的对应位置,并对该过程添加try catch,Integer.valueOf()方法遇到空格会触发异常,能够筛选非"\t"的情况。
错误判断完毕,接下来判断是否为Magic Square。建立数组存储行之和、列之和、对角线之和,并初始化为0,再利用循环计算它们的值。判断第一个行之和、列之和、对角线之和之间是否相等,不等则返回false,相等则进入行之和、列之和、对角线之和内部之间是否相等的判断。
2.1.2 generateMagicSquare()
首先是对给出的以下问题的思考:
前者是由于数组越界,会出现访问row[n]的情况,而row的长度为n,最多可访问至row[n-1];后者则是因为n为负数,在数组中访问下标为负数,直接报错。
而在给出的generateMagicSquare方法中,首先判断输入的n是否为偶数或者负数,若是则返回false;若不是,则继续进行生成MagicSquare。
分析所给的代码:(1)依次填入1,2,...,n*n,并首先将1放在第一行的正中间;(2)将下一个数值放入前一个元素的右上方(3)若位置被占用,即轮到了第k*n+1个(k为整数,且k<n),则将其放到前一个元素的正下方的格子,并继续进行(2)过程。
流程图如下:
最后按照要求对该方法进行了补充完善,增加判断输入n是否合法、将生成的Magic Square存储到6.txt的功能。
2.2 Turtle Graphics
主要是了解并利用turtle内的一些方法(如forward, turn等),完成TurtleSoup.java中待实现的方法。
(1)drawSquare方法较为简单,只需利用forward, turn方法,画一个正方形。(2)calculateRegularPolygonAngle, calculatePolygonSidesFromAngle, drawRegularPolygon用于计算正多边形内角、边数和画出正多边形。(3)calculateBearingToPoint 和 calculateBearings计算两个点之间转移所需转过的角度,即当前点到目标点的向量和当前方向向量之间的夹角,以及不同的点之间连续转换所需角度。(4)convexHull方法:若集中的点数量小于3,直接返回原来的集合。否则,利用礼品包装算法。首先找到极点,在该代码中为左下角的点,同时设置暂存集合与原集合一样,用于对其进行操作而不改变原来的点集;接着将该极点加入凸包集合,并从暂存集合中去除它;循环遍历所有的点,找出和极点偏转角度最小的,找到后将该点作为下一个极点,并继续找点;直到找到第一个极点,算法结束。(5)最后drawPersonalArt绘制一个图形,通过forward、turn及循环等操作,具体实现:进行500次循环,每隔100次循环更换一次颜色,依次为红橙黄绿青,每次循环转向116°并前进i/4长度,从而达成不断向外扩散、颜色渐变的效果。
2.3 Social Network
实现Person和FriendshipGraph两个类,模拟社交网络,完成添加节点、节点之间添加单向边、通过宽度优先算法计算两节点间最短路等功能。
主要需要完成,关于Person类的三个方法:addnewfriend增加对象的朋友,getmyname得到对象的名字,getfriends得到对象的朋友列表,以及FriendshipGraph类的三个方法:addVertex向图中添加新的节点;addEdge向图中添加新的边;getDistance通过BFS求两个点之间的最短距离。
需注意的是:由于每个人的名字唯一,因此addVertex添加新节点前,需先判断这个人的名字之前是否出现过,若出现过,则打印警告并结束运行,若没有,则将其加入allpeoplet中,将名字写入allname中;以及person类的构造方法:判断名字是否在allpersons中已经存在(通过存储所有已存在的名字的全局名字表),若是则输出“名字已存在”并退出,否则初始化这个名字,并且将其加入allpersons中。
3 实验中遇到的困难与解决途径
1.运行MagicSquare时,提出异常,提示”数字之间并非使用\t分割“。
定位异常,找到了对应代码,发现是将error3打成了error2,改正后程序正常运行。
2.Git提交后刷新url未出现应上传的文件。
重新提交git,发现之前漏了一些命令步骤。
3.上传后从github打开java文件,出现乱码。
在eclipse中编码格式默认为GBK,修改设置为UTF-8即可。
4 经验感想
1.初次使用git,遇到一些障碍,需多搜索多尝试。
2.训练了我的基本 Java 编程技能,对java的一些语法有了一些掌握,但仍需继续练习。