哈工大软件构造lab1小结

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

文章目录

  • 前言
  • 问题一
    • 使用的库
    • 异常处理机制
    • 字符串内容检查
    • 写入文件
  • 问题二
    • problem 3:画一个正方形
    • problem 5:画一个多边形
    • problem 6:计算轴承
    • problem 7:计算凸包
    • problem 8:个人艺术
  • 问题三
    • 设计/实现Person类
    • 设计/实现FriendshipGraph类
  • 总结

前言

本次实验作者收获了很多关于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、空指针异常类:    NullPointerException2、数据类型转换异常:ClassCastException3、没有访问权限:IllegalAccessException4、方法的参数错误:IllegalArgumentException5、数组下标越界异常:IndexOutOfBoundsException6、文件已结束异常:EOFException7、文件未找到异常:FileNotFoundException8、字符串转换为数字异常:NumberFormatException9、指定的类不存在: ClassNotFoundException10、实例化异常:InstantiationException

字符串内容检查

if (string.matches("[0-9]+")) {...} elsereturn 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算法,同上

总结

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

2022哈工大软件构造lab1小结(知识点)相关推荐

  1. 哈工大软件构造Lab1(2022)

    目录 一.实验目标概述 二.实验环境配置 1.安装编写java程序的IDE--IntelliJ IDEA 2.安装Git 3.安装Junit 4.GitHub Lab1仓库的URL地址 三.实验过程 ...

  2. (软件构造)2022哈工大软件构造 lab2内容以及心得

    2022年春季学期 计算学部<软件构造>课程 Lab 2实验报告 姓名 艾浩林 学号 120L021917 班号 2003006 电子邮件 2017869860@qq.com 手机号码 1 ...

  3. 哈工大软件构造lab1

    2020年春季学期 计算机学院<软件构造>课程 Lab 1实验报告 姓名 麦昌瀚 学号 190110920 班号 7 电子邮件 835889372@qq.com 手机号码 目录 1 实验目 ...

  4. 哈工大 软件构造Lab1的设计实现

    2021年春季学期 计算学部<软件构造>课程 Lab 1实验报告 目录 1. 实验目标概述 3 2. 实验环境配置 3 3. 实验过程 6 3.1 Magic Squares 6 3.1. ...

  5. 哈工大软件构造Lab1实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 1实验报告 目录 1 实验目标概述... 1 2 实验环境配置... 1 3 实验过程... 1 3.1 Magic Squares ...

  6. 2022哈工大软件构造课程总结与经验分享(复习指导)

    一.软构1-3讲 1.软件构造的多维度视图和质量目标 2.软件测试与测试优先的编程 3.软件构造过程与配置管理 二.软构4-8讲 4.数据类型与类型检验 5.设计规约 6.抽象数据类型 (ADT) 7 ...

  7. 2022哈工大软件构造我的学习笔记(1)

    一.软件多维视图 软件多维视图包括moment/period,build/run time,code/component level三个维度共个视图. 1.build time下关注: Code-le ...

  8. 哈工大软件构造实验一

    哈工大软件构造lab1 实验目标 实验过程 Magic Square 第一部分 要求 实现 第二部分 要求 实现 Turtle Graphics 第一部分 绘制多边形 第二部分 计算方位 第三部分 凸 ...

  9. 哈工大软件构造期末知识点总结

    哈工大软件构造试题构成: 1.30-45分的选择题,10-20题 2.55-70分的简答与设计题,5-6题 考试知识点(不全面): 1.git工具的知识点 2.Java设计模式(一共有23个,主要考察 ...

最新文章

  1. 剑指offer-面试题20.顺时针打印矩阵
  2. String to Integer (atoi) leetcode java
  3. 涂抹mysql笔记-mysql复制特性
  4. UNIX网络编程——TCP/IP简介
  5. oracle 分组后取每组第一条数据
  6. JAVA 基础3-数组
  7. 电商促销PSD分层海报设计流程,设计师收好
  8. java窗体实现射击_java_Java基于Swing实现的打猎射击游戏代码,本文实例讲述了Java基于Swing实 - phpStudy...
  9. 以敏捷的方式运作一所大学
  10. GTDer为何不再拖延了?
  11. 现代语音信号处理之语音特征参数估计
  12. 安装 Maxwell
  13. 格雷码转二进制c语言程序,systemC构建格雷码和二进制的转换
  14. 视频后期制作Premiere Pro 2022
  15. linux分析mirna,一篇15分的miRNA芯片文章详细解读 | 文章解读
  16. Vim常用操作,normal模式、insert模式和visual模式
  17. 为何有些文献查不到DOI?
  18. Dialog based MFC
  19. 虚拟现实技术成功应用案例
  20. 好产品不断更新迭代,如何评估App升级效果

热门文章

  1. Python调用百度地图api路径查询
  2. 系统规划与管理师笔记——信息系统综合知识
  3. 小凯机器人软件_微信小凯机器人_小凯机器人需要下载吗
  4. 书单|双十一必入的科普口碑好书
  5. (14)ObjectARX2015 + vs2012创建和编辑对象时的动态拖动技术
  6. USB简单介绍USB共享网络功能(一)
  7. 运行python的两种方式磁盘式_day03-python-学习笔记
  8. css水墨背景,PS古风水墨背景教程
  9. 音频知识点(5)- VAD/CNG/DTX
  10. 12306nbsp;售票网站新版验证码识别对抗