20202309 2020-2021-2《数据结构与面向对象程序设计》课程总结

一、课程内容总结

1、第一章:绪论

该章介绍java程序设计语言和程序开发基础,涵盖面向对象开发的相关概念。通过本章的学习逐步熟悉java的开发环境。

与上学期C语言程序设计课的开头相似,介绍了计算机的基本结构与组成部分,计算机由硬件和软件组成,两者协同工作以帮助我们解决问题。

Java的介绍:程序使用特定的程序设计语言编写,程序设计语言是用特定的字和符号表示问题的解决方案。与其他的程序设计语言相比,Java是一种相对较新的程序设计语言。Java是一种面向对象的程序设计语言,对象是构成Java程序的主要元素。Java中一个程序由一个或多个类组成,每个类包含一个或多个方法,方法由程序语句构成。

注释:   // XXXXXXXX

              /*XXXXXXXX*/

标识符:由数字、字母、_  、$  组成且不能以数字开头,大小写有区分。

保留字:abstract、byte、final、int等等

空白符:包括空格、Tab以及回车换行符

对象、类、继承的含义。时间复杂度分析:增长函数,循环。

 

2、第二章:数据与表达式

该章介绍了Java基本数据类型,执行运算所用的表达式,数据类型之间的转换以及借助Scanner类实现对用户交互输入数据的读取。

字符串是java中的对象,由类String定义,字符串字面值可以包含任何有效字符。

输出:System.out.println();

           System.out.print();

字符串连接:“String1”+“String2”

转义字符:\b退格;\t制表符;\n换行;\r回车;\"双引号;\'单引号;\\反斜线。

 变量是内存空间,用于保存数据值,内存空间的名字就是变量名。

常量:如果保留字final在声明之前,则要声明标识符是常量。按照惯例,常量名使用大写字母。

基本数据类型:byte  8位; short 16位; int 32位;long 64位; float 32位;double 64位。

字符字面值用单引号,字符串字面值用双引号。

布尔型:保留字boolean,其有两个有效值:true和false。布尔值不能转换成任何其他的数据类型,任何其他的数据类型也不能转换成布尔值。

算术表达式:+-*/%

*/%有相同优先级,比+-高,先执行。

自增运算符,自减运算符:x++,x--,++x,--x

三种转换方式:赋值转换(一种类型的值赋值给另一种类型变量),提升(为了执行某种运算,需要修改操作数时),造型(一种java运算符,由括号内的类型名指定)。

Scanner类:为了调用Scanner方法,需先创建Scanner对象。

                      Scanner scan=new Scanner(System.in);

程序调试:方法断点:stop in xxx.main

                  行断点:stopatxxx

 

3、第三章:类与对象

该章介绍预定义类的使用和基于预定义类创建对象。类和对象主要用于处理字符串,生成随机数,执行复杂计算和格式化输出,还包含包、枚举类型和包装类。

String name=new String(“JamesGosling”)

String name=“JamesGosling”

String tem=name;

int tem=10;

 别名:name2=name1;完成地址复制,两者储存相同地址,因此指向同一个对象。

String类:

indexOf() 返回指定字符得索引
charAt() 返回指定索引处得字符
repalce() 字符串替换
trim() 去除字符串两端的空白
split() 分割字符串 返回分割后的字符串数组
getBytes() 返回字符串的byte类型数组
length() 返回字符串的长度
toLowerCase() 字符串转小写
toUpperCase() 字符串转大写
substring() 截取字符串
equals() 字符串比较

Random类:

random.nextInt() 随机生成一个int类型

random.nextInt(int bound) 生成一个0-参数bound范围内的随机数

random.nextFloat() 生成一个随机的0-1之间的浮点型

Math类:

static int abs(int a) 返回 a 的绝对值

static long abs(long a) 返回 a 的绝对值

static float abs(float a) 返回 a 的绝对值

static double abs(double a) 返回 a 的绝对值

static int max(int x,int y) 返回 x 和 y 中的最大值

static double max(double x,double y) 返回 x 和 y 中的最大值

static long max(long x,long y) 返回 x 和 y 中的最大值

static float max(float x,float y) 返回 x 和 y 中的最大值

static int min(int x,int y) 返回 x 和 y 中的最小值

static long min(long x,long y) 返回 x 和 y 中的最小值

static double min(double x,double y) 返回 x 和 y 中的最小值

static float min(float x,float y) 返回 x 和 y 中的最小值

格式化输出:

NumberFormat静态类

NumberFormat.getCurrencyInstance();
NumberFormat.getPercentInstance();

DecimalFormat非静态类

printf格式化输出

枚举类型:

enum Week{Sun,Mon,Tue,Wed,Thir,Fri,Sat};

Weektest=Week.Sun

Week.name()

Week.ordinal()

两个方法name和ordinal

包装类:byte、short、integer、long、float、double、character、boolean、void

 

4、第四章:条件与循环

该章介绍如何用布尔表达式判断,包含所有与条件和循环相关的语句。

条件语句:又称选择语句,包含if语句、if-else语句、switch语句。每个判定都基于布尔表达式,布尔表达式就是条件。

循环语句:包含while语句、do语句、for语句。

逻辑运算符:!逻辑非; &&逻辑与; ||逻辑或。

if语句:如果条件为真,则执行语句;如果条件为假,则跳过语句。

if-else语句:如果条件为真,我们做一件事情;如果条件为假,我们做另一件事情。

条件运算符:(total>max)?total+1:total*2;

嵌套if语句:根据前一个if语句判定结果确定是否执行后续的if语句。

switch语句:进行多路条件的选择,通常与break语句一起使用。

while语句:执行循环体前判定条件,执行循环体后,会再次判定条件,如果条件为真,则再次执行循环体,重复会一直持续到条件为假。

嵌套循环:循环包含另一个循环。

迭代器:一个对象,它的方法使用户一次处理一个集合元素。

do语句:执行循环体后判断条件,会一直执行循环体指导条件为假,才跳出循环。

for语句:适用于已知执行次数的循环,包含三部分(初始化部分;布尔条件;增量)。

5、第五章:编写类:

该章包含于编写类和方法相关的问题,包括实例数据、可见性、范围、方法参数和返回类型,介绍构造函数、方法设计、静态数据和方法重载、测试与调试。

类是一个抽象的概念,是对象的设计图;而对象是类抽象概念的实物表示,是雷达实例化。

示例数据,UML类图。

封装:使类外的代码很难甚至不能修改类内声明的变量值。

访问器:以只读方式访问特定的值。

更改器:能改变特定的值。

return语句:有返回值的方法必须使用。无返回值时,可用void作为返回类型。

参数:传递给调用方法的值,为方法提供数据。

静态类成员:静态变量,静态方法。

类关系:依赖、聚合。

this引用:对象引用自身。非静态方法内,可以用this引用当前执行的对象。

方法重载:方法名相同,参数列表不同,方法不同。

测试:评审、缺陷测试、单元测试、集成测试、系统测试、测试驱动开发(TDD)

调试:print语句简单调试、调试器。

 

6、第六章:数组:

该章介绍数组和数组的处理,设计边界检查、初始化列表、命令行参数、变长参数列表和多维数组。

数组是值的列表,在数组中储存的每个值都有指定的位置编号。

数组的声明:int[] height=new int [11];数组必须是实例化的对象。

边界检查:党引用数组元素时,索引必须他与或等于0且小于数组大小。

int [] grades与int grades []等效。

初始化列表:int [] scores={87,98,69,77,54,67};

可以将整个数组作为参数传递给方法。数组还可以将对对象的引用储存为元素。

二维数组:需使用两个索引引用二维数组,一个用于指定行,另一个用于指定列。

多维数组:维度大于一的数组。

 

7、第七章:继承:

该章介绍派生、类的层次结构、覆盖和可见性等相关概念。

创建子类:使用extends指明从现有类派生的新类。

受保护的修饰符:protected。

super引用:使用保留字super引用父类,访问父级别的成员。

方法重写:子类定义的方法名称和签名与父类的相同时,子类的版本会重写父类的版本,形成自己的方法。

对象类

抽象类(不能实例化)

可见性:子类能继承私有成员,但不能通过名字直接引用,可以间接使用。

 

8、第八章:多态:

该章介绍绑定的概念,绑定与多态之间的关系,如何使用继承或者接口实现多态的引用。

多态引用可以随时引用不同类型的对象。
引用变量可以引用通过继承与其相关的任何类创建的任何对象。
接口是抽象方法的集合,因此无法实例化。
继承也可应用于接口,也就是说从一个接口能派生另一个接口。
接口名可用于声明对象引用变量。
接口引用可以引用实现该接口的任何类的任何对象。
方法的参数可以是多态的,这样方法就能灵活地控制其参数。

 

9、第九章:异常:

该章介绍异常处理,未捕获异常产生的影响,分析 try-catch语句,异常的传播,还探讨在处理输入和输出时如何使用异常,分析写入文本文件的示例。

错误和异常是表示异常或无效处理的对象。
当正在抛出的异常提供调用堆栈跟踪的方法时,会打印相关的信息。
每个catch 子句就是处理 (ry 块抛出的指定类型的异常。
无论是正常退出try块,还是因为抛出异常退出ty块,都会执行 finally 子句。
如果未在发生异常的方法中捕获并处理异常,则会将异常传播到调用该异常方法的方法。
通过从 Exception 类或其后代派生新类来定义新异常。
方法头中的 throws 子句必须包含方法,用于捕获和处理受检查的异常。
流是连续的字节序列;它可以用作输入源,也可以用作输出目的地。
应明确关闭输出文件流,否则将无法正确保留写入文件的数据。

catch 子句是try-catch 语句的一部分,用于处理指定的异常类。
受检查异常要么由方法捕获,要么在方法头的 throws 子句中列出。
错误是一个对象,表示程序出现了自身无法恢复的问题。
异常表示特殊或错误情况的对象。
异常处理程序是在拋出异常时响应特定类型异常的代码。它通常在try-catch 语句中的catch 子句实现。
finally 子句是 try-catch 语句中的一个子句,无论如何退出 ury 块,都会执行 finally子句。
输入流是指任何数据源。
输出流是写入数据的位置。
try-catch 语句是用于拦截拋出的异常,以适当的方式响应异常的语句。

 

10、第十章:集合:

该章介绍集合的概念,将接口与实现分离的需求,还介绍栈,探讨基于数组的栈的实现。

Java Collections API 是Java 应用程序编程接口 API 的子集,用于表示或处理集合,
LIFO 是(1)后进先出;(2)对集合的描述,其添加的最后一个元素将被第一个删除
pop是一种栈操作,其将元素从栈顶移除。
push 是一种栈操作,其将元素添加到栈顶。
Stack 是一种线性集合,以LIO 方式从同一端添加和删除元素。

 

11、第十一章:链式结构:

该章讨论使用引用来创建链式数据结构,探讨链表管理的基本问题,并使用底层链式数据结构定义栈的替代实现。

        使用链表实现,peek操作返回 top 指针所指向节点元素的引1用。

如果完素数量为 0,则 isEmpty 操作返回 true,否则返回 false。

size 操作只返回栈中元素的总数。

可以使用toString 操作遍历链表。

双链表是一种链表,其每个节点既要引用链表中的下一个节点,也要引用上一个节点。
链表一种链式结构,在这种结构中一个对象引用下一个对象,形成了对象的线性排序。
链式结构是使用对象引用变量在对象之间创建链接的数据结构。
节点是表示链式结构中单个元素的类。
哨兵节点要么位于链表前端,要么位于链表末尾,它只作为标记,不代表链表的元素。

 

12、第十二章:队列:

探讨队列的概念,实现先进先出队列,以基数排序为例使队列内容形象化。最后,讨论基于底层链表、定长数组和循环数组的队列实现。

队列以 FIFO 方式处理元素,即第一个入队的元素也是第一个出队的元素。
队列是最佳的存储重复密钥的集合。
使用队列来模拟等待的队伍。
通过引用链表的第一个元素和最后一个元素实现链式队列。
在集合的两端进行 enqueue 和 dequeue 操作。
因为队列操作修改集合两端,要将第一个元素始终固定在索引0 处,就必须将数组元素移位。
在非循环数组实现中,元素移位产生的时间复杂度为 O(n)。

 

13、第十三章:列表:

该章介绍了种类型的列表:有序列表、无序列表和索引列表。本章对这了种类型列表进行比较和对比,讨论它们的共享操作和每种列表的独有操作。在设计各种不同类型列表时,用户都可以使用继承。列表既可以用数组实现,也可以用链表实现。

列表集合:有序列表,无序列表,索引列表。

add,get,remove,set,size方法。

用数组实现列表。

用链表实现列表。

 

14、第十四章:搜索与排序:

该章讨论线性搜索算法和二分搜索算法:分析一些排序算法,如选择排序、插入排序、 冒泡排序、快速排序和合并排序。该章的重点是搜索和排序的编程问题,比如比较对象要用 Comparable 接口。

搜索是在项目集中查找指定目标或确定指定日标是否在集合中的过程。
有效的搜索可以最大限度地减少比较次数。
在方法声明中使用 static 修饰符将方法声明为静态。
二分搜索利用搜索池有序这一事实。
二分搜索通过每次比较将去除一半的可行候选元素。
二分搜索具有对数时间复杂度,这使其成为一种非常高效的分析大型搜索池的方法。
排序是基于某种标准将元素列表排列为所定义顺序的过程。
选择排序算法通过重复地将特定值放入其最终排序位置来对列表进行排序。
插入排序算法通过重复地将特定值插入到有序子列表来对列表进行排序。
冒泡排序算法通过重复比较相邻元素并在必要时交换它们来排序列表。
快速排序算法通过将列表分区,再递归地对两部分排序来完成对整个列表的排序。
合并排序算法递归地将列表分成两部分,直至每个子列表都只有一个元素时,再将这些子列表合并成有序列表,以此完成对整个列表的排序。

 

15、第十五章:树:

该章概括介绍树、树的重要术语和概念。该章讨论树的各种实现方法,使用二叉树来表示计算算术表达式。

树是一种非线性结构,分层组织其元素。
不管树的完全性如何,模拟链式策略都允许连续分配数组的位置。
树的遍历有四种基本方法:前序遍历、中序遍历、后序遍历和层序遍历。
前序遍历意味着先访问根节点,然后遍历左子树,最后遍历右子树。
中序遍历是先遍历左子树,然后访问根节点,最后遍历右子树。
后序遍历先遍历左子树,再遍历右子树,最后访问根节点。
层序遍历从根节点开始,依次访问每一层的每个节点,且每一层只访问一次。
决策树可以作为专家系统的基础。

 

16、第十六章:二叉搜索树:

该章分析二叉搜索树的链式实现。

二叉树搜索树是一种二叉树,对于每个节点,左子树中的元素都小于其父元素,右子树中的元素都大于或等于其父元素。
最高效的二叉搜索树是平衡的,因此每次比较都会去除一半可行的候选元素。
从 BST 中删除有两个子节点的节点时,中序后继节点是替换该节点的最好选择。
每个BinaryTreeNode 对象不仅维护对每个节点所存储元素的引用,还维护对每个节点子节点的引用。
在从二叉搜索树中删除元素时,必须提升另一个节点以替换要刷除的节点。
二叉树的最左边节点包含最小元素,相应地,最右边节点包含最大元素。
右子树的高度减去左子树的高度称为节点的平衡因子。
有两种方式可以改变树或树的任何子树的平衡:插入节点或删除节点。

 

17、第十七章:堆:

该章探讨堆的概念、使用和实现。此外,还介绍堆的链式实现和数组实现。

完全树是一棵平衡树,其最低层h 的所有叶子都在树的左侧。
堆是一棵完全的二叉树,堆要么是最小堆,要么是最大堆。
最大堆是具有两个附加性质的二叉树:最大堆是一棵完全树:对于每个节点,其都大于或等于其左子节点和右子节点。
最小堆是具有两个附加性质的二叉树:最小堆是一棵完全的树:对于每个节点,其都小于或等于其左子节点和右子节点。

 

18、第十八章:图:

该章介绍无向图和有向图的概念,与图相关的重要术语。该章还分析一些常见的图算法,讨论图的实现,详细分析图的邻接矩阵实现。

无向图是指边没有方向的图,也就是说边是无序的顶点对。
在图中,如果两个顶点之问有边相连,则这两个顶点是相邻的。
如果无向图含有连接顶点的最多条边,则认为该无向图是完全的。
路径是连接图中两个顶点的边的序列。
环是第一个顶点与最后一个顶点相同且没有重复边的路径。
无向树是一个连通的、无环的无向图,其中一个元素被指定为根。
有向图是指边有方向的图,也就是说边是有序的顶点对。
在有向图中,路径是它连接图中两个顶点的有向边序列。

 

二、作业:


1、作业1:第一章和第二章测试活动

2、作业2:第三章 类和对象 测试

3、作业3:第4章和第5章 测试

4、作业4:第6和第7章测试

5、作业5:封装继承多态重写重载文件字符字节读写-测试:

编写一组程序,要体现一下知识点:
(1)继承
(2)多态
(3)重写
(4)重载
(5)目录创建
(6)文件创建
(7)字节流读写
(8)字符流读写

6、作业6:第9/10/11章 继承多态异常

7、作业7:实现自己的ArrayList:

1.编写自己的ArrayList类
要求:实现增加、删除、修改、查找、判断是否为空、返回list长度等操作。
2.测试。

8、作业8:尾插法:

已知一个单链表(没有头节点),其头指针/引用为head,要插入一个节点element,写出尾插法的方法伪代码:

public LinearNode insertTail(LinearNode head, LinearNode element){
}

9、作业9:ArrayStack测试:

(1)撰写自己的类;
(2)提供StackADT,ArrayStack(框架),实现ArrayStack里面的剩余方法;
(3)编写测试类,测试所写的方法是否正确。

10、作业10:栈应用-进制转换:

算法基于原理:     N = (N div d)×d + N mod d  
要求输入一个十进制数,转换成任意进制数并输出。

11、作业11:栈/队列测试

12、作业12:最小生成树测试:

1.画出Prim算法的最小生成树的生成过程
2.画出Kruscal算法的最小生成树的生成过程
3.计算最小权值

13、作业13:树和图

14、作业14:Dijkstra(迪杰斯特拉)算法测试:

使用Dijkstra(迪杰斯特拉)算法计算单源(V1出发)最短路径。
图2是课堂介绍的示例。
要求
(1)写出V1到各个顶点的最短路径
(2)要求写出最短路径计算过程(类似于图2)


15、作业15:快速排序测试:

3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
快速排序
给出第一趟快速排序的结果!

 

三、实验报告链接:

1、实验一 实验名称:

基于命令行进行简单的Java程序编辑、编译、运行和调试。

练习Linux基本命令;

学习Java程序的JDB调试技能:

编写简单的Java程序。

《数据结构与面向对象程序设计》实验1实验报告(20202309葛鹏宇) - 20202309葛鹏宇 - 博客园 (cnblogs.com)

2、实验二 实验名称:

(1) 编写简单的计算器,完成加减乘除模运算。
(2) 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
(3) 编写测试代码,测试验证。

《数据结构与面向对象程序设计》实验二实验报告20202309葛鹏宇 - 20202309葛鹏宇 - 博客园 (cnblogs.com)

3、实验三 实验名称:

(1)初步掌握单元测试和TDD

(2)理解并掌握面向对象三要素:封装、继承、多态
(3)初步掌握UML建模
(4)完成蓝墨云上 (1)-(5)实验。

20202309葛鹏宇《数据结构与面向对象程序设计》实验三实验报告 - 20202309葛鹏宇 - 博客园 (cnblogs.com)

4、实验四 实验名称:

(一)Java Socket编程

(二)Java和密码学

(三)编写有理数/复数计算器

(四)远程有理数计算器

(五)远程复数计算器

20202309葛鹏宇《数据结构与面向对象程序设计》实验4实验报告 - 20202309葛鹏宇 - 博客园 (cnblogs.com)

5、实验五实验六 实验名称:

链表练习

在android平台上实现实验

20202309葛鹏宇《数据结构与面向对象程序设计》实验五实验六实验报告 - 20202309葛鹏宇 - 博客园 (cnblogs.com)

6、实验七 实验名称:

(1)、定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。

(2)、重构你的代码
把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)
把测试代码放test包中

(3)、参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试

(4)、实现排序方法等(至少3个)
测试实现的算法(正常,异常,边界)

(5)、编写Android程序对实现各种查找与排序算法进行测试

20202309 葛鹏宇 《数据结构与面向对象程序设计》实验7实验报告 - 20202309葛鹏宇 - 博客园 (cnblogs.com)

7、实验八 实验名称:

(1)、参考教材PP16.1,完成链树LinkedBinaryTree的实现

(2)、基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能

(3)、自己设计并实现一颗决策树

(4)、输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果

20202309葛鹏宇《数据结构与面向对象程序设计》实验8实验报告 - 20202309葛鹏宇 - 博客园 (cnblogs.com)

8、实验九 实验名称:

(1) 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)
(2) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)
(3) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环
(4) 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出
(5) 完成有向图的单源最短路径求解(迪杰斯特拉算法)

20202309葛鹏宇《数据结构与面向对象程序设计》实验九实验报告 - 20202309葛鹏宇 - 博客园 (cnblogs.com)

四、代码托管链接:

码云:gpy/gpy20202309 (gitee.com)

statistic.sh统计结果:

 

 

五、课程收获与不足:

       上个学期初次接触编程,从0开始学习c语言可以说是举步维艰,幸运的是期末前略微悟出了这语言其中的一点奥秘。有着与编程语言相互熟悉一个学期的经验,这学期Java的学习可以说是没有起步就熄火。虽然没有像上学期学c一样难以前进,但是我感觉Java比c要难以理解得多,可能是源于两种语言的各自的方向不同这种性质差异导致的。Java一个程序的代码可以在不同的地方出现就略显麻烦,但是一个方法可以被更广泛地使用,大大便利了不同程序的开发。

       这学期的课主要难在复杂的实验上,每此做实验少则半天多则一整天,从研究每个数据结构的名词的意思和包含的逻辑关系到通过用新学的还不熟练的Java语言实现一些方法,每个方面都好像是一座座大山。但山的后面也不一定就是海,有的时候研究了半天,好不容易敲出来了一个实验题目需要的代码,但按ctrl+shift+F10堪比开彩票,等待的可能是各种Exception,这就是最锻炼心态的时候了。通过这一个学期对心态的磨练,我看到Exception已经可以稳定的控制住自己的情绪了,这算是一大收获。

      有很多的时候我做不出来实验,就是弄懂了题目的要求是什么甚至也清楚逻辑大概是什么样的,但是就是无法用编程语言描绘出来这种想法。其实这种情况在上学期学习c的时候就已经出现过,但是通过在oj平台上做了不少较为简单的题目慢慢学会了怎么去用语言实现。如果这学期我也在oj上试着用Java答一些题目应该会改善这种状况。

       虽然实验可能最终仍然做不出来,得靠别的同学或者网上的信息的帮助,但在摸索实验怎么完成的道路上确实让我加深了很多对Java的理解。

       感谢老师这一学期的付出和2023这个一齐前进的集体。

 

posted @ 2022-01-02 23:20  20202309葛鹏宇  阅读(35)  评论(1编辑  收藏  举报