软件构造lab1

  1. 实验目标概述

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

  1. 实验环境配置

本次实验使用了两种IDE,分别是eclipse和intellij IDEA。起初实验环境配置时对Java版本的要求与最新版eclipse并不适配导致安装无法正常进行,在群里老师说可以使用其他版本的Java之后使用Java21顺利安装了eclipse。在下载junit4的时候没能在eclipse安装高级设置中顺利安装,于是在放弃高级安装后直接安装,在程序中引用jUnit4库。由于实验初期并不会正常使用git,目录结构与实验要求完全不符,但eclipse调整目录结构极为困难,最后选择了IDEA进行目录结构的调整

在这里给出你的GitHub Lab1仓库的URL地址:https://github.com/ComputerScienceHIT/HIT-Lab1-2022112818.git

  1. 实验过程

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

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

    1. Magic Squares

此处的两个要求分别为判断已有的数组是否为幻方,以及生成一个幻方。

注:幻方为每一行、列及对角线加和都相等的矩阵

      1. isLegalMagicSquare()

打开文件后按行读入,以tab作为分隔符,将该行的字符串分割为一组整数组成的小段字符串,然后将该字符串数组转化为整数数组,并存入二维数组中。如果中间发现负数或最终二维数组的行列不相等,程序提示相关错误。若满足条件,则验算每一行、列及对角线加和是否相等,若不相等返回false,若相等则返回true

      1. generateMagicSquare()

阅读generateMagicSquare()的代码,可以看出它是将1到n2填充到一个n*n  的幻方中,这种方法是常用的填充幻方的方法。程序的流程图如下:

但是,这种方法只能填充n为奇数时的幻方。当n为偶数时,函数产生异常java.lang.ArrayIndexOutOfBoundsException即填充过程中在row++时发生数组越界访问。并且当n是负数时,产生异常java.lang.NegativeArraySizeException即初始化了行列数为负数的数组。加入对n输入数值的检查,当输入不合法时提示错误并退出。同时,当输入合法时,增加将结果写入文件的功能。和之前类似,使用BufferedWriter将数据写入文件。利用前面的 isLegalMagicSquare()函数,可以判断生成的文本文件确实符合 Magic Square

    1. Turtle Graphics

利用turtle进行画图,主要学习之处在于git的使用与利用junit进行测试。

      1. Problem 1: Clone and import

利用git clone将远程的仓库下载到自己的电脑上,利用git init建立本地仓库

      1. Problem 3: Turtle graphics and drawSquare

利用for循环,每次画固定长度后旋转90度

      1. Problem 5: Drawing polygons

由多边形定义,可以推导出正n边形边数公式为:sides=360/(180-angle),正sides边形内角公式:(边数-2)*180°/sides,调用写好的calculatePolygonSidesFromAngle函数,可以求出正多边形的内角度数,然后用同样方法画正多边形,循环的次数改为sides,角度改为angle

      1. Problem 6: Calculating Bearings

首先对于函数calculateBearingToPoint,计算处从一个点到了一个点相对角度,并与当前方向做差得到需要偏转的角度。然后此函数调用calculateBearingToPoint,每次得到的方向作为下一个偏转的当前方向,进行迭代即可

      1. Problem 7: Convex Hulls

首先遍历每个点得到y值最小点中x值最小的点作为起始点,然后套一个二重循环,内层循环设置一个当前起点,最开始初始化为起始点,然后遍历其余点,找出从当前起点开始,以从y轴正方向为0角度开始的偏转最小角度的点,若多个角度相同的最小点则找与当前起点距离远的那个点。然后退出内层循环,将该点作为下一个当前起点,并加入凸包集合。此时遍历所有点,得到最终的凸包集合

      1. Problem 8: Personal art

每次移动随机长度后旋转90度,重复50次,得到蒙德里安风格的图画

      1. Submitting

通过git add将代码加入待存区,然后git commit提交至本地git 仓库,最后将本地仓库与远程仓库同步

    1. Social Network

建立一个社交网络,利用图存储人与人之间的关系,并计算人与人之间的距离。

      1. 设计/实现FriendshipGraph

该类需满足三个功能,加入顶点(人),加入边(人际关系),计算距离。顶点与边正常添加即可,但在添加顶点前须检查是否有重复顶点,若存在应当报错。计算距离采用广度优先搜索,以per1为起点展开搜索,记录搜索深度,直到到达per2,深度即为距离。

      1. 设计/实现Person

记录姓名,并且能够调出自己的姓名,姓名属于private元素

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

同实验要求,在注释掉第10行代码后输出-1,-1,0,-1符合推测,在rose替换为rachel后程序提示重名。

      1. 设计/实现测试用例

建立4人图,其中一处为单向,其他均只与后一个人有双向链接。分别测量了所有人之间的距离,结果符合预期

  1. 实验进度记录

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

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

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

注:由于写完实验最后才开始写实验报告,并不知道有这个任务,所以只能凭印象写一点,下次一定正常完成

日期

时间段

任务

实际完成情况

2024-3-24

20:30-22:30

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

遇到困难,未完成

2024-3-25至2024-3-28

20:00-22:00

编写问题2

正常完成编码部分,git部分暂缓

2024-3-29至2024-3-30

20:00-22:00

编写问题3

正常完成

2024-3-31至

2024-4-4

20:00-22:00

调整目录结构,摸索git的使用

正常完成

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

遇到的困难

解决途径

对Java、git完全不熟悉

通过哔哩哔哩,Java官网和git官网,csdn等平台进行学习,摸索中逐渐掌握

使用数组经常出现溢出报错

改为使用list类

无法正常调整目录结构

更换IDE,重新建立项目,将代码文件复制进去

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

经验:对Java和面向对象编程有了更加深入的认识,查阅资料及自学能力得到锻炼

教训:不要拖ddl,给自学与摸索留下充足的时间和试错机会,代码和项目留一份备份防止误操作导致文件丢失

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

Java优势在于极为庞大的库函数,比起C语言大多数从底层写起的逻辑,Java直接调用相关库函数非常方便,面向对象编程也拓宽了我的思路,很合口味

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

Eclipse除了免费没有任何优势,缺少汉化、自动补全功能,建立新项目与文件夹步骤繁琐,bug提示信息用处小。

IntelliJ IDEA除了付费没啥缺点,自带汉化包,自动补全排序非常智能化,调整项目结构也较为容易,并且能够对于程序中的bug提出有效的解决方式。

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

几乎完全没有摸索明白,只是把它当成了一个仓库

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

难度不高,但非常有助于理解相关知识,不愧是国际强校的课程

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

如果对于Java较为熟悉工作量其实很小,但是自学与试错消耗了大量的时间导致工作量陡增,如果ddl没有延长到4.4我无法正常提交作业。

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

迄今为止对自学要求最高的一门课,不过对于真正进行软件开发有着极为重要的意义,适合钻研的一门课

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值