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

文章目录

  • 前言`
  • 一、Magic Squares
    • 1.任务要求
    • 2.isLegalMagicSquare()
      • 1.BufferedReader
      • 2.split
    • 3.generateMagicSquare
  • 二、Turtle Graphics
    • 1.任务要求
    • 2.Calculating Bearings
    • 3. Convex Hulls
  • 三、Social Network
    • 1.任务要求
    • 2.设计FriendshipGraph类
    • 3.设计Person类
  • 总结

前言`

本文介绍了我关于软件构造实验1的一些学习心得和经验教训。


一、Magic Squares

1.任务要求

Magic Squares即幻方,是一个n*n的正方形矩阵,它要求每一行,每一列,两条对角线n个数字和的值都要相等。该任务的目标是设计两个函数,第一个函数是isLegalMagicSquare函数,它要判断给定的矩阵是不是幻方,并且会检查文件中的值是否合法。第二个函数generateMagicSquare函数会生成一个矩阵,并调用isLegalMagicSquare函数判断其是否是一个幻方。

2.isLegalMagicSquare()

这个任务的关键是判断从文件中输入的数据是否合法,不合法的情况包括:行列数不相等,并非矩阵,某些数字不是正整数,数字之间并非使用\t分割等。

1.BufferedReader

在这个任务中,我们要读取文件中的内容,那么就需要调用BufferedReader方法。在这里我对BufferedReader方法进行介绍。
BufferedReader是为了提供读的效率而设计的一个包装类,它可以包装字符流。可以从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。、
在这里我们重点介绍BufferedReader类里的两个方法。

read
int read()方法,每次可以读取到一个字符(以int 类型表示),不过因为返回的是int类型的,所以要强制类型转换成char类型才能打印该字符。

readLine
String readLine()这个方法一次可以读取一个文本行,返回的直接就是这一行的字符串,如果读到行尾了就返回null。
这个方法就是我们在这个任务中所需要的。

static boolean isLegalMagicSquare(String fileName) throws IOException {String filename = fileName;int row = 0;// 记录矩阵的行数try {BufferedReader br = new BufferedReader(new FileReader(filename));while (br.readLine() != null) {row++;}br.close();// 关闭文件} catch (IOException a) {System.out.println("ERROR! " + filename + " 读取文件错误");return false;}

在上面的代码片段中,我调用了readLine方法,从给定的文件中一行一行读取字符,在这里要注意几个点。一是readLine读到行尾就返回了null,我们用此作为循环判断条件。而是调用完后,要记住关闭文件,也就是调用close方法。

2.split

在java中split方法把字符串按照指定的分割符进行分割,然后返回字符串数组。

while ((myLine = BR.readLine()) != null) {line = myLine.split("\t");//调用split,在每个\t处分割

在给定的文件中,数字与数字之间用\t分割开。用myLine保存文件中一行字符串,在调用\t方法对字符串进行切割,存放到line数组中。举个例子,myline=“65\t43\t7\t”,调用split方法后,line[0]=65,line[1]=43,line[2]=7。

if (myLine.split(" ").length > 1) {System.out.println("ERROR! " + filename + " 数字之间并非用\\t分割");BR.close();return false;}

而如果数字与数字之间不是用\t分割,而是用空格分割,那我们仍然可以用split方法,如上面代码片段所示。用split对数据在空格处进行分割,如果分割后得到的数据大于1(也就是说明有的数据并未用\t分割),则返回false.

3.generateMagicSquare

这个问题的关键是读懂给定的代码段是如何生成一个矩阵的。下面给出了代码以及注释,要注意这里的n必须是一个正整数且是奇数。

int magic[][] = new int[n][n];int row = 0, col = n / 2, i, j, square = n * n;// 将1-square这n*n个元素填写到矩阵中for (i = 1; i <= square; i++) {magic[row][col] = i;// 首先填写第一行正中间的数,之后向右上方填写if (i % n == 0)row++;// 每填入n个数,第n个数的右上方就是第一个数,那么就需要换到下一行填写else {if (row == 0)row = n - 1;// 第一行的右上方为最后一行elserow--;// 右上方的行数比当前的行数少一if (col == n - 1)col = 0;// 最后一列右上方为第一列elsecol++;// 右上方的列数比当前的列数多一}}

二、Turtle Graphics

1.任务要求

我们通过对Turtle发出命令,观察它的移动轨迹(也就是我们所需要的画的图像),在这个任务中我们需要完成:画一个正方形,画一个多边形,计算夹角,计算凸包。

2.Calculating Bearings

前面的几个问题都很简单,就不在这里复述了。
calculateBearingToPoint 这个方法是要实现从当前点的当前朝向转多少度能朝向目的点。这个只需要借助y轴作为中间量即可。首先计算当前点和目的点的连线向量与y轴的夹角,再减去当前点的当前朝向与y轴的转换即可,这里注意旋转都是顺时针旋转,注意正负角。

public static double calculateBearingToPoint(double currentBearing, int currentX, int currentY,int targetX, int targetY) {double angle = 90.0 - Math.atan2(targetY - currentY,targetX - currentX) / Math.PI * 180 ;//计算目的点与当前点连线的向量与y轴夹角,弧度转角度if(angle >= currentBearing )   return (angle - currentBearing ); //顺时针转else return (angle - currentBearing + 360 );//度数为负值,加上360度,顺时针转}

这里的关键,一是调用Math.atan2方法计算从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。二是注意,这里的方向角都是顺时针旋转得到的,所以如果求出来的是个负角,不能按逆时针看待,要加360度。

3. Convex Hulls

这个问题是凸包问题,即求一组最小的点集,使得这些点集依次连线能够把所有的点给包围起来。这个问题也是我认为本次实验中最难的一个问题。我们要利用上一个问题calculateBearingToPoint方法。具体算法如下:
a. 当点集的点的个数小于等于3时,返回点集即可。否则,转b
b. 首先遍历所有的点,找到最左边的点(这个点一定在目标点集中),如果有两个点的x坐标相同,则取y坐标小的点。把这个点设置为极点。
c. 以极点为当前点,当前朝向为0度,顺时针旋转,找到与之夹角最小的点,如果有两个或多个最小转角相同的点,则取最远的点。将这个点设置为极点,并且在原来点集删除这个点。
d. 循环c直到再次遇到第一个极点。
e. 所有设置为极点的点就构成目标点集。

三、Social Network

1.任务要求

该任务是设计一张社交网络无向图,其中人为图中的点,互为朋友之间的两个人构成一条边。能计算任意两人之间的最短路径。构建的图为无向无权图,可以采用BFS广度优先遍历得到两点间的最短路径。
这个任务,我认为难点不在于BFS算法,而是类中要设置什么字段,方法能更好的完成任务。

2.设计FriendshipGraph类

private ArrayList<Person> allPeople = new ArrayList<Person>();//所有人的集合
private ArrayList<String> allName = new ArrayList<String>();//所有名字的集合

首先设置了一个List(allPeople)用来存储所有人,又设置了一个List(allName)用来存储姓名。之所以设置两个List是因为人的名字(name)和人的实例的名称不同。比如

一个Person实例rachel,他的名字(name)为Rachel.

3.设计Person类

private String name ;//姓名
private ArrayList<Person> friends = new ArrayList<Person>();//朋友列表

Person类设置了一个name字段用来保存名字,friends列表用来保存一个人的朋友,还有这两个字段的get方法。同时实现了方法addFriend.用来往friends列表里添加个体。


总结

1.首先要搞清楚任务的需求,不能一开始就盲目的做,要大体上了解整个任务的目的是什么。
2.学会使用Java强大的类库,善于查询Java API文档,上网查询。很多情况下,不需要自己实现代码,只需要调用库里已有的方法即可,就比如队列的相关操作。
3.学会了git的相关操作,并且了解到了git的优势,养成了经常将代码提交到仓库的习惯。
4.编写代码要养成良好的规范,比如缩进,变量的命名等等。

【软件构造】实验一的心得体会相关推荐

  1. 哈工大2021软件构造实验3心得(1)-进行GUI设计

    哈工大2021软件构造实验3心得(1)-进行GUI设计 最近,笔者完成下窝工的软构实验三.在完成过程中,有很多坑想要记录一下. 顺便方便一下后来的窝工学子. 此Blog主要讨论如何在Eclipse里面 ...

  2. 哈工大2021春软件构造实验总结

    哈工大2021春软件构造实验总结 文章目录 一.实验一 1. 实验概述 1.1 Magic Squares 1.2 Turtle Graphics 1.3 Social Network 2. 实验感受 ...

  3. java实验2总结心得,打字小游戏JAVA实验总结及心得体会

    篇一:扫雷游戏实验报告 课程设计 班 级: 姓 名: 学 号: 指导教师: 成 绩: 电子与信息工程学院信息与通信工程系 目录 1.任务概述------------------------------ ...

  4. java五子棋实验总结与心得_实验总结与心得体会

    实验总结与心得体会 实验总结与心得体会 之前我在编程的过程中写过一份实验总结,里面详细的记录了实验中遇到的各种问题以及解决办法,当我完成了整个实验整理文档的时候,看到程序说明文档的后面标着0kB,心里 ...

  5. python语言的实验心得体会范文_实验报告个人心得体会范文

    实验报告个人心得体会范文 实验后的实验报告让我们有了总结回顾的效果.下面是 xx 整理的实验报告心得体会范文,以供大家阅读. 实验报告心得体会范文 ( 一 ) 这学期我们开设了计 算机网络技术实验课. ...

  6. 软件构造实验一问题解决方法及经验教训

    软件构造实验一问题解决方法及经验教训 一:实验目标概述 1.本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求 ...

  7. php实例一实验报告心得,实验报告个人心得体会【两篇】

    [导语]所谓心得就是工作或学习中的体验和领悟到的东西,亦可以称作心得体会."心得体会"是一种日常应用文体,属于议论文的范畴.一般篇幅可长可短,结构比较简单.下面是由无忧考网为大家整 ...

  8. python编程实验报告收获与体会_实验报告个人心得体会(20篇)

    实验报告个人心得体会 第 1 篇: 在做 XXX 的实验前,我以为不会难做,就像以前做物理实验一样,做完实验,然后两下 子就将实验报告做完.直到做完测试实验时,我才明白其实并不容易做,但学到的知识与难 ...

  9. 软件构造实验1相关思路

    软件构造实验1相关思路 1 实验目标概述 本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所 ...

最新文章

  1. oracle查询保留2位小数
  2. 在国企当程序员是什么体验?
  3. java8 stream案例分析
  4. WeX5 Model 里data ,baasData 数据过滤条件清除 数据初始化
  5. 实用常识 | HTML嵌入处理MARKDOWN合并单元格
  6. yum时报Error: rpmdb open failed解决方法
  7. java 求最大公因数_求最大公约数的三种算法(java实现)
  8. oracle 11g r2 安装过程与卸载详细图解
  9. CSS 单词间距 word-spacing属性
  10. php 全局 路径,PHP问题包括全局路径
  11. java基础选择题及答案_100道Java基础面试题收集整理(附答案)
  12. C#数据库编程实战经典
  13. 植被抽稀lisp程序_地形图缩编中植被符号抽稀方法.doc
  14. python 典型相关分析_典型关联分析(CCA)原理
  15. 简约大气毕业论文答辩PPT模板
  16. 武汉理工大学计算机学院宿舍,武汉理工大学专业所属校区及新生住宿分布情况(v2.0)...
  17. Android像素密度dpi/ppi计算公式,px、sp、dp互转工具类——概念解释
  18. RTB广告技术修炼之-流量漫游
  19. 起点web端体验报告
  20. 如何选择优质线路的韩国服务器

热门文章

  1. 2021-09-13项目部署
  2. 【知识点】UDS刷写的一般流程介绍
  3. Chrome浏览器配置阿里云DNS方法
  4. 周迅与李大齐分手后首谈旧爱:诚实面对自己的想法
  5. 分享一道蚂蚁金服笔试题
  6. FCPX自定义分屏字幕插件:Stupid Raisins Split Pop效果展示
  7. 1-6月中国ADAS供应商占比9% 又一家零部件巨头全面布局智驾新赛道
  8. Unity AssetBundle介绍
  9. mysql时间和时间戳转换工具_时间戳转换工具
  10. 和风天气API 版本6和版本7