本次实验通过求解四个问题,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
⚫ 基本的Java OO编程
⚫ 基于Eclipse IDE进行Java编程
⚫ 基于JUnit的测试
⚫ 基于Git的代码配置管理
这个实验属于非常基础的Java编程问题,虽然需要做的事情看起来不少,但是难度、代码量都是很低的。然而做这个实验的过程中,养成良好的习惯是很重要的。所以,这个实验中不是很关键、不能体现方法与技巧的东西,我就省略掉了,免得连篇累牍。
先判断所给文件中有没有非法内容(非正数,小数,非法的分隔符等),再判断能否构成方阵,最后检验行、列、对角线的和,判断是不是幻方。
这里需要注意,在以后的学习过程中,在所有处理I/O的时候(包括文件输入、控制台输入等等)都要判断输入是否合法。在实验1中,由于当时还没有学习异常处理的内容,就只能先用输出错误信息+退出函数的方法来处理不合法的输入了。
if (k != strings.length) {//判断每行数据个数是否相等,若不相等,则不是矩阵
System.out.println("It is not a square matrix.");
myReader.close();
return false;
}
for(int j = 0; j < k; j++) {
matrix[i][j] = Integer.valueOf(strings[j]);
if (matrix[i][j]==0) {
System.out.println("Contains zero, or it is not a square matrix.");
myReader.close();
return false;
}
}
由于从实验4开始,已经学习了异常等内容,编写程序的时候就要多注意,可能会发生哪些异常,如何去处理。具体的处理过程,下面紧接着有个例子,是因为实验里边要求抛出异常,就用了一下。
try {
if (n < 0)
throw new NegativeArraySizeException();
if (n % 2 == 0)
throw new ArrayIndexOutOfBoundsException();
} catch (NegativeArraySizeException ex) {
System.out.println("Invalid input: negative number");
return false;
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("Invalid input: even number");
return false;
}
剩下的也没什么好写的,把流程图放在这里。
这是MIT软件构造课程的一个实验,目标是培养基础Java编程能力。饰演的大多数内容都很简单,这里就不说了。下面说点重要的东西。
计算转角,非常简单,按照公式编程即可。
注意:此处需要注意Java给的arctan算法的返回值与实际需要的转角的区别,使用计算结果的时候,需要根据实际情况进行相应的处理。
if (((double)targetX - (double)currentX)>=0)
rad = Math.atan(k);
else
rad = Math.atan(k) + Math.PI;
现在我们需要用刚刚编写的方法来解决一个实际问题:凸包问题。
因为Problem 6已经让我们设计了计算转角的方法,我们就顺水推舟,利用这个方法,设计出一个求凸包的算法。
具体步骤如下:
1.将所有顶点放入一个数组。
2.可以证明,离原点最远的点一定是凸包的顶点,那就以它为起点,保存起来,并开始用包装法画凸包。
3.包装法的实现:
(1)初始化起始角度:原点到起点的方向对应角度+90度
(2)找出下一个点:逐个遍历点数组并计算转角和距离,找出转角最小的一个(或几个)点;转角相同的时候,根据凸包定义,找出距离最远的点。
(3)迭代:把下一个点加入凸包,在下一次循环作为起始点,重复(2)(3)
(4)循环退出条件:下一个点就是起点的时候,凸包完成。
计算机行业讲究“复用”,自己以前辛辛苦苦做出来的没有Bug的程序、方法,为什么不多用几次呢?复用不是复制粘贴,而是根据实际需要,让以前的代码继续发挥作用,减少开发时间。购买一件商品,使用的次数越多,平均每次的成本就越低。正是这个原理,复用能够大大降低软件开发成本,被复用的次数多的、有实际应用价值的东西,就被打包成了库。在以后的学习过程中,复用的机会还很多,后面的实验回顾会提到对于前面实验代码的复用。
这是CMU软件构造课的实验。这个实验的核心内容,是设计实现一个无向社交关系图,实现基本功能:添加人和关系,并设计计算距离功能(简单的BFS算法实现)。
FriendshipGraph类非常简单,存储点(人)和边(关系)就可以了。
Person类只需要存个名字。然而由于实验里边的要求:
Use proper access modifiers (public, private, etc.) for your fields and methods. If a field/method can be private, it should be private.
所以我们把名字都限制为private。
访问限制是Java的核心思想之一。后续实验中,为了防止表示泄露(rep exposure)和多线程编程中出现的同步问题,会经常用到private,final这类限定符。
测试是编程的重要环节,编写对ADT和方法的测试,也是贯穿于本学期的实验中。这也是我们软件构造课程将Testing and Test-First Programming章节拿到前面来奖的原因。每次编写完一个ADT,就编写一些简单而又有效的测试用例去测试一下,看看会不会出现潜在的问题。有了JUnit工具,我们的测试文件编写就省去了很多main函数和判断的编写,使用JUnit的各种assert就可以判断了。
这是MIT的一个实验,形式为给出方法和Javadoc,让你来编写具体实现。
这个实验大部分内容都是简单的流程化操作,要编写的东西不少,但是都不难,只要程序设计基本功扎实,认真一点,做的会很顺利。总的来说,这一块没有什么需要特别注意的地方。