【软件构造】LAB1实验报告
2022年春季学期
计算学部《软件构造》课程
Lab 1实验报告
姓名 |
李** |
学号 |
|
班号 |
|
电子邮件 |
|
手机号码 |
3.1.2 generateMagicSquare(). 3
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
另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
最后进行Git下载,在官网下载即可。下载完成需要自主学习git的各种命令。在进行GitHub的git版本推送时,由于对git命令的不熟悉,导致无法推送成功,最后通过查看网上教程成功解决。
GitHub Lab1仓库的URL地址:https://github.com/ComputerScienceHIT/HIT-Lab1-120L021603
- 实验过程
- Magic Squares
该任务首先需要编写MagicSquare类,加入方法isLegalMagicSquare来实现判断给定矩阵是否为魔方矩阵,其次要分析并改进实验手册中给出的generateMagicSquare方法。
- isLegalMagicSquare()
该函数首先要读取文件并将其内容转换为矩阵,然后通过判断该矩阵的每一行、每一列、每一个对角线的元素和是否相同判断矩阵是否为魔方矩阵。在此过程中,要注意判断读取的矩阵是否符合标准,若不符合,直接退出程序。程序流程图如下所示。
将实验提供的五个txt作为输入,判断其是否为魔方矩阵,结果1、2为魔方矩阵,3不是魔方矩阵,4存在负数和小数为违法输入,5存在数字之间并未用\t分割,为违法输入。下图为程序结果截图。
- generateMagicSquare()
该方法可以产生一个行数列数都为n的魔方矩阵,其主要算法为将1放在第一行中间一列,从而开始一直到n*n每一个数存放的行比前一个数减一,列数加一,如果行数或列数达到矩阵边界,则将行数重置为n-1,列数重置为0;如果第i个数 中i为n的倍数,则把下一个数放在上一个数的下面。转换为该方法的程序流程图为下图。
根据上述算法思想我为函数添加了如下中文注释。
- int magic[][] = new int[n][n];
- /*初始值行数为零,列数为n的中值*/
- int row = 0, col = n / 2, i, j, square = n * n;
- /*进入循环,每进行n次循环为一个周期,一个周期内magic[row][col]沿对角线方向移动,如果row或col越界,则重置*/
- for (i = 1; i <= square; i++) {
- magic[row][col] = i; /*第i次循环时将i赋值给数组的第row行第col列*/
- if (i % n == 0)
- row++; /*总共循环n*n次,i每增加n的大小,row就要加一*/
- else {
- if (row == 0) /*row到达边界,将row重置为n-1*/
- row = n - 1;
- else
- row--; /*否则行数减一*/
- if (col == (n - 1))
- col = 0; /*col到达边界,将col重置为0*/
- else
- col++; /*否则列数加一*/
- }
- }
对于这个算法要求输入的n必须为正奇数,当输入的n为偶数时,程序运行后会在控制台报错,根据我对该程序的分析,当n为偶数时,经过有限次循环就会使当row=n-1时,恰好i为n的倍数,此时在上述代码的第九行会使row加一,此后进入下一次循环时magic数组的访问就会溢出。
而当我输入的n为负数时,程序在上述代码的第7行声明数组时就会报错,因为数组的长度不能为负数。
因此为了解决这一问题,需要在进入函数最开始的地方先判断输入n是否合法,若不合法则立刻退出程序,返回false。以下是代码实现部分。
- if(n % 2 == 0) {
- System.out.println(n+"是偶数");
- return false;
- }
- if(n < 0) {
- System.out.println(n+"是负数");
- return false;
- }
对函数进行的另外一个扩展是将产生的魔方矩阵输出到6.txt中去,该操作只需要加入写文件操作即可。
将该函数生成的6.txt输入到之前写的函数isLegalMagicSquare,可得到正确结果。以下为结果截图。
- Turtle Graphics
该任务主要是通过获得GitHub下的代码,进行一些修改在上传到GitHub,主要是需要一些git操作。
- Problem 1: Clone and import
代码获取:点击实验手册的链接地址,进入GitHub页面,点击下图中的“Down ZIP”,即可下载代码压缩包,解压至想要的本地目录即可。
如需在本地建立git仓库,只需在Git Bash里输入git init,就可创建本地仓库,通过一些git命令可以管理本地开发,如git status查看本地版本状态;git add将本地文件添加到本地git存储库中;git commit将本地git存储库中的文件提交到git库中等等。
- Problem 3: Turtle graphics and drawSquare
该任务需要通过调用代码中已有的forward、turn方法来编写方法drawSquare。只需要让海龟前进n步,再转向90度,上述操作循环四次即可。实验结果如下图所示。
- Problem 5: Drawing polygons
绘画正多边形,首先要先完成方法calculateRegularPolygonAngle,计算正多边形的内角度数,根据公式(n-2)*180/n得出结果。然后通过一个循环即可画出正多边形。代码如下所示。
- public static void drawRegularPolygon(Turtle turtle, int sides, int sideLength) {
- double angle = calculateRegularPolygonAngle(sides);
- for(int i = 0;i<sides;i++) {
- turtle.forward(sideLength);
- turtle.turn(180 - angle);
- }
- }
经过调用,可以得到tutle绘画出的正多边形,下图为正五边形和正八边形的运行结果。
- Problem 6: Calculating Bearings
首先完成calculateBearingToPoint的编写,在该函数中获得源点与目标点连接的向量与y轴的夹角,与turtle在源点的初始角度做差,就是turtle从源点运动到目标点所需转动的角度。然后在calculateBearings中建立一个循环将每个点与其相邻的点传到calculateBearingToPoint计算,第一次的初始角度为0,其他次角度为前几次角度的累加值与360取模。最后获得所有需要的角度。
- Problem 7: Convex Hulls
该方法用来求一个点集的凸包,主要算法参考礼品包装算法。其主要思想为先选择这个点集的左下角的点,计算从该点到点集中的其他点所需旋转的角度,选择角度最小的点作为下一个初始点,循环进行上述步骤,直至初始点回到左下角的点。那么循环中用作初始点的所有点的集合就是该点集的凸包。
- Problem 8: Personal art
该方法要求我们进行自我创造,秉持着抽象艺术的想法,我写了一个十层循环,每个循环画一个正方形,每次迭代正方形的边长变为原来的0.707倍,turtle运动角度偏移45度,画笔换一个颜色。最后产生的图形如下图所示。
- Submitting
打开Git Bash,输入以下命令:
- git status
- git add
- git commit -m
- git push -u origin master
即可将本地代码推送到GitHub上。
- Social Network
建立一个社交网络功能,每个人都是一个节点,两个人是朋友就可以在两个人节点间添加一条无向边。
首先建立一个graph,生成所有需要在图中存储的Person类,并将其插入到graph中,并将所有Person之间的关系以边的关系存储到graph中去。
关于实验手册中的如果将代码中的第10行注释掉的话,第 14-17 行的代码应输出-1,-1,0,-1,因为此时没有从Rachel到其他节点的路径,运行程序后和预想的一致。
如果将第 3 行引号中的“Ross”替换为“Rachel”,我的程序会在添加节点时提示图中已存在相同姓名的人,并直接退出。
- 设计/实现测试用例
分别设计测试用例来测试FriendshipGraph中的三个方法。对于FriendshipGraph中的方法addVertex,面对输入划分等价类,将输入划分为Person在图中存在或不存在;对于addEdge,面对输入划分等价类,将输入划分为Person在图中存在或不存在;对于getDistance,面对输入划分等价类,可划分为按照路径大小划分0、1、2,按照输入划分,在图中、不在图中,按照输入的两个点的关系划分,是同一个点,不是同一个点。
将上述测试用例按照全部覆盖原则进行测试,测试结果为全部通过。下图为测试结果截图。
- 实验进度记录
日期 |
时间段 |
任务 |
实际完成情况 |
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 |
编写问题二代码,填写报告 |
按计划完成 |
- 实验过程中遇到的困难与解决途径
遇到的困难 |
解决途径 |
Git 命令不熟,导致无法将代码push到GitHub上 |
上网百度教程,进行系统学习后解决 |
在编写问题三的getDistance时不会编写最短路径代码 |
找到了上学期学习的《数据结构与算法》一书,重新进行了学习 |
编写问题三的getDistance时,测试代码时发现结果不正确,调了半天 |
第二天上软件构造课时,老师讲到了immutable和mutable变量之间的区别,发现自己创建mutable变量时直接引用了其他变量的地址,导致多个变量指向同一个地址。就改回来了 |
- 实验过程中收获的经验、教训、感想
- 实验过程中收获的经验和教训(必答)
经过这次实验,我学会了使用git进行版本管理,以及Java的语言规范并且学会了利用Junit对自己写的程序进行测试。关于这次实验的经验教训,最让我印象深刻的莫过于在编写程序时一定要注意每个变量的性质,是否为mutable变量,如果是,则要尽力避免该变量的不安全性。
- 针对以下方面的感受(必答)
- Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?
是,和我熟悉的其他语言相比,Java的优点是面向对象编程,使程序的每个部分都更加清晰,更加模块化,因此每个模块的独立性与可复用性相对更强;并且有Junit这样的测试库,有利于大型编程场景下对于不够的测试与调整;
有较为完整的错误处理机制,对于每个变量有更为系统的权限设置,更适合防御性编程;关于不足,和C语言相比可能不太适合底层,并且速度也相对较慢。
- 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;
优势:作为Java的集成开发平台,它有较为完整的Java开发工具与相关库的支持;
不足:关于Eclipse,我在编写程序时感觉它在自动补足的功能上不如VS等平台做的好。
- 关于Git和GitHub,是否感受到了它在版本控制方面的价值;
是,这样一个版本控制工具对于一个大型编程项目来说尤其重要,可以实现团队协同编程,并且可以在任何时候进行版本回溯,不必担心新版本崩溃时无法恢复到原来版本。
- 关于CMU和MIT的作业,你有何感受;
我觉得他们的作业比较经典。
- 关于本实验的工作量、难度、deadline;
关于本实验的工作量不能说少,因为需要配置环境,学习一门新语言,然后才能正式进入编程阶段,不计算撰写报告之前的Java学习时间,环境配置时间,我总共用了15个小时才大致完成所有内容,并且我还没有计算之后的Java可执行文件生成实践;至于难度,实验本身难度不大,但是有配置环境、语言不同等加成也不算简单。Deadline给了一周的时间,如果不是和一门考试撞上的话还算充裕。
- 关于初接触“软件构造”课程;
很期待之后的学习,希望能通过进一步的学习规范自己的代码编写习惯,提高自己编写的代码质量。
【软件构造】LAB1实验报告相关推荐
- 哈工大软件构造Lab1实验报告
2020年春季学期 计算机学院<软件构造>课程 Lab 1实验报告 目录 1 实验目标概述... 1 2 实验环境配置... 1 3 实验过程... 1 3.1 Magic Squares ...
- 软件构造Lab1——实验报告
1. 实验目标概述 本次实验通过求解四个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测 ...
- 软件构造lab2 - 实验报告
软件构造lab2 - 实验报告 1.实验目标概述 2.环境配置 3.实验过程 3.1Poetic Walks 3.1.1Get the code and prepare Git repository ...
- 软件构造Lab1实验总结
软件构造Lab1实验总结 1 实验目标概述 本次实验通过求解四个问题,训练基本 Java 编程技能,能够利用 Java OO 开 发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够 ...
- HIT 软件构造 lab3实验报告
2020年春季学期 计算机学院<软件构造>课程 Lab 3实验报告 姓名 赵旭东 学号 1180300223 班号 1803002 电子邮件 1264887178@qq.com 手机号码 ...
- 哈工大2020软件构造Lab2实验报告
本项目于3.17日实验课验收,请放心参考 参考时文中有给出一些建议,请查看 基本更新完成 2020春计算机学院<软件构造>课程Lab2实验报告 Software Construction ...
- HIT 软件构造 lab2实验报告
2020年春季学期 计算机学院<软件构造>课程 Lab 2实验报告 学号 1180300223 班号 1803002 目录 1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3 ...
- 软件构造 Lab2 实验报告
2021年春季学期 计算学部<软件构造>课程 Lab 2实验报告 姓名 王雨宁 学号 1190201118 班号 1903006 电子邮件 1756840811@qq.com 手机号码 1 ...
- [HITSC]哈工大2020春软件构造Lab3实验报告
Github地址 1 实验目标概述 本次实验覆盖课程第 3.4.5 章的内容,目标是编写具有可复用性和可维护 性的软件,主要使用以下软件构造技术: 子类型.泛型.多态.重写.重载 继承.代理.组合 常 ...
- 哈工大软件构造lab2实验报告
1 实验目标概述 2 实验环境配置 3 实验过程 3.1 Poetic Walks 3.1.1 Get the code and prepare Git repository 3.1.2 Proble ...
最新文章
- ubuntu10.10---用Apache+mod_wsgi部署python程序
- LeetCode Algorithm 1052. 爱生气的书店老板
- docker swarm的应用----docker集群的构建
- 针对开发人员的Microsoft SQL Server元数据
- python网管系统_IT外包网管服务,Python密度聚类算法-DBSCAN实践
- 实时事理学习与搜索平台DemoV1.0正式对外发布
- php 微信转账,php实现微信公众号企业转账功能
- mysql统计各部门人数_2021各省份电网报名人数统计!会不会比考研还难?有些省份人数还就多的离谱了。。。...
- Feature Layer with selection(ArcGIS JS Api 图上点选)
- Activity 之生命周期
- 事后分析报告(M2阶段)
- 信用评分卡 (part 1 of 7)
- 解决企业IT三大运维管理难题
- Python3.8.0中string与byte相互转换
- PAAS平台7#215;24小时可用性应用设计
- php小炒花生米,花生(炒)的做法_花生(炒)怎么做好吃_花生(炒)的家常做法大全【美食杰】...
- STM32固件库下载步骤
- 计算身份证号码的校验码Python
- QQ游戏连连看自动化脚本(仅限学习交流)
- 最易学和最难学编程语言排行榜!
热门文章
- java智能算法--机器学习包
- 聊天页面(vue、语音发送、websocket等)
- Apple 软件产品使用的 TCP 和 UDP 端口
- omap_i2c omap_i2c.2: controller timed out
- java作业分工_团队作业(三):确定分工
- Google Earth Engine——从Python中的经纬度坐标获取Modis正弦图块网格位置
- 数学归纳法产生的历史背景
- 怎么解决word中英文混合换行后字体间隔变大问题
- 字节跳动教育业务怎么样_听说字节跳动教育线已经投入了不少,好像效果不咋样[笑哭]…...
- 2012二级c语言上机,2012全国计算机等级考试-二级C语言-上机考试-填空题-分类总结...