20202329 2021-2022-1《数据结构与面向对象程序设计》课程总结
一. 课程内容总结
前言:本课程的学习的基石:真正的面向对象、良好的程序设计实践、程序实例、图形用户界面。
第一章. Linux基础与Java开发环境
刚开始主要是软件的安装工作,即Ubuntu的安装。除此之外还有码云的创建和Linux命令行基本操作的学习和JDB的调试技能.
常用命令行:
cd:进入目录
ls:显示目录下的文件
mkdir:创建目录
rm:删除当前目录中的文件
mv:将文件名重命名或者转移文件
java:用来创建一个java程序
javac:编译java文件
vi:创建一个文件
find:查找指定目录下的文件
man:帮助命令,里面包含了绝大部分命令,函数的使用方法。
Locate:用来查找需要的文件
grep:用于查找内容符合指定要求的文件
which:快速查找文件
cheat:告诉你一个命令该如何使用
正常模式:按“:”输入命令行
插入模式:可以输入文本,在正常模式下,按i可以进入插入模式
可视模式:正常模式下按v可以进入可视模式
wq:强制保存并退出
w:只保存不退出
q:只退出不保存
x:删除光标所在的内容
dd:删除整行
nd:自定义删除几行
JDB的调试技能:方法断点,行断点,条件断点,临时断点
l 第二章.数据与表达式(主要是探讨Java程序中使用的一些基本数据类型和表达式用法)
u 字符串:区别print和println的用法,掌握字符穿的连接方式(“+”)、掌握一些基本转义字符的使用(\n、\t等等)
u 变量与赋值:变量是内存中用来保存一个特定类型数据值的位置的名称,变量声明由类型及一个变量列表组成。赋值语句(例如:s=10,),访问数据时不会改变其内存中的状态。在此也要注意不能把一个类型的值赋给与之不匹配的另一个类型的变量。
u 基本数据类型:整形和浮点型、boolean类型。Int用于整形,float和double用于浮点型(double用于更大的数),布尔值只有两个值(true及flase)
u 表达式:算数运算符(%、+、-、*、/、)、运算符的优先级、自增自减运算符(a++、a--)及赋值运算符(a+=5表示a=a+5)
u 数据转换:转换技术有赋值转换、提升及强制类型转换
u 读输入数据:Scanner类提供了从不同的数据源读入的不同类型数据的方法。想要调运Scanner类必须先创建一个对象。
l 第三章.使用类与对象(类的使用及其对象的创建方法)
u 创建对象:new运算符返回新建对象的应用,且多个引用变量可以指向同一个对象。
u String类:一旦创建String类,他的长度就不会再增加或者缩短
u 包:Java标准类库按照包来组织。且在开发程序时类库非常有用。
u Random类:属于java.util包,表示伪随机生成器。
u Math类:他的所有方法都是静态的,即通过类名来调运他们
u 格式化输出:NumberFormat类、DecimalFormat类、printf方法(加入此方法是为了移植遗留系统使用)
l 第四章.编写类(封装、继承、多态)
u UML类图
u 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。访问时通过getter和setter方法对象应该是封装的,以防对于数据的不合适访问-(private),public与封装相反。
u 静态变量由类中的所有实例所共享
u 方法的返回值类型应该和方法头中规定的返回值类型一样
u 方法重载:重载的方法由参数类型区分
第五章.继承(extends)
u 继承可以使用现有类的所有功能
u 通过继承创建的新类称为“子类”,被继承的称为“父类”
u 抽象类不能够进行实例化
u 一个子类可以继承多个基类
u 子类继承父类属性和方法也可以覆盖父类的方法
u Java中所有的类都直接或间接地派生与Object类
u 继承可适用于接口,一个借口可派生出另一个接口
l 第六章.多态
u 多态是指把不同子类对象都当做父类来看。赋值以后,父类的引用就可以根据当前赋值给他的子类的特性运行。
u 多态在同一接口下,能够使用不同的实例
u 接口是一组抽象方法,所以不能被实例化
u 接口名可以用来声明对象引用变量
l 第七章。条件判断与循环
u 条件语句及循环语句可控制方法内语句的执行
u If语句可以让程序选择是否执行下一条特定语句
u 在嵌套的if语句中,else自居与最近尚未匹配的if相匹配
u CompareTo方法用来判定字符串之间的相对顺序
u Break语句常用在switch语句的每个case分支之后
u While语句重复的执行相同的语句
u Do语句至少执行一次循环体
第八章.数组
u 大小为N的数组的小标从0到N-1(也就是说数组的下标从0开始)
u 数组必须进行实例化,因为它是一个对象
u 命令行参数保存在String对象数组中,并传递给main方法
u 边界检查:确保指向数组元素的下标在有效范围内
l 第九章.查找与排序
u 查找顾名思义就是在一组数据中找到你想要找到的元素,关于查找的方法有很多,例如线性查找、二分查找、顺序查找、二叉树查找、分块查找等,但查找也尤其效率的高低,高效的查找使得比较次数最少
u 顺序查找适合于存储结构为顺序存储的。然后从开始往后一个一个查找。
u 线性查找则是从开始一个一个找,而二分查找是从中间开始查找。
u 排序顾名思义是将一组数据根据特定的要求进行排列,可以是升序,也可以是降序。主要有选择排序,冒泡排序,插入排序、快速排序、归并排序等。选择排序是反复将每个数值防在最终的位置,插入排序是反复将每个数值插入到已经有序的子表中,而冒泡排序是反复比较相邻的元素。他们三个的时间复杂度都是O(n^2),归并排序时间复杂度是O(nlogn).
u 二分查找对于数据很大时,效率很高。
l 第十章.队列
u 队列是一种特殊的线性表,先进先出(最先进入的元素最先离开)。队列只容许在最后端输入,在最前段删除。
u 队列分为顺序和链式队列
u ArrayListh常用功能:add(增加)、remove(移除)、size(队列的大小)等
u 入队(enqueue)/出队(dequeue)
l 第十一章.栈
u 栈是一个线性集合,后进先出(即最后进的元素最先出栈)。因此,其元素的添加与删除都在一端进行,即栈顶(top).
u 栈的使用有前、中、后缀表达式三种。前缀:- 6 9.中缀:6 – 9.后缀:6 9 -。
u 栈的基本操作:pop(删除元素并返回栈顶)、push(元素入栈)、peek(将元素弹到栈顶),isEmpty(判断是否为空)等
l 第十二章.树
u 首先,树是非线性结构,其元素组织为一个层次结构。
u 在树中,有很多名词概念,例如树的节点,度,叶子,树的深度等等
u 树的便利:先序遍历(根左右)、中序遍历(左根右)、后续遍历(左右根)、层序遍历(从顶层到底层,从左至右)。
u 二叉树:完全二叉树、满二叉树、最优二叉树(哈弗曼树)、平衡二叉树。
l 第十三章.图
u 图是一种非线性结构。
u 无向图:图中所有边都是无向边,边的顶点之间是无序的。
u 有向图:图中所有边都是有向的。
u 带权图:图的每条边上都有对应的权值
u 图的便利:广度遍历和深度遍历。广度遍历是从一个顶点开始然后逐渐辐射周围的顶点,而深度遍历是从顶点开始沿着一枝一枝遍历到底。广度优先遍历和深度优先遍历的主要区别就是在于用栈代替队列来管理遍历过程。
u 图的表示方法:十字链表、领结表(打死都要记住)、邻接矩阵(打死也得记住)、边集数组。
u 最小生成树:prim算法和kruscal算法
u 单元最短路径:迪杰特斯拉算法
u 拓扑排序:对于有向五环图,寻找入度为0的结点删除,以此类推。
二. 一学期的作业(饱含了超人的爱)----云班课
l 作业一:第一章和第二章测试活动(选择题)
l 作业二:类和对象
l 作业三:实验三的做实验内容,即封装继承多态,单元测试、UML的实现。(此次包含五个小作业)
l 作业四:第四章和第五章测试(选择题)
l 作业五:第六章和第七章测试
l 作业六:封装继承多态重写重载文件字符字节读写
l 作业七:实现自己的ArrayList(实现增加、删除、修改、查找、判断是否为空、返回list长度等操作)
l 作业八:第九、十、十一章继承多态异常(选择题)
l 作业九:实验四内容截图加学号水印(此次包含五个小作业)
l 作业十:ArrayStack测试
l 作业十一:尾插法
l 作业十二:栈应用—进制转换
l 作业十三:树和图(选择题)
l 作业十四:最小生成树测试
l 作业十五:栈和队列测试(选择题)
l 作业十六:快速排序测试
l 作业十七:最后一次测试
三. 实验报告链接汇总
l 实验一 《Linux基础与Java开发环境》:
实验内容:主要是学习命令行的基本操作以及基于命令行编写简单的程序,并学习JDB调试。
https://www.cnblogs.com/zt20202329/p/15322275.html
l 实验二 《编写简单的计算器》:
实验内容:
(1) 编写简单的计算器,完成加减乘除模运算。
(2) 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
(3) 编写测试代码,测试验证。
https://www.cnblogs.com/zt20202329/p/15350817.html
l 实验三 《数据结构与面向对象设计》:
实验内容:在IDEA安装好的基础上,初步掌握单元测试以及TDD、理解并掌握面向对象三要素(封装、继承、多态)以及UML建模
https://www.cnblogs.com/zt20202329/p/15396257.html
l 实验四 《Java Socket编程》:
实验内容:Java Socket编程(结合伙伴一方编写客户端,一方编写服务端)、Java与密码学(掌握几种加解密算法)、编写并实现远程有理数计数器与远程复数计数器)。
https://www.cnblogs.com/zt20202329/p/15449930.html
l 实验五 和实验六《链表的练习及Android的安装与使用》:
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)
https://www.cnblogs.com/zt20202329/p/15522282.html
l 实验七《排序与查找》:
实验内容:主要是练习并实现几种排序与查找方法(排序方法:选择排序、冒泡排序、插入排序、希尔排序、堆排序。查找方法:顺序查找、二叉排序树查找、分块查找、斐波那契查找、线性探索查找、折半查找等)
- 定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位
提交运行结果图。 - 重构你的代码
把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)
把测试代码放test包中
重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种) - 参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试
提交运行结果截图 - 实现排序方法等(至少3个)
测试实现的算法(正常,异常,边界)
提交运行结果截图(如果编写多个排序算法,即使其中三个排序程序有瑕疵,也可以酌情得满分) - 编写Android程序对实现各种查找与排序算法进行测试
提交运行结果截
推送代码到码云(选做,额外加分)
https://www.cnblogs.com/zt20202329/p/15554066.html
l 实验八《树的构造》:
实验内容:实现链树,构造一颗二叉树,并根据中序和先序确定唯一一颗二叉树。构造一颗决策树(内容自己定义)。将树的中缀表达式转化为后缀或者前缀表达式。
1.参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
3.自己设计并实现一颗决策树
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
4.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
提交测试代码运行截图,要全屏,包含自己的学号信息
https://www.cnblogs.com/zt20202329/p/15615397.html
l 实验九 《图》:
实验内容:用领接表或者邻接矩阵初始化有向图或者无向图(自己选择)并定义图的节点和边、完成图的深度遍历和 广度便利、完成图的拓扑排序、用Prim算法或者Kruscal算法完成无向图的最小生成树、用迪杰斯特拉算法完成有向图的单元最短路径。
https://www.cnblogs.com/zt20202329/p/15721728.html
l 实验十 《最后的告别之课程总结》
实验内容:回顾过往、展望未来,认真体会。
四. 代码托管链接托管
有些代码因为换电脑的缘故已经不见了(难受)
五. 课程收获与不足
- 自己的收获
数据结构与面向对象这门课程比上学期的程序设计基础难很多。首先在软件的安装方面就会遇到很多问题,IDEA和Andriod到目前为止每次打开都需要再重新install一下之后才能够正常使用。其次对于课程的学习,我学起来是十分吃力的,对于理论知识的掌握感觉还OK,但一旦涉及程序的编写总会出现各种各样的难题,课下也会花时间去多加练习,多向同学求助。但即便如此,每次的实验题对于我来说还是比较困难,实验也多是去借鉴学长学姐的,再加以自己的理解完成。整个学期下来,在超人的传授中,我也汲取到了很多的知识(不仅仅限于学习方面);每节课都是在欢声笑语中度过。在超人的课堂中,我收获到的不仅仅是知识,还有一份快乐。
2.自我改进:再往后的学习中,要培养自己独立自主的能力,要更加善于独立思考,培养自我解决问题的能力,永远保持一颗积极向上,热爱学习的心态。
在课程学习期间,一个不经意的瞬间,我还发现了Java的美妙之处,那便是情书代码。接下来就展示几个吧!!!
例如:
对超人的感谢(也可用来表白)