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

Lab 1实验报告

姓名

李**

学号

班号

电子邮件

手机号码

目录

1 实验目标概述... 1

2 实验环境配置... 1

3 实验过程... 2

3.1 Magic Squares. 2

3.1.1 isLegalMagicSquare(). 2

3.1.2 generateMagicSquare(). 3

3.2 Turtle Graphics. 5

3.2.1 Problem 1: Clone and import 6

3.2.2 Problem 3: Turtle graphics and drawSquare. 6

3.2.3 Problem 5: Drawing polygons. 7

3.2.4 Problem 6: Calculating Bearings. 7

3.2.5 Problem 7: Convex Hulls. 7

3.2.6 Problem 8: Personal art 8

3.2.7 Submitting. 8

3.3 Social Network. 8

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

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

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

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

4 实验进度记录... 9

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

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

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

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

  1. 实验目标概述

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

另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。

  1. 基本的 Java OO 编程
  1. 基于 Eclipse IDE 进行 Java 编程
  2. 基于 JUnit 的测试
  3. 基于 Git 的代码配置管理
  1. 实验环境配置

首先安装JDK,在甲骨文官网找到JDK11的安装程序,登录网页并开始下载。下载成功后,点击程序就可以自动安装,选择自定义安装路径将JDK安装到想要安装的本地目录下。安装成功后可以开始配置环境变量。右击“此电脑”点击属性/高级系统设置/环境变量,增加环境变量JAVA_HOME为Java的安装路径,然后设置JAVA_CLASSPATH。

然后安装Eclipse,在其官网上找到软件包下载地址,点击下载。将下载的压缩包解压至目标目录下,即可正常使用。下载后,需要将Eclipse的Java编译器地址配置到Eclipse并且设置Java编译器版本为11。按照自己的喜好设置软件主题、字体及大小等。配置结果如下图所示。

最后进行Git下载,在官网下载即可。下载完成需要自主学习git的各种命令。在进行GitHub的git版本推送时,由于对git命令的不熟悉,导致无法推送成功,最后通过查看网上教程成功解决。

GitHub Lab1仓库的URL地址:https://github.com/ComputerScienceHIT/HIT-Lab1-120L021603

  1. 实验过程

    1. Magic Squares

该任务首先需要编写MagicSquare类,加入方法isLegalMagicSquare来实现判断给定矩阵是否为魔方矩阵,其次要分析并改进实验手册中给出的generateMagicSquare方法。

  1. isLegalMagicSquare()

该函数首先要读取文件并将其内容转换为矩阵,然后通过判断该矩阵的每一行、每一列、每一个对角线的元素和是否相同判断矩阵是否为魔方矩阵。在此过程中,要注意判断读取的矩阵是否符合标准,若不符合,直接退出程序。程序流程图如下所示。

将实验提供的五个txt作为输入,判断其是否为魔方矩阵,结果1、2为魔方矩阵,3不是魔方矩阵,4存在负数和小数为违法输入,5存在数字之间并未用\t分割,为违法输入。下图为程序结果截图。

  1. generateMagicSquare()

该方法可以产生一个行数列数都为n的魔方矩阵,其主要算法为将1放在第一行中间一列,从而开始一直到n*n每一个数存放的行比前一个数减一,列数加一,如果行数或列数达到矩阵边界,则将行数重置为n-1,列数重置为0;如果第i个数 中i为n的倍数,则把下一个数放在上一个数的下面。转换为该方法的程序流程图为下图。

根据上述算法思想我为函数添加了如下中文注释。

  1. int magic[][] = new int[n][n];
  2. /*初始值行数为零,列数为n的中值*/
  3. int row = 0, col = n / 2, i, j, square = n * n;
  4. /*进入循环,每进行n次循环为一个周期,一个周期内magic[row][col]沿对角线方向移动,如果row或col越界,则重置*/
  5. for (i = 1; i <= square; i++) {
  6. magic[row][col] = i;          /*第i次循环时将i赋值给数组的第row行第col列*/
  7. if (i % n == 0)
  8. row++;                    /*总共循环n*n次,i每增加n的大小,row就要加一*/
  9. else {
  10. if (row == 0)             /*row到达边界,将row重置为n-1*/
  11. row = n - 1;
  12. else
  13. row--;                /*否则行数减一*/
  14. if (col == (n - 1))
  15. col = 0;              /*col到达边界,将col重置为0*/
  16. else
  17. col++;                /*否则列数加一*/
  18. }
  19. }

对于这个算法要求输入的n必须为正奇数,当输入的n为偶数时,程序运行后会在控制台报错,根据我对该程序的分析,当n为偶数时,经过有限次循环就会使当row=n-1时,恰好i为n的倍数,此时在上述代码的第九行会使row加一,此后进入下一次循环时magic数组的访问就会溢出。

而当我输入的n为负数时,程序在上述代码的第7行声明数组时就会报错,因为数组的长度不能为负数。

因此为了解决这一问题,需要在进入函数最开始的地方先判断输入n是否合法,若不合法则立刻退出程序,返回false。以下是代码实现部分。

  1. if(n % 2 == 0) {
  2. System.out.println(n+"是偶数");
  3. return false;
  4. }
  5. if(n < 0) {
  6. System.out.println(n+"是负数");
  7. return false;
  8. }

对函数进行的另外一个扩展是将产生的魔方矩阵输出到6.txt中去,该操作只需要加入写文件操作即可。

将该函数生成的6.txt输入到之前写的函数isLegalMagicSquare,可得到正确结果。以下为结果截图。

  1. Turtle Graphics

该任务主要是通过获得GitHub下的代码,进行一些修改在上传到GitHub,主要是需要一些git操作。

  1. Problem 1: Clone and import

代码获取:点击实验手册的链接地址,进入GitHub页面,点击下图中的“Down ZIP”,即可下载代码压缩包,解压至想要的本地目录即可。

如需在本地建立git仓库,只需在Git Bash里输入git init,就可创建本地仓库,通过一些git命令可以管理本地开发,如git status查看本地版本状态;git add将本地文件添加到本地git存储库中;git commit将本地git存储库中的文件提交到git库中等等。

  1. Problem 3: Turtle graphics and drawSquare

该任务需要通过调用代码中已有的forward、turn方法来编写方法drawSquare。只需要让海龟前进n步,再转向90度,上述操作循环四次即可。实验结果如下图所示。

  1. Problem 5: Drawing polygons

绘画正多边形,首先要先完成方法calculateRegularPolygonAngle,计算正多边形的内角度数,根据公式(n-2)*180/n得出结果。然后通过一个循环即可画出正多边形。代码如下所示。

  1. public static void drawRegularPolygon(Turtle turtle, int sides, int sideLength) {
  2. double angle = calculateRegularPolygonAngle(sides);
  3. for(int i = 0;i<sides;i++) {
  4. turtle.forward(sideLength);
  5. turtle.turn(180 - angle);
  6. }
  7. }

经过调用,可以得到tutle绘画出的正多边形,下图为正五边形和正八边形的运行结果。

  1. Problem 6: Calculating Bearings

首先完成calculateBearingToPoint的编写,在该函数中获得源点与目标点连接的向量与y轴的夹角,与turtle在源点的初始角度做差,就是turtle从源点运动到目标点所需转动的角度。然后在calculateBearings中建立一个循环将每个点与其相邻的点传到calculateBearingToPoint计算,第一次的初始角度为0,其他次角度为前几次角度的累加值与360取模。最后获得所有需要的角度。

  1. Problem 7: Convex Hulls

该方法用来求一个点集的凸包,主要算法参考礼品包装算法。其主要思想为先选择这个点集的左下角的点,计算从该点到点集中的其他点所需旋转的角度,选择角度最小的点作为下一个初始点,循环进行上述步骤,直至初始点回到左下角的点。那么循环中用作初始点的所有点的集合就是该点集的凸包。

  1. Problem 8: Personal art

该方法要求我们进行自我创造,秉持着抽象艺术的想法,我写了一个十层循环,每个循环画一个正方形,每次迭代正方形的边长变为原来的0.707倍,turtle运动角度偏移45度,画笔换一个颜色。最后产生的图形如下图所示。

  1. Submitting

打开Git Bash,输入以下命令:

  1. git status
  2. git add
  3. git commit -m
  4. git push -u origin master

即可将本地代码推送到GitHub上。

  1. Social Network

建立一个社交网络功能,每个人都是一个节点,两个人是朋友就可以在两个人节点间添加一条无向边。

  1. 设计/实现FriendshipGraph类

设计一个FriendshipGraph首先建立一个图。这里通过邻接矩阵来表示节点与节点之间的关系。然后添加变量VertexNum、EdgeNum记录图的节点数量、边数量;添加Map存储Person对象与其Id的对应关系。

该类有三个方法,分别为addVertex、addEdge、getDistance。其中addVertex可以向graph中添加节点,addEdge可以向graph中添加边,getDistance可以获得两个节点之间的最短距离,通过广度优先遍历实现。

  1. 设计/实现Person类

Person类暂时只存储了人的姓名。

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

首先建立一个graph,生成所有需要在图中存储的Person类,并将其插入到graph中,并将所有Person之间的关系以边的关系存储到graph中去。

关于实验手册中的如果将代码中的第10行注释掉的话,第 14-17 行的代码应输出-1,-1,0,-1,因为此时没有从Rachel到其他节点的路径,运行程序后和预想的一致。

\

如果将第 3 行引号中的“Ross”替换为“Rachel”,我的程序会在添加节点时提示图中已存在相同姓名的人,并直接退出。

  1. 设计/实现测试用例

分别设计测试用例来测试FriendshipGraph中的三个方法。对于FriendshipGraph中的方法addVertex,面对输入划分等价类,将输入划分为Person在图中存在或不存在;对于addEdge,面对输入划分等价类,将输入划分为Person在图中存在或不存在;对于getDistance,面对输入划分等价类,可划分为按照路径大小划分0、1、2,按照输入划分,在图中、不在图中,按照输入的两个点的关系划分,是同一个点,不是同一个点。

将上述测试用例按照全部覆盖原则进行测试,测试结果为全部通过。下图为测试结果截图。

  1. 实验进度记录

日期

时间段

任务

实际完成情况

2022-4-29

19:30-22:00

安装实验环境,学习git的使用

按计划完成

2022-04-30

19:30-22:00

编写问题一的大部分函数

按计划完成

2022-05-01

11:00-12:00

15:20-16:00

结束问题一的全部编写与问题二的全部编程

按计划完成

2022-05-01

19:00-19:30

编写问题三部分程序

按计划完成

2022-05-01

19:00-19:30

编写问题三全部程序

超出预计时间

2022-05-02

15:00-15:30

测试问题三代码

超出预计时间

2022-05-02

15:30-18:00

编写问题二代码

按计划完成

2022-05-02

19:19-22:19

编写问题二代码,填写报告

按计划完成

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

遇到的困难

解决途径

Git 命令不熟,导致无法将代码push到GitHub上

上网百度教程,进行系统学习后解决

在编写问题三的getDistance时不会编写最短路径代码

找到了上学期学习的《数据结构与算法》一书,重新进行了学习

编写问题三的getDistance时,测试代码时发现结果不正确,调了半天

第二天上软件构造课时,老师讲到了immutable和mutable变量之间的区别,发现自己创建mutable变量时直接引用了其他变量的地址,导致多个变量指向同一个地址。就改回来了

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

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

经过这次实验,我学会了使用git进行版本管理,以及Java的语言规范并且学会了利用Junit对自己写的程序进行测试。关于这次实验的经验教训,最让我印象深刻的莫过于在编写程序时一定要注意每个变量的性质,是否为mutable变量,如果是,则要尽力避免该变量的不安全性。

    1. 针对以下方面的感受(必答)
  1. Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?

是,和我熟悉的其他语言相比,Java的优点是面向对象编程,使程序的每个部分都更加清晰,更加模块化,因此每个模块的独立性与可复用性相对更强;并且有Junit这样的测试库,有利于大型编程场景下对于不够的测试与调整;

有较为完整的错误处理机制,对于每个变量有更为系统的权限设置,更适合防御性编程;关于不足,和C语言相比可能不太适合底层,并且速度也相对较慢。

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

优势:作为Java的集成开发平台,它有较为完整的Java开发工具与相关库的支持;

不足:关于Eclipse,我在编写程序时感觉它在自动补足的功能上不如VS等平台做的好。

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

是,这样一个版本控制工具对于一个大型编程项目来说尤其重要,可以实现团队协同编程,并且可以在任何时候进行版本回溯,不必担心新版本崩溃时无法恢复到原来版本。

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

我觉得他们的作业比较经典。

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

关于本实验的工作量不能说少,因为需要配置环境,学习一门新语言,然后才能正式进入编程阶段,不计算撰写报告之前的Java学习时间,环境配置时间,我总共用了15个小时才大致完成所有内容,并且我还没有计算之后的Java可执行文件生成实践;至于难度,实验本身难度不大,但是有配置环境、语言不同等加成也不算简单。Deadline给了一周的时间,如果不是和一门考试撞上的话还算充裕。

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

很期待之后的学习,希望能通过进一步的学习规范自己的代码编写习惯,提高自己编写的代码质量。

【软件构造】LAB1实验报告相关推荐

  1. 哈工大软件构造Lab1实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 1实验报告 目录 1 实验目标概述... 1 2 实验环境配置... 1 3 实验过程... 1 3.1 Magic Squares ...

  2. 软件构造Lab1——实验报告

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

  3. 软件构造lab2 - 实验报告

    软件构造lab2 - 实验报告 1.实验目标概述 2.环境配置 3.实验过程 3.1Poetic Walks 3.1.1Get the code and prepare Git repository ...

  4. 软件构造Lab1实验总结

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

  5. HIT 软件构造 lab3实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 3实验报告 姓名 赵旭东 学号 1180300223 班号 1803002 电子邮件 1264887178@qq.com 手机号码 ...

  6. 哈工大2020软件构造Lab2实验报告

    本项目于3.17日实验课验收,请放心参考 参考时文中有给出一些建议,请查看 基本更新完成 2020春计算机学院<软件构造>课程Lab2实验报告 Software Construction ...

  7. HIT 软件构造 lab2实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 2实验报告 学号 1180300223 班号 1803002 目录 1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3 ...

  8. 软件构造 Lab2 实验报告

    2021年春季学期 计算学部<软件构造>课程 Lab 2实验报告 姓名 王雨宁 学号 1190201118 班号 1903006 电子邮件 1756840811@qq.com 手机号码 1 ...

  9. [HITSC]哈工大2020春软件构造Lab3实验报告

    Github地址 1 实验目标概述 本次实验覆盖课程第 3.4.5 章的内容,目标是编写具有可复用性和可维护 性的软件,主要使用以下软件构造技术: 子类型.泛型.多态.重写.重载 继承.代理.组合 常 ...

  10. 哈工大软件构造lab2实验报告

    1 实验目标概述 2 实验环境配置 3 实验过程 3.1 Poetic Walks 3.1.1 Get the code and prepare Git repository 3.1.2 Proble ...

最新文章

  1. ubuntu10.10---用Apache+mod_wsgi部署python程序
  2. LeetCode Algorithm 1052. 爱生气的书店老板
  3. docker swarm的应用----docker集群的构建
  4. 针对开发人员的Microsoft SQL Server元数据
  5. python网管系统_IT外包网管服务,Python密度聚类算法-DBSCAN实践
  6. 实时事理学习与搜索平台DemoV1.0正式对外发布
  7. php 微信转账,php实现微信公众号企业转账功能
  8. mysql统计各部门人数_2021各省份电网报名人数统计!会不会比考研还难?有些省份人数还就多的离谱了。。。...
  9. Feature Layer with selection(ArcGIS JS Api 图上点选)
  10. Activity 之生命周期
  11. 事后分析报告(M2阶段)
  12. 信用评分卡 (part 1 of 7)
  13. 解决企业IT三大运维管理难题
  14. Python3.8.0中string与byte相互转换
  15. PAAS平台7#215;24小时可用性应用设计
  16. php小炒花生米,花生(炒)的做法_花生(炒)怎么做好吃_花生(炒)的家常做法大全【美食杰】...
  17. STM32固件库下载步骤
  18. 计算身份证号码的校验码Python
  19. QQ游戏连连看自动化脚本(仅限学习交流)
  20. 最易学和最难学编程语言排行榜!

热门文章

  1. java智能算法--机器学习包
  2. 聊天页面(vue、语音发送、websocket等)
  3. Apple 软件产品使用的 TCP 和 UDP 端口
  4. omap_i2c omap_i2c.2: controller timed out
  5. java作业分工_团队作业(三):确定分工
  6. Google Earth Engine——从Python中的经纬度坐标获取Modis正弦图块网格位置
  7. 数学归纳法产生的历史背景
  8. 怎么解决word中英文混合换行后字体间隔变大问题
  9. 字节跳动教育业务怎么样_听说字节跳动教育线已经投入了不少,好像效果不咋样[笑哭]…...
  10. 2012二级c语言上机,2012全国计算机等级考试-二级C语言-上机考试-填空题-分类总结...