精华内容
下载资源
问答
  • 哈工大软件构造lab1
    2022-05-03 10:42:06

    哈工大软件构造lab1小结

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    本次实验作者收获了很多关于java编程的知识,在这里和大家分享一下。


    提示:以下是本篇文章正文内容,下面案例可供参考

    问题一

    使用的库

    import java.util.Scanner;
    import java.io.*;
    
    ...
    BufferedReader br = new BufferedReader(new FileReader(fileName));
    String str = null;
    while ((str = br.readLine()) != null) {
    
          ...
          
          }
    br.close();
    
    
    ...
    
    
    Scanner input = new Scanner(System.in);
    ...
    input.close();
    

    不用把所有相关的知识掌握,把自己需要的代码掌握就行。
    只需要记住:

    1.	BufferedReader的readLine方法是一种高效读取文件的方法
    适合读取矩阵等数据
    一次读取最多读8192个字符,**遇到换行符时返回**
    
    2.	创建的scanner对象调用下列方法(函数),读取用户在命令行输入的各种数据类型  
    next.Byte(),	nextDouble(),	nextFloat	,nextInt(),	nextLine()	,nextLong()	,nextShot() 
    

    上述方法执行时都会造成堵塞**,等待用户在命令行输入数据回车确认**

    上面提到的scanner的用法和文件操作就是比较简单的操作,读者可以把这些代码直接拿来使用。

    异常处理机制

    try {
               ...
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } 
    

    异常检测我们这里推荐使用try catch语句,使用框架参考上面的代码,注意下面几点:

    1.	如果 try 语句块中发生异常,那么一个相应的异常对象就会被拋出,然后 catch 语句就会依据所拋出异常对象的类型进行捕获,并处理。处理之后,程序会跳过 try 语句块中剩余的语句,***转到 catch 语句块后面的第一条语句开始执行。***
    2.	Java处理异常的方式是中断处理(停止java虚拟机JVM)。常用的异常有:	
    
    1、空指针异常类:	NullPointerException
    
    2、数据类型转换异常:ClassCastException
    
    3、没有访问权限:IllegalAccessException
    
    4、方法的参数错误:IllegalArgumentException
    
    5、数组下标越界异常:IndexOutOfBoundsException
    
    6、文件已结束异常:EOFException
    
    7、文件未找到异常:FileNotFoundException
    
    8、字符串转换为数字异常:NumberFormatException
    
    9、指定的类不存在: ClassNotFoundException
    
    10、实例化异常:InstantiationException
    

    字符串内容检查

    if (string.matches("[0-9]+")) {
           ...
         } else
             return false;
    

    框架见上面,知识点:

    1.	boolean matches(String regex):
    matches() 方法用于检测字符串是否匹配给定的正则表达式。
    2.	参数:regex – 匹配字符串的正则表达式。
    

    正则表达式怎么构造可以自己在网上学习,构造技巧也非常简单,这里不多加讲解了。

    写入文件

      PrintWriter pw = new PrintWriter("...", "UTF_8");
      for (i = 0; i < n; i++) {
      	for (j = 0; j < n; j++)
            pw.print(...);
        pw.println();
         }
      pw.close();
    
    1.	java.io.PrintWriter是java中很常见的一个类,该类可用来创建一个文件并向文本文件写入数据。可以理解为java中的文件输出,java中的文件输入可以用java.io.File。
    2.	只要记住:使用print类不会在文本末尾加上任何东西,如果需要分隔符应该手工添加,**使用println自动在字符串末尾加一个行分隔符,并清空缓冲区**(如果非要用print方法,记得要添上flush()方法以及换行符)
    

    问题二

    problem 3:画一个正方形

    代码如下(示例):

    public static void drawSquare(Turtle turtle, int sideLength) {
            for(int i = 0; i < 4; i++) {
                turtle.forward(sideLength);
                turtle.turn(90);
            }
        }
    

    代码很简单,就是向前移动和转弯,旋转角度为90度。使用上述模板(可以自己修改参数)画出来的图形是一个正多边形,旋转角度读者可以自己计算。

    problem 5:画一个多边形

    代码如下(示例):

    ...
    return (180.00*(sides - 2)) /sides ;
    //已知边数,计算正多边形的内角度数
    ...
    return (int)Math.round(360.00/(180.00-angle));
    //已知内角度数,计算正多边形的边数
    ...
    
    

    上面几个语句都是数学上的一些结论,大家看看就行。

    problem 6:计算轴承

    Angle = 450.00 - currentBearing - Math.toDegrees(Math.atan((float)(targetY - currentY) / (targetX - currentX)));
    

    计算角度的方法非常简单,大家可以自行推导,注意上面使用到的两个函数:

    1.	Java中Math.toDegrees()用于将**以弧度测量的角度转换为以度为单位的近似等效角度**,也就是将-π/2到π/2之间的弧度值转化为度。
    2.	如果要将角度转成成弧度用Math.toRadians。
    3.	Math.atan() 函数返回一个数值的反正切(以弧度为单位),也就是返回一个-π/2到π/2之间的弧度值
    

    其他的就没什么难的点了。

    problem 7:计算凸包

    凸包算法非常常见,这里不多介绍,我们关注一个细节:

    public static Set<Point> convexHull(Set<Point> points) {
    	...
    }
    

    这个函数中我们用到了Set(集合)这个概念。关于集合,大家在上大学之前就有所了解,我们介绍下面几个java知识点:

    1.	Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类。
    	1.1	HashSet是哈希表结构,主要利用HashMap的key来存储元素,当有元素插入的时候,**会计算元素的hashCode值,将元素插入到哈希表对应的位置中来;**
    	1.2	TreeSet是红黑树结构,每一个元素都是树中的一个节点,插入的元素都会进行**排序**。TreeSet具有排序功能,分为自然排序(123456)和自定义排序两类。
    
    2.	关于尖括号:	<"T">是ageneric,通常可以读作"T型"。它取决于<>左边的类型实际意味着什么。
    ex:	
    如果你看到例如ArrayList<Integer>:
    那就意味着"An Array List of Integers"。
    另一个例子是HashMap<String, Integer>,意思是"**带有String keys和Integer 值的 Map** "。
    

    关于set的详细代码:见https://www.jianshu.com/p/b48c47a42916

    problem 8:个人艺术

    这个就比较随意了,可以根据个人喜好对图形进行设计:
    包括颜色、大小、形状等等,具体代码就不介绍了。

    问题三

    我们对报告中要求的顺序略微改动一下,先设计person类,再设计FriendshipGraph类更加通顺。

    设计/实现Person类

    public class Person {
    	public String name;
    	...
    	}
    }
    

    设计person类可以根据读者喜好自行改变,设计思路也非常简单,只需要保证包含名字这个必要元素即可。

    设计/实现FriendshipGraph类

    import java.util.*;
    ...
    Map map = new HashMap();
    

    首先是导入了一个常用工具包,并建立一个Map接口。知识点有:

    1.	Map集合用于储存元素对,**Map储存的是一对键值(key和value)**,是通过key映射到它的value;
    2.	HashMap是Map的实现类,**实现了 Map 接口,根据键的 HashCode 值存储数据**,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步
    

    这里我们建立HashMap的目的是实现检查重名的方法。

    HashMap本身的功能相当强大,有兴趣的读者可以在这个网站对HashMap的功能进行查看:
    https://www.runoob.com/java/java-hashmap.html

    接下来我们关注数据结构:

    public Person []vertexList = new Person[num];
    private final int [][]relation = new int[num][num];
    

    构建社交网络最初级的版本就是使用二维数组(矩阵),这里注意使用到的private和final:

    1.	可以将实例字段定义为final,**这样的字段必须在构造对象时初始化,而且一经设置,在接下来的语句中不能修改**,这样使得数据被保护起来。
    2.	方法可以调用这个方法的所属类的所有对象的私有数据
    3.	如果不希望方法被修改,可以使用private关键字对方法进行标识,**如果你修改了实现方式,将不保证可用。**
    4.	 Java中引入private的类型,目的是为了防止类中的数据成员,在类的定义之外被修改。
    
    // 添加节点
    	public boolean addVertex(Person person) {
    		...
    		vertexList[num_of_verts++] = person;
    		...
    	}
    // 将边加入关系矩阵中
    	public boolean addEdge(Person person1, Person person2) {
    		...
    		start = get_index_of_ver(person1);
    		end = get_index_of_ver(person2);
    		relation[start][end] = 1;
    		...
    	}
    

    这里我们提供了添加节点和边的代码,实现起来非常简单,只需要对数组和矩阵进行操作就行了。

    最后我们关注最短路径问题的求解(最后的大boss反而早有了经典的算法):
    给出两种方案:

    方案一:使用广搜,算法网上都有,不介绍了
    方案二:Floyd算法,同上
    

    总结

    本次实验作者收获良多,文章写得生涩,如有建议欢迎提出。

    更多相关内容
  • 哈工大软件构造Lab1

    2021-05-30 23:35:16
    2021年春季学期计算学部《软件构造》课程 Lab 1实验报告 姓名 刘小川 学号 1190200817 班号 1936602 电子邮件 ...

    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 5

    3.2.2 Problem 3: Turtle graphics and drawSquare. 5

    3.2.3 Problem 5: Drawing polygons. 6

    3.2.4 Problem 6: Calculating Bearings. 7

    3.2.5 Problem 7: Convex Hulls. 8

    3.2.6 Problem 8: Personal art 9

    3.2.7 Submitting. 10

    3.3 Social Network. 10

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

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

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

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

    4 实验进度记录... 15

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

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

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

    6.2 针对以下方面的感受... 16

     

     

    1. 实验目标概述

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

    ⚫ 基本的 Java OO 编程

    ⚫ 基于 Eclipse IDE 进行 Java 编程

    ⚫ 基于 JUnit 的测试

    ⚫ 基于 Git 的代码配置管理。

    1. 实验环境配置

    在官网下载安装JDK,根据网上的步骤配置环境变量。

    在官网下载安装Eclipse,设置JRE以及其他preferences。新建一个Workspace,建立项目、包以及java源代码,Eclipse配置成功的结果如图。

    在官网下载Git并安装,设置用户名、邮箱等信息,Git配置成功的结果如图。

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

    1. 实验过程

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

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

      1. Magic Squares

    主要任务:从txt文件中解析数据,并判断数据是否构成一个幻方,通过5个文件进行测试。同时阅读和改进产生幻方的代码,并进行测试。

        1. isLegalMagicSquare()

    首先,需要从txt文件中读出数据,读txt文件可以使用固定的格式,即使用BufferedReader并用try-resource语句处理异常。

       

    利用BufferedReader,每次可以从文件中读入一行字符串。由于txt文件以’\t’分隔数据的,用String类的split方法可以将读入的字符串以’\t’分隔,得到字符串数组,每个字符串数组都代表一个数。使用Integer.valueOf将分隔后的每个字符串解析为数字,同时需要捕获异常识别非法数据。

    所有数据都存在二维ArrayList中,获得每一行数据的个数以及总行数,判断是否为n*n的矩阵。分别计算每行、每列以及两个对角线上的数字之和,比较是否相等,并返回结果。如果出现各种特殊情况,输出错误提示信息并返回。

        1. generateMagicSquare()

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

    但是,这种方法只能填充n  为奇数时的幻方。当n  为偶数时,函数产生异常java.lang.ArrayIndexOutOfBoundsException即填充过程中在row++时发生数组越界访问。并且当n  是负数时,不能有效处理非法输入,产生异常java.lang.NegativeArraySizeException即初始化了行列数为负数的数组。这导致了很差的健壮性。修改这个函数,当输入不合法时提示错误并退出。

    同时,当输入合法时,增加将结果写入文件的功能。和之前类似,使用BufferedWriter将数据写入文件。

    利用前面的 isLegalMagicSquare()函数,可以判断生成的文本文件确实符合 Magic Square。

      1. Turtle Graphics

    主要任务:根据函数的注释补全代码,实现一系列绘图可能用到的功能。包括画出正方形、计算正多边形的内角、计算对应内角的正多边形边数、计算绘图时的角度转移、计算凸包、以及绘制自己独特的图形。

        1. Problem 1: Clone and import

    使用git init初始化一个本地仓库,通过git clone将GitHub上的文件下载到这个仓库中。这时就可以利用IDE进行代码编写。每当认为某一个代码改进完成,可以让它成为一个新的版本时,利用git add添加相应代码,使用git commit将本地文件加入到本地仓库。当所有的代码都修改完毕,通过git push origin master将本地仓库push到GitHub上。

        1. Problem 3: Turtle graphics and drawSquare

    绘制图形时要用到两个函数:forward和turn,分别实现前进和转向。绘制正方形时,只需要每次前进给定长度,然后转向90°,循环四次即可。

    代码:

    结果:

     

        1. Problem 5: Drawing polygons

    对于给定边数的正多边形,需要计算内角的度数来确定每次转向的度数。实现calculateRegularPolygonAngle()函数确定给定边数的正多边形的内角度数。直接通过公式可求出。

    和上面一样,每次前进给定长度,转向的角度为外角的度数,循环次数为边数。

    代码:

    结果(以正六边形为例):

    最后还要实现给定内角度数,确定正多边形边数的函数。直接通过公式可求出。注意最后要将结果四舍五入才能返回整数。

        1. Problem 6: Calculating Bearings

    实现函数calculateBearingToPoint()以满足已知起点、终点和当前朝向时,应该转向的角度。计算起点和终点所连直线的斜率,利用atan函数得到最终的朝向的角度,它和当前朝向的差值就是需要转过的角度。

    通过调用calculateBearingToPoint()函数就可以计算经过一系列点时每次要转向的角度,进而实现calculateBearings()。已知初始朝向,按顺序在列表中取出两个点,调用calculateBearingToPoint()就可以得到这两个点之间需要转过的角。修改当前朝向为转向之后的角度,就可以进行下一次计算。需要注意,更新当前朝向后,如果角度超过360°,需要减去360°。

        1. Problem 7: Convex Hulls

    使用安德鲁算法求解凸包。首先判断特殊情况,如果顶点数小于等于2时,这些点都会是凸包中的,直接返回原点集。找到所有点中横坐标最大的点,有多个则选择纵坐标最小的点,把它作为基准点,这个点一定在凸包中。其他的点和这个点的连线与y轴正半轴存在夹角,按照夹角从小到大对其他顶点排序。维护一个栈,首先将基准点入栈。按顺序从排好序的顶点中取出一个,如果栈中的点数大于2,就取出栈顶的两个点。通过计算向量的内积判断栈顶的点是否应该在凸包中,如果不在,将栈顶的点弹出,继续判断;如果在,将取出的顶点入栈。如果栈中的点数小于2,直接将取出的顶点入栈。最后,栈中的点就是凸包中的点。代码如下:

         

    对于以上实现的代码,都通过了测试程序的测试。

        1. Problem 8: Personal art

    利用while循环绘制一个雪花图形,通过递推确定每次要转向的角度。

    代码:

    结果:

        1. Submitting

    当所有代码都修改完成并确认无误后,利用git add添加修改过的代码文件,使用git commit将本地文件加入到本地仓库,同时可以标注版本信息。通过git push origin master将本地仓库push到GitHub上,在GitHub上可以看到push之后的文件。

      1. Social Network

    主要任务:设计Person类和FriendshipGraph类来模拟一个社交网络,并实现社交网络中需要的一些简单功能,包括添加人、添加社交关系以及计算两个人之间的距离。同时,编写测试程序来检查实现的正确性。

        1. 设计/实现FriendshipGraph类

    社交网络是一个图模型,FriendshipGraph类中要存储一个图,并且要支持各种功能。我在FriendshipGraph类中只存储图的顶点,而顶点之间的关系和某一个人有关,因此存储在Person类中。FriendshipGraph类的属性只有private HashSet<Person> vertex用来存储图的顶点,方法包括构造方法、private变量的getter和setter以及一些简单的功能addVertex(),addEdge(),getDistance()。另外,由于名字是Person的属性,因此判断名字是否重复交给Person类实现。

    addVertex()向vertex集合中添加顶点,addEdge()在Person类的朋友集合中添加新的朋友,getDistance()利用广度优先搜索计算两个Person之间的最近距离。同时,在函数中判断一些非法情况。具体代码如下:

    属性

    构造函数

    getter和setter

    addVertex()

    addEdge()

    getDistance()

        1. 设计/实现Person类

    Person类是对人的抽象,属性包括自己的名字和朋友集合。方法包括:内部private属性的getter和setter,构造函数,以及添加朋友的addFriend()。同时,为了判断重名,在Person类中重写hashCode()、equals()和toString()方法,使得每个Person实例有不同的名字,如果有两个同名Person添加到社交网络的集合中,集合只会保留一个。具体代码如下:

    属性

    addFrined()

    构造函数

    Getter和setter

    重写的hashCode,equals,toString

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

    按照给定的客户端代码实现。

        1. 设计/实现测试用例

    对于addVertex()的测试:当调用addVertex()后,测试FriendshipGraph类中顶点集合vertex的大小。如果添加的人不重复,大小会加一,否则不变。

    当addVertex()添加人的名字重复时,程序会输出提示信息并退出。因此测试程序退出时的输出内容是否正确(在网上查阅资料得知,需要添加额外的代码以测试调用System.exit()的情况)。

       

    对于addEdge()的测试:当调用addEdge()后,测试添加朋友的Person类中朋友集合friend的大小。addEdge()两个参数对应的Person类中的friend集合大小都会加一。

    对于getDistance()的测试:建立一个社交网络,测试函数返回的结果和实际结果是否相同,需要覆盖距离是-1、0以及大于0的情况。

    测试结果:

    1. 实验进度记录

     

    日期

    时间段

    任务

    实际完成情况

    2021-05-06

    20:30-21:30

    编写Social Network问题中的FriendshipGraph类和Person类并在main函数中进行测试

    按计划完成

    2021-05-07

    18:30-19:30

    编写isLegalMagicSquare()函数,并用1.txt~5.txt文件中的数据进行测试

    延期10分钟完成

    2021-05-07

    20:30-21:30

    分析generateMagicSquare()函数的功能并进行修改,用其产生的Magic Square测试isLegalMagicSquare()函数

    按计划完成

    2021-05-08

    14:00-17:00

    完成Turtle Graphics问题中的所有任务

    按计划完成

    2021-05-09

    18:30-19:00

    设计并编写addVertex(),addEdge()和getDistance()的单元测试

    按计划完成

    2021-05-11

    13:45-15:00

    使用Git管理仓库并push到GitHub

    延期20分钟完成

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

    遇到的困难

    解决途径

    用Git管理时无法合并到master分支

     

    查阅资料,发现命令行参数存在问题,修改后成功。

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

    本次实验初次接触软件构造,在实验中,我明白了软件构造的基本流程,并且更加熟练地掌握Java语言。同时,对Git的学习和使用也让我懂得了软件管理的重要性。获得了一些使用Git和本地IDE进行软件构造的经验。同时,也获得了一些教训,一定要在编写代码之前考虑好类的构造,属性、方法的定义以及使用的数据结构,否则一旦出错可能需要重头再来;同时,在设计之前也要平衡不同的质量目标,不至于在代码编写结束后再耗费很大功夫重新修改。

      1. 针对以下方面的感受
    1. Java编程语言是否对你的口味?

    是,面向对象的语言会更容易编写,同时Java也包含了更多常用的数据 结构和函数,可以节省编写代码的工作量。

    1. 关于Eclipse IDE;

    Eclipse集成开发环境功能很强大,使得编写程序更加容易。

    1. 关于Git和GitHub;

    虽然Git的指令有些难搞懂,但是用它管理项目是很方便的。GitHub上的资源很多,功能也很强,但就是访问速度太慢了。

    1. 关于CMU和MIT的作业;

    难度适合,也让我们可以与国外名校接轨。

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

    难度不大,但是工作有些繁琐,但deadline设置比较合理,可以按时完成。

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

    初次做软件构造的实验,我认为可以通过这个课程提升自己的编程能力并且培养一种全局观念,同时可以获得更多不同的能力。

    展开全文
  • 哈工大软件构造lab1

    2021-05-19 23:22:51
    2020年春季学期 计算机学院《软件构造》课程 Lab 1实验报告 姓名 麦昌瀚 学号 190110920 班号 7 电子邮件 835889372@qq.com 手机号码 目录 1 实验目标概述... 1 2 实验环境配置... 1 3 实验过程... 1 3.1 Magic ...

    2020年春季学期
    计算机学院《软件构造》课程

    Lab 1实验报告
     

    姓名

    麦昌瀚

    学号

    190110920

    班号

    7

    电子邮件

    835889372@qq.com

    手机号码

     

    目录

    1 实验目标概述... 1

    2 实验环境配置... 1

    3 实验过程... 1

    3.1 Magic Squares. 1

    3.1.1 isLegalMagicSquare(). 1

    3.1.2 generateMagicSquare(). 1

    3.2 Turtle Graphics. 1

    3.2.1 Problem 1: Clone and import 2

    3.2.2 Problem 3: Turtle graphics and drawSquare. 2

    3.2.3 Problem 5: Drawing polygons. 2

    3.2.4 Problem 6: Calculating Bearings. 2

    3.2.5 Problem 7: Convex Hulls. 2

    3.2.6 Problem 8: Personal art 2

    3.2.7 Submitting. 2

    3.3 Social Network. 2

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

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

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

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

    4 实验进度记录... 3

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

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

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

    6.2 针对以下方面的感受... 3

    1. 实验目标概述

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

    1、基本的 Java OO编程
    2、基于 Eclipse IDE进行 Java编程
    3、基于 JUnit的测试
    4、基于 Git的代码配置管理

    1. 实验环境配置

    简要陈述你配置本次实验所需开发、测试、运行环境的过程,必要时可以给出屏幕截图。特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

    由于之前已经安装过jdk,所以此次我直接打开高级系统设置查看环境变量路径,并在命令行窗口检查确认jdk为1.8版本。随后在lab0的实验报告中根据给出的网址下载安装了ecilpse,在git官网下载安装了git-bash。

    难点:由于实验指导书安装eclipse的教程充斥着大量晦涩难懂的英文和复杂操作,所以结合csdn的教程顺利安装好程序并初步掌握eclipse的使用和java基础编程。

    GitHub Lab1仓库的URL地址(Lab1-学号)

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

    1. 实验过程

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

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

      1. Magic Squares

    MagicSquare是一个正整数组成的正方形,他的每一行、每一列和对角线的数字之和都相等。

    任务一:编写一个Java程序(Magicsquare.java)用于检查矩阵的行/列/对角线值,该程序能够从五个已经提供的txt文档中读入数据,来判断输入的数据能否构成一个MagicSquare,若是则返回true,若不是则返回false且说明原因。

    任务二:对给出的generateMagicSquare函数进行扩充,使之能够产生一个MagicSquare并且将其输入到文本6.txt中,然后对其判断是否为MagicSquare。并且满足若输入的为奇数能产生MagicSquare,而输入偶数或者负数会返回false。

        1. isLegalMagicSquare()

    首先需要判断读入的数据能否构成一个矩阵。根据实验手册,需要判断的三张错误:

    行列数不相等:逐行读取得知总行数,然后对每一行按照\t进行分割得出列数,判断每一列是否与行数相等,若有一列不相等,则返回false。

    矩阵中某些数字不是正整数:按照\t将分割后的字符串装入数组中,然后判断这些字符串是否包含”.”或者”-”,若包含,则返回false。

    不是以\t作为分隔符:按照\t将分割后的字符串装入数组中,然后判断这些字符串是否包含空格,若包含,则返回false。

    可以构成矩阵时,读入文件中的数字,用二维数组表示矩阵,分别计算矩阵每一行、每一列、对角线的和是否相等来判断能否构成MagicSquare,并返回true。

    使用try-catch组合,若文件读取本身出现问题,呈现相关错误信息

    输出的结果:

        1. generateMagicSquare()

    输入的 n不合法时(n为偶数、n为负数等)提示错误并“优雅的”退出:

    将产生的 magic square写入文件\src\P1\txt\6.txt中并检验

      1. Turtle Graphics

    实现一个绘图工具Trurtle Graphics,需要我们完成的任务为:画出一个正方形,计算正多边形内角,由正多边形内角得到边数,计算从一个点到另外一个点所需要转过的角度,给定一系列点计算每次转过的角度并返回在集合中,计算一系列点中的凸包,调用函数绘制个人艺术作品,使用junit进行单元测试。

        1. Problem 1: Clone and import

    从github上获取代码:网页download。

    从本地创建git仓库:1、git init初始化本地仓库2、git add remote添加远程库源3、在远程仓库创建master分支4、git pull origin master将远程仓库同步到本地5、git add * ->git commit -m “……”->git push将本地文件加入到本地仓库,将本地仓库同步到远程仓库。

        1. Problem 3: Turtle graphics and drawSquare

    通过四次循环,使用forward、turn函数每次前进+转90°就可以得到正方形。

        1. Problem 5: Drawing polygons

    补全calculateRegularPolygonAngle。正多边形的内角等于180 – 360./ 边数

    补全calculatePolygonSidesFromAngle。知道正多边形的内角求边数,由前句进行简单数学公式转换即可

    补全drawRegularPolygon。画出指定边长的正多边形。调用calculateRegularPolygonAngle(sides)计算正多边形的内角,调用forward和turn函数进行前进和转向。

        1. Problem 6: Calculating Bearings

    补全calculateBearingToPoint。该函数利用atan2函数计算前进方向与x轴正向夹角,之后再把该角度转换成与y轴正向的夹角,注意如果出现负数要再加上360°。

    补全calculateBearings。对列表中的每两个相邻点调用calculateBearingToPoint计算夹角,列表保存并返回

        1. Problem 7: Convex Hulls

    计算给定集合中的凸包需要利用Gift wrapping algorithm算法。点数少于3个时直接得凸包,否则先找到最左下角的点加入集合:

    然后比较剩余点到此点的偏转角,找到偏转角最小的加入集合,当偏转角相同时,需要找到最长的一条边的点加入集合,当回到起点时终止程序,最后即可得到凸包的点集:

        1. Problem 8: Personal art

    经计算后绘制得到一个顶角竖直向上的五色正五角星:

        1. Submitting

    (1).打开git-bash

    (2).cd /D/P2

    (3).git add .HIT- Lab1-190110920

    (4).git commit –m “P2”

    (5)git push origin master

      1. Social Network

    实现并测试Friendship Graph类和Person类,模拟社交网络,可以计算图中两个人之间的距离。

        1. 设计/实现FriendshipGraph类

    1.定义一个Person集合来储存所有人的对象,定义一个String集合来储存所有已经存在的名字并进行初始化:

    2.函数addVertex:增加一个人的对象。 实现此功能需要注意用来增加的Person对象是否已经存在,所以需要在开始判断name中是否已经有了匹配的的名字,若已经存在,则输出“输入人名重复”并结束程序,若没有则将待增加的新的Person对象加入people集合中,对象的名字加入name集合中:

    3.函数addEdge:增加一条有向边。实现此功能只需要调用Person类的addnewfriend方法即可

    4.函数:getDistance:得到两个人之间的最短距离。使用广度优先搜索方式求最短路径的方法。若两个Person对象为同一个,则返回0。然后定义一个Map集合way和一个Person队列thequeue,队列thequeue用来储存广搜的遍历结果,theway的Map集合用来储存广搜的所有元素及他们与第一个元素的距离。具体实现为将第一个元素c1入队,并且把c1和下标0入集合,当队列非空时,弹出队首元素top,并且得到top在集合theway中的下标distance,然后只要队首元素的所有朋友friend,中的元素与c2不同就全部入队,这些元素及下标distance+1放入集合。队列非空则继续执行以上步骤,直到找到某个元素与c2相同并且返回这个元素在集合way中的下标。如果直到队列为空还没找到c2,则返回-1:

        1. 设计/实现Person类

    1.定义String变量name储存名字,定义一个Person的集合friend,定义一个

    2.构造方法:依据输入的字符串初始化这个名字,并且将这个名字加入集合friend中:

    3.增加本人新朋友addnewfriend:直接将新Person对象加入friend中即可

    4.得到本人的名字getname:直接返回name

    5.得到本人的朋友列表getthisfriend,直接返回friends

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

    基于实验报告的代码稍加修改

    输出结果为:

        1. 设计/实现测试用例

    创建对象测试public void addVertextest()

    加入朋友关系测试public void addEdgetest()

    覆盖每个顶点先建立交际网,再测试距离是否正确public void getDistancetest()

    1. 实验进度记录

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

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

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

    日期

    时间段

    任务

    实际完成情况

    2021-05-13

    15:45-17:00

    尝试初步编写问题1的isLegalMagicSquare函数

    按计划完成

    2021-05-16

    14:00-16:00

    编写问题1的isLegalMagicSquare函数并完成测试

    延期1小时完成

    2021-05-20

    15:45-17:00

    编写问题1的generateMagicSquare函数并完成测试

    按计划完成

    2021-05-20

    19:00-20:00

    尝试了解第二题的概况并完成1-4

    延期1小时完成

    2021-05-21

    15:00-17:00

    完成P2的凸包和个人艺术设计,并经过调试后通过了自带的测试

    按计划完成

    2021-05-22

    13:00-17:00

    完成P3的Person类和FriendshipGraph类

    按计划完成

    2021-05-22

    19:00-20:00

    完成P3的测试

    按计划完成

    2021-05-23

    19:00-21:00

    完成收尾工作

    按计划完成

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

    遇到的难点

    解决途径

    初次接触java,文件读写出现很多问题

    通过查阅资料理解了flie类和bufferreader类等的关系与使用

    p2的英文教程在初次接触时造成了许多困难

    经过耐心阅读领会了题目的意思和大致目标

    ……

    ……

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

    此次实验初次使用java,我对众多语法和结构不熟悉。但是在一段时间的钻研后,我学到了java领域的许多新奇知识,并逐渐熟悉了git、eclipse和junit的使用,受益匪浅。

      1. 针对以下方面的感受
    1. Java编程语言是否对你的口味?

    第一印象不错,具有面向对象编程固有的许多优点与特色

    1. 关于Eclipse IDE

    对于初学者十分友好,自动提示与纠错功能非常强大

    1. 关于Git和GitHub

    较为生疏,还需要深入研究

    1. 关于CMU和MIT的作业

    英文教程障碍较大

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

    适中

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

    收获颇丰

    其他收获:

    Scanner cannot be resolved to a type

    刚开始接触java,这个问题非常简单但是在网上怎么也找不到答案
    Scanner类使用前需要将其导入。
    在代码的最前端加入
    import java.util.Scanner;
    即可
     

    展开全文
  • 2022 哈工大 软件构造 lab1
  • 计算学部《软件构造》课程 Lab 1实验报告 目录 1. 实验目标概述 3 2. 实验环境配置 3 3. 实验过程 6 3.1 Magic Squares 6 3.1.1 isLegalMagicSquare() 6 3.1.2 generateMagicSquare() 8 3.2 Turtle Graphics ...

    2021年春季学期

    计算学部《软件构造》课程

    Lab 1实验报告

    目录

    1. 实验目标概述 3

    2. 实验环境配置 3

    3. 实验过程 6

    3.1 Magic Squares 6

    3.1.1 isLegalMagicSquare() 6

    3.1.2 generateMagicSquare() 8

    3.2 Turtle Graphics 10

    3.2.1 Problem 1: Clone and import 10

    3.2.2 Problem 3: Turtle graphics and drawSquare 10

    3.2.3 Problem 5: Drawing polygons 11

    3.2.4 Problem 6: Calculating Bearings 11

    3.2.5 Problem 7: Convex Hulls 12

    3.2.6 Problem 8: Personal art 12

    3.2.7 Submitting 14

    3.3 Social Network 14

    3.3.1 设计/实现FriendshipGraph类 14

    3.3.2 设计/实现Person类 15

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

    3.3.4 设计/实现测试用例 17

    4. 实验进度记录 18

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

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

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

    6.2 针对以下方面的感受 19

    实验目标概述

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

    ⚫ 基本的 Java OO 编程

    ⚫ 基于 Eclipse IDE 进行 Java 编程

    ⚫ 基于 JUnit 的测试

    ⚫ 基于 Git 的代码配置管理

    实验环境配置

    在这里给出你的GitHub Lab1仓库的URL地址。

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

    实验过程

    Magic Squares

    该任务的目标:设计isLegalMagicSquare()函数,判定给定的几个矩阵是否为magic
    square;将给定的生成奇数阶的magic
    square的generateMagicSquare()函数作为静态函数加入我的程序代码中,将生成的矩阵存入6.txt并调用isLegalMagicSquare()判断所生成的矩阵是否正确。该阶段涉及到文件读写操作、对某些特定函数的调用(例如split等)、对部分异常的处理(例如矩阵中有负数、浮点数,或是行列数不相等)等。

    isLegalMagicSquare()

    1.根据实验要求,我不能上来直接就去用magic矩阵的定义去判断其正确性,即每行每列每个对角线的元素和都相等;而是应该先判断给定的矩阵是否合理,即判断行列数是否相等、矩阵中是否有浮点数、负数等。由此,我的想法是设置一个整型变量n = 0,对于txt文件先按行读入,每读入一行n++,直到读完文件,此时n的值即为矩阵行数。然后,依旧是按行读入文件,每读入一行,将其存入String line中,并调用split(“\t”)将其分割并存入String[] line_cut,比较行数n与line_cut.length,不相等则输出错误提示并返回false,后经过测试,当文件未用”\t”进行分割时,也会导n != line_cut.length,因此在这里一并输出错误提示;然后判断line_cut中的每一个元素是否都是正整数,按位寻访line_cut,若出现某一位不在数字字符’0’-‘9’中,则输出错误提示并返回false。综上所述,即有如下代码:
    在这里插入图片描述

    1. 以上错误判断完毕后,将读入的文档存入矩阵magic中,并按照magic矩阵定义进行测试,若不符合magic矩阵定义,则返回false。注意,在此过程中,并未输出错误提示,表示矩阵本身不存在行列数不相等等错误。于是有以下代码:
      在这里插入图片描述

    至此,isLegalMagicSquare()函数设计完毕;

    1. 结果展示:
      在这里插入图片描述

    generateMagicSquare()

    1. 程序代码已经在ppt中给出,程序流程图如下:
      在这里插入图片描述

    2. 除该程序代码外,需对该函数的输入进行测试,以防输入为偶数或负数。该测试在我的main函数中完成,输入阶数为负数或偶数或输入阶数小于2时输出错误提示并予以重新输入,但是,如果输入根本并非整数,而是浮点数或字符时,则输出错误提示且不允许重新输入,于是有如下代码:
      在这里插入图片描述

    3. 除此之外,还需要在函数中加入文件写入操作,将产生的magic矩阵存入6.txt以便于main函数中测试其生成的magic矩阵的正确性,添加的代码如下:
      在这里插入图片描述

    4. 结果展示:
      在这里插入图片描述

    Turtle Graphics

    该任务的目标:clone已有的程序后,利用turtle按照要求画图,主要需要修改及再编程的是TurtleSoup类,其中的一些函数编程时需要结合我们已有的数学几何知识、TurtleSoup类中的提示信息以及测试用的TurtleSoupTest类中的提示信息,最后可以发挥想象力进行自己的创作。

    Problem 1: Clone and import

    1. 从github获取代码
      在这里插入图片描述

    由于clone出现问题,找不到实验报告上给的那个链接,所以我进入该链接后,将代码逐个复制到我的程序类中。

    1. 初始化本地仓库

      git init

    Problem 3: Turtle graphics and drawSquare

    1. 该函数需要实现:已知边长,画出边长为指定数值的正方形。参数是海龟对象turtle和边长sideLength。

    2. 循环执行,每次画笔直行sideLength距离,然后画笔方向旋转90度,循环执行4次后即可得到所需要的正方形,函数代码如下:
      在这里插入图片描述

    3. 结果展示(sideLength = 40):
      在这里插入图片描述

    Problem 5: Drawing polygons

    1. 首先,要求计算已知正多边形边数的内角度,该计算由已知公式可以推导,因此相关函数代码如下:
      在这里插入图片描述

    2. 根据正方形的画法,只需要将画笔的转向角度设置为180 –
      内角度数,循环多边形边数次数即可。考虑到画笔转向既能是顺时针又能是逆时针,故在此声明:sides可为负数,且当sides为负整数时,代表着画笔将逆时针旋转,且旋转度数为180
      – 内角度数,并且取sides的绝对值为正多边形边数。函数代码如下:
      在这里插入图片描述

    Problem 6: Calculating Bearings

    1. 首先,已知起点和当前朝向角度,要求起点到终点需要转动的角度。根据几何运算,得函数代码如下:
      在这里插入图片描述

    2. 上述问题的扩展:此时有若干个点,要求从第一个点开始到第二个点,再从第二个点到第三个点……以此类推每次转向的角度。以起点为第一个点,循环n-1次,每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中,将下一次的“起点”用当前“终点”更新,继续循环。程序代码如下:
      在这里插入图片描述

    Problem 7: Convex Hulls

    由凸包算法(CSDN(ConvexHull凸包算法之Gift-Wrapping_Innovative
    Workstation-CSDN博客
    )上查阅),可得该函数代码为:
    在这里插入图片描述
    在这里插入图片描述

    Problem 8: Personal art

    函数代码:
    在这里插入图片描述

    结果展示:
    在这里插入图片描述

    Submitting

    在这里插入图片描述

    由于第一次提交时已经进行过初始化以及与我的云仓库的关联,本次提交中只需要添加文件、注释以及提交三个步骤。

    Social Network

    该任务的目标:设计一张社交网络无向图,连接互为朋友的人与人,并且能计算任意两人之间需要的最少的关联路径。于是,该问题为最短路径问题,而构建的图为无向无权图,所以利用DFS深度优先遍历即可得到两点间的最短路径。

    设计/实现FriendshipGraph类

    存储图中的人姓名的集合:
    在这里插入图片描述

    addVertex()函数:首先判断Person
    p是否在图中,若已经存在于图中,则输出错误信息,程序结束;否则将p添加至person中。
    在这里插入图片描述

    addEdge()函数:在a、b的朋友列表里分别加入彼此。
    在这里插入图片描述

    getDistance()函数:DFS深度优先算法求最短路径
    在这里插入图片描述

    设计/实现Person类

    在这里插入图片描述

    Person类包括:

    Person():包括这个人的名字p_name,这个人的朋友列表friends;

    IsFriendOf(Person p):在p_name的朋友列表里加入p;

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

    由ppt给出:
    在这里插入图片描述
    在这里插入图片描述

    设计/实现测试用例

    在这里插入图片描述

    思想:将a通过addVertex()函数加入testGraph1中,b不加入,因此,测试用例为a在testGraph1.person中,b不在;
    在这里插入图片描述

    思想:将a、b通过addVertex()函数加入testGraph1中,调用addEdge()函数,在a、b加一条线,即关联在一起,那么,a、b的朋友列表将包含彼此,因此测试用例中,a在b.friends中,b也在a.friends中;
    在这里插入图片描述
    在这里插入图片描述

    思想:getDistance测试中应包括自己与自己、相互认识的两人、相互不认识但是有中间人关联的两人以及互不相干的两人;

    测试结果:
    在这里插入图片描述
    至此,实验设计结束。

    展开全文
  • 提交github的步骤同上一个实验,不再赘述。
  • 以及person类的构造方法:判断名字是否在allpersons中已经存在(通过存储所有已存在的名字的全局名字表),若是则输出“名字已存在”并退出,否则初始化这个名字,并且将其加入allpersons中。 3 实验中遇到的困难与...
  • 软件构造 Lab1

    2019-09-27 01:21:31
    大二软件构造第一次实验  本人本次实验操作系统:macOS high Sierra 10.13.3    任务一:MagicSquare  对于本任务,主要需要实现两个方法,一个是isLegalMagicSquare方法,一个是generateMagicSquare方法。 ...
  • 这部分心得主要探讨最后一个问题Social Network。该任务的目标为设计一张社交网络有向图,连接...用HashMap构造一个邻接表,每个key是一个Person类,value为集合类,存储和该点有朋友关系的所有点,类比C语言的链表结构
  • 软件构造Lab1中初次接触Java、JUnit、Git、Travis等语言与工具,收获颇多,当然也遇到了很多坑,下面是Lab1中经验教训的一个总结。 java读写文件 1.从文件中读入数据 以按行读入数据到List中为例: try { File ...
  • https://github.com/ComputerScienceHIT/Lab1-1180300120.git 3实验过程 请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源...
  • 哈工大2020软件构造Lab1实验报告

    千次阅读 多人点赞 2020-03-09 11:21:29
    哈工大2020春 软件构造 实验1 Fundamental Java Programming and Testing:Magic Square 幻方;Turtle 海龟;Social Network 社交网络
  • 2020年春季学期计算机学院《软件构造》课程 Lab 1实验报告 姓名 许家辉 学号 1190202428 班号 1903005 电子邮件 ...
  • 计算学部《软件构造》课程 **Lab 1实验报告 ** 姓名 李启明 学号 120L021920 班号 2003006 电子邮件 1094583745@qq.com 手机号码 15645157396 目录 1 实验目标概述 1 2 实验环境配
  • 软件构造Lab1

    2019-06-24 16:28:48
    Fundamental Java Programming and Testing写在最前面实验目标概述实验环境配置实验过程Magic SquaresTurtle GraphicsSocial NetworkTweet Tweet Fundamental Java Programming and Testing 写在最前面 ...
  • 哈尔滨工业大学2022春软件构造Lab1实验经历与实验心得,可供后来学子借鉴
  • 软件构造
  • 在做Lab1时遇到了一些问题,记录下解决方法。 1.文件读取 文件读取大体上分为两种方式,一种是按照字节读取文件,一种是按照字符读取文件。按照字节读取的文件,除非内容是单字节的,否则读取出来的内容不是直观的,...
  • 软件构造-Lab1心得

    2019-04-02 11:36:15
    软件构造这门课是英文PPT,由于对专业词汇缺乏了解,阅读起来很是困难。没想到连实验的要求都是英文的,这让本来对JAVA语言就不熟悉的我稍微产生了一点抵触的心理。 P1 Magic Squares P1还算不难。其中涉及了读取...
  • 仅仅供大家参考

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 205
精华内容 82
关键字:

哈工大软件构造lab1