哈工大软件构造lab1

2020年春季学期
计算机学院《软件构造》课程

Lab 1实验报告
 

姓名

麦昌瀚

学号

190110920

班号

7

电子邮件

835889372@qq.com

手机号码

 

目录

1 实验目标概述... 1

2 实验环境配置... 1

3 实验过程... 1

3.1 Magic Squares. 1

3.1.1 isLegalMagicSquare(). 1

3.1.2 generateMagicSquare(). 1

3.2 Turtle Graphics. 1

3.2.1 Problem 1: Clone and import 2

3.2.2 Problem 3: Turtle graphics and drawSquare. 2

3.2.3 Problem 5: Drawing polygons. 2

3.2.4 Problem 6: Calculating Bearings. 2

3.2.5 Problem 7: Convex Hulls. 2

3.2.6 Problem 8: Personal art 2

3.2.7 Submitting. 2

3.3 Social Network. 2

3.3.1 设计/实现FriendshipGraph类... 2

3.3.2 设计/实现Person类... 2

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

3.3.4 设计/实现测试用例... 3

4 实验进度记录... 3

5 实验过程中遇到的困难与解决途径... 3

6 实验过程中收获的经验、教训、感想... 3

6.1 实验过程中收获的经验和教训... 3

6.2 针对以下方面的感受... 3

  1. 实验目标概述

本次实验通过求解三个问题,训练基本 Java编程技能,能够利用 Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用 Git作为代码配置管理的工具,学会 Git的基本使用方法。

1、基本的 Java OO编程
2、基于 Eclipse IDE进行 Java编程
3、基于 JUnit的测试
4、基于 Git的代码配置管理

  1. 实验环境配置

简要陈述你配置本次实验所需开发、测试、运行环境的过程,必要时可以给出屏幕截图。特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

由于之前已经安装过jdk,所以此次我直接打开高级系统设置查看环境变量路径,并在命令行窗口检查确认jdk为1.8版本。随后在lab0的实验报告中根据给出的网址下载安装了ecilpse,在git官网下载安装了git-bash。

难点:由于实验指导书安装eclipse的教程充斥着大量晦涩难懂的英文和复杂操作,所以结合csdn的教程顺利安装好程序并初步掌握eclipse的使用和java基础编程。

GitHub Lab1仓库的URL地址(Lab1-学号)

https://github.com/ComputerScienceHIT/HIT-Lab1-190110920

  1. 实验过程

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

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

    1. Magic Squares

MagicSquare是一个正整数组成的正方形,他的每一行、每一列和对角线的数字之和都相等。

任务一:编写一个Java程序(Magicsquare.java)用于检查矩阵的行/列/对角线值,该程序能够从五个已经提供的txt文档中读入数据,来判断输入的数据能否构成一个MagicSquare,若是则返回true,若不是则返回false且说明原因。

任务二:对给出的generateMagicSquare函数进行扩充,使之能够产生一个MagicSquare并且将其输入到文本6.txt中,然后对其判断是否为MagicSquare。并且满足若输入的为奇数能产生MagicSquare,而输入偶数或者负数会返回false。

      1. isLegalMagicSquare()

首先需要判断读入的数据能否构成一个矩阵。根据实验手册,需要判断的三张错误:

行列数不相等:逐行读取得知总行数,然后对每一行按照\t进行分割得出列数,判断每一列是否与行数相等,若有一列不相等,则返回false。

矩阵中某些数字不是正整数:按照\t将分割后的字符串装入数组中,然后判断这些字符串是否包含”.”或者”-”,若包含,则返回false。

不是以\t作为分隔符:按照\t将分割后的字符串装入数组中,然后判断这些字符串是否包含空格,若包含,则返回false。

可以构成矩阵时,读入文件中的数字,用二维数组表示矩阵,分别计算矩阵每一行、每一列、对角线的和是否相等来判断能否构成MagicSquare,并返回true。

使用try-catch组合,若文件读取本身出现问题,呈现相关错误信息

输出的结果:

      1. generateMagicSquare()

输入的 n不合法时(n为偶数、n为负数等)提示错误并“优雅的”退出:

将产生的 magic square写入文件\src\P1\txt\6.txt中并检验

    1. Turtle Graphics

实现一个绘图工具Trurtle Graphics,需要我们完成的任务为:画出一个正方形,计算正多边形内角,由正多边形内角得到边数,计算从一个点到另外一个点所需要转过的角度,给定一系列点计算每次转过的角度并返回在集合中,计算一系列点中的凸包,调用函数绘制个人艺术作品,使用junit进行单元测试。

      1. Problem 1: Clone and import

从github上获取代码:网页download。

从本地创建git仓库:1、git init初始化本地仓库2、git add remote添加远程库源3、在远程仓库创建master分支4、git pull origin master将远程仓库同步到本地5、git add * ->git commit -m “……”->git push将本地文件加入到本地仓库,将本地仓库同步到远程仓库。

      1. Problem 3: Turtle graphics and drawSquare

通过四次循环,使用forward、turn函数每次前进+转90°就可以得到正方形。

      1. Problem 5: Drawing polygons

补全calculateRegularPolygonAngle。正多边形的内角等于180 – 360./ 边数

补全calculatePolygonSidesFromAngle。知道正多边形的内角求边数,由前句进行简单数学公式转换即可

补全drawRegularPolygon。画出指定边长的正多边形。调用calculateRegularPolygonAngle(sides)计算正多边形的内角,调用forward和turn函数进行前进和转向。

      1. Problem 6: Calculating Bearings

补全calculateBearingToPoint。该函数利用atan2函数计算前进方向与x轴正向夹角,之后再把该角度转换成与y轴正向的夹角,注意如果出现负数要再加上360°。

补全calculateBearings。对列表中的每两个相邻点调用calculateBearingToPoint计算夹角,列表保存并返回

      1. Problem 7: Convex Hulls

计算给定集合中的凸包需要利用Gift wrapping algorithm算法。点数少于3个时直接得凸包,否则先找到最左下角的点加入集合:

然后比较剩余点到此点的偏转角,找到偏转角最小的加入集合,当偏转角相同时,需要找到最长的一条边的点加入集合,当回到起点时终止程序,最后即可得到凸包的点集:

      1. Problem 8: Personal art

经计算后绘制得到一个顶角竖直向上的五色正五角星:

      1. Submitting

(1).打开git-bash

(2).cd /D/P2

(3).git add .HIT- Lab1-190110920

(4).git commit –m “P2”

(5)git push origin master

    1. Social Network

实现并测试Friendship Graph类和Person类,模拟社交网络,可以计算图中两个人之间的距离。

      1. 设计/实现FriendshipGraph类

1.定义一个Person集合来储存所有人的对象,定义一个String集合来储存所有已经存在的名字并进行初始化:

2.函数addVertex:增加一个人的对象。 实现此功能需要注意用来增加的Person对象是否已经存在,所以需要在开始判断name中是否已经有了匹配的的名字,若已经存在,则输出“输入人名重复”并结束程序,若没有则将待增加的新的Person对象加入people集合中,对象的名字加入name集合中:

3.函数addEdge:增加一条有向边。实现此功能只需要调用Person类的addnewfriend方法即可

4.函数:getDistance:得到两个人之间的最短距离。使用广度优先搜索方式求最短路径的方法。若两个Person对象为同一个,则返回0。然后定义一个Map集合way和一个Person队列thequeue,队列thequeue用来储存广搜的遍历结果,theway的Map集合用来储存广搜的所有元素及他们与第一个元素的距离。具体实现为将第一个元素c1入队,并且把c1和下标0入集合,当队列非空时,弹出队首元素top,并且得到top在集合theway中的下标distance,然后只要队首元素的所有朋友friend,中的元素与c2不同就全部入队,这些元素及下标distance+1放入集合。队列非空则继续执行以上步骤,直到找到某个元素与c2相同并且返回这个元素在集合way中的下标。如果直到队列为空还没找到c2,则返回-1:

      1. 设计/实现Person类

1.定义String变量name储存名字,定义一个Person的集合friend,定义一个

2.构造方法:依据输入的字符串初始化这个名字,并且将这个名字加入集合friend中:

3.增加本人新朋友addnewfriend:直接将新Person对象加入friend中即可

4.得到本人的名字getname:直接返回name

5.得到本人的朋友列表getthisfriend,直接返回friends

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

基于实验报告的代码稍加修改

输出结果为:

      1. 设计/实现测试用例

创建对象测试public void addVertextest()

加入朋友关系测试public void addEdgetest()

覆盖每个顶点先建立交际网,再测试距离是否正确public void getDistancetest()

  1. 实验进度记录

请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。

每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。

不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。

日期

时间段

任务

实际完成情况

2021-05-13

15:45-17:00

尝试初步编写问题1的isLegalMagicSquare函数

按计划完成

2021-05-16

14:00-16:00

编写问题1的isLegalMagicSquare函数并完成测试

延期1小时完成

2021-05-20

15:45-17:00

编写问题1的generateMagicSquare函数并完成测试

按计划完成

2021-05-20

19:00-20:00

尝试了解第二题的概况并完成1-4

延期1小时完成

2021-05-21

15:00-17:00

完成P2的凸包和个人艺术设计,并经过调试后通过了自带的测试

按计划完成

2021-05-22

13:00-17:00

完成P3的Person类和FriendshipGraph类

按计划完成

2021-05-22

19:00-20:00

完成P3的测试

按计划完成

2021-05-23

19:00-21:00

完成收尾工作

按计划完成

  1. 实验过程中遇到的困难与解决途径

遇到的难点

解决途径

初次接触java,文件读写出现很多问题

通过查阅资料理解了flie类和bufferreader类等的关系与使用

p2的英文教程在初次接触时造成了许多困难

经过耐心阅读领会了题目的意思和大致目标

……

……

  1. 实验过程中收获的经验、教训、感想
    1. 实验过程中收获的经验和教训

此次实验初次使用java,我对众多语法和结构不熟悉。但是在一段时间的钻研后,我学到了java领域的许多新奇知识,并逐渐熟悉了git、eclipse和junit的使用,受益匪浅。

    1. 针对以下方面的感受
  1. Java编程语言是否对你的口味?

第一印象不错,具有面向对象编程固有的许多优点与特色

  1. 关于Eclipse IDE

对于初学者十分友好,自动提示与纠错功能非常强大

  1. 关于Git和GitHub

较为生疏,还需要深入研究

  1. 关于CMU和MIT的作业

英文教程障碍较大

  1. 关于本实验的工作量、难度、deadline

适中

  1. 关于初接触“软件构造”课程

收获颇丰

其他收获:

Scanner cannot be resolved to a type

刚开始接触java,这个问题非常简单但是在网上怎么也找不到答案
Scanner类使用前需要将其导入。
在代码的最前端加入
import java.util.Scanner;
即可
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值