栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【软件构造】HIT-Lab1经验总结教训

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【软件构造】HIT-Lab1经验总结教训

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 前言
  • 一、实验内容本身
    • 1.P1
    • 2.P2
    • 3.P3
    • 4.测试代码
  • 二、非编码内容的总结
    • 1.P2的引入
    • 2.Git与Github
    • 3.外部库文件添加到lib文件中
    • 4.Maven项目和在线集成构建
  • 总结


前言

本文主要总结哈工大软件构造实验一的经验教训,分为实验内容本身和非编码内容的总结,目的一是及时记录,总结经验。二是记录自己实验过程,加学分。三是方便后续学弟学妹们少走弯路,更多关注编码本身的要求。

一、实验内容本身

本次实验分为三个小问题,结合实验手册或外国实验手册可以顺利地解决,当然,也有不少需要注意的事项,下面将分实验介绍:

1.P1

一是java的文件读操作,参照相关教程可以学习。用readLine方法一次读取一行,此方法不会读入换行符,同时按照“t”分隔开便可以得到数据。一开始我用的是读取全部内容,在行末加入“t”,造成了不少问题。对文件的打开最好用try{}catch{}finally{},并把关闭文件写在finally里面。二是容器的使用,由于不知道矩阵的大小,使用可变二维数组,即是二维容器,值得注意的是,赋值的时候我们要创建一维容器存储数据,再将一维容器加入到二维容器中。获取数据的时候要用到两次get,示意如下:

ArrayList> squarenumber = new ArrayList>();
ArrayList EveryRow=new ArrayList(); //新建一维数组存储每一行的数值
			for(int j=0;j
				int values=Integer.valueOf(Stringquare[j]);
				EveryRow.add(values);
			}
			squarenumber.add(EveryRow);
			row_number++;

三是对于数据合法性的判断,可以使用正则表达式,当然如果要区分各种不同情况,仍然需要分类判断,利用contain方法。
四是文件的写操作,可以将结果矩阵转换为字符串,再将字符串转换为字节数组,然后为打开的文件实例化输出流,通过write方法就可以将内容输出到文件中,具体可以参照其他教程。另外,相对路径起点为项目根目录,就实验而言示意如下:

"./src/P1/txt/6.txt"

五是文件的清空,一开始我也没注意到这个问题,在编写实验报告的时候注意到,每次构造前都应该将6.txt清空,不然会保留上次的结果。同时在判断幻方的时候应该添加对空文件的判断。查找相关教程,清空操作示意如下:

try {
				FileWriter writernull =new FileWriter(file);
				writernull.write("");
				writernull.flush();
				writernull.close();
			}catch (Exception e) {
				e.printStackTrace();
			}

关于P1的其他注意事项可以参考下面文章:
哈工大软件构造-Lab1-P1的问题

Java读取txt文件和写入txt文件

2.P2

P2没啥好讲的,按照实验要求一步步做就好,结合国外实验手册的提示便可。几个注意点如下:
一是求海龟转动方向的函数calculateBearingToPoint要考虑清楚每种情况,可以分为八个方位进行考察,别忘了坐标轴上的情况,这里很有可能造成arctan求解的问题。并且求得的角度是弧线制,要转换为度数。示意如下:

double x=Math.atan(b/a);
 x=Math.toDegrees(x);

二是求一系列转动角度的calculateBearings,注意每次求得一个角度后,下次调用要加上这个角度,一开始我是忘了加,但由于给的测试用例特殊,也能通过。但后面在宿友的提醒下发现了错误并更改。
三是求凸包算法convexHull,应该也是P2最难的,首先参照国外实验手册,会给出很多需要注意的事项,并且告知了算法为礼品包装算法。接着学习礼品包装算法,这样我们便有了思路,可以开始实验。最值得注意的事项就是:如果从左下角顺时针选择点,对于前两个点,不能考虑初始最左下角的点,而从第三个点开始可以考虑最左下角的点。

3.P3

P3咋看难度不小,其实就是有向图的广度优先遍历求最短路径。注意点一个是尽量分隔开Person类和FrendshipGraph类,减少耦合度。二是对于有向图的存储,对于稀疏矩阵最好使用邻接表。三是对于各种情况的考虑,加了重复点?加的边有点不存在图中?求距离的点不存在图中?对于这些我一开始由于C的习惯,用system.exit来结束程序,在测试中结合相关教程可以完成。但在重装了Elipse之后报错,相关的测试方法已经被较高版本的Elipse抛弃荒废了,其实完全可以用throw new exception来代替,测试的方法习题课一的代码1也有给出,完美的解决了这个问题。示意如下:

//实现代码中
throw new IllegalArgumentException("Each person should has a unique name");
//测试代码中
@Rule
	public ExpectedException expectedEx = ExpectedException.none();
@Test
	public void testAddEdge1() throws IllegalArgumentException {
expectedEx.expect(IllegalArgumentException.class);
expectedEx.expectMessage("The added edge exists and the node does not exist in the graph");
graph.addEdge(p1, p5);
}

四是注意邻接表中应该区分头结点和邻接链中的结点,这是不一样的,在加入队列的时候要警惕。然后注意用广度优先遍历求最短路径而不只是广度优先遍历,一开始我便是只考虑了广度优先遍历,然后测试时候出错了才意识到。关于queue的用法可以查看相关java教程。所有实验中,利用好各种容器和对应方法都有助于我们更快的解决问题。(java这点实在太方便了。)
【Java】Java队列Queue使用详解

4.测试代码

添加测试的方法很简单不赘述。需要注意的一个是写好相关的spec注释和测试方法,考虑清楚各种情况。二是可以参照习题课一的代码进行学习修改。

二、非编码内容的总结 1.P2的引入

这个问题困扰了一个小时,在各种查找csdn和更改build path下人麻了,首先我们需要知道Source folder,folder,package的区别关系。最重要的是一个Package下面不能再有Package最好的方法是先在包资源管理器中创建好目录,P2是包,turtle和rules是folder,然后再将.java文件添加到文件中。这时候需要更改Package的引用,示意如下:

package P2.turtle;
2.Git与Github

这个问题并不复杂,通过教程我们可以很快上手掌握,主要是访问Github有时候会很慢,可以通过解除证书认证,不过有时候还是不好使,关于Git的使用,相关教程链接如下:
Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!

删除github上的一个仓库或者仓库里面的某个文件

3.外部库文件添加到lib文件中

这个问题困扰了我一个半小时,其实是个很简单的问题,所以网上没啥回答,我磕磕碰碰找到了几个方法,一是打开项目的classpath文件,读代码可以大概看出用了啥jar包。另外一个是打开项目的Properties,选择Java build path,选择Libraries,便可以看到自己调用了什么库文件,就实验一而言,其实只需要添加如下两个jar文件(如果没用到其他的)(这里建议使用Junit4)

4.Maven项目和在线集成构建

这个点困扰了我一天多,首先注意到这个不是非必须内容。主要是想看自己的代码交到了Github上面能不能跑起来,利用工具Travis CI集成构建。我的理解是这样的(不一定正确):Travis CI要能集成构建,必须知道你的项目都用了哪些外部库文件,但在自己本地电脑部署的时候,是通过classpath指明相应库文件所在磁盘位置,在Travis CI上要脱离本地电脑环境就需要告诉他库文件的位置。这时候就需要将项目转换为Maven,Ant或Gradle项目,关于Maven是什么意思,可以参照下面这篇文章了解,关于怎么转换成Maven文件,可以参照下面这篇文章。
Maven是什么? Maven的概念+作用+仓库的介绍+常用命令

使用Travis CI进行在线build
所以我们需要将项目转换为Maven项目,顺利的话这一步没有任何问题,不幸的是,我的报错了,然后为了解决这个错误,查找了一堆资料,结果有个坑爹教程让我把Maven本地仓库删了,这下直接乱了,无奈下重装了Elipse和JDK(血的教训)。我遇到的问题是pom.xml文件报错,错误原因如下:
Failure to transfer org.codehaus.plexus:plexus-interpolation:jar:1.15 from http://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.codehaus.plexus:plexus-interpolation:jar:1.15 from/to central (http://repo.maven.apache.org/maven2): The operation was cancelled.pom.xml
解决方法网上很多,但对我都没啥用,最后选择删掉maven本地仓库重新下载并在Elipse中更改本地仓库位置(所以理解Maven至关重要!!!),教程如下:(学弟学妹如果遇到这个问题可以先参考其他方法,都没有用的情况下再选择这样做)
Eclipse集成Maven插件
解决了这个问题,接着我发现还有好多警告内容,其实是对JDK,JRE,Elipse版本的了解不够透彻。
一个警告是:
Build path specifies execution environment JavaSE-1.8. There are no JREs installed in the workspace that are strictly compatible with this environment
解决方法为:
看警告的项目路径,选中项目修改,选择项目点击鼠标右键–>properties–>java buil path–>右栏选择libraries项–>选择JRE system library–> Edit–>选择workspace default JRE–>确认完成。
另外一个是(大概如下,图片网上找的)

解决方法在外国教程找到,链接如下:
How to change Java compiler version for Eclipse project
至此,终于把问题解决了,添加了Junit依赖,链接Travis CI和Github,结果发现总是没法自动集成构建,结果隔天实验课好像说了自动集成构建是要钱的…,然后学校今年的仓库好像就没办法自动集成构建了…。虽然最后啥都没有搞出来,不过通过这个过程,加深了对build的很多理解,也算是一种收获吧。

总结

没有啥好总结的,这门课还是蛮硬核的,我是深圳校区过来交流的,深圳校区上的是软件构造导论,本部是软件构造,还是有一些区别。最后祝大家实验顺利!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/859462.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号