课程总结
20192308王泽荣 2019-2020-2《数据结构与面向对象程序设计》课程总结
一、课程内容总结
第一章 绪论
本章介绍了Java程序设计语言和基本的程序开发过程。介绍了面向对象的开发方法,包括相关的概念和术语。
了解Java程序设计语言,了解程序编译运行的步骤,理解问题求解的一般方法,了解软件开发的一般过程,了解面向对象技术相关概念,面向对象的程序设计,类是对象的蓝图,虚拟机介绍与安装,IDEA介绍与安装。
第二章 数据和表达式
介绍了Java中使用的基本数据类型及执行计算时表达式的使用。讨论了数据类型之间的转换,以及如何借助于Scanner类交互地从用户读入输入。
字符串
- print及println方法
- 字符串连接
- 转义字符
- 变量和赋值
变量
- 赋值语句
- 常量
- 基本数据类型
- 整型和浮点型
- 字符类型
- boolean类型
表达式
- 算术运算符
- 运算符优先级
- 自增及自减运算符
- 赋值运算符
数据转换
- 转换技术
读输入数据
- Scanner类
第三章 使用类和对象
本章介绍了讨论对象的创建及对象引用变量的使用,探讨String类提供的服务,探讨Random类和Math类提供的服务。
- 创建对象
- String类
- 包
- Random类
- Math类
第四章 条件和循环
本章主要介绍了if和switch语句执行基本的判定,分别使用while、do、和for循环重复执行语句,探讨用于判定的布尔表达式,为了分析并读入文本文件中的重复输入,再次讨论了Scanner类。
- if语句可以让程序选择是否执行一条特定的语句。
- 循环语句可让程序多次执行同一条语句。
- 可用逻辑运算符构造复杂的条件。
- if-else语句可在条件为真时实现一个操作,在条件为假时实现另一个操作。
- 在嵌套的if语句中, else子句与最近尚未匹配的if相匹配
第五章 编写类
编写类
- 类的定义:属性+方法;
- 类的封装、形参实参;
- 构造方法不应该有返回值;
- 构造方法提倡封装;
- 程序的测试;
第七章 数组
本章主要讲了定义并使用数组来组织数据,讨论边界检查及容量管理技术,讨论数组作为对象及对象数组的问题。
数组
- 数组实例化;
- 数组越界问题排查与预防;
第八章 继承
本章主要讨论类继承的设计机制,说明抽象类的目的及使用方法,讨论与继承有关的可见性问题
继承
- 继承是从已有类派生出新类的过程;
- 父类与子类;
- 子类可以复写父类的方法;
- 抽象类不能实例化;
第九章 多态
探讨了绑定的概念,以及它与多态的关系。之后研究了如何使用继承或接口来完成多态引用。与多态相关的设计问题也在这一章介绍。
多态
- 多态引用可以在不同的时候指向不同类型的对象;
- 接口是一组抽象方法,所以不能被实例化;
- 方法的参数可以是抽象的;
第十章 异常
介绍了异常处理及不捕获异常时的后果。探讨了try-catch语句,分析了异常的传播。本章还介绍了处理输人/输出时的异常使用,给出了一个编写文本文件的例子。
异常
- 异常代未正确处理的对象;
- trycatch语句可以处理特定类型的异常;
- I/O异常及其处理;
第十一章 递归
介绍了递归的概念、递归的实现及其正确的用法。
递归
- 递归允许方法调用自己;
- 每次递归调用某一方法时,都创建了新的局部变量和参数;
第十二章 算法分析
讨论了包括递归算法在内的算法复杂度的分析技术,介绍了大0符号。
第十三章 查找与排序
- 探讨了线性查找和二分查找算法,还介绍了5个排序算法,其中包括平方阶及O(n logn)的算法。同时还研究了这些算法的效率。
查找与排序
- 高效的查找可以减少查找次数与时间;
- 二分查找等查找算法各自适用于不同的情况;
- 选择排序、插入排序等排序方法也是需要面对不同情况具体分析;
第十四章栈
介绍了集合的概念,确立了将接口与实现分开的重要意义。我们将栈作为集合的第一个例子,介绍了栈的动态及定长的两种实现方式。
栈
- 后进先出;
- 集合的介绍;
- 链表的介绍;
- 栈、链表各有优劣
第十五章 队列
介绍了队列的概念,然后作为工具来帮助我们解决问题,最后研究所使用的数据结构。讨论了基于数组和动态链表的两种实现方式。
队列
队列的介绍;
先进先出;
第十六章 树
介绍了树的术语和相关概念,讨论了不同的实现策略,详细介绍了递归的链式实现方法。
第十七章 二叉排序树
二叉查找树
- 左子树小于结点,右子树大于结点;
- 最有效的二叉查找树是平衡的;
- 可以对二叉树进行旋转使其达到平衡;
第十八章 堆和优先队列
介绍了查找树的概念,以及典型的二叉查找树的链式实现。
堆
- 堆是一个完全二叉树;
- 大顶堆、小顶堆;
- 堆中元素的添加、删除;
第十九章 图
图
- 无向图、有向图;
- 邻接,路径;
- 边的权;
- 邻接矩阵;
- 图的遍历:广度优先与深度优先;
第二十章 哈希算法
涉及创建哈希表以便于存储及获取对象的相关概念。本章还介绍了Java API中与哈希相关的几种应用。
二、总结所做过的作业
- 安装虚拟机;
- 实践一,虚拟机编写简单程序;
- 编写简单的类;
- 测试一
- 复数计算器
- 类的继承
- 概念常识问答
- 测试二;
- 栈实践;
- 二分查找实践;
- 树——计算;
- 二叉树建立,层序遍历实践;
- 哈夫曼编码实践;
- 测试三;
- 地图染色实践;
- 迪杰斯特拉算法实践;
- 拓扑排序;
- 最小生成树测试;
- 英语打卡;
三、实验报告链接汇总
实验一 Linux基础与Java开发环境
(1)基于命令行和IDE进行简单的Java程序编辑、编译、运行和调试。
(2)练习Linux基本命令;
(3)学习Java程序的JDB调试技能。
(4)编写简单的Java程序。
https://www.cnblogs.com/nomorename/p/13963165.html
https://www.cnblogs.com/nomorename/p/13781643.html
实验二
(1)编写简单的计算器,完成加减乘除模运算。
(2)要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
(3)编写测试代码,测试验证。
https://www.cnblogs.com/nomorename/p/13791064.html
实验三
下载安装并使用IDEA,完成下面实验。
(1)初步掌握单元测试和TDD
、
(2)理解并掌握面向对象三要素:封装、继承、多态
(3)初步掌握UML建模
(4)完成蓝墨云上 (1)-(5)实验。
https://www.cnblogs.com/nomorename/p/13804423.html
实验四
(1)Java Socket编程
1.学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程
2.结对编程。结对伙伴A编写客户端SocketClient.java,结对伙伴B编写服务器端。
3.截图加学号水印上传蓝墨云,代码push到码云,并撰写实验报告。
(2)Java和密码学
以结对的方式完成Java密码学相关内容的学习(帖子中所有代码和相关知识点需要学习)。提交学习成果码云链接和代表性成果截图,要有学号水印。
(3)编写有理数/复数计算器
结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。截图加水印上传蓝墨云,代码push码云。
(4)远程有理数计算器
结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
(5)远程复数计算器
结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴A(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端B,B收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
https://www.cnblogs.com/nomorename/p/13907187.html
实验五
1.Android Stuidio的安装测试
2.Activity测试
3.UI测试
4.布局测试
5.事件处理测试
https://www.cnblogs.com/nomorename/p/13923211.html
实验六
链表练习,要求实现多个不同的功能
https://www.cnblogs.com/nomorename/p/13956332.html
实验七
1.定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
2.重构你的代码
把Sorting.java Searching.java放入 cn.edu.besti.cs1823.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)
把测试代码放test包中
3.参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并##在Searching中补充查找算法并测试
4.补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等(至少3个)
测试实现的算法(正常,异常,边界)
https://www.cnblogs.com/nomorename/p/14055630.html
实验八
1.参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和###后序ABDHIEJMNCFGKL,构造出附图中的树
3.自己设计并实现一颗决策树。提交测试代码运行截图,要全屏,包含自己的学号信息
4.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
https://www.cnblogs.com/nomorename/p/14111144.html
实验九
(1) 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输###入顶点和边数)(2分)
(2) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)(4分)
(3) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环(3分)
(4) 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出(3分)
(5) 完成有向图的单源最短路径求解(迪杰斯特拉算法)(3分)
https://www.cnblogs.com/nomorename/p/14210538.html
四、代码托管链接
https://gitee.com/besti1923/end-1923
- 给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
- 加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
- 积极主动敲代码做到没?教材实践上有什么经验教训?
加点代码,改点代码的前提其实是理解别人的代码,并且投入到实践中去,从头开始打代码的话会非常的艰难,复杂,拿别人的代码来进行理解,并在深入理解的基础上加以改造,应用,是最好的学习方式,在不断地改进中,我们吸取别人敲代码的经验,还有思路想法,当我们在自己敲代码的时候,我们也可以用这种思维去创造、去写新的我们的自己代码。对于所有的算法代码,其实不一定都要完完全全的掌握,世界上的算法是何其的多,计算机发展了那么多年,有那么多人前仆后继的去搞开发,自然代码和算法也是多种多样,所以当我们遇到不会的问题时,应当学会如何查询,如何在查询到的资源中进行改造,变成自己要用的东西。
五、课程收获与不足
- 自己的收获(投入,效率,效果等)
- 我的最大的收获在于增长了自我学习的能力和意识
- 自己需要改进的地方
- 有较为强大的惰性,喜欢偷懒
- 结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
- 在后半段的学习中,有点消极,在理论部分的学习中有点得过且过的意思
六、问卷调查
- 你平均每周投入到本课程有效学习时间有多少?
- 每次实验十小时以上,日常学习随机
- 每周的学习效率有提高吗?你是怎么衡量的?
- 每周学习时间减少了(数据结构部分),主要是上课认真听讲认真思考了,上课效率提升帮助学习效率提升
- 蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?
- 促进很大,建议加大力度
- 你觉得这门课老师应该继续做哪一件事情?
- 上课使用复杂手势签到
- 你觉得这门课老师应该停止做哪一件事情?
- 停止英测试,停止全英试卷