20202314 2020-2021-2《数据结构与面向对象程序设计》课程总结
课程总结
一、课程内容总结
二、作业内容总结
三、实验报告链接汇总
四、代码托管链接
五、课程收获与不足
-------------------------------------我是分割线----------------------------------
一、课程内容总结
(以下内容按照九个实验对应内容和其他内容来进行分配)
第一章 简要内容
Linux和Java开发环境
命令行基本操作
cd 进入某目录
cd .. 进入上级目录
ls 列出当前目录下的文件
rm 删除当前目录下某个文件
mkdir 创建文件夹
cp 复制某文件至某地址
mv 将某文件转移或重命名
man 查找命令的使用方法等
vi/vim 创建文件并进入编辑
java 运行一个java程序
javac 编译一个java文件
主要是这些。
第二章简要内容
Java程序设计基础(基本运算符、变量及赋值等)
- 变量和赋值(int、float、double、Boolean、char、String……)
- 基本数据类型(整型、浮点型、字符型、Boolean型……)
- 表达式(变量的声明,基本运算,实例化……)
第三章简要内容
类与对象、Junit单元测试、UML建模
- 类与对象:public/private class 里的 class 即是类,是模板,是图纸。而(类名)+(对象名)则是声明一个类的对象(未实例化)。
- Junit单元测试。
主要使用其中assertEquals方法,操作比较简单,功能却十分强大,好东西。但是里面比较预期值与实际值时经常会出问题,原因是数据的类型不对应,这个时候就需要使用类型转换来防止出现“弃真”的错误(概率论数理统计的假设检验/doge)。 - UML建模。其实就是把一个类的对象和方法等通过图的方式来表现其逻辑关系,比较清晰易懂,对于我们课程学习这些比较简单的程序来说影响不是特别大,但是一个程序非常大的时候它的作用会非常明显,就相当于一个思维导图,大地图。
第四章简要内容
输入/输出、网络(Java Socket)、异常
输入: Scanner 对象名=new Scanner(System.in);
输出:System.out.print(ln)//加ln会换行
其实也可以通过其他方式进行不同类型的输入或者输出,但是我目前只会这种普通的输入输出……但是我相信别的也不难。
网络:java socket
主要是局域网通过ip与设定端口进行远程链接来传递信息等,挺好玩的,但是除了这个小玩具似的功能之外别的啥也不太知道,对不起……
异常:
在特定情况下,数据不能满足方法里的条件,会抛出特定的异常,使用javajdk时,一些自带方法会自动抛出已有类型的对应的异常。在自己的类与方法中,也可以自己设定不同类型、状况下抛出的异常类型!这个非常好用,可以用来检查自己的错误,但是我写程序检查错误一般都是中间多插入几个输出,比较直观……(主要我比较笨,这是笨方法)
第五章和第六章简要内容
线性结构(ArrayList、LinkedList……)以及Android模拟…
由于实验做的是自己设计的链表,而且ArrayList本身其实就是个动态数组(没有固定个数限制)
所以这一部分,我对LinkedList的学习还是比较深入的。(写自己的LinkedList花了我大概两三天的空闲时间)
首先,链表之所以为链表,是因为其中每个元素,有两个属性,一个是自己本身,一个是它的后继节点。
其实这个就有一点递归的思想了,但是它又稍微有点不一样,因为很多嵌套和自我调用都是在同一个方法里的,但是对链表这个类中的各个方法都需要用到递归(比如增加头结点,增加尾结点,增加特定序号位置的节点,删除特定位置的节点等等),对于各个不同的方法,所使用的逻辑和循环的方法是不相同的,要注意的一些边界问题也不甚一致,所以难度虽然不大,但是并不能称之为简单,应该还算是比较复杂吧,当时做出来这个还是比较有成就感的,就很妙。
第七章简要内容
排序运算方法(快速排序、插入排序……)
其中使用的比较多的是下面四种排序中的2、3、4
- 快速排序
算是一种冒泡的改进版,排序时候会分割成两部分,然后再冒泡,效率上会高一些。 - 插入排序
其实就是茬poker牌!!!每次插入一个数的时候,在有序数列中逐个比对,选择一个比它大和比它小的数之间插入这个数,逻辑上很合理!但是设计这个算法的时候要注意序号的问题! - 冒泡排序
其实这个排序也很秒,方法如其名,比如一开始有八个数,那么先选择八个数里最大/小的那个数排到第一个位置,然后再在另外七个里面再选最大/小的那个数排到第二个位置,一直到排序结束,很妙。 - 选择排序
这个我学c语言的时候学这个算法,我感觉这个算法就,很不合理,就很不是人类的逻辑,就很奇怪很麻烦似的,但是事实上,你写一次就知道这个方法写起来最简单,交换部分就是三行代码,然后在外面套一个循环就可以了。 就是每两个数如果大小顺序与想要的顺序不一致就交换,一直到整个序列有序!
第八章简要内容
链式结构(二叉树…)
二叉树,特殊的链式结构。!
二叉树,其实就是一个元素有三个部分的链式结构,一个自身,一个左孩子,一个右孩子。所以其实它的设计上比较重要的还是方法的递归写法,才能做到插入一个新的节点时不会使原本的二叉树产生奇怪的效果,导致全树崩盘……
涉及到的主要知识还有先序、中序、后序遍历*(其中知道两个就可以确定唯一的二叉树)
还有二叉树的几种表示方法(双亲表示法等等等等)
第九章简要内容
图!
图这一块其实内容也主要偏向离散数学的知识(毕竟是在学数据结构)
图按照有无规定方向可以分为有向图和无向图。
有向图和无向图在一些方面上还是很有区别的,用处也各有千秋。
图的主要相关知识主要我觉得是以下五点。
1.图的逻辑结构
图其实也就是一个集合,里面有两类东西,一类是节点,一类是边
而对于其中的边,若有向便是有向图,若无向则是无向图;
此外还有边的权重;节点的出度,入度等,还有是否有回路,图里的子图,连通图(强连通,弱连通),生成树等,不再一一解释。
2.图的存储结构
在java中,主要通过邻接矩阵或者邻接表来实现对图的存储。
邻接矩阵是通过输出每个节点到另外其他所有节点有无直接的通路以及对应权重等来表示这个唯一的图;
而邻接表可以说也是输出了以上的内容,但是展现方式不太一样,一个是矩阵,一个算链表;
这一块也挺妙的,当时写有向图和无向图的输出(邻接表、邻接矩阵)以及其中各自有的方法写了很久,收获感成就感也很强。
3.图的基本操作
主要是添加节点,删除节点,输出图,对图进行特殊的计算等(prim,迪杰斯特拉……)
写这一块的代码写了很久,很爽。
4.图的遍历
遍历这一块,收获比较大,感触比较深的是上网搜csdn里遍历方法的时候发现的,就是标记数组的运用,通过一个做记号的方式(我自己之前写自己的程序也喜欢用做记号的方法,但是我写的都比较偏,而且逻辑也很麻烦,并不简单,所以我的代码有时候挺难懂的…………不过人家这个isVisited布尔型数组的使用来标记某一个节点是否遍历过可以说是很人性了!)
深度遍历DFS
深度遍历,他的着重点是什么?深度!
所以他是从一个节点开始,一直往下挖挖挖,知道没有往下走的路,再倒回到最开始的地方,然后再往下挖(但是不挖已经挖过的了),从而实现遍历。
广度遍历BFS
广度遍历,它的着重点自然而然则是广度了。
其实有点像层序遍历
它比较吃邻接这个东西,就是先找一个点,然后再找它所有的邻接点,然后再在它的邻接点里面一个一个的广度遍历,从而实现遍历。
5.图的最短路径问题
主要就是迪杰斯特拉算法,就是每走一条路,就把这条路删去,然后把它的权值直接加上,这样就能够保证每次计算的时候,权重最小的那条一定是总权值也最小的那条通路了,很妙。
其他内容
栈:
算是另外一种特殊的线性表,想象一个坑,先跳进去的只能最后出来,最后跳进去的那个可以先出来(先进后出)。出栈,入栈(方法)
队列:
队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队。
堆:
是一种二叉树的特例(完全二叉树,而且大小上是有特定顺序的)
小顶堆,大顶堆……
重载: 同一个类中,同一个方法,参数不同,效果不同!
比如animal类里有eat()和eat(String food),在两个方法里各自写具体的方法,到时候调用两个不同的方法效果就不一样。
重写: 子类对父类中的方法重新编写!
-------------------------------------又是我哼哼----------------------------------
二、作业内容总结
(我也不知道哪些算是作业……)
作业1:安装虚拟机
VMware WorkStation 16 PRO™以及Ubuntu,这个还好,直接next next next就好了,跟着教程操作就完事了。
作业2:第一章第二章测试
见云班课
作业3:类和对象测试
见云班课
作业4:第四章和第五章测试
见云班课
作业5:第六章和第七章测试
见云班课
作业6:封装继承多态重写重载文件字符字节读写-测试
见云班课
作业7:第9/10/11章 继承多态异常
见云班课
作业8:实现自己的ArrayList
见云班课
作业9:ArrayStack测试
见云班课
作业10:栈应用-进制转换
见云班课
作业11:安装Android Studio
哇塞,这个当时按了很多遍,第一遍它提示它最关键的HAXM不支持,我一看,嗷原来是没下载这个东西,然后下载,安装,读条读完了,他又说他安装不了。2021年11月3日,我花了两个小时去csdn等一系列论坛搜索了各种方法来解决此问题,但是没有得到任何效果。
第二天我开机随便一开,它自己就好了。
作业12、13、14、15、16:
栈\队列测试
最小生成树测试
树和图
迪杰斯特拉算法测试
快速排序测试
均见云班课……
-------------------------------------分割线在此----------------------------------
三、实验报告链接汇总
1、https://www.cnblogs.com/ahua1021/p/15319998.html
2、https://www.cnblogs.com/ahua1021/p/15325086.html
3、https://www.cnblogs.com/ahua1021/p/15396069.html
4、https://www.cnblogs.com/ahua1021/p/15409985.html
5和6、https://www.cnblogs.com/ahua1021/p/15500939.html
7、https://www.cnblogs.com/ahua1021/p/15534242.html
8、https://www.cnblogs.com/ahua1021/p/15598167.html
9、https://www.cnblogs.com/ahua1021/p/15679854.html
-------------------------------------隔开隔开来----------------------------------
四、代码托管链接
码云链接https://gitee.com/besti2023javads/wang-xinyao-20202314
我搞了半天没找到那个statistic.sh那个……,然后我就在我的这个包里面搜索了/n的数量来确定行数,结果代码统计量是5771行…………
我觉得主要是我有几个方法,我写的很麻烦,所以其实程序总共没有几个很大型的,但是最后代码数量比同学稍多点…………
-------------------------------------完全隔开来----------------------------------
五、课程收获与不足
下面是我的课程总结与感想小作文!
首先,对于java程序的编写方法与c语言的编写方法虽有一定程度上的相似,如编写语句的运行顺序,逻辑的运行方法等比较相似,但在关键词、关键词的使用方法、“头文件”,以及类和对象的理解等,都是大不相同的,可以说是全新的知识。所以java的学习是千万不能轻视的,需要我们认真踏实地去学习,才能够做到能够达到课程要求的基础上,真正地学到java这类面向对象的高级语言的灵活熟练使用。
对于实验四学习中的各类密码算法,MD5和DES算法让我大为震撼,虽然并没有完全理解其中的部分原理,但是通过一系列实践操作后发现把运行参数中我所设定的字符串变成了一堆乱码再有变成解密后的原信息,感到十分的精妙。在客户端与服务器的编写上,程序报错Exception in thread "main" java.net.ConnectException: Connection refused: connect
问题解决方案则是上网搜了一下,发现这个是因为服务器或者客户端所输入的ip地址错误或者端口不对应所导致的,client一方应当输入server一方的ip地址才能进行远程的操作。在这一部分的学习里开始稍有些代码和java运行上的收获,其实就跟学游泳一样,有挫折有跌倒有喝水才开始有收获。这应该算是我java学习的第一关。
而链表这一块应该算是我的第二关了。链表是我第一个写了二三百行的一个程序,最终调试修改之后成功也是非常感动。其中主要有以下两类错误,也很有收获。
其一是链表Linked编译通过,测试结果有误,无法正确的实现目的。问题解决方案则是通过给定特定的数据,来测试设定的链表在不同情况下是否能够正确的输出结果,从而找到源代码中是哪一部分出现了问题。对于第二个问题,在链表中自定义的变量类型无法使用“>”等以及equals、compareTo等方法来实现比较大小。这个问题我通过在方法内部使用String a = “”+t(自定义变量)来实现将自定义的变量转换为String类型,值得注意的是,在String类型中,2“>”11,所以应当在输入时设定变量类型即为String并输入“02”,即可正常的比较大小! 通过此次程序的设计,我的收获主要是当程序产生问题时,运用“分部”与“分步”的方法(先划分部分,再将程序分为多个步骤,类似于逻辑图),既能够理清自己写程序的逻辑思路,又便于发现程序中的问题。
这便是我java学习的第二关,通过这一关,我主要提升了一些写代码的效率和检查代码错误的方法和经验。前面这两次大的考验吧算是,才能让我在实验九写图和图的方法的时候效率和速度都快了很多。
在实验九的图之前,实验七和实验八对我来说,主要算是个练手吧,因为新的内容其实不算很多(java的程序设计上的),主要是讲一些数据结构的内容,再加上原本这些排序之类的算法c语言也学过一部分,所以学起来还算比较顺心的,问题不是特别大。实验七实验八做的比较顺利,也比较快。
最后也就是实验九的图,这个为什么让我这样前面一直铺垫铺垫就是想说它呢,因为那天我做这个实验写代码,写着写着算是上瘾了吧,就大概二十分钟三十分钟写一个比较重要的方法然后修改修改测试通过了,就很有成就感,所以那天就写爽了,一晚上就给干出来了,所以比较开心。
其实这一块主要有两个难点,第一个是java程序设计的功底够不够,你懂逻辑,但是能不能用java语言正确地让程序跑起来,让计算机知道该做什么。第二个是你懂不懂这些数据结构的逻辑,每一个算法,它的原理是什么,它的实现是怎样的,这些都十分关键。
所以那天写出来,一整个人就是一个感动的大状态!
但是反思课程学习以来的不足,我觉得主要是个别的方法学的不是很行,总体的把握还是有这个框架的。
像文件的读写这一块,因为它涉及很多方法各个方法之间不甚相同,加上练得又少,所以最后那个测试的时候,基本上全部所有都做出来了,就是读写这一块没过去。哎。
最后,在虽然还有一段距离但是也差不多马上就要到了的春节来临之前祝王老师新年快乐!