2020HIT软件构造实验:lab1各任务的个人理解

一. 实验目的

这个实验其实只是四个实验中的一道开胃菜,其目的本身在于让我们熟悉利用java来编程,并且用git来进行代码管理。所以说,事先学过java自然上手会更快,但是没有学过java其实也无所谓,倒不如说提升我们熟悉一个没使用过的新工具的能力,这正是这个实验的目的。

二. 实验环境配置

不得不说,lab1(以及lab0)的环境配置步骤并不算简单,尤其是jdk的环境变量配置,真的有很多坑。但是由于实验指导说明里面给的比较详细了,这里就只给出两点我觉得算是坑的部分:

2.1 关于jdk8

在课程要求中提到,TA使用jdk8来评分,所以我们也不能使用jdk8之后的特性。但是,就我观测到的结论而言,安装jdk8要比安装jdk11或者jdk13要复杂不少,所以为了简便起见,这里推荐大家直接安装jdk11或者最新版本的jdk,然后进行以下两步调整:

  1. 在上面选项的Window-Preferences-Compiler中,将编译器的编译级别调整成1.8,如图:在这里插入图片描述
    这样子可以保证java8以上的特性无法通过编译;
  2. 右键JRE System Library,在Properties项中调整java执行环境为JavaSE-1.8版本,如图:在这里插入图片描述
    这样就可以一方面简化安装过程,另一方面也不会因为使用java8以上的特性而出现差错。

2.2 关于assert

lab0的指导书中有一部分是让我们看mit的原课程的实验要求,而这一实验要求是英文的,就会给许多同学造成一定的障碍,从而导致漏掉一些重要内容。其中有一点很重要的地方,就是开启assert。在我们之后编写实验的时候,经常会使用的assert代码,在Eclipse的默认设置中会被跳过。为了更改这一点,我们需要在刚刚的Prefenences-Java-Installed JREs里面点击我们使用的JRE,然后点击edit,在default VM arguments里面填上-ea,这样子我们写的“assert xxx;”代码才不会被跳过。如图:在这里插入图片描述
我见到不止一个同学因为不擅长看英文,做到了lab4也没发现这一点,可能就会导致在前面引入相当多的bug。

三. 实验具体内容

3.1 Magic Squares

该问题分两部分,前一半是从文件中读取幻方的数据信息判断其是否可以被转换为为合法幻方,后一半是先构造一个幻方,再将其输出至文件中。

我认为这道问题中,幻方只是一个载体,其真实目的在于帮助我们对于java不同于c的特性进行初步的了解,尤其是java的集合类,包装类,IO,异常处理以及字符串处理等知识。

注意:就我个人而言,因为刚上手的时候编程能力几乎为0,这一部分做了半天也没做出来(主要卡在IO上),最后也是跳过了这一部分,先做的后面,最后才做出来的3.1。如果有和我情况相似的同学,建议直接从容易上手的3.2开始,3.1留到最后做。

这一部分的大体思路就是:

  1. 提取出文件中的整数,检测文件格式合法性,并存放于集合类list中
  2. 检查集合类list中的数是否能构成一个方阵
  3. 检查集合类list中的方阵是否为合法幻方

2,3步比较简单,第一步由于涉及到IO,对于编程不熟练的同学(比如我)可能有些难度。推荐这篇博客,可能对于大家有一定的帮助。

附:罗伯法填写奇数阶幻方(就是给出的代码)的思路流程图:这就是我们小学学过的罗伯法,在各大搜索引擎上都可以找到
这就是我们小学学过的罗伯法,在各大搜索引擎上都可以找到,思路很简单,这里就不再赘述。

3.2 Turtle Graphics

这个任务要求我们利用给出的turtle包,实现各种各样的功能。后面的几个任务中利用到了许多集合类相关的内容,以及一些其他的java的基本知识。

平心而论,我真的觉得这一实验远比3.1好上手得多,甚至一开始还有git的教学(笑),而且内容也相当好玩,真的建议大家先做这个。

当然,这个实验里面有一个还算蛮大的坑,就是git clone下来,需要把import P2.turtle 改成 import turtle。注意eclipse会把多个import折叠,所以如果import那一行报错,不要忘记点import左面的加号,里面可能藏了一只turtle(笑)

  1. Problem3 & Problem5:画多边形
    有一说一,这一部分对于我这样完全没有编程基础的菜鸟而言,作为入门练习真的再合适不过了。做出来这两问,只需要我们知道正多边形内角的计算方法(当然你要是忘记了还不会上网查那我就没办法了(笑)),然后用代码里面给出的移动和旋转操作就ok了。

  2. Problem6
    这一部分就是让我们对于集合类有一个初步的认识,通过一个非常简单的问题,我们就可以对于集合类List有一个基本的了解了。需要注意的一点是,题目里面要求角度范围是0到360,不要不小心输出负值,否则可能莫名其妙卡很久。

  3. Problem7
    Problem7是一个平面上的凸包问题,形象地理解就是在桌子上扎了很多钉子,用橡皮筋将所有的钉子围起来,那么凸包中的点就是受到橡皮筋拉力的钉子。代码中提示的gift-wrapping算法的思想是先找一个必然在凸包里面的点,然后再以这个点为基础,找到下一个凸包中的点,再寻找下一个点的下一个点,以此类推,直到我们找到的下一个点是第一个点,那么我们刚刚找到过的所有点的集合就是凸包(如图):
    凸包
    我这里的思路是干脆复用上一问的结果,如果已知凸包里面包含pk-1和pk,由于所有的点都在边pk-1pk的一侧,想找下一个点pk+1就相当于让∠pk-1pkpk+1最大化,然后如果有多个这样的pk+1,取能使边pkpk+1最长的一个。(当然,我这是一个很笨的方法,有点为了复用上一问的结论而复用上一问的结论了。如果利用直线的叉乘,理论上比我的方法要简单不少。)如图:k=1
    当然,这里有一个问题,就是这个递推过程怎么开始。言外之意,k=0的时候,显然我们找不到前一个点。这里就需要让第一个点p0是最左侧的点中的最下面的一个,然后随便一个位于p0正下方的点p-1,然后就可以用这两个点推出p1的位置,如图:初始化
    在这张图中,我们想要得到p1,必须已知p4和p0,然后找到最大化p4p0p1的p1。但我们显然并不知道p4,所以用固定点p-1,因为p-1p0p4是固定的,所以最大化p-1p0p1即可最大化p4p0p1。

  4. Problem8
    这一问我真的很喜欢,真的很能发挥出来我们的想象力,据说一个大佬学长画的美队的盾牌,还挺好看的(当然,从一个选择困难症患者的角度来讲,其实决定该做什么也挺难受的)。因为是一笔画,所以我首先想到的就是皮亚诺曲线,然后在维基上面搜皮亚诺曲线的时候,我找到了非常类似的科赫雪花,感觉比皮亚诺曲线更美观一些,就做的这个。如图:(上图为百度百科上面的0-3阶科赫雪花,下图为我自己画的四阶科赫雪花)
    百度百科上的0-3阶科赫雪花我自己实现的四阶科赫雪花

3.3 Social Network

这个问题是要求我们用java实现一个可被扩展为有向图的设计,利用广度优先搜索,去实现一个无向图社交网络,并编写测试用例。这个问题其实训练的是我们对于面向对象编程本身的理解,同时也让我们对于JUnit测试进行一定初步的了解与实践。

3.3.1 设计/实现ADT:Person&Relationship&FriendshipGraph

如果把人与人的社交用无向图来表示,每个人是一个顶点,那么人与人之间的关系就是图中的边。在c之类的语言中,我们或许还需要考虑这个无向图是用邻接矩阵还是邻接表来表示(我一开始还真的认真地纠结过这个问题(笑))。

但是在面向对象的语言中,这么做就很蠢了。我们无论是点还是边还是无向图,都当作一个对象,每个点/边/图用一个类的实例来表示。类中包括两部分,字段和方法。字段中存储相关数据,而方法是我们对于这些数据的操作。以无向图为例,它由两部分组成,点和边。所以我们设计的字段就是两个list,一个存点,一个存边。然后对于这个图的观测和操作,放到方法里面解决就ok了。

3.3.2 设计/实现测试用例

我们原来的测试一般是用main函数,然后对于不同的输入进行试数,从而达到对整体测试的目的。但是这样子既不容易测出来错误,一旦代码复杂起来测出错误也不好找问题出在哪。所以我们有了单元测试JUnit,相当于在每个类上面挂上一大堆main函数,然后每个main函数对于类里面需要进行测试的方法进行单独测试。这样子就可以将错误尽快处理掉,防止错误扩散之后不好找。

四. 其他的经验

4.1 关于本次实验的目的

4.1.1 关于Java

在学习这门课之前,听说过学长传下来的一些流言,诸如“这门课不教Java就要求大家用”之类的,导致我产生了一种不提前自学Java,这门课就会很难的错觉。再加上确实3.1的IO部分对于我这种编程菜鸡而言真的很难,就导致我对于这门课产生了一些恐惧心理。但其实如果任何编程语言都只是工具,就像是钳子或者扳手一样,根本就没什么必要学,拿在手里用用就熟练了。我这里并不建议为了这门课特意学Java,就算完全不会,先从简单的3.2开始上手,一步一步,由浅入深,慢慢也就熟练了。

4.1.2 关于git

这个实验的另一个目的是教会大家使用git。但有一说一,我认为这个实验,包括后面的三个实验,大家只要会git add,git commit和git push三条代码就已经很足够了,但是如果我们想熟练运用git这一工具(甚至只是在考试里面得到关于git代码那道题的分),这一点还远远不够。因此,绝不能满足于这一实验之内用到的git知识,而应该更多地了解这一有力的工具。

4.2 我的其他感想

无论对于哪个实验,最需要注意的一点就是:时间上一定要注意!!!这个实验和之前的其他实验不同,不是一天两天就能做出来的,大家最好从一开始就开始弄,不要拖到最后,否则会导致ddl周十分慌乱,影响到其他的课程不说,错过ddl还会扣分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值