20192310 2020-2021-1 《数据结构与面向对象程序设计》课程总结
课程:《数据结构与面向对象程序设计》
班级:1923班
姓名:严嘉钰
学号:20192310
任课教师:王志强
必修/选修:公选课
课程内容总结
第一章 绪论
Java是面向对象程序设计语言
类是对象的蓝图
三大特性:封装 继承 多态
重要术语:对象 属性 方法
注释、标识符:class、public、static、void、main、String、args、System
Java是高级语言
错误:1.编译时错误 2.运行时错误 3.逻辑错误
第二章 数据和表达式
print及prinlnt方法
System.out.println
Scanner
常量:final
基本数据类型
byte,short,int,long,float,double,boolean,char
算术运算符:+、-、*、/、%
关系运算符:、>、>=、<、<=、==、!=
逻辑运算符:&&、||、!
运算符优先级:相同优先级满足从左到右的结合律
自增,自减符:i++、i--、++i、--i
第三章
new:返回指向新建对象的引用
String类方法:compareTo (String str);equals();length()等。
Java标准类库中的类按包来组织。每个类都属于一个具体的包。
Random类:伪随机数生成器执行复杂的计算产生随机数
Math类:方法都是静态的,可以用Math.XXX()直接调用
枚举类型:列出这个类型的变量的所有可能取值。eg.enum
NumberFormat类:有两个方法getCurencyInstance和getPercentInstance返回用于格式化数值的对象。getCurencyInstance返回货币格式对象,getPercentInstance返回百分比格式对象。
DecimalFormat类:使用new运算符来实例化对象。
print,println,printf方法
第四章
if与if-else语句
字符比较:Unicode顺序
浮点数的比较:计算两个差值的绝对值,在与公差进行比较。
字符比较:Unicode顺序,大小写字母,数字要联系ASCII表中的编码。
对角比较:equals。
switch语句:switch(){case :break;default:}
迭代器:迭代器是一个对象,可以使用它的一些方法每次处理集合中的一个元素。也就是说,迭代器可以按需一项项地处理每一个元素
while语句 break跳出循环。
do-while 语句:do{}while();
for 语句:for( ; ; ),与while等价
第五章
类:属性(变量/常量)+方法(函数)。
类是对象的抽象\蓝图,而对象是类的具体实例。
UML类图:实现、关联、聚合、组合、继承。
封装public、private
静态类
1.静态变量(static):有时也称类变量,它由类的所有实例共享,在一个对象中修改静态变量的值,就等于修改了其他所有对象中该静态变量的值。
2.静态方法:不需要为了调用方法而实例化类的一个对象,只能访问静态变量或局部变量。
类关系:依赖,聚合
方法重载与重写:重载:根据参数类型与数量确定初始化方法 重写:重新编写父类方法
测试类:
缺陷测试:发现错误,质量保证
单元测试:模块测试,确保方法的正确性
集成测试:系统大组件的正确性
系统测试:与需求保持一致性
方法重载:参数类型与数量,不管返回值
第六章
GUI元素:
三类对象:组件、事件、窃1听1器。
四要素:组件、容器、布局、事件
第七章
数组索引从0开始。
数组是对象,要用new实例化,new指定大小,之后数组大小不能改变
第八章
讨论类继承的设计机制,说明抽象类的目的及使用方法,讨论与继承有关的可见性问题
extends继承,代码复用,Java只支持单继承
super与this常用于调用构造方法
方法重载与重写:重载:根据参数类型与数量确定初始化方法 重写:重新编写父类方法
Object类是所有类的父类
abstract抽象类达抽象概念,不能用new实例化
抽象类的子类:实现父类的抽象方法变成具体类,不实现父类抽象方法仍要用abstract修饰
第九章
多态引用在不同的时候可以指向不同类型的对象
多态引用运行时才将方法调用与它的定义绑定在一起
引用变量可以指向声明继承于它的任意类的任何对象
接口是一组抽象方法,与抽象类一样不能被实例化
接口层次:接口可以继承接口;类可以实现接口,但不能继承接口。
Comparable接口
方法的参数可以是多态的
第十章
研究用于处理异常的try-catch语句
错误和异常代表不常见的或不正确处理的对象
错误(Error)不用捕获
处理异常:在异常发生的地方处理;在程序的其他地方处理
程序中出现异常不捕获异常,程序会崩溃
try-catch 语句: Java中把正常流程放try块中,错误(异常)处理放catch块中,每个catch 子句处理try块中可能抛出的一种特定类型的异常,注意多个catch一定把父类放后面处理, finally:总会执行,用于资源管理
如果没有在异常发生处捕获及处理,异常会被传播给调用的方法
throw:方法中抛出Checked Exception,方法声明中必须有throws。
Java异常处理是要处理Exception类及其子类:
产生RuntimeException的问题在调用代码
I/O异常: 几乎所有的IO API都可能抛出异常
第十一章
讨论深化递归思想的几个例子
可以用数学思维理解递归,锻炼递归思想,需要注意与迭代的区分
第十二章
计算机系统中最重要的资源之一是CPU时间,完成具体任务的算法效率是决定程序执行速度的一个主要因素
第十三章
查找
线性查找:设置哨兵在数组开头或结尾,以便提高查找效率。
二分查找:从中间开始,要求表是有序的,每次比较后可以减少查找池中的一半元素
分块查找:先二分查找,再线性查找
哈希查找:直接通过关键字找到存储地址。
散列查找
排序
选择排序:分别将每个值放在排好序的最终位置,从而完成一组值的排序。
插入排序:将一个具体的值插入到表中已有序的子系列中,从而完成一组值的排序。
冒泡排序:重复地比较表中的相邻元素,如果它们不符合要求则交换他们。
快速排序:根据一个任意选定的划分元素来对表进行划分,然后再递归地对划分元素两边的字段进行排序,从而完成对表的排序。
归并排序:递归地对分表,知道每个子表只含有一个元素时为止,然后再将子表按序合并,从而完成对表的排序。
第十四章
栈:先进后出
栈常见方法
push():将元素添加到栈顶
pop():删除栈顶元素
peek():查看栈顶元素
isEmpty():判断栈是否为空
size():判断栈中元素的个数
使用栈计算后缀表达式:从左到右扫描表达式,操作数入栈,遇到操作符则pop两个数计算后再push。
链表:与有固定大小的数组不一样,链表没有容量上限。
第十五章
队列是一个线性集合,它在一端添加元素,在另一端删除元素————先进先出。
enqueue:将元素插入到队尾。
dequeue:从队头删除元素。
first:检测队头的元素。
isEmpty:判定队列是否为空。
size:断定队列中的元素个数
第十六章
树:节点+边
完全二叉树(满二叉树也是完全二叉树)
树的遍历: 先序遍历、 中序遍历、 后序遍历、 层序遍历
二叉树的实现
决策树:用二叉树来表示。
第十七章
二叉查找树: 查找、插入、 删除
二叉查找树的实现
平衡二叉查找树
第十八章
堆:完全二叉树(根节点小于左右孩子)
堆的实现
堆排序
优先队列:具有更高优先级的项排在前面,具有相同优先级的项按先进先出的规则排列。
第十九章
无向图:图中表示边的顶点对是无序的图是无向图,意味着两点间的连接是双向的。
有向图:图中的边是顶点的有序对的图为有向图,意味着有向图的边是有方向的边。
带权图:图中每条边都对应一个权值的图成为带权图,有时也称为网络。
图遍历:广度优先遍历、 深度优先遍历
无向图的最小生成树(Prim算法或Kruscal算法)
有向图的拓扑排序
有向图的最短路径求解(迪杰斯特拉算法)
图的实现策略:邻接表邻接矩阵
总结做过的作业
~(1)虚拟机的安装
~(2)使用虚拟机编写简单程序;
~(3)编写简单的类;
~(4)测试一
~(5)复数计算器
~(5)类的继承
~(6)概念常识问答
~(7)测试二;
~(8)栈实践;
~(9)二分查找实践;
~(10)树——计算;
~(11)二叉树建立,层序遍历实践;
~(12)哈夫曼编码实践;
~(13)测试三;
~(14)地图染色实践;
~(15)迪杰斯特拉算法实践;
~(16)拓扑排序;
~(17)最小生成树测试;
实验报告链接汇总:
实验一 linux命令行和编写简单java程序:
~基于命令行进行简单的Java程序编辑、编译、运行和调试
https://www.cnblogs.com/nandemonaiya/p/13781549.html
实验二 编写简单的计算器
~简单计算器,完成加减乘除模的运算
https://www.cnblogs.com/nandemonaiya/p/13786668.html
实验三 面向对象程序设计
~下载安装并使用IDEA
~初步掌握单元测试和TDD
~理解并掌握面向对象三要素:封装、继承、多态
~初步掌握UML建模
https://www.cnblogs.com/nandemonaiya/p/13799828.html
实验四 Java Socket编程与密码学
~Java Socket编程
~Java和密码学
~编写有理数/复数计算器
~远程有理数计算器
~远程复数计算器
https://www.cnblogs.com/nandemonaiya/p/13908856.html
实验五 Android程序设计
~Android Stuidio的安装测试
~Activity测试
~UI测试
~布局测试
~事件处理测试
https://www.cnblogs.com/nandemonaiya/p/13916744.html
实验六 线性结构之链表
~通过键盘输入一些整数,建立一个链表
~实现节点插入、删除、输出操作
~使用冒泡排序法或者选择排序法根据数值大小对链表进行排序
~在android上实现以上操作
https://www.cnblogs.com/nandemonaiya/p/13954191.html
实验七 查找与排序
~定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试
~重构你的代码
~参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试
~补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等
~编写Android程序对实现各种查找与排序算法进行测试
https://www.cnblogs.com/nandemonaiya/p/14040473.html
实验八 树
~参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
~基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
~自己设计并实现一颗决策树
~输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
https://www.cnblogs.com/nandemonaiya/p/14104912.html
实验九 图
~初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)
~图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)
~完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环
~完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出
~完成有向图的单源最短路径求解(迪杰斯特拉算法)
https://www.cnblogs.com/nandemonaiya/p/14212762.html
代码托管链接:https://gitee.com/nandemonaiya
给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
代码量基本达到预期,很少出现上网复制代码的情况
加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
虽然据说一个好的程序员不应该出现调试的环节,但我觉得一步一步调试的过程才是编程的精髓
积极主动敲代码做到没?教材实践上有什么经验教训?
在平常的作业中并不是很积极主动,属于按部就班的类型
但在安卓开发中比较积极主动,因为比较感兴趣
教材实践的经验就是:别按教材的来,有问题问百度
课程收获与不足
自己的收获(投入,效率,效果等)
在Java上投入的时间是最多的,收获了一门可以较为熟练使用的语言,还有对安卓程序开发的兴趣
自己需要改进的地方
比较虎头蛇尾,临近考试,最后一次实验就比较水,投入时间大概是之前的五分之一
结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
没有真正贯彻,和结对伙伴差距过大,难以共同学习
基本各次实验都会给很多找我求助的同学一些力所能及的帮助
建议老师不要每次都要每张图都让我们加水印,太费时间了
问卷调查
你平均每周投入到本课程有效学习时间有多少?
前期比较长,周末加周一周四还有课余估计有三十小时,后期则较短一些
每周的学习效率有提高吗?你是怎么衡量的?
有很大提高,学习曲线的中间是一段陡峭的曲线,我每次为了完成实验花在debug上的时间减少了
蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?
比较有作用,比较方便
建议保持
你觉得这门课老师应该继续做哪一件事情?
加大安卓开发的部分,实验中鼓励自主创新
你觉得这门课老师应该停止做哪一件事情?
让我们在每张图上都加水印