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

[一]课程内容总结


课本官方简介:
第1章(绪论)介绍了Java程序设计语言和基本的程序开发过程。介绍了面向对象的开发方法,包括相关的概念和术语。这一章还介绍了帮助学生熟悉开发环境所适用的主要参考资料。
第2章(数据和表达式)探讨了Java程序中使用的基本数据类型及执行计算时表达式的使用。讨论了数据类型之间的转换,以及如何借助于Scanner类交互地从用户读人输人。
第3章(使用类和对象)探讨了预定义的类及由它们创建的对象的使用。使用类和对象来操作字符串、产生随机数、执行复杂的计算及格式化输出。本章讨论了包、枚举类型和包装类。
第4章(条件和循环)介绍了用于判定的布尔表达式的使用。讨论了与条件及循环相关的所有语句,包括for循环的增强版本。为了分析并读人文本文件中的重复输人,再次讨论了Scanner类。
第5章(编写类)探讨了与编写类及方法相关的基本问题。内容包括实例数据、可见性、作用城、方法参数及返回值类型,也涉及了构造方法、方法设计、静态数据和方法重载等内容。第二版将测试和调试的内容也放到本章。
第6章(图形用户界面)全面研究了JavaGUI处理,重点是组件、事件和侦听器。使用多个an例子讨论了不同类的组件和事件。另外,也介绍了布局管理器、汕器层次、边框、工具示和助记符等内容。
第7章(数组)涉及数组的基本概念和数组的处理,内容包括边界检查、初值表、命令行参数、变长参数列表和多维数组等。
第8章(继承)讨论了类的派生及相关的概念,包括类层次、重写及可见性等。重点是强调在软件设计中继承的正确使用及它的作用是什么。
第9章(多态)探讨了绑定的概念,以及它与多态的关系。之后研究了如何使用继承或接口来完成多态引用。与多态相关的设计问题也在这一章介绍。
第10章(异常)介绍了异常处理及不捕获异常时的后果。探讨了ty-catch语句,分析了异的传播。本章还介绍了处理输人/输出时的异常使用,给出了一个编写文本文件的例子。
第11章(递归)介绍了递归的概念、递归的实现及其正确的用法。在本章的讨论中精心选择了几个示例,包括迷宫遍历和经典的汉诺塔问题。
第12章(算法分析)讨论了包括递归算法在内的算法复杂度的分析技术,介绍了大O符号。
第13章(查找与排序)探讨了线性查找和二分查找算法,还介绍了5个排序算法,其中包括平方阶及O(nlogn)的算法。同时还研究了这些算法的效率。
第14章(栈)介绍了集合的概念,确立了将接口与实现分开的重要意义。我们将栈作为集合的第一个例子,介绍了栈的动态及定长的两种实现方式。本章介绍了泛型,详述了泛型对集合类的支持。
第15章(队列)介绍了FIFO队列,讨论了不同的实现选择。本章首先介绍了队列的概念,然后作为工具来帮助我们解决问题,最后研究所使用的数据结构。讨论了基于数组和动态链表的两种实现方式。
第16章(树)介绍了树的术语和相关概念,讨论了不同的实现策略,详细介绍了递归的链式实现方法。本章还给出了一个二叉决策树的示例。
第17章(二叉查找树)介绍了查找树的概念,以及典型的二叉查找树的链式实现。本章还讨论了树的旋转算法。
第18章(堆和优先队列)讨论了堆的概念,以及堆与树的关系。研究了堆的完全链式实现方式。我们将优先队列作为集合来讨论,同时还分析了堆和优先队列之间的关系。
第19章(图)讨论了有向图和无向图。此外,还介绍了带权图、广度优先遍历和深度优先遍历之间的差别。介绍了最小生成树,讨论了它的实现策略。

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
自己的补充:
(1)绪论
1.面向对象的程序设计;
2.类是对象的蓝图;
3.虚拟机介绍与安装,IDEA介绍与安装;
(2)数据与表达式
1.数据类型介绍;
2.数据转换;
3.数据输入输出方法、语句;
(3)使用类和对象
1.类的对象的实例化;
2.类的方法;
3.随机数生成;
4.math类;
5.各种包使用;
(4)条件与循环
1.条件语句:if、swith等;
2.循环语句:do、while等;
3.compareTo语句;
(5)编写类
1.类的定义:属性+方法;
2.类的封装、形参实参;
3.构造方法不应该有返回值;
4.构造方法提倡封装;
5.程序的测试;
(6)数组
1.数组实例化;
2.数组越界问题排查与预防;
(7)继承
1.继承是从已有类派生出新类的过程;
2.父类与子类;
3.子类可以复写父类的方法;
4.抽象类不能实例化;
(8)多态
1.多态引用可以在不同的时候指向不同类型的对象;
2.接口是一组抽象方法,所以不能被实例化;
3.方法的参数可以是抽象的;
(9)异常
1.异常代未正确处理的对象;
2.trycatch语句可以处理特定类型的异常;
3.I/O异常及其处理;
(10)递归
1.递归允许方法调用自己;
2.每次递归调用某一方法时,都创建了新的局部变量和参数;
(11)查找与排序
1.高效的查找可以减少查找次数与时间;
2.二分查找等查找算法各自适用于不同的情况;
3.选择排序、插入排序等排序方法也是需要面对不同情况具体分析;
(12)栈
1.后进先出;
2.集合的介绍;
3.链表的介绍;
4.栈、链表各有优劣;
(13)队列
1.队列的介绍;
2.先进先出;
(14)树
1.树是一种非线性结构;
2.树的遍历有四种方法;
3.决策树;
4.二叉树;
(15)二叉查找树
1.左子树小于结点,右子树大于结点;
2.最有效的二叉查找树是平衡的;
3.可以对二叉树进行旋转使其达到平衡;
(16)堆
1.堆是一个完全二叉树;
2.大顶堆、小顶堆;
3.堆中元素的添加、删除;
(17)图
1.无向图、有向图;
2.邻接,路径;
3.边的权;
4.邻接矩阵;
5.图的遍历:广度优先与深度优先;


还有一些没办法放到章节里面的内容。
(1)Android应用开发与设计;
(2)UML图设计;
(3)everything使用;
(4)博客园使用;
(5)码云使用;
(6)编程技巧;
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
[二]作业简介
(1)安装虚拟机;
(2)实践一,虚拟机编写简单程序;
(3)编写简单的类;
(4)测试一
(5)复数计算器
(5)类的继承
(6)概念常识问答
(7)测试二;
(8)栈实践;
(9)二分查找实践;
(10)树——计算;
(11)二叉树建立,层序遍历实践;
(12)哈夫曼编码实践;
(13)测试三;
(14)地图染色实践;
(15)迪杰斯特拉算法实践;
(16)拓扑排序;
(17)最小生成树测试;
(18)英语打卡;
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
[三]实验报告汇总
https://www.cnblogs.com/ling-nan/p/13792284.html
https://www.cnblogs.com/ling-nan/p/13792343.html
https://www.cnblogs.com/ling-nan/p/13800077.html
https://www.cnblogs.com/ling-nan/p/13893979.html
https://www.cnblogs.com/ling-nan/p/13923129.html
https://www.cnblogs.com/ling-nan/p/13949711.html
https://www.cnblogs.com/ling-nan/p/14033499.html
https://www.cnblogs.com/ling-nan/p/14105629.html
https://www.cnblogs.com/ling-nan/p/14199570.html
(1)
1.基于命令行和IDE(Intellj IDEA 简易教程](http://www.cnblogs.com/rocedu/p/4421202.html)进行简单的Java程序编辑、编译、运行和调试。
2.练习Linux基本命令;
3.学习Java程序的JDB调试技能:https://www.cnblogs.com/rocedu/p/6371262.html
4.编写简单的Java程序。
(2)

  1. 编写简单的计算器,完成加减乘除模运算。

  2. 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。

  3. 编写测试代码,测试验证。
    https://gitee.com/besti1923/lrh20192304_JAVAProgramrr/blob/master/src/first.java
    https://gitee.com/besti1923/lrh20192304_JAVAProgramrr/blob/master/src/firsttest.java
    (3)

  4. 初步掌握单元测试和TDD

  5. 理解并掌握面向对象三要素:封装、继承、多态

  6. 初步掌握UML建模
    https://gitee.com/besti1923/lrh20192304_JAVAProgramrr/blob/master/src/third.java
    https://gitee.com/besti1923/lrh20192304_JAVAProgramrr/blob/master/src/first.java

    (4)
    1.Java Socket编程(2分)
    1.学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程
    2.结对编程。结对伙伴A编写客户端SocketClient.java,结对伙伴B编写服务器端。
    2.Java和密码学
    3.结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。
    4.结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
    客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果;
    5.结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
    客户端通过键盘输入一个复数计算的公式,并把该公式以字符串的形式发送给伙伴A(服务器端),服务器端根据字符串计算出结果,并把结果返回给客户端B,B收到结果后输出结果。
    https://gitee.com/besti1923/lrh20192304_JAVAProgramrr/blob/master/src/first.java
    https://gitee.com/besti1923/lrh20192304_JAVAProgramrr/commit/e7191084b8ffe71d77940aa2ec9ea5647636be0c
    https://gitee.com/besti1923/lrh20192304_JAVAProgramrr/commit/1390630562660ac04b96efce6c1b072eab2b17e9
    (5)
    1)Android Stuidio的安装测试: 参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十四章:

    参考http://www.cnblogs.com/rocedu/p/6371315.html#SECANDROID,安装 Android Stuidio
    完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号,自己学号前后一名同学的学号,提交代码运行截图和码云Git链接,截图没有学号要扣分
    学习Android Stuidio调试应用程序
    (2)Activity测试: 参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十五章:
    构建项目,运行教材相关代码
    创建 ThirdActivity, 在ThirdActivity中显示自己的学号,修改代码让MainActivity启动ThirdActivity
    提交代码运行截图和码云Git链接,截图要有学号水印,否则会扣分
    (3)UI测试: 参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十六章:
    构建项目,运行教材相关代码
    修改代码让Toast消息中显示自己的学号信息
    提交代码运行截图和码云Git链接,截图要有学号水印,否则会扣分
    (4)布局测试: 参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十七章:
    构建项目,运行教材相关代码
    修改布局让P290页的界面与教材不同
    提交代码运行截图和码云Git链接,截图要有学号水印,否则会扣分
    (5)事件处理测试: 参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十八章:
    构建项目,运行教材相关代码
    提交代码运行截图和码云Git链接,截图要有学号水印,否则会扣分
    (6)
    1.通过键盘输入一些整数,建立一个链表(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.实现节点插入、删除、输出操作(2分,3个知识点根据实际情况酌情扣分);

继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;

从磁盘读取一个文件, 这个文件有两个数字。
从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。
从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
从链表中删除刚才的数字1. 并打印所有数字和元素的总数。

签入所有代码。

3.使用冒泡排序法或者选择排序法根据数值大小对链表进行排序(2分);
如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。

在 2.得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。
(7)
1.定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位
提交运行结果图。
2.把Sorting.java Searching.java放入 cn.edu.besti.cs1823.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)
把测试代码放test包中
重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种
3.参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试
提交运行结果截图
4.补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等(至少3个)
测试实现的算法(正常,异常,边界)
https://gitee.com/besti1923/lrh20192304_JAVAProgramrr/commit/85efa2b2e95accea5eeed53e81e5c218c53bfa4e
(8)
1.参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和先序ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
3.自己设计并实现一颗决策树
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
4.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
提交测试代码运行截图,要全屏,包含自己的学号信息
https://gitee.com/besti1923/lrh20192304_JAVAProgramrr/commit/149b8d178593a2cd8736c482d6054a01dc2b8b6c
(9)

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

[3]代码
还有一个没办法放上来,他说内存不够计算不了(未解决这个问题),安卓以及虚拟机内代码数未计算。
1.
2.代码理解起来相较于代码的编写要简单一些,但是既是看得懂别人的代码,也需要自己手动操作才能有更好的理解,如果自己没有上手操作,很难能真正理解代码。勤于实践才能更好理解代码。
3.积极主动编代码做的还不够,并没有把书上所有的代码全部编译,对于书上的代码,在编的过程中发现它的注释非常齐全,自己在写程序时也要养成勤于添加注释的好习惯。还有就是发现英语的学习不能放松,书上代码很多地方看不太懂就是因为对于单词释义的不熟悉。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
1.自己对于课程的投入还是比较多的,但是苦于效率不是很高,无法在编写的时间内高效编写代码,完成实验,往往需要花费很长的时间去完成实验的任务;在平时的测试之中得到的分数不是很高。平时上课坐在老师旁边也可以很好地督促自己认真听讲。
2.对代码地熟练掌握与运用方面还需要多加训练和学习。平时也要勤于学习编程相关的方法和操作。
3.结队学习因为只是某些实验时需要,所以贯彻落实不是很彻底。结队学习我认为形式不错,以后可以保持。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
1.每周平均下来9h吧。
2.缓慢提高吧,自己编写代码数量变多,运用更加熟练了。
3.云班课视频对于一些方法的学习以及课后知识补充比较有效,而且这个东西上课点名好用。
4.继续几周一次实验
5.继续停止每周的测试,英文测试希望降低全英文题目比例。
——————————————————————————
码云库

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

(9)

posted @ 2020-12-30 14:00  20192304刘润衡  阅读(203)  评论(0编辑  收藏  举报