20192321 2020-2021-1《数据结构与面向对象程序设计》课程总结

20192321 2020-2021-1《数据结构与面向对象程序设计》课程总结

课程内容总结

  • 第一章(绪论)介绍了Java程序设计语言和基本的程序开发过程。介绍了面向对象的开发方法,包括相关的概念和术语。

  • 第二章(数据和表达式)探讨了Java程序中使用的基本数据类型及执行计算时表达式的使用。讨论了数据类型之间的转换,以及如何借助于Scanner类交互地从用户读入输入。

  • 第三章(使用类和对象)探讨了预定义地类及由它们创建的对象的使用。使用类和对象来操作字符串、产生随机数、执行复杂的计算及格式化输出。本章讨论了包、枚举类型和包装类。

  • 第四章(条件和循环)介绍了用于判定的布尔表达式的使用。讨论了与条件及循环相关的所有语句,包括for循环的增强版本。为了分析并读入文本文件中的重复输入,再次讨论了Scanner类。

  • 第五章(编写类)探讨了与编写类及方法相关的基本问题。内容包括实例数据、可见性、作用域、方法参数及返回值类型,也涉及了构造方法、方法设计、静态数据和方法重载等内容。

  • 第七章(数组)涉及数组的基本概念和数组的处理,内容包括边界检查、初值表、命令行参数、变长参数列表和多维数组等。

  • 第八章(继承)讨论了类的派生及相关概念,包括类层次、重写及可见性等。

  • 第九章(多态)探讨了绑定的概念,以及它与多态的关系。之后研究了如何使用继承或接口来完成多态引用。

  • 第十章(异常)介绍了异常处理及不捕获异常时的后果。探讨了try-catch语句,分析了异常的传播。本章还介绍了处理输入/输出时的异常使用。

  • 第十一章(递归)介绍了递归的概念、递归的实现及其正确的用法。

  • 第十二章(算法分析)讨论了包括递归算法在内的算法复杂度的分析技术,介绍了大O符号。

  • 第十三章(查找与排序)探讨了线性查找和二分查找算法,还介绍了5个排序算法,其中包括平方阶及O(n log n)的算法。同时还研究了这些算法的效率。

  • 第十四章(栈)介绍了集合的概念,确定了将接口与现实分开的重要意义。介绍了栈的动态及定长的两种实现方法。介绍了泛型,详述了泛型对集合类的支持。

  • 第十五章(队列)介绍了FIFO队列,讨论了不同的实现选择。本章首先介绍了队列的概念,然后作为工具来帮助我们解决问题,最后研究所使用的数据结构。讨论了基于数组和动态链表的两种实现方式。

  • 第十六章(树)介绍了树的术语和相关概念,讨论了不同的实现策略,详细介绍了递归的链式实现方法。

  • 第十七章(二叉查找树)介绍了查找树的概念,以及典型的二叉查找树的链式实现。

  • 第十八章(堆和优先队列)讨论了堆的概念,以及堆和树的关系。研究了堆的完全链式实现方式。同时还分析了堆和优先队列之间的关系。

  • 第十九章(图)讨论了有向图和无向图。此外,还介绍了带权图、广度优先遍历和深度优先遍历之间的差别。介绍了最小生成树,讨论了它的实现策略。

  • 第二十章(哈希方法)涉及创建哈希表以便于存储及获取对象的相关概念。本章还介绍了Java API中与哈希相关的几种应用。

总结所做过的作业

  • 作业1:安装虚拟机
    安装虚拟的Linux系统

  • 作业二:使用VIM编辑器编写Java程序
    (1)任务1:使用VIM编辑器编写Java程序。要求输入2个Int类型的数值m和n,当m不为0时,计算(m!)+(m的n次方),并输出。当m为0时提示重新输入。
    要求程序能够运行成功,否则后面均不得分。
    (2)任务2:使用VIM编辑器编写Java程序。要求输入1个Int类型的数值n。当m>0时,输出一个m行的三角形(丑或漂亮的三角形都行)。当m小于等于0时提示重新输入。
    要求程序能够运行成功,否则后面均不得分。

  • 作业三:类继承作业
    编写一个类,要求实现继承,可以以游戏、书籍、球员、复数等为例。
    (1)必须包含至少1个抽象方法。(1分)
    (2)必须测试,测试参数来自命令行参数。(1分)
    (3)简单测试一下Object类的方法。(1分)
    (4)要求能够实现两个对象的比较(Comparable接口)(2分)

  • 作业四:复数计算器
    实现复数类(加减乘除运算和比较大小)。要求使用Comparable接口、要求自定义接口、要求使用继承。

  • 作业五:栈实践
    用数组实现自己的栈,ArrayStackADT,需要包含栈的常规操作,并测试。需要包含push、pop、peek、size、isEmpty等操作。

  • 作业六:查找及ASL作业(计算)
    给定关键字序列19 14 23 1 68 20 84 27 55 11 10 79,试分别用顺序查找、折半查找、二叉排序树查找、散列查找(用线性探查法和链地址法)来实现查找。试画出它们的对应存储形式(顺序查找的顺序表,二分查找的判定树,二叉排序树查找的二叉排序树,两种散列查找的散列表),并求出每一种查找的成功平均查找长度。其中,散列函数H(k)=k%11。

  • 作业七:排序
    使用选择和插入排序法,写出第3次排序的结果:3 1 9 3 6 2 10

  • 作业八:二分查找(折半查找)
    给Searching类添加二分查找算法的递归实现方法。创建驱动程序来演示这个实现机制。
    (1)编程实现递归
    (2)创建一个测试类,测试递归实现的二分查找是否正确。

  • 作业九:树-计算题
    计算题:
    (1)有1023个结点的完全二叉树,其高度是多少?叶结点数是多少?(2分)
    (2)高度为h的完全二叉树至少有多少个结点?至多有多少个结点?(2分)
    (3)已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点,…,nm个度为m的结点,问该树中有多少个叶结点?(2分)

  • 作业十:二叉树的建立和层序遍历法实践
    (1)给定一个序列AB#CD###E#F##建立一颗树,根据“二叉树的生成”算法构造这颗树。(3分)
    (2)使用层序遍历方法完成遍历并测试(3分)。

  • 作业十一:哈夫曼编码测试
    哈夫曼编码测试,画出哈夫曼树,写出各个叶子节点的编码。

  • 作业十二:最小生成树测试
    (1)画出Prim算法的最小生成树的生成过程
    (2)画出Kruscal算法的最小生成树的生成过程
    (3)计算最小权值

  • 作业十三:Dijkstra(迪杰斯特拉)算法测试
    使用Dijkstra(迪杰斯特拉)算法计算单源(V1出发)最短路径。
    要求
    (1)写出V1到各个顶点的最短路径
    (2)要求写出最短路径计算过程(类似于图2)

  • 作业十四:地图染色问题
    给图染色,具体算法如下:
    (1)将图的结点按照度数递减的次序排列.
    (2)用第一种颜色对第一个结点着色,并按照结点排列的次序
    对与前面着色点不邻接的每一点着以相同颜色.
    (3)用第二种颜色对尚未着色的点重复步骤2,直到所有点着色完为止.

实验报告链接汇总

  • 实验一 Linux基础与Java开发环境
    (1)基于命令行和IDE进行简单的Java程序编辑、编译、运行和调试。
    (2)练习Linux基本命令;
    (3)学习Java程序的JDB调试技能。
    (4)编写简单的Java程序。

  • 20192321 2020-2021-1 《数据结构与面向对象程序设计》实验二报告
    (1)编写简单的计算器,完成加减乘除模运算。
    (2)要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
    (3)编写测试代码,测试验证。

  • 20192321 2020-2021-1 《数据结构与面向对象程序设计》实验三报告
    下载安装并使用IDEA,完成下面实验。
    (1)初步掌握单元测试和TDD
    (2)理解并掌握面向对象三要素:封装、继承、多态
    (3)初步掌握UML建模
    (4)完成蓝墨云上 (1)-(5)实验。

  • 20192321 实验四 《数据结构与面向对象程序设计》实验报告
    (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码云。
    注意实验四(4)和实验四(5),一个人不能仅实现客户端,必须实现一个客户端和服务器,否则两个实验均不得分!!!
    (6)实验报告
    在规定时间前发表博客,标题“学号 实验四 《数据结构与面向对象程序设计》实验报告”

  • 20192321 实验五 《数据结构与面向对象程序设计》实验报告
    (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
    (3)UI测试
    参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十六章:
    构建项目,运行教材相关代码
    修改代码让Toast消息中显示自己的学号信息
    (4)布局测试:
    参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十七章:
    构建项目,运行教材相关代码
    修改布局让P290页的界面与教材不同
    (5)事件处理测试:
    参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十八章:
    构建项目,运行教材相关代码
    提交代码运行截图和码云Git链接,截图要有学号水印,否则会扣分

  • 20192321 实验六 《数据结构与面向对象程序设计》实验报告
    (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)

  • 20192321 实验七 《数据结构与面向对象程序设计》实验报告
    (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个)
    测试实现的算法(正常,异常,边界)
    提交运行结果截图(如果编写多个排序算法,即使其中三个排序程序有瑕疵,也可以酌情得满分)
    (5)编写Android程序对实现各种查找与排序算法进行测试
    提交运行结果截图
    推送代码到码云(选做,加分)

  • 20192321 实验八 《数据结构与面向对象程序设计》实验报告
    (1)参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
    用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台
    (2)基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
    用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台
    (3)自己设计并实现一颗决策树
    提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台
    (4)输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
    提交测试代码运行截图,要全屏,包含自己的学号信息

  • 20192321 2020-2021-1《数据结构与面向对象程序设计》实验九报告
    图的综合实践
    (1) 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)(2分)
    (2) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)(4分)
    (3) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环(3分)
    (4) 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出(3分)
    (5) 完成有向图的单源最短路径求解(迪杰斯特拉算法)(3分)

代码托管链接:李锦程的码云

  • statistic.sh运行结果

  • 加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
    使用有意义的函数和变量名字。如果你的函数和变量的名字,能够切实的描述它们的逻辑,那么你就不需要写注释来解释它在干什么。检讨一下我经常乱七八糟的起变量名,还觉得越简单越好,什么N、R、P都出现过,确实最后搞的自己一头雾水。写代码要习惯使用包,我在刚开始写代码的时候没有使用包的习惯,导致一个实验的代码经常找不到,或者在一长串的代码中不知道哪个是自己要用的。不会的问题先按照别人的思路过一遍,但一定要自己动手打,不能照着抄。多思考,多实践。

  • 积极主动敲代码做到没?教材实践上有什么经验教训?
    学期开始时很积极,每一项作业尤其是实验都会认真的做,看了《积极主动敲代码》那篇博客,也很认同他的观点,会分析教材上的代码。国庆节假期之前有所懈怠,没有做到积极主动,有点为了完成任务而完成任务。国庆节总结调整。学习数据结构的时候积极性有一个小高潮,对于栈等结构的分析比较有兴趣。学习树的时候又不积极了,当时也是事情很多,最记忆犹新的是有一天晚上踩着点赶deadline,赶的时候很着急,匆匆赶完之后是12点,惊险刺激而且心有余悸。跟自己说以后不管什么情况,绝对不可以这样赶deadline。教材实践基本上就是灵活运用,而且要锤炼细节。书上代码无脑敲进去是没有用的,而且会有各种各样的问题出现,需要自己修改。

课程收获与不足

  • 自己的收获(投入,效率,效果等)
    最大的收获是学会了自己啃书,出现问题自己上网去搜博客找解决方案。养成了一些好习惯,比如写学习总结博客、解决问题写博客、多看博客。学习了linux、Java、安卓和数据结构四大块知识。还有项目开发过程和项目管理的一些感性认识。

  • 自己需要改进的地方
    偶尔懒惰,数据结构没有留作业的部分有些没实现。要多多寻找方法,提高学习效率。这里的方法包括:如果学习代码时遇到看不懂的点该怎样最最高效的解决?对于易掌握的东西怎么高效消化而不浪费时间?

  • 结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
    是。我自己比较懒。两个人在一起会互相督促。

问卷调查

  • 你平均每周投入到本课程有效学习时间有多少?
    20小时左右
  • 每周的学习效率有提高吗?你是怎么衡量的?
    (1)学习效率起起伏伏。
    (2)能否顺利完成任务。
  • 蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?
    (1)有,可以按需查看所需要的资源。
    (2)希望资源能够更新一下,或者做下整理,资源太多了有时候也是一种烦恼...
  • 你觉得这门课老师应该继续做哪一件事情?
    督促学习,定时定量布置任务。
  • 你觉得这门课老师应该停止做哪一件事情?
    放缓一下进度吧,感觉上课需要讲的东西还没有讲清楚。

出你的总结中涉及到的链接的二维码

  • 作业1

  • 作业2

  • 作业3

  • 作业4

  • 作业5

  • 作业6

  • 作业7

  • 作业8

  • 作业9

  • 作业10

  • 作业11

  • 作业12

  • 作业13

  • 作业14

  • 实验一

  • 实验二

  • 实验三

  • 实验四

  • 实验五

  • 实验六

  • 实验七

  • 实验八

  • 实验九

posted @ 2020-12-30 15:28  20192321李锦程  阅读(185)  评论(1编辑  收藏  举报