20202318 《数据结构与面向对象程序设计》课程总结报告
啊不管格式了随便了反正是个大总结
算了还是要正式一点
课程:《程序设计与数据结构》
班级: 2023
姓名:柳星宇
学号:20202318
实验教师:王志强
总结日期:2022年1月1日
必修/选修: 必修
首先要拿出我们赖以生存的课本《Java软件结构与数据结构》(第四版)毕竟课程总结如果没有这本书,我怎么可能记得我做了啥吧?对不起我太菜了,没这书我真记不住。那我们开始进行课程内容总结吧: !!!
第一章 简要内容
算了我收回前言,这章也没用到课本呀,打脸了┭┮﹏┭┮。这章主要是学习了程序开发,Java介绍,JAVA Application程序解读以及基于命令行的基本操作,第一次接触JAVA呀,就给我留下了难受的影响。一上来就是安装让我C盘爆红的软件,点名批评VMware Workstation.没安装在C盘它还不乐意动了(可能是我的问题,算了应该就是我的问题)。除了安装软件,我还在老师的指导下注册了博客园和Gitee码云(虽然是上学期选修学的。人生苦短,我用Python(●'◡'●))。博客园是我和同学们交作业最主要的平台,我通过写博客并发布来表示我完成了作业,而码云是一个能够云上托管代码的平台,同时代码的提交量也是记录我平时成绩的指标。尽管我没交很多。
在这一章我有学到不少操作时候的快捷键,因为后面写代码时经常用得上。在VM这个鬼虚拟机上,我可以通过新建三个标签页:一个使用vim 编辑代码;一个使用javac, java(或ant, gradle...)编译运行代码;一个使用JDB调试代码来进行简单的程序编译和运行,同时也是我第一次成功输出“hello java world !”这是继C与Python之后第三个输出的语言。除此之外,还有不少基础命令,例如三个模式的互换: i——插入模式;“ :”——普通模式进入命令行模式; Esc——插入模式进入命令行模式,当时我属实是挺蒙的,啊怎么打不了字,这程序不听我话,唉不堪回首。还有q!(强制退出不保存);shift+zz 或:wq(保存并退出)、:w(文件转存); :wq!(强制保存并退出)以及ls 和 find 等操作,让我收获颇丰。
同时也是为了巩固知识,我又在老师的指导下简单的(敷衍的)计算平均数的小程序和猜数字的小程序,真实有趣呢(不是)。更多的基础知识来源于查表,查阅 command 命令的使用手册,虽然没有优化我的操作,但至少没让我的程序死掉,挺好的。
课本的序章与本课大同小异,主要也是讲了关于数据结构的概念,包括:正确性、可靠性、健壮性、可用性、可维护性、可重用性、可移植性、运行效率和质量问题九个方面的基础知识,更加有助于我衡量我自己的程序的综合效果。
可以放一些图,显得不干燥
程序设计入门,最有效的方法就是积极敲代码!!!!
第二章 简要内容
好吧我错了,课本真的只是辅佐我跟上王哥的步伐的。还是看笔记吧。
在我和同学们张牙舞爪地完成了第一次JAVA“入门”设计和程序编写后,王哥开始正式讲授JAVA知识,除硬件设备和软件环境外,第一个知识点便是JAVA中最基础的类与对象。等等为什么讲义上写的是第三章?难道是我前两章整合到一章去了吗?好像也没有吧,算了按我的节奏来吧。
类与对象(类=属性[变量]+方法[函数])
这句话看起来简单,现在我也十分熟悉。但在当时我是真的不理解呀!!或许是上学期学习的C语言给我带来的不小影响,在JAVA编写初期,我认为在public class XXX { }下可以直接开始作业,结果就是”星星之火可以燎原“。经过老师纠正错误思想,我才明白了一个标准的基础的能够运行的JAVA程序至少包括两个类:方法类和测试类。(hello world不算啊,太简单了)。依据我的理解,方法类主要包含程序名称(人为命名,依据想要完成的目标)和程序算法(程序的工作方法),而测试类是验证方法可行性的测试代码,在逻辑和编写上十分简单,只需要在public static void main (String[] args)下定义一些符号赋值然后再引用方法像xxxxx.way(xxxxx用方法)就能进行测试。好吧我的理解雀食浅薄呀。
参考资料:第三次-上课讲义提纲.docx (mosoteach.cn) 算是一点一点回忆数月之前的知识吧。字符串与输出、变量与赋值、8种基本数据类型(真没记完,到现在也就用过三四种( ̄▽ ̄)")、算术表达式、逻辑表达式、数据运算优先级、自增自减运算符、赋值运算符(这个我熟,写循环时用的最多啦(●'◡'●))、类型转换、Scanner类等。(这里我想吐槽一下,这个Scanner和C语言完全不同,我花了好久才明白过来怎么接受由键盘输入的数据)。当然还有程序调试,包括运行和使用Debug检查(确实好用)。
课本的第二章讲的是算法分析,尤其是时间复杂度,听说蛮重要的。但是我也不怎么关注呀我好大哥王志强老师又不考这些内容👍,增长函数和复杂度分析是基本没学(不是)。但是课后测试着实是把我折磨的不轻呀,测到这些个知识点也就算了,全英就十分难受了。实不相瞒,为了在这个测试多拿点分,我把每一道题都copy下来拉到有道里边翻译,但好像没有什么效果,一套做完能得个2/3的分挺高兴了。啊我真是容易满足。不行不行这是不好的思想,我一定要秉持谦虚的学习态度,时刻铭记自身的不足,永远把 时刻获取新的知识作为我自身的价值取向和学习导向。
第三章 简要内容
翻了翻我的试验记录,似乎到封装、继承和多态了。期考第一题也考了这个知识点。封装就是把对象的属性保护好,把public格式替换成private格式进行储存,这样就能够保护原属性不被轻易地修改了;继承也挺好理解,子类继承父类的方法,在调用的时候能够除去冗杂的代码,提高代码整洁程度。不过这么做也有不足,就是父类对子类基本上是全开放的,存在着改变父类的同时不小心把子类也给整了。多态是接口的多种不同的实现方式,我对此的理解就是一个项目里,有一个接口文件,里边全是调用方法的语句,然后再在其他各种类里分别实现这些方法。
封装对成员变量实行更准确的控制。封装可以隐藏内部程序实现的细节。良好的封装能够减少代码之间的耦合度。外部成员无法修改已封装好的程序代码。方便数据检查,有利于保护对象信息的完整性,同时也提高程序的安全性。继承便于修改,体高代码的可维护性。提高代码复用性。父类的属性方法可以用于子类。可以轻松的定义子类。使设计应用程序变得简单。多态可以消除类型之间的耦合关系,实现低耦合、灵活性、可扩充性、可替换性。
可以简单的举些例子,例如父类是一个“Human”,子类“Teacher”继承父类,然后“Student”是这两个类的多态表现。以下是这几个类和测试类的代码:
ⅠHuman.java · 柳星宇/JAVA project - 码云 - 开源中国 (gitee.com)
ⅠTeacher.java · 柳星宇/JAVA project - 码云 - 开源中国 (gitee.com)
ⅠStudent.java · 柳星宇/JAVA project - 码云 - 开源中国 (gitee.com)
ⅠTest.java · 柳星宇/JAVA project - 码云 - 开源中国 (gitee.com)
(也算字吧,就当浓缩了)自己玩下来发现确实蛮神奇的。其实还有做关于接口的其他实验的,但是感觉太简陋了,没敢拿得上台面。(好像把private更换成protected也行得通),然后本类就用this,子类用父类就是super(),确实不错。
然后,这次关于继承封装多态的实验简直是不要太爽(嗯~ o(* ̄▽ ̄*)o)。在这里翻出来一下
(1)参考http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习
(2)参考http://www.cnblogs.com/rocedu/p/4837092.html,以TDD的方式研究学习StringBuffer
(3)参考https://www.cnblogs.com/rocedu/p/4472842.html,对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
(4)以TDD的方式开发一个复数类Complex
(5)使用StarUML对实验二中的代码进行建模
只能说对于好不容易完成了实验的我来说,有力的拔高了我的技术水平。掌握了更多的JAVA知识,积累了更多是实战经验,迈上了更高的台阶。(学长学姐们都这么强的吗?)
课本第三章怎么直接就是栈了?待会一起总结吧。
第四章 简要内容
紧接着上篇的结尾,本章主要的知识点是栈。本章内容由浅入深地概述了栈的定义和作用,包含:定义与集合相关的概念和术语;探讨JAVA集合API的基本结构(这个难┭┮﹏┭┮) ;讨论集合的抽象设计;讨论集合的各种问题,包括上一章的【继承、多态、泛型和接口】(Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。Java Collections API和泛型 - 娄老师 - 博客园 (cnblogs.com)是这样,嗯)定义栈集合;使用栈集合解决问题;考察栈的数组实现。
这章从难度上感觉是比上一章要简单一些,栈的基本逻辑以及push、pop等方法的原理和应用,是比上一章要明确不少的。因此,重点来了!!我被老师要求不准使用系统栈,在课上完成编写自己的栈方法并且测试。只能说那天挺惨的。不过这极大的锻炼了我实际编程能力的水平。拉出我的栈:ArrayStack.java · 柳星宇/JAVA project - 码云 - 开源中国 (gitee.com)(能用!!!!而且期末测试的第一题我也是用的自己的栈!!!!)当然这也是课本3.6给我们留的自测题。最常用五个栈操作:push 入栈,添加一个元素到栈的顶部;pop 出栈,从栈的顶部移出一个元素(这个会把那个元素删除,拿了不还了属于是);peek 查看,查看栈顶部的元素(有礼貌,看看不动手,君子行为);isempty 确定栈是否为空。这个方法定义类型与以上不同(ture or false);size 确定栈的元素目录。
测试截图:
当然,和往常一样,课后作业永远要比课上难得多,使用栈计算后缀表达式都算是小儿科了。万万没想到呀,课后的作业竟然是编写服务器和客户端,而且是要求两人小组共同完成。有一说一,课上真没讲多少关于这个的内容呀。我依稀记得当时实验课我一边看着B站视频一边照葫芦画瓢地写完了客户端和服务器,一运行,不错,看起来没问题,发给小伙伴,哦吼,完蛋。结果和小伙伴搞了好久,借鉴各路大神的程序,才完成了能够远程连接的服务器和客户端。哇太感动了卧槽,人生苦短我选JAVA。
第五章 简要内容
有超前课本一个章节,没关系。这一章学习的重点是”链式结构栈“,也就是学习使用链表啦。在上一章节中我学习集合的概念,并具体讨论了一种称为”栈“的集合,也顺利的利用基于数组的基本数据结构设计了一种栈的实现,而这一章我将要学习使用链式结构运行栈。
链表最关键的两个关键点是”指针(pointer)“和”结点(node)“,链表由一系列对象构成,其中每个对象指向了链表中的下一对象(当然也可以同时指向下一多个对象,但我们不学这么难),由此已经体现出了链表要优于上章数组的核心要素——无限容量。上一章中我们需要定义数组的长度,而在这一章我们不需要定义链表的长度,因为链表会按需动态增长,在本质上是没有容量的限制的。学习的重点,也转移到与链表相关的访问元素、、插入结点、删除结点之中(别乱动首结点)。王老师很良心,为我们详细地讲解链表知识后,!!没有!!让我们自己写链表栈!!太棒了!开个玩笑,JAVA API中自带有栈,用java.util.Stack和LinkedList类就能够做到栈的列表实现。好家伙,刚说完,王老师就布置了自己写LinkedStack和ArrayStack的作业要求,作业的测试项也基本都是链表实现,淦。
来来来,展示一下代码呗:ArrayList.java · 柳星宇/JAVA project - 码云 - 开源中国 (gitee.com)。
还有,要求装一个安卓模拟器genymotion和Android Station。说句老实话,除了第一次输出”hello world“后,基本没用过。对不起,我很抱歉,我罪不可赦。
第六章 简要内容
这一章的学习重点是队列和线性表(因为看到自己写的LinearNode和LinkedQueue了),课本上的题目是列表,估计和队列差不了多少吧。列表集合有三种线性结构类型:有序列表(ordered list)、无序列表(unordered list)和索引列表(indexed list),有序列表就是存放的元素之间具有某种关系的联系,联系是指事物内部各要素之间和事物之间相互影响、相互制约和相互作用的关系,具有客观性、普遍性、多样性、条件性,不好意思跑题了。无序列表与有序列表相反,内部元素基本毫无干系,把无序列表通过某种排序方式转换成有序列表,就是我们之后要学习和掌握的。最后一个索引列表,其元素可以用数字索引来引用,简单点来说就是能够访问到列表中哪个位置是哪个元素。嗯~ o(* ̄▽ ̄*)o差不多吧这些。
查找是本章要学习的两大方法之一。根据给定的某个值,在表中确定一个关键字等于给定值的记录或数据元素。常用的查找方法有线性查找法、二分查找法、分块查找法、索引查找法等。老师主要讲解线性查找和二分查找,因此我第一次学习“了哨兵”这个标志,我个人比较喜欢二分查找,因为二分查找(也叫折半查找)的方法中有先给数据排序的步骤,这我擅长呀,线性查找布置一个哨兵真不真假不假的,对于我这个榆木脑袋着实难以习得其精髓。此外还学习哈希法,再哈希法,开放定址法,数字分析法等拓展内容,只可意会不可言传。
其次是排序方式。这次期考的第二题就是排序,我是按要求用了“插入排序”、“选择排序”和“冒泡排序”。当然课上不止讲了这些排序方式(为什么老师PPT已经到第九章了呀我靠,是不是因为做结构和做方法是分开来着的(¬︿̫̿¬☆)),还有归并排序,基数排序,快速排序,堆排序,希尔排序!(气抖冷,为什么云班课上的PPT的希尔的照片删了)排序.pptx (mosoteach.cn) 二刺螈瞠怒(我咩有)
快速排序,堆排序和归并排序是最重要的三种高级排序方法 就平均性能来说,快速排序要比堆排序和归并排序速度要快 但是快速排序不稳定,最坏情况下性能会退化 堆排序基本上是原地操作,而归并排序需要大量的额外空间 归并排序是稳定的,而堆排序和快速排序是不稳定的。
言归正传啊,这次课后作业总算能够啃一些上学期的底了,梭哈!!顺便附上小作业:XuanZe.java · 柳星宇/JAVA project - 码云 - 开源中国 (gitee.com)
第七章 树与二叉树
有一说一,我真的把蛮多章的内容融到一起了。算了,反正我学了不少,我把能拿得出手的全拿出来就好了。
树与之前学习的集合不同,树是一种非线性结构,其元素被组织成了一个层次结构。树的核心是结点(node)和边(edge),元素就被储存在这些结点中,边则将一个结点和另一个结点连接起来。每一结点都位于该树层次结构中的某一特定层上。树的根(root)是树顶的唯一结点,称为根结点。树的分类有广义树,n元树,二叉树(重点)等。接下来学习最多的就是基于二叉树的数据结构知识。
第一部分学习了我们怎么合理地描述出唯一树,方式是运用树的遍历(前序遍历,中序遍历,后续遍历和层序遍历)确定唯一树,其中中序遍历必不可少,能组成唯一树的遍历必须包含两个及以上且有中序遍历的遍历。第二部分的主要内容是树的存储结构,包含:双亲表示法,孩子表示法,双亲孩子表示法,孩子兄弟表示法(WDNMD都是些什么起名鬼才取的名字呀,虽然很合理),还有二叉树的结点数,度数,层数等知识(要测试的!!!)。因此,自己搞一个BinaryTreeADT也就变的十分的合理了,嗯,是这样的。总之主要采用了链式存储结构,用链表实现二叉树,包括find和iteratorInOrede等大量代码,第一次写这么多又大又长的代码,敲得时候挺容易让人给整崩溃的。(又是燎原之火呢w(゚Д゚)w)(吐槽一下课本,BTADT留白真的太多了,脑汁榨干了也看不出方法,唉,我在B站上大学感谢各位UP和身边同学的大力支持)堆好像没有要求打代码,吧?有要求学习判断最大堆最小堆和堆排序的伪代码。左旋右旋左右旋右左旋红黑树等,基本也只要求掌握,毕竟旋转更新结点的代码确实蛮难的,听王老师说好像是啥来着。然后还有(伪)决策树,体验了一下简单的选择对错得到不同结果,相比于真正的大数据下的决策树,我的决策树凤毛麟角都称不上。
(有无相当爱马仕的姐妹?)
第八章 图
啊,总算来到最后一章了,临近期末,这真的是我学的最最最最最认真的一次(前面也很认真)。快快打起精神。
学习图,包含实际问题中的图及抽象,图的逻辑结构,图的存储结构及实现,图的基本操作,图的遍历,图中的树问题,图中的最短路径问题,活动顶点与活动边的问题。其实学期离散数学有系统的讲过关于图的概念,王老师也很巧妙的运用地图着色问题,搜索引擎网站问题,电路图等生活中“常见的”现象引入课题(我使劲夸,别挂我啊)。好吧,主要还是学习了有向图和无向图两大类。包括结点的度(有向图有出度入度),边的模等。根据两类图的不同,王老师分别在两类图的基础上进行拓展,例如无向图中的最小生成树问题(Prim和Kruskal算法),有向图的广度深度遍历,单源最短路径——Dijkstra算法,拓扑排序,AOV,AOE等。还有,死都要记住的邻接表法!!我真棒!!图-新.pptx (mosoteach.cn)。
课后实验我也是超级认真的,我脑子虽然笨,但我毅然决然地跑去问我的超人,超人也十分乐意为我答疑解惑,啊,太美了。但是考前一晚我和邻接矩阵杠上了,最后第二天考试发现第三题要用邻接表┭┮﹏┭┮。不过没关系,本次实验最难的是有向图和无向图的构造,只要吧Node的度记好,在此基础上编写方法也不是难事。最后还是感谢王志强老师的亲切呵护与爱心救助,使得我没有在考试中败下阵来(再次暗示)。人生苦短,我选王志强!!
做过的实验:
思路清晰,首先是博客园记录下的作业和实验,看我一个一个搬上来:
1、基于命令行进行简单的Java程序编辑、编译、运行和调试。
2、练习Linux基本命令;
3、学习Java程序的JDB调试技能:https://www.cnblogs.com/rocedu/p/6371262.html
4、编写简单的Java程序。
20202318柳星宇《数据结构与面向对象程序设计》实验一报告 - 柳星宇 - 博客园 (cnblogs.com)
1、 编写简单的计算器,完成加减乘除模运算。
2、要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
3、编写测试代码,测试验证。(https://www.cnblogs.com/rocedu/p/4472842.html)
20202318柳星宇 2021-2022-1《数据结构与面向对象程序设计》实验二报告 - 柳星宇 - 博客园 (cnblogs.com)
1、 初步掌握单元测试和TDD
2、 理解并掌握面向对象三要素:封装、继承、多态
3、初步掌握UML建模
4.、完成蓝墨云上 (1)-(5)实验。
20202318 2021-2022-1 《数据结构与面向对象程序设计》实验三报告 - 柳星宇 - 博客园 (cnblogs.com)
实验四:JavaSocket编程
1、Java Socket编程
2、Java和密码学:参考 http://www.cnblogs.com/rocedu/p/6683948.html
3、编写有理数/复数计算器
4、远程有理数计算器
5、远程复数计算器
6、实验报告
20202318 实验四《数据结构与面向对象程序设计》实验报告 - 柳星宇 - 博客园 (cnblogs.com)
1、链表练习,要求实现下列功能:通过键盘输入一些整数,建立一个链表;这些数是你学号中依次取出的两位数。 再加上今天的时间。打印所有链表元素, 并输出元素的总数。
2、链表练习,要求实现下列功能:实现节点插入、删除、输出操作;继续你上一个程序, 扩展它的功能;从磁盘读取一个文件,完成相关操作。
3、链表练习,要求实现下列功能:用冒泡排序法或者选择排序法根据数值大小对链表进行排序;
4、在android上实现实验(1)和(2)
5、在android平台上实现实验(3)
20202318 实验五和六 线性结构之链表 - 柳星宇 - 博客园 (cnblogs.com)
1、定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
2、重构你的代码
3、把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种)
4、参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试
5、实现排序方法等(至少3个)测试实现的算法(正常,异常,边界)
6、编写Android程序对实现各种查找与排序算法进行测试
20202318 《数据结构与面向对象程序设计》实验七报告 - 柳星宇 - 博客园 (cnblogs.com)
1、参考教材PP16.1,完成链树LinkedBinaryTree的实现,自己编写驱动类对自己实现的LinkedBinaryTree进行测试。
2、基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能
3、对自己实现的功能进行测试。
4、自己设计并实现一颗决策树提交测试代码运行截图,要全屏,包含自己的学号信息课下把代码推送到代码托管平台
5、输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
20202318 《数据结构与面向对象程序设计》实验八报告 - 柳星宇 - 博客园 (cnblogs.com)
1、初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)
2、图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)
3、 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环
4、完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出
5、完成有向图的单源最短路径求解(迪杰斯特拉算法)
20202318 《数据结构与面向对象程序设计》实验九报告 - 柳星宇 - 博客园 (cnblogs.com)
接着是云班课的“小作业”:云班课 - 活动列表 (mosoteach.cn)
(好像做过的作业和实验报告链接都在这里吧,嗯~ o(* ̄▽ ̄*)o)
代码托管链接:
应该是这样吧。加一下 132 142kB 29kB 60kB 38kB 5200 1065 2207 1420
本学期的项目(应该就这么多吧)
课程收获与不足:
终于到了最后总结了好耶( •̀ ω •́ )y。这个学期已经接近尾声,JAVA的课程也随之结束,但我对JAVA的热情却丝毫不减!一个学期下来,我从一个JAVA编程小白成长到了能够打出数百行代码的大工程的编程大白,毫无疑问是王老师含辛茹苦,数月如一日地教育和监督,由此我收获了丰富的JAVA语法知识,锻炼了使用IDEA编程的操作水平(老师对不起我真的没怎么用安卓呜呜呜~~),从使用简单命令行,到简单的排序、读写,再到后来的树,图,我一直在不断地成长。
当然,在成长过程中我也暴露了我自身许多的不足,包括但不限于课上吃东西(不是),前期对于各种新软件的烦躁和抗拒,做测试题时试图摆烂,构造大型工程时没有明确目标,喜欢借鉴(褒义词)等。但是在对操作得心应手后,也逐渐产生了自己独立完成JAVA大项目的兴趣,使得我停止浑浑噩噩的应付,而是不自觉地想要完成好任务。就算将来的我不往专业JAVA工程师的方向发展,我也会好好汲取本学期JAVA学习阶段的宝贵经验,严于律己,积极克服自身缺点。
最后,还要感谢王志强老师的陪伴,王老师对我的辛苦教学一定是意义非凡的,我一定不会辜负王老师寄予我的期待,做到成为最好的自己,不负韶华,砥砺前行!