软件构造实验一总结与反思

前言    

    我们在开学的前四周进行了软件构造这门课的第一个实验,这是我第一次使用java语言来完成任务,是第一次使用了IDEA,Git等工具,同时也是第一次完成CMU,MIT的作业。故此,有些许总结与反思。

 

实验目标概述

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

我们需要掌握:

基本的 Java OO 编程

基于 Eclipse IDE 进行 Java 编程

基于 JUnit 的测试

基于 Git 的代码配置管理

 

实验环境配置

关于实验环境,此次配置完成后对于以后的实验,学习等都会有一劳永益的作用。而我们需要配置以下部分:

Java:学校要求的版本较老,不要下载最新的版本。我下载的是Java 8这一比较经典的版本,直接官网下载即可。

集成环境:学校要求使用Eclipse,但基于同学推荐与实际使用来看,IDEA的更受欢迎,也更为高效简便。于是我下载了IDEA,并下载了汉化插件。当然,需要将junit4导入该平台内,如下图:

 

 

Git:此部分按照要求、说明按部就班操作即可。

 

实验详细过程

Magic Squares

  在此任务之中,我初次接触了java编程,第一次使用了IDEA编程环境,学习了一些java的基础知识,如try-catch代码,java中如何读写文件,和java的一些基础操作等,训练了基本 Java 编程技能。同时也遇到了如对于异常输入处理,幻方内各数是否为从1至n^2不同数的判断等问题,并通过自学完成了处理。

1.1“1isLegalMagicSquare()”

  1. 首先是文件的读入,我选择按行读入。首先,读第一行确定维数,读入后,依据实验要求通过“\t”将字符串分割,然后再将其转化为整数,写入预先设计二维数组,同时在读入时检查数组是否以“\t”分割。之后再各行依此进行此项,同时检查数组格式是否正确。
  2. 其次进行幻方判断,首先判断幻方内各数是否为从1至n^2不同数(此步包含了元素非负判断),然后判断幻方各行列对角线是否和为n*(n*n+1)/2。

 

 
 
关于判断幻方内各数是否为从1至n^2不同数的代码
 
 
 
第一部分实验结果

1.2“generateMagicSquare()”

    一些相关的图片与代码:
    

程序流程图

对于偶数输入,负数输入的处理

  

2 Turtle Graphics

    这个实验初次见到会惊奇于其全英文的任务并畏惧于其冗长的代码,但实际操作后发现任务并不繁杂。我在这个任务中体验使用封装好的函数、编写好的JUnit测试代码,体会到了java开发的乐趣,还学习了Graham扫描法.

2.1 Problem 1: Clone and import

从GitHub获取该任务的代码:
git clone https://github.com/rainywang/Spring2022_HITCS_SC_Lab1.git
在本地创建git仓库:git init
使用git管理本地开发:git status…

2.2 Problem 3: Turtle graphics and drawSquare

 turtle.forward(sideLength);turtle.turn(90);重复四次

2.3 Problem 5: Drawing polygons

     以边算角:return (sides-2)*180.0/sides;
     以角算边:int i=3; for(;angle*i>(i-2)*180.0;i++); return i;
     多边形:double angle =180.0-calculateRegularPolygonAngle(sides);
             for(int i=0;i<sides;i++){
            turtle.forward(sideLength);
            turtle.turn(angle);
           }

2.4 Problem 6: Calculating Bearings

利用了Java中的Math.atan2方法,结合三角函数知识进行计算,如下:

2.5 Problem 7: Convex Hulls

利用了Graham扫描法以计算其凸包,代码如下

2.6 Problem 8: Personal art

 

设计图案,原理是该实验提供十个颜色,于是每画一个多边形旋转36°,且以不同大小旋转两次

2.7 Submitting

在本地仓库目录下打开Git Bash,使用命令:
git add . -->git commit -m “…” --> git push origin master

 

3 Social Network

对上学期于需求分析与设计学习的知识有了更深刻的认识,对public,private等符号有了理解,自己编写了junit测试用例,对其使用有了更深刻的认识

3.1 设计/实现FriendshipGraph

    依据个人理解,认为问题任务所涉及的属性、操作都应该于该类中实现。Person类中只应该涉及个人自己的信息,本次任务中只有其名字。依据任务要求,决定采用哈希图的方式哈希图中,key为Person(点),value为此人所对应的关系集合,(该点边集),类似与c中的邻接表法表示图其特点在于不限规模且易于理解。

对于其中难点getdistance的实现

3.2 设计/实现Person

于本实验中用处不大,对于name属性采用了private的前缀并使用方法获取,可于后续进行扩充。

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

客户端代码于要求中以提供,但为了满足测试报错等需求进行了部分修改(try-catch代码的增加)。

3.4 设计/实现测试用例

对于三个方法,分别根据每个理应报错的情况,正常情况等进行了测试。
其中除了assertEquals()方法,对于理应报错的情况用了以下代码进行测试
 
Eg:addVertex方法之中人名相同情况
 
正常测试情况

 

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

遇到的困难

解决途径

 

实验中材料基本为英文

 

 

翻译软件,中文解释,询问同学

 

第一次接触java开发相关环境配置

 

 

网络搜集资料,向老师同学询问

 

P2包中的函数无法使用

 

 

询问同学后得到解决方法

P1中对文件操作一无所知

查询网络,询问同学

P3中进行测试时一头雾水

查询网络,询问同学

对于凸包算get distance方法中的广度优先算法不甚了解

查询网络,询问同学

 

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

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

    这次实验,让我意识到基础知识要扎实;面对问题要用于多次尝试,查询资料;注释要详细,代码结构要思路清晰;同时让我体验到了Junit测试的优越之处,可以即时检验代码,检验思路;同时IDEA对于我编码的检测与合理解决方案大大提高了我的编程效率,增长了我的能力,少走了很多弯路。

针对以下方面的感受

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

    Java语言给我了一种全新的编程体验,很明显能感觉到他的简易之处,在有C语言基础的情况下上手较为简单,且面向对象编程给了我许多启示,同时静态的编译检查很大程度上的提高了编程效率。

 

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

   优势为,界面更友好,运行简单快捷,提供了JUnit的包可直接导入使用,IDEA对于我编码的检测与合理解决方案大大提高了我的编程效率,增长了我的能力,少走了很多弯路。

 

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

   在网站上看到了每次提交的结果,可以任意的查看某版,不用担心某次不当修改出现了新的bug,而找不到上一版较好的代码。

 

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

   全英文界面给我完成作业提供了部分难度,但其作业可以很明显感受其趣味性,虽有难度与挑战,但提升也匪浅。

 

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

   与我个人而言,我认为其工作量较大,难度中等,deadline合适。

 

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

这门课给我带来了全新的挑战与全新的知识,我收获了很多,也体会到了一片全新的天地。

 

posted @ 2023-03-31 19:14  (^O^)在?  阅读(56)  评论(0)    收藏  举报