软件构造笔记(3):实验一

实验目标概述

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

实验环境配置

安装IDEA作为IDE,绑定学校edu邮箱,下载必要插件,在运行项目的过程中安装JUnit4插件作为测试工具。安装过程按照官方文档,没有遇到问题。

Lab1仓库地址:

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

实验过程

Magic Squares

这里需要编写两个方法,一个判断从文件中输入的幻方是否为合法幻方,需要考虑各个数字的合法性,另一个是创建一个n阶幻方并写入一个文件,n由用户给出,需要判断n的合法性。

 

isLegalMagicSquare()

首先需读到用户的文件路径,从文件中读取到字符串以后转换为n * n的整形数组,以方便后面判断。在读取文件时,以”\t”为分隔符获取各个数字(利用split方法)。依次检查各行、列、对角线之和是否为一个常数,而且各数应该是正整数。如果不是合格的幻方,那么返回false;反之返回true。

 

generateMagicSquare()

本部分代码已经给出,只需要继续完善即可。先根据题意,在n为负数或者偶数时抛出异常并返回false,程序依然正常执行,因此需要在本方法内就catch异常,同时输出异常信息。最后将输出流定为输出到6.txt文件中,即完成本方法。

下面为异常处理部分的代码:

try

{

    if (n%2==0)

        throw new ArrayIndexOutOfBoundsException();

    if (n<0)

        throw new NegativeArraySizeException();

}

catch (Exception e)

{

    e.printStackTrace();

    return false;

}

方法流程图:

 

Turtle Graphics

利用Java实现一个简单的Turtle的核心功能,包括转向,前进等基本操作及其组合。

 

Problem 1: Clone and import

从https://github.com/rainywang/Spring2021_HITCS_SC_Lab1/tree/master/P2获取代码,在本地利用IDEA IDE建立git仓库,并设置远程仓库地址,跟踪相关文件。

 

Problem 3: Turtle graphics and drawSquare

了解实验背景,了解实验需求,需要实现的方法都在TurtleSoup.java文件中有详细注解。

drawSquare方法的目的是利用前进和转向的方法,让乌龟画出正方形。因此设置每次前进相同距离后右转90°即可。

 

Problem 5: Drawing polygons

画正多边形的原理与正方形相同,只是需要根据边的个数提前计算出每次转向的角度,以及转向次数。利用calculateRegularPolygonAngle方法计算得到每次转向的角度即可。

 

Problem 6: Calculating Bearings

先实现calculateHeadingToPoint方法,根据当前位置及朝向,判断目的位置需要转向的角度,这里利用Math.atan2方法计算目标角度,如果目标角度为负数则手动增加360°以符合对返回值的要求。

 

Problem 7: Convex Hulls

计算闭包,先找到左下角的点,再依次扫描其他点,注意考虑三点共线的情况,依次取逆时针旋转的最外点,当再次扫描到左下角点时任务结束,返回闭包点集合。若输入的点集合中点个数不多于4个,则原样返回。

 

Problem 8: Personal art

个人艺术环节,由于本人艺术细胞极其缺乏,只利用现有的一些方法任意组合得到了一个非常简单的图形。

 

Submitting

设置好远程仓库,在编写一个阶段后commit并附加说明,最后直接push进入仓库。

 

Social Network

主要任务是实现Person和FriendshipGraph类,并通过图的BFS得到两人之间关系的最近距离。

 

设计/实现FriendshipGraph类

类图设计如图所示。addVertex实现将顶点加入图中,并且检测是否有重复人名出现(利用Set的特性),并初始化每个人的num作为标记方便记录。addEdge方法负责在顶点间加入边以表示“朋友”关系。getDistance方法负责利用BFS搜索,找到两人间的关系最短距离,如果两个人毫无关联则返回-1;如果“两个人”实际上是同一个人,则直接返回0.

 

设计/实现Person类

Person的类图如下图所示:

设计五个成员变量,name是标记该对象的名字,num作为该人加入图中的顺序,friend标记这个人的所有朋友,visited标记这个人是否已经被访问过,dist标记从起点到这个人的距离。在每次调用getDistance方法时,都会重置Person中的dist以及visited变量。尽可能使用私有变量,利用get和set方法获取变量和改变变量。

 

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

沿用实验手册的代码,没有进行修改。

日期

时间段

任务

实际完成情况

2021-05-12

19:30-20:30

研究git的使用

延期完成

2021-05-16

16:00-19:00

学习基础Java,完成P1两个方法的编写与调整

按时完成

2021-05-16

19:00-21:00

完成P2的problem1-problem5

按时完成

2021-05-18

19:00-21:00

完成P2全部,并进行测试

编写P3的主要部分

按时完成

2021-05-21

15:00-17:00

完成P1和P2部分实验报告以及P3的测试

按时完成

2021-05-21

18:00-20:00

完成P3的实验报告,收尾

按时完成

遇到的困难

解决途径

IDEA内置的Git非常难push,成功率极低

下一个GitHub desktop,在IDEA中commit,最后在GitHub desktop中一次性push。

不会用Java语言读取文件

从电脑桌面的角落里找出Java核心技术的电子书文件,硬啃。

设计/实现测试用例

自行构造一个关系图如下:

利用Junit的AssertEquals方法测试当前用例的正确性:

 assertEquals(-1,graph.getDistance(alan,turing));//no relationship

        assertEquals(3,graph.getDistance(alan,bill));

        assertEquals(1,graph.getDistance(ben,bill));//shortest path

        assertEquals(2,graph.getDistance(ben,van));

        assertEquals(1,graph.getDistance(chomsky,turing));//only path

        assertEquals(2,graph.getDistance(turing,bush));

分别测试没有关系、最短路径、唯一路径三种情形下的结果,与手动推导的结果对比验证。

实验进度记录

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

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

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

开始学习OOP,以一种全新的视角编写程序。

 

针对以下方面的感受

Java编程语言是否对你的口味?

API数量之丰富让人望而止步,手册查到头秃。但也正是这些包装好了的API减少了重复造的轮子数量。

关于Eclipse IDE;

没有使用Eclipse,使用IDEA进行编程,代码提示功能十分好用,教育邮箱真香。

关于Git和GitHub;

Git很好用,GitHub迫于恶劣的网络环境很难用。

关于CMU和MIT的作业;

MIT的作业说明十分丰富,每一步的任务目标非常清晰,要用到的算法甚至提供了网址说明;CMU的说明明显要少一些,让人没有方向感,不知如何入手。

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

作为第一次实验,工作量之大超乎想象。用到的各类算法把人打回了数据结构与算法课堂,头发一把一把的掉。Deadline比较适中。

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

概念非常多,纸上得来终觉浅,还是需要多实践来体会软件构造。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值