2023年春季学期
计算学部《软件构造》课程

Lab 1实验报告

目录

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 的基本使用方法。

·基本的 Java OO 编程

·基于 Eclipse IDE 进行 Java 编程

·基于 JUnit 的测试

·基于 Git 的代码配置管理

2.       实验环境配置

本次实验开发测试运行的环境为IDEA,在配置环境的过程中,主要遇到的是JDK版本实验要求不符的情况,打开IDEA集成开发环境工具,点击:File--Project Structure进行JDK的更改。

安装Junit:

Idea自带,根据提示配置成功。

GIT安装:

根据Lab0提示下载安装。

3.        实验过程

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

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

3.1        Magic Squares

读取五个文本文件,并检查其中矩阵行列对角线值,并判断他是否为幻方矩阵。

3.1.1        isLegalMagicSquare()

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

FileReader文件字符输入流,BufferedReader缓冲输入流,将字符串并保存在一个String类型的tmp字符串中,并加入集合list中。

定义int类型row记录行列式的行数,将字符串每行用“\t”split分隔,记录length为列数(如果输入格式中未用“\t”分隔,此时列数并非真实的列数),length不等于row时,输出错误提示,return false。

采用Integer的valueOf()方法判断是否存在非整数和非正数的情况。

计算行、列、对角线上数字和的值,进行判断是否符合幻方矩阵的性质。

3.1.2        generateMagicSquare()

流程图

判断n不合法的情况,return false。

n合法时,对n*n的矩阵进行填充。从第一行中间位置(0,n/2)开始填充,1赋值给初始位置。进行边界检查,达到上边界时,跳至下边界。其他情况正常row--。达到右边界时,跳至左边界。其他情况时正常col++。当i能被n整除时,下移一行,赋值为i + 1,然后继续循环赋值。当循环n的平方次后,则生成好了n*n的幻方矩阵。

输出生成的幻方矩阵并且写入6.txt文件中。

3.2 Turtle Graphics

利用git clone 获取代码,根据注释补全代码,实现一系列绘图可能用到的功能:画出正方形、计算正多边形的内角、计算对应内角的正多边形边数、计算角度转移(以某点作为出发点,面向某个方向,要前往指定坐标点,需要转过多少角度)、求解凸包问题、以及绘制自己独特的图形。​​​​​​​

3.2.1 Problem 1: Clone and import

git init 用于初始化项目

克隆项目的地址 git clone xxx ,显示100%时就代表项目克隆成功

​​​​​​​​​​​​​​3.2.2         Problem 3: Turtle graphics and drawSquare

调用已经实现的forward和turn函数,向前走sideLength,转90°角,实现正方形的绘制。

​​​​​​​​​​​​​​3.2.3        Problem 5: Drawing polygons

calculateRegularPolygonAngle()函数求解给定边数的正多边形的内角度数。

每次前进sidelength,转向的角度为外角的度数(通过调用calculateRegularPolygonAngle()函数得到),循环次数为边数

calculatePolygonSidesFromAngle()函数求解给定正多边形内角大小的边数。

绘制边长为40的正八边形

Problem 6: Calculating Bearings

以某点作为出发点,面向某个方向,要前往指定坐标点,需要转过多少角度。我们通过调用math.atan2函数,计算角度,最终确定转角。

​​​​​​​​​​​​​​3.2.4        Problem 7: Convex Hulls

当点集中的点少于等于两个时,凸包由点集中的所有点组成,直接将两点返回。

当大于两个点时,选择最左下的角作为出发点,通过循环遍历整个点集,查找横纵坐标最小的点。找到该点后记录下来,并加入到凸包的点集中。之后开始对点集进行遍历,找到偏角最小的点依次加入集合。出现两个点转向角相同的情况时,选择距离更远的点。当筛选下一个点又返回到起始点时,说明形成一个闭环,返回结果点集。

​​​​​​​​​​​​​​3.2.5        Problem 8: Personal art

通过调用drawRegularPolygon()函数,在循环中实现正多边形的绘制,每次绘制完一个正多边形,角度转10度,形成对称规律的图形(形似花朵)。简单绘制茎秆和叶子(平行四边形)。

绘制结果:

​​​​​​​3.2.6        Submitting

如何通过Git提交当前版本到GitHub上你的Lab1仓库。

打开GitBash,输入git push origin master即可。

​​​​​​​​​​​​​​3.3        ​​​​​​​Social Network

该问题需要我们将社交网络建模为一个无向图,其中每个人连接到零个或多个用户。

3.3.1        设计/实现FriendshipGraph类

首先定义集合来存储people和name。addVertex:起到添加朋友的作用,定义hashset方便判断重复情况。

AddEdge:起到添加到边的作用,本问题拟刻画的社交网络是无向图,但类设计需要支持未来扩展到有向图。所以在两个 Person 对象 A 和 B 之间增加一条边时需要同时调用 addEdge(A,B)和 addEdge(B,A)两条语句。

getDistance:利用HashMap采用广度优先算法获取最小距离,未联通时返回值为-1.

3.3.2        设计/实现Person类

设计存储String类型存储person的name,存储人的朋友集合FriendshipList以及AddFriend,getName,getFriendshipList方法。

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

输出与测试样例结果一致。

注释掉“graph.addEdge(rachel, ross)”

Rachel与任何人都不相邻,返回-1;自己到自己的距离为0,getDistance(rachel, rachel)返回0。

如果将第 3 行引号中的“Ross”替换为“Rachel”,违反了“Each person has a unique name”的约束条件,此时提示出错并结束程序运行。

​​​​​​​​​​​​​​3.3.4        设计/实现测试用例

针对addVertex测试:主要测试添加人的情况,首先测试是否能加入person a 和 b,其次测试重复的person(b)加入后,是否会输出FALSE而使程序终止。

针对addEdge测试:测试无向图中是否成功加入了加入边ab。

对getDistance的测试:构建无向图,检验距离是否与预期吻合。

4.        实验进度记录

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

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

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

日期

时间段

任务

实际完成情况

2022-03-06

16:00-18:30

编写问题1的isLegalMagicSquare函数并进行测试

按计划完成

2022-03-08

14:00-16:30

根据注释补充问题2的TurtleSoup代码

遇到困难,未完成,凸包问题未完成

2022-03-08

18:00-19:00

补充问题2的凸包算法代码

按计划完成

2022-03-10

14:00-16:00

编写问题3的主要代码

延期半小时完成

2022-03-11

14:00-16:00

编写问题3的测试

按计划完成

2022-03-12

14:00-15:00

优化代码

按计划完成

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

遇到的困难

解决途径

初学JAVA做实验的时候有思路,但是不知道JAVA中用什么方法来实现

查阅资料,积累经验,增强自己对java语言的掌握

初次使用Git,中间出错很多次

在CSDN上查找资料,并进行实践

初次接触凸包问题,对解决凸包问题的算法不是很了解

查询资料进行学习,学习算法内在的思想,并完善自己的代码

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

6.1        实验过程中收获的经验和教训(必答)

初次使用Java语言进行编程,先大致了解了IDEA集成开发环境工具的使用。并且在实验中发现了自己存在很多不足,边做实验边学习,使得自己对Java编程更加熟悉。同时,在本次实验第一次接触Junit单元测试进行“边测试边编程”的方式写程序,发现程序健壮性得到了显著性提高。此外,在本次实验我还了解了Git,Git是一款源代码管理工具,我们写的代码需要使用Git进行管理。在网上学习了Git的基本操作,并且动手实践。

在本次实验,我也深刻地意识到自己对Java的语法掌握不好,写代码时总有“心有余而力不足”的感觉,常常需要查阅资料,极大的降低了效率,在以后的学习中会注重巩固自己的基础知识,对Java语法能够更加熟悉并且熟练地掌握。

​​​​​​​​​​​​​​6.2        针对以下方面的感受(必答)

1.Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?

较好。

优势:Java提供的库函数功能十分强大,有大量封装好的方法。

不足:Java删除了指针,所以不如C语言灵活,并且不像C语言那样写代码直接编译运行,需要自己创建class等等。

2.关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;

我使用的是IDEA,我认为它的优点是它能生成某个类的测试类,还能正确的放到test相应的目录下,此外它还有着强大的整合能力例如:精准搜索、提示功能的快速、Git等等。缺点是,idea使用的是内存空间,会把创建的索引都保存到内存中,而实际占用的cpu少。

3.关于Git和GitHub,是否感受到了它在版本控制方面的价值;

感受到了,支持保存原版本和多设备查看。

4.关于CMU和MIT的作业,你有何感受;

喜欢MIT作业的形式,可以根据规约来实现方法,也是对自己编程的一种锻炼,完成后进行test还可以更好的检验。

完成CMU的作业巩固了自己对Java语法的学习。

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

工作量中等偏多,但是给的时间很充裕,难度的话我认为凸包算法那部分较难,由于本学期刚刚接触算法,所以觉得有些吃力。Deadline时间合理。

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

我认为这门课很好,将理论与实践很好的结合了,真正地去了解了开发软件时的一些事项,为未来同学们的实习和就业都奠定了良好的理论基础和实践基础。

HIT软构Lab1心得相关推荐

  1. HIT软构lab2中GraphPoet的一种实现

    首先是第一个方法GraphPoet的实现 public GraphPoet(File corpus) throws IOException {BufferedReader br = new Buffe ...

  2. 软构习题课一内容总结

    软构作为一门编程课,竟然还有习题课是我没想到的.第一次上习题课时我们还没有像现在一样为各科期末考试忙得焦头烂额,所以我花了很长时间理解习题一.直到开始做实验一,我发现习题课真的太重要了!!因为习题一中 ...

  3. 中软实训总结_中软实训心得

    中软实训心得 在厦门中软的一个多月里,在那里学习的经历让我怀念,难忘,在那里的每一天都会让我成长.在中软的实训生活中,我深刻体会到了自己专业方面的欠缺和不足,也意识到了作为计算机网络工程专业的学生,要 ...

  4. 软构实验知识补充:什么是代码覆盖率

    学习内容: 关于代码覆盖率的相关知识与IDEA检测代码覆盖率的方法. 背景: 今天做软构lab2时需要在Eclipse下面使用Eclemma工具测试所谓的代码覆盖率.我对这个概念产生了一些好奇,于是做 ...

  5. (迟到了半个多月的)第一次软构实验总结

    date: 2019-03-09 20:08:00 第一次软构实验 第一次的软构实验本来以为会非常简单,但是没想到坑点那么多.从需要的算法层面来说确实不难,但是细节的处理还是挺麻烦的,感觉和传统的AC ...

  6. HIT 软件构造 Lab1

    2022年春季学期 计算学部<软件构造>课程 Lab 1实验报告 姓名 艾浩林 学号 120L021917 班号 2003006 电子邮件 2017869860@qq.com 手机号码 1 ...

  7. HIT软件构造lab1

    目录 1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3.1 Magic Squares 1 3.1.1 isLegalMagicSquare() 1 3.1.2 generateMag ...

  8. 软构实验(二 )博客

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VMb9NQzR-1625031897332)(media/b7c1f747a870edf8b0db7af7453bb90 ...

  9. HIT软件构造-学习心得

    伪代码编程 伪代码是指某种用来描述算法.子程序.类或完整程序的工作逻辑的.非形式的.类似于英语的记法. 1. 用类似英语的语句来精确描述特定的操作 2. 避免使用目标编程语言中的语法元素 这点是关键, ...

最新文章

  1. mysql编辑工具wf_轻松构建自定义WF设计器
  2. 解决cocoapods在64位iOS7系统以下的警告问题
  3. ThreadPoolExecutor运转机制详解(转)
  4. 2016年个人技术总结(前端)
  5. Android成长日记-Android监听事件的方法
  6. Java消息服务~JMSReplyTo示例
  7. mysql降序后去重_Mysql 数据记录去重后按字段排序
  8. day21 java的随机数
  9. python语言-python语言基本语句用法总结
  10. 利用深度学习自动补全 Python 代码,这个开源项目有点牛逼
  11. web图书销售管理系统_美萍手机销售WEB版销售管理系统整体解决方案服务商
  12. linux开机启动界面异常,Linux 界面不能启动的解决
  13. 蓝桥杯摔手机测试次数
  14. Redis启动窗口一闪就关
  15. VSCode+latex引用bibtex参考文献
  16. Vue源码--解读vue响应式原理
  17. 柏拉图對愛與婚姻得啟示---------捷徑穿越人生得麦田
  18. 集训笔记---扩展欧几里德算法(POJ NO.1061 青蛙的约会 有点烦人小跳蛙gcd)
  19. 在早教阶段幼儿应不应该使用计算机,计算机与幼儿教育
  20. SAP各种BOM的定义简洁易懂

热门文章

  1. 国家秘密载体印制资质(涉密档案数字化加工)甲级、乙级申请条件
  2. 2023年3月越南签证办理攻略
  3. 什么软件可以测试你适合什么颜色,颜色心理测试性格篇
  4. 色盲算法_专为色盲而设计
  5. 1.程序员仪式与注释
  6. 线性薛定谔方程实现界面推移
  7. i386、x86-64(AMD64)区分
  8. Oracle SQL递归查询START WITH CONNECT BY 查询父子关系
  9. git rev-parse之操作笔记
  10. Flink字符串数据流转换数据类型(Row)流及Row的源码