软件构造实验一

实验涉及幻方的判断与生成,以及turtle Graphics的多种画图操作,包括求凸包算法、绘制正多边形、计算角度和实现人际关系图。在幻方部分,通过isLegalMagicSquare()检查合法性,generateMagicSquare()构造幻方。turtle Graphics部分涉及画正多边形、计算角度和实现凸包算法。实验要求理解并应用各种算法和图形函数。
摘要由CSDN通过智能技术生成

 

  1. 实验过程

请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。

为了条理清晰,可根据需要在各节增加三级标题。

    1. Magic Squares

该任务先让我知道了幻方的概念,任务要求我判断一个矩阵是否是幻方,接下来是让我能初步了解构造幻方的方法。该任务涉及到很多文件读写操作,还有一些异常情况的处理。

      1. isLegalMagicSquare()

按步骤给出你的设计和实现思路/过程/结果。

本函数以文件为输入,布尔值为输出,判断文件中存储的矩阵是否是幻方。

首先是用了BufferedReader创建对象,然后用readLine()方法读取字符串。并可以在用readLine()时记录矩阵行数,方便后面做比较:

接下来便是先判断一些特殊情况:不符合幻方的定义、矩阵中存在负数或者小数、数字之间没有用\t分隔。

运用split()将一行字符以\t分开放到数组里,并用n记录一行的长度,即一行有几个数。如果行列数不等,说明不符合定义。

关于存在负数和小数,用了contains()判断是否出现过”.”或者”-”,如果有,说明出现了负数或小数。

第三种情况的想法是用Integer.valueOf()将读到的每个数字字符转成int存入矩阵中,而Integer.valueOf()遇到空格时会出现异常。

接下来便是判断过程,将行和、列和以及斜边和分别存到数组中,然后判断:

​​​​​​​

如果行和、列和以及斜边和,任两个和不相等,则判断不是;还需要判断行和、列和,斜边和本身是否都相等:

      1. generateMagicSquare()

思路:首先在初始位置赋值为1,之后的位置便是取当前位置的右上角,值在每次循环中加1,如果当前在第一行,那么下个位置在最后一行,如果没有,则行数减1;如果当前在最后一列,则下个位置在第一列,如果没有,则列数加1。填了第上面的位置,下次就填下面的,填了右边的位置,下次就填左边。像这样不断重复,能把整个矩阵填满,也能满足幻方定义。

注释:

然后便是将创建的幻方存入6.txt中,并在遇到n为负数或偶数时输出false并退出。

    1. Turtle Graphics

画图方面让我熟悉turtle Graphics的各种函数,在计算上,让我熟悉一些函数的使用。

熟悉了求凸包的一种算法。

      1. Problem 1: Clone and import

在教学QQ群中找到找到GitHub链接,然后把P2下载到与P1同级的地方。用Git命令行实现。

      1. Problem 3: Turtle graphics and drawSquare

重复四次前进并转向90度:

      1. Problem 5: Drawing polygons

calculateRegularPolygonAngle()中由边数计算出内角:运用公式:angle = (sides-2)*180 /sides

然后便是调用这个函数,求出内角,以内角和边数来前进和转向。

      1. Problem 6: Calculating Bearings

这部分用到了Maht.atan2()可以求出角度

需要注意atan2()函数返回值的范围,如果求出的为负值,还需要加上360。

在b中计算一个角度集合,很需要注意是一个连续的过程,所以得用循环。

      1. Problem 7: Convex Hulls

运用Gift wrapping algorithm算法,首先可以选定右下角的点作为初始点,右下角首先满足横坐标最小,再满足竖坐标较小。然后从初始点找偏角最小的点,如果有多个,则取距离最长的点。然后把选到的点作为初始点,再循环,直到最后又回到第一次的初始点。

      1. Problem 8: Personal art

主要是把之前写的画正多边形的函数用起来,颜色上我想用彩虹七色,通过一个整型数对7取余,余数对应存在数组里的颜色,然后用循环改变颜色,话不同边数,不同转角的图形,实现对称性。

      1. Submitting

使用 ssh-keygen 生成公私钥

将公钥复制到 GitHub 即可

添加 GitHub 仓库地址到 IDEA 中​​​​​​​

使用 git commit 提交代码到本地库

使用 git push 提交代码到远程

    1. Social Network

利用自己构造的类和方法来实现人际关系图,感觉主要是如何抽象人际关系。

      1. 设计/实现FriendshipGraph类

首先是person表示存储的人,而后面也要判断是否重名,需要name表示已经存储的名字。

 

增加点,即增加一个新的人。需要用前面的name判断现在是否已经包含这个名字。

增加边,即增加朋友,addfriend具体在person类中实现。

求距离感觉很复杂,需要使用先广搜索,再用队列,现将起点入队,起点弹出时,让起点的朋友入队,计算先前的距离,再加一,直到找完,队列空。

      1. 设计/实现Person类

首先是person的人名,以及friend表示该人的所有朋友。然后friends记录朋友的名字,在addfriend中需要用到判断是否已经有这个名字。

      1. 设计/实现客户端代码main()

      1. 设计/实现测试用例

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值