20202319 2020-2021-2《数据结构与面向对象程序设计》课程总结
20202319吕炳翰 2020-2021-2《数据结构与面向对象程序设计》课程总结
一、课程内容总结
第一章 绪论
- Java程序设计语言
- 程序开发
- 问题求解
- 软件开发行为
- 面向对象程序设计
在这个章节里面我们能够看到Java程序设计语言和基本的程序开发过程。其中还介绍了面向对象的开发方法,包括相关的概念和术语。
我们可以通过第一章了解Java程序设计语言,了解程序编译运行的步骤,理解问题求解的一般方法,了解软件开发的一般过程,了解面向对象技术相关概念,面向对象的程序设计,类是对象的蓝图,虚拟机介绍与安装,IDEA介绍与安装。
其中,第一点java程序设计语言,与我们之前所学的c语言的差别还是有的,就例如常见的public、class、static、void、main、String、args、System、out、println等,这些都是java专属的标识符。
第二点,程序开发。我们通过对c语言的学习,我们能够一定了解机器的语言取决于CPU,同样的还有汇编语言、高级语言等。
第三点,问题求解。首先我们要认识到问题,然后再找到相应的办法去解决它。随后设计方案,最终实现最优方案。
第四点,软件开发行为。我们要知道开发软件是为了什么,怎么做,然后设计代码,最后测试。
第五点,面向对象程序设计。三要素:封装,继承,多态。
第二章 数据和表达式
- 字符串
- 变量和赋值
- 基本数据类型
- 表达式
- 数据转化
- 读输入数据
在这个章节里面,我们能够了解Java中使用的基本数据类型及执行计算时表达式的使用。其中讨论了数据类型之间的转换,以及如何借助于Scanner类交互地从用户读入输入。
字符串
- print及println方法
- 字符串连接
- 转义字符
- 变量和赋值
变量和赋值
- 赋值语句
- 常量
- 基本数据类型
- 整型和浮点型
- 字符类型
- boolean类型
基本数据类型
-
8 种基本类型(byte,short,int,long,float,double,boolean,char)
-
6种数字类型(byte,short,int,long,float,double)
-
4种整数类型(byte,short,int,long),
表达式
- 算术运算符
- 运算符优先级
- 自增及自减运算符
- 赋值运算符
数据转化
- 转换技术
- 基本类型之间的转换:加宽转换与缩窄转换。
输入数据
- Scanner类的输入
第三章 使用类和对象
- 创建对象
- String类
- 包
- Random类
- Math类
- 格式化输出
- 枚举类型
- 包装类
通过对于这个章节的学习,其中介绍了讨论对象的创建及对象引用变量的使用,探讨String类提供的服务,探讨Random类和Math类提供的服务。
第四章 条件和循环
- 布尔表达式
- if语句
- 数据比较
- switch语句
- while语句
- 迭代器
- do语句
- for语句
本章主要介绍了if和switch语句执行基本的判定,分别使用while、do、和for循环重复执行语句,探讨用于判定的布尔表达式,为了分析并读入文本文件中的重复输入,再次讨论了Scanner类。
布尔表达式
- 控制流:顺序(存储程序)、分支(条件语句,特殊情况、循环(自动化)
if语句
-
if
-
if...else if ... esle
数据比较
-
浮点数的比较:计算两个差值的绝对值,在与公差进行比较。
switch语句
switch(){
case;
default;
}
while语句
-
break可以跳出多重循环。
-
continue语句也类似,但是要再次计算循环条件,如果仍未真,则再次执行循环体。
迭代器
do语句
for语句
第五章 编写类
- 再谈类和对象
- 类的剖析
- 封装
- 方法的剖析
- 静态类成员
- 类方法
- 方法设计
- 方法重载
- 测试
- 调试
通过本章的学习,能够理解类的定义:属性+方法,类的封装和形参实参,构造方法。
第六章 图形用户界面
- GUI元素
第七章 数组
- 数组元素
- 数组的声明及使用
- 对象数组
- 命令行参数
- 变长参数表
- 二维数组
通过对于这个章节的学习,了解到了主要讲了定义并使用数组来组织数据,讨论边界检查及容量管理技术,讨论数组作为对象及对象数组的问题。
数组元素
-
从0开始,0到length-1
数组的声明及应用
-
用new实例化,指定大小,之后数组大小不能改变。如:int [] arr = new int[1127]
-
Java中访数组元素不能越界,用数组的length属性控制,
-
第一次声明数组可以使用初值表代替new实例化数组
第八章 继承
- 创建子类
- 方法的重写
- 类层次
- 可见性
- 设计继承
我们可以从这个章节中学到主要讨论类继承的设计机制,说明抽象类的目的及使用方法,讨论与继承有关的可见性问题
继承
- 继承是从已有类派生出新类的过程;
- 父类与子类;
- 子类可以复写父类的方法;
- 抽象类不能实例化;
创建子类
-
extends继承,Java只支持单继承
-
super与this常用于调用构造方法
-
抽象类继承
第九章 多态
- 后绑定
- 通过继承实现多台
- 接口
- 通过接口实现多态
本章探讨了绑定的概念,以及它与多态的关系。之后研究了如何使用继承或接口来完成多态引用。与多态相关的设计问题也在这一章介绍。
多态
- 继承是从已有类派生出新类的过程;
- 父类与子类;
- 子类可以复写父类的方法;
- 抽象类不能实例化;
接口
-
interface,implements 等价于class,extends
-
接口是一组抽象方法,与抽象类一样不能被实例化
-
接口层次:接口可以继承接口;类可以实现接口,但不能继承接口。
-
Comparable接口:compareTo()
通过接口实现多态
接口引用可以指向实现这个接口的任意类的作何对象
第十章 异常
- 异常处理
- 不捕获异常
- try-catch语句
- 异常传播
- 异常类的层次
- I/O异常
在这个章节中介绍了异常处理及不捕获异常时的后果。探讨了try-catch语句,分析了异常的传播。除此之外,本章还介绍了处理输人/输出时的异常使用,给出了一个编写文本文件的例子。
异常
- 异常代未正确处理的对象;
- trycatch语句可以处理特定类型的异常
异常类的层次
-
Error及其子类写程序不用处理
-
Java异常处理是要处理Exception类及其子类:
-
RuntimeException及其子类也不用处理(Unchecked Exception),是免检异常;
-
产生RuntimeException的问题在调用代码
-
Multi-catch:类之间不能有继承关系
-
自定义异常
第十一章 递归
- 递归思想
- 递归程序设计
- 使用递归
在这个章节中重点介绍了递归的概念、递归的实现及其正确的用法。
第十二章 算法分析
- 算法效率
- 增长函数和打O符号
- 比较增长函数
在这个章节中呢,介绍并讨论了包括递归算法在内的算法复杂度的分析技术,介绍了大0符号。
第十三章 查找与排序
- 查找
- 排序
- 分析查找及排序算法
同样的,在本章节中我们探讨了线性查找和二分查找算法,还介绍了5个排序算法,其中包括平方阶及O(n logn)的算法。同时还研究了这些算法的效率。
查找
-
线性查找
-
二分查找:从中间开始,要求表是有序的,每次比较后可以减少查找池中的一半元素。
-
分块查找:先二分查找,再线性查找。
-
哈希查找:直接通过关键字找到存储地址,是的查找时间可以常数级。
-
散列查找
排序
-
选择排序:分别将每个值放在排好序的最终位置,从而完成一组值的排序。
-
插入排序:将一个具体的值插入到表中已有序的子系列中,从而完成一组值的排序。
-
冒泡排序:重复地比较表中的相邻元素,如果它们不符合要求则交换他们。
-
快速排序:根据一个任意选定的划分元素来对表进行划分,然后再递归地对划分元素两边的字段进行排序,从而完成对表的排序。
-
归并排序:递归地对分表,知道每个子表只含有一个元素时为止,然后再将子表按序合并,从而完成对表的排序。
分析查找及排序算法
-
考虑当问题大小增大时算法的渐进复杂度。
-
考虑每个算法的最优情形和最差情形。
第十四章 栈
- 集合的介绍
- 栈集合
- 继承、多态和泛型
- 栈的ADT
- 使用栈:计算后缀表达式
- 异常
- 使用数组实现栈
- ArrayStack类
- 将引用作为链
- 管理链表
- 没有链的元素
- 使用链实现栈
- 使用java.util.Stack类实现栈
- 包
本章主要介绍了集合的概念,确立了将接口与实现分开的重要意义。我们将栈作为集合的第一个例子,介绍了栈的动态及定长的两种实现方式。
栈集合
-
后进先出
-
push将元素添加到栈顶
-
pop删除栈顶元素
-
peek查看栈顶元素
-
isEmpty判断栈是否为空
-
size判断栈中元素的个数
使用链实现栈
- 链表实现栈
- 插入/删除都在栈顶
- Top指向栈顶元素
- 数组可以随机存取,随时取得某个数,但是链表必须从头开始
- 需要遍历链表while(head != null){操作};
第十五章 队列
- 队列ADT
- 使用队列:编码k值
- 使用队列:模拟票务柜台
- 实现队列:使用链表
- 队列的实现:使用数组
在这个章节当中,我们主要介绍了队列的概念,然后作为工具来帮助我们解决问题,最后研究所使用的数据结构。讨论了基于数组和动态链表的两种实现方式。
队列ADT
-
队列是一个线性集合,它在一端添加元素,在另一端删除元素————先进先出。
-
接口中一般有以下功能:
- enqueue:将元素插入到队尾。
- dequeue:从队头删除元素。
- first:检测队头的元素。
- isEmpty:判定队列是否为空。
- size:断定队列中的元素个数。
第十六章 树
- 树
- 树的遍历
- 数的实现策略
- 二叉树的实现
- 决策树
本章介绍了树的术语和相关概念,讨论了不同的实现策略,详细介绍了递归的链式实现方法。
树
-
子节点
-
兄弟结点
-
满二叉树
-
完全二叉树
- 节点+边
树的遍历
-
先序遍历
-
中序遍历
-
后序遍历
-
层序遍历
第十七章 二叉排序树
- 二叉查找树
- 二叉查找树的实现
- 平衡二叉查找树
二叉查找树
- 左子树小于结点,右子树大于结点;
- 最有效的二叉查找树是平衡的;
- 可以对二叉树进行旋转使其达到平衡;
第十八章 堆和优先队列
- 堆
- 堆的实现
- 堆排序
- 优先队列
本章主要介绍了查找树的概念,以及典型的二叉查找树的链式实现。
堆
-
可以使用数组形式,用顺序结构存储最为合适。
-
最小堆(小顶堆)
-
最大堆(大顶堆)
‘
第十九章 图
- 无向图
- 有向图
- 带权图
- 常用的图算法
- 图的实现策略
本章主要介绍了图的结构和其内容。
第二十章 哈希算法
- 哈希算法
- 哈希函数
- 解决冲突
- 从哈希表中删除元素
- Java Collections API中的哈希表
涉及创建哈希表以便于存储及获取对象的相关概念。本章还介绍了Java API中与哈希相关的几种应用。
二、总结所做过的作业
- 作业1:安装虚拟机
- 作业2:《数据结构与面向对象程序设计》第一周作业
- 作业3:编写简单的类
- 作业4:类继承作业
- 作业5:复数计算器
- 作业6:栈实践
- 作业7:二分查找(折半查找)实践
- 作业8:二叉树的建立和层序遍历法实践
- 作业9:哈夫曼编码实践
- 实践1:使用VIM编辑器编写Java程序
- 实践2:查找及ASL作业
- 实践3:排序
- 实践4:树-计算题
- 实践5:哈夫曼编码测试
- 实践6:地图染色问题
- 实践7:最小生成树测试
- 实践8:Dijkstra(迪杰斯特拉)算法测试
可能还有漏的,一时间想不起来了。。。。
三、实验报告总结
实验一:linux命令行和编写简单java程序
-
1、基于命令行进行简单的Java程序编辑、编译、运行和调试。
2、练习Linux基本命令;
3、学习Java程序的JDB调试技能:https://www.cnblogs.com/rocedu/p/6371262.html
4、编写简单的Java程序。
实验二:编写简单的计算器
- 1.实验内容
(1) 编写简单的计算器,完成加减乘除模运算。
(2) 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
(3) 编写测试代码,测试验证。(https://www.cnblogs.com/rocedu/p/4472842.html)
实验三:面向对象程序设计
- 初步掌握单元测试和TDD
- 理解并掌握面向对象三要素:封装、继承、多态
- 初步掌握UML建模
实验四:Java Socket编程
1.实验内容
(一)Java Socket编程
1.学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程
2.结对编程。结对伙伴A编写客户端SocketClient.java,结对伙伴B编写服务器端。
3.截图加学号水印上传蓝墨云,代码push到码云,并撰写实验报告。
(二)Java和密码学
参考 http://www.cnblogs.com/rocedu/p/6683948.html
以结对的方式完成Java密码学相关内容的学习(帖子中所有代码和相关知识点需要学习)。提交学习成果码云链接和代表性成果截图,要有学号水印。
(三)编写有理数/复数计算器
结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。截图加水印上传蓝墨云,代码push码云。
(四)远程有理数计算器
结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
(五)远程复数计算器
结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴A(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端B,B收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
注意实验四(4)和实验四(5),一个人不能仅实现客户端,必须实现一个客户端和服务器,否则两个实验均不得分!!!
(六)实验报告
在规定时间前发表博客,标题“学号 实验四 《数据结构与面向对象程序设计》实验报告”
实验六:线性结构及链表
1.链表练习,要求实现下列功能:
- 通过键盘输入一些整数,建立一个链表;
这些数是你学号中依次取出的两位数。 再加上今天的时间。
例如你的学号是 20172301
今天时间是 2018/10/1, 16:23:49秒
数字就是
20, 17,23,1, 20, 18,10,1,16,23,49
打印所有链表元素, 并输出元素的总数。
在你的程序中,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。 例如你叫 张三, 那么这个变量名就是
int nZhangSan = 0; //初始化为 0.
做完这一步,把你的程序签入源代码控制(git push)。
2.链表练习,要求实现下列功能:
- 实现节点插入、删除、输出操作;
继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
从磁盘读取一个文件, 这个文件有两个数字。
从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。
从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
从链表中删除刚才的数字1. 并打印所有数字和元素的总数。
3.链表练习,要求实现下列功能:
- 使用冒泡排序法或者选择排序法根据数值大小对链表进行排序;
如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。
4.在android上实现实验(1)和(2)
5.在android平台上实现实验(3)
实验七:查找与排序
1.定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位提交运行结果图。
2.重构你的代码把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)把测试代码放test包中重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种)
3.参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试提交运行结果截图
4.实现排序方法等(至少3个)测试实现的算法(正常,异常,边界)提交运行结果截图(如果编写多个排序算法,即使其中三个排序程序有瑕疵,也可以酌情得满分)
5.编写Android程序对实现各种查找与排序算法进行测试提交运行结果截图推送代码到码云(选做,额外加分)
实验八:树
1.参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
3.自己设计并实现一颗决策树
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
4.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
提交测试代码运行截图,要全屏,包含自己的学号信息
实验九:图
一、实验内容
(1) 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)(2分)
(2) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)(4分)
(3) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环(3分)
(4) 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出(3分)
(5) 完成有向图的单源最短路径求解(迪杰斯特拉算法)(3分
四、代码托管
给出statistic.sh的运行结果,统计本学期的代码量。
这学期才打了4500行代码,总觉得自己并没有学多少java,也是由于前期没有弄好idea,导致自己没能很好地联系代码,但就一个学期的学习,虽说很好,但还是学到了很多东西,还是得说,不能懒于敲代码,要想提升自己,只能不断地前进和练习。
这个是这学期上传至码云的总的代码链接:https://gitee.com/besti2023javads/lv-binghan
课程收获与不足
- 自己的收获(投入,效率,效果等)
这个学期对于《数据结构与面向对象程序设计》的学习,可以说收获到了许多没有接触到过的专业知识,刚开始学这门课程的时候,我总是感觉力不从心,因为觉得与上学期所学的c语言非常不同,然后也没有特别注重对于数据结构的学习,导致前期学习比较吃力,究其根本也是懒惰,但后来通过课程的推进,我越发感觉有意思起来了,能够开始自主学习,通过百度以及课本的方式,自学能力有了一定的提升。
- 自己需要改进的地方
自己还需要改进的地方就是自己的编程能力不足,没有达到自己心中的理想状态,尤其是后面学到树和图时,理论听起来十分容易,但一旦敲起代码,就会感到十分吃力与困难,所以说,还是得加以学习。
最后的最后,做个总结,这个学期的数据结构学习可以说是辛苦中带着快乐,苦是因为敲代码时耗时耗力的那种痛苦,快乐就是弄明白之后的那种茅塞顿开的感觉,总的来说,对于这门课程我是非常喜爱的,其中也包括王志强老师的细心教导!
整个活,祝王超人新年快乐!!!!