软件构造实验1 part1

写在前面的话
----------记软件构造的6次实验以及学习过程的一些经历和知识点记录

新接触软件构造这门课对于一个零Java基础的人来说确实有点困难,不过希望在慢慢摸索中逐渐进步~~

实验1之前的准备工作,包括下载jdk,git以及eclipse和一些环境的设置。
三者的下载没什么难度,lab0的实验说明上给出了下载地址,比较麻烦的是环境变量的设置。对于第一次接触这些软件的人来说比较生疏,所以设置的时候虽然参考了许多教程,但还是没什么把握能够成功运行。

设置变量的时候失败了好几次,由于本人英语不是太好,所以仅看实验说明和指导的部分还是很难完成这些工作,最后筛还是百度选了一些觉得靠谱的文章终于完成了实验环境的构造

感觉lab0的准备工作还是要认真对待的,毕竟工欲善其事必先利其器。。。。

软件构造这门课会接触很多新鲜的事情,多查资料,多看文章,多学习了解一些新鲜的事物,最后会收获颇多

2
断断续续写了两周,终于完成了。

该实验首先需要配置环境变量,安装jdk,eclipse以及git,网上有很多关于安装的教程,按照教程安装即可。

P1加粗样式

该问题分为两个部分完成。

Ø 第一部分是读取5个txt文件中的数据判断是否为magic squares,主要包括将txt中的内容存入int型的二维数组中以及判断是否满足幻方的定义(包括数据是否为整数,是否以“\t”分隔,行列数是否相等,以及行,列,对角线之和的判断),

Ø 第二部分是对给定的用来生成magic squares的函数进行分析然后将生成的矩阵写入文件,主要包括分析函数的参数n为奇数,偶数以及负数的情况并分析产生的异常。

Ø 该问题主要涉及了读写文件的一些操作以及数组这一数据结构的应用还有数据类型之间的转换以及循环结构和分支结构的应用等一些基本的Java语言的运用,运用这些基础Java语言完成判断一个矩阵是否为magic squares的问题。通过这些基础的Java语言的应用,熟悉Java语言。

l 设计思路

首先调用读取文件的方法将数据读入字符串数组,然后用split方法分割每一个字符串得到矩阵,然后将矩阵转换成int型的,再进行行,列以及对角线之和的判断来确定是否为magic squares。

其中处理异常的说明如下:

² 关于是否为整数的判断,采用了构造正则表达式的方法来判断,构造的方法如下:

判断是否为正整数

² 关于是否满足矩阵的定义以及是否以”\t”进行分割,采用了判断行数row和列数column是否相等的方式判断(如果txt中有不以”\t”分隔的数据,则split分割时不能满足分割后的行列数相等,所以将是否以”\t”进行分隔的判断归到了判断行列数是否相等下)

幻方生成问题

A. 首先将1放在最上一行的中间。其后整体上沿着自左下至右上的这条对角线将自然数按顺序放置,中间对行列有些许调整,如下:

B.行数一直在减小,直至减小为第一行时,下一个整数要放在最底行

C.列数一直在增加,当到达最右边一列时,下一个整数要放在最左边的列上

D.当要放的位置上已经填好了整数,或上一个整数已经放在了幻方的右上角

时,则当前要摆放的整数将放在该位置的下方。

关于n为偶数或负数会出现异常,
偶数是因为左下角的元素会越界
负数是因为无法生成矩阵

P2

该问题主要分为几个方面:

l 了解Java中的画图工具turtle的几个方法,学会利用turtle汇出一些基本图形

l 借助数学公式,根据角度计算边或根据边计算角度并结合turtle汇出正多边形

l 利用三角函数的知识计算向量的角度变化

l 根据前三个方面结合对凸包判断的礼品包装法完成找到对点集中构成凸包的最小点集的程序

如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。

l 创建本地git仓库:

² 首先输入命令mkdir git_projects创建一个文件夹git_projects

² 然后输入命令cd git_projects进入该文件夹

² 最后输入命令git init便可创建本地仓库

l 从GitHub获取该任务的代码:

² 输入如下所示命令行:

git clone 仓库地址

然后便可以将远程仓库内的文件克隆下来,

l 使用git管理开发:

从git中导入项目到eclipse中的步骤如下:

² Open the Eclipse:

² File>>Import>>Git:Project from Git, 点击Next.

² 选择 Clone URI, 点击Next.

² 在 URI 中填入Git上项目的地址,再填入Password, 点击 Next.

² 选择要导入的项目,点击 Next.

² 在 Directory
中输入要存储的路径,点击 Next.

Problem 3: Turtle graphics and drawSquare

l 绘图的工具主要有以下几个:

在turtle.java中提供了绘制图形的四个接口:

² public void forward(int units);

沿当前方向绘制线段,参数units为该线段的长度

² public void turn(double degrees);

将绘制的方向顺时针转动,转动的角度为参数degrees

² public void color(PenColor color);

改变当前绘制的颜色,颜色选择是通过枚举形式

² public void draw();

打开绘图窗口

l 设计思路

引用turtle对象中的forward和turn两个方法并进行4次循环即可完成square的绘图

l 运行结果

在这里插入图片描述

Problem 5: Drawing polygons
分以下三个部分

1.1.1.1
calculateRegularPolygonAngle()

l 设计思路:

该方法主要根据正多边形的边数计算正多边形的内角度数,只需运用数学公式正多边形的内角和sum = 180*(n-2)再取sum/n即可计算出内角

l 注意事项:

在计算角度的时候要注意进行类型转换,将结果转换成double型

1.1.1.1
calculatePolygonSidesFromAngle()

l 设计思路:

该方法主要根据内角计算正多边形的边数,利用公式nangle=180(n-2),可得n = 360/(180-angle)即可计算出边数

l 注意事项:

计算边数时要注意对结果取整,此方法主要运用了Math.ceil()函数进行了向上取整

1.1.1.2
drawRegularPolygon()

l 设计思路:

首先使画笔方向旋转270度使其指向水平向左的方向,然后每次使画笔沿顺时针方向旋转angle(多边形的外角的度数),然后调用forward绘制边,进行n(多边形的边数次循环便可完成绘制)

l 运行结果:

运行该方法绘制了一个正八边形如下图:

在这里插入图片描述

1.1.1 Problem 6: Calculating
Bearings

l 设计思路

该方法的设计是在方法calculateBearingToPoint()(功能:根据给出的当前的点(x0,y0)和下一步将要到达的点(x1,y1)以及当前的方向currentBearing计算出要到达(x1,y1)点应该旋转的角度)的基础上进行的,所以先分析calculateBearingToPoint(),如下:

² 设计思路:首先计算两点所形成向量的横纵坐标x,y,然后分情况讨论得出该向量与y轴正向的夹角,然后跟currentBearing进行比较并计算出旋转的角度,

² 注意事项:利用atan方法计算角度时要弄清楚是与x轴哪个方向的夹角,以及分清楚角度的正负,计算旋转角度时要统一两个量,即旋转前后的方向都是与y轴正方向的沿顺时针方向的夹角

以下附上代码:
在这里插入图片描述

l 在calculateBearingToPoint()的基础上设计Calculating
Bearings()的思路如下:

最初朝向的方向currentBearing记为0°,若点对数为0或1则直接返回空集否则利用calculateBearingToPoint方法计算序列前两个点间需要旋转的角度angle加入List 中,然后更新当前朝向的方向currentBearing = (currentBearing+angle)%360,然后循环计算下两个点需要旋转的角度直至点集中所有的点被计算完毕,返回最后的List即可

1.1.1 Problem 7: Convex Hulls

l  设计思路:

该方法的设计主要分三步进行,主要运用了礼品包装算法:

²  第一步:若点集中没有点或者有1个,2个点时直接返回该点集,若是大于等于3个点,则找出所有点中y值最小的点,若y值最小的点不止一个,则在他们中选择x值最小的点,记该点为p0

²  第二步:计算剩余所有的点和p0的连线与x轴正向逆时针方向的夹角,

并按照角度由小到大进行排序,若其中有共线的,则将与p0距离近的排在前面,距离远的排在后面

²  第三步:将前两个点入栈,并计算当前方向(即栈顶元素与栈顶下方元素的线段的方向),利用前面的calculateBearingToPoint方法判断排好序的下一个未被判断的点p与栈顶元素的连线与当前方向相比是否是逆时针拐向,若是,则点p入栈,继续判断序列中p后面的点与p点的连线的拐向,否则栈顶退栈并重新判断点p与新的栈顶元素是否满足逆时针拐向。

²  注意事项:点集中的点类型为double,两次调用函数calculateBearingToPoint的形参是int型,所以将double型的点转换int型,因为test文件中给出的参数都是浮点型的整数,所以不影响实验结果,如果因此重新写一个计算方法与calculateBearingToPoint相同只有形参类型改为浮点数意义不大

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值