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

一、课程内容总结

  第一章  基于Linux系统下的java开发

    首先是练习了Linux基本命令。比如,打开终端是ctrl+alt+t,新建一个终端窗口是 ctrl+shift+t,查看当前文件夹的内容是ls,新建文件夹是mkdir等等。

    其次是命令行的基本操作。比如,新建一个java程序,可以用vi  HelloWord.java,如果HelloWord.java已经存在,则该操作是打开这个程序;操作成功后,进入的是普通模式,该模式下还不能够进行程序的编写,这是通过输入i或a进入插入模式即可编写,而按Esc即可退出插入模式;在普通模式下,k.j.h.l可以分别进行上、下、左、右的操作,w可移动到下一个单词,b可移动到上一个单词,dd可以删除光标所在的行,n+dd则可以删除包括光标在内的向下数n行,yy复制光标所在整行,p在光标处粘贴;在普通模式下输入“:”,即可进入命令行模式,其中“q!”表示强制退出并且不保存,“q”表示退出,“wq!”表示强制保存并退出……编译某java程序就进行javac  HelloWord.java的操作。如果你还编写了一个类是Student.java并且该类用在了HelloWord.java里,编译时需要同时编译,即javac HelloWord.java Student.java(顺序不重要),然后进行java HelloWord 操作运行程序。但是,我把如何设置保存class文件和java文件的方法忘了QWQ。

    然后就是java程序的JDB调试。当程序运行结果不符合预期时,输入jdb HelloWord.class进入调试,stop in HelloWord.main可以在main方法开始处设置断点;输入run,程序运行,直到main()开始处停止。输入next,程序继续运行,输入list可以查看程序运行到哪一行,应用stop或clear查看设置的断点情况,输入exit退出程序。

    最后就是上传码云的操作,这个是我直接从网络上找的。网址分享一下吧:https://www.cnblogs.com/cndarren/p/12125091.html

  第二章  封装、继承、多态

       最简单的设置变量、常量等的步骤没有过多赘述。这里说一下,在java里System.out.println()表示输出括号中的信息,并且换行;设置一个不变量时需要“final  变量类型  变量名=……;”;java相比于c语言,多出了String类型和boolean类型,即字符串和布朗类型,布朗类型只能够表示真值true和假值false。需要注意数据类型之间的相互转换。  

    java关键字和语句。Java 的关键字对 Java 的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名。比如break关键词经常用在条件和循环语句中,用来跳出循环语句;continue关键字的作用是跳过循环体中剩余的语句执行下一个循环……

    java方法的定义语法。格式一般是 

 

    比如:

 

 

     当方法定义好后,需要调用才可以生效,我们可以通过main方法来调用。

     语句学习包括:if-else选择语句,switch-case选择语句,while循环语句,do-while语法,for循环语句。

    数组定义。一般定义数组:数组类型 [ ]  数组名=new 数组类型[ 容量],数据类型 [ ][ ] 数组名=new 数据类型[行的个数][列的个数];

    类:类=属性(对象具有的特征)+方法(对象所具有的具体操作);类是对象的抽象,对象是类的具体,比如王者荣耀英雄分类为辅助、射手、刺客……,这是“类”,但具体的蔡文姬、孙尚香、兰陵王……就是“对象”。

    定义类:类名+类的属性+类的方法。类中可以包含局部变量、成员变量和静态变量。  创建对象的语法:类名 对象名=new 类名();通过“对象名.属性”可以引用对象属性,通过“对象名.方法”可以引用对象方法。

    构造方法:会在创建给类对象的时候被调用。而创建对象的时候至少调用一个构造方法。构造方法的名称与类名相同,且没有返回值;当定义类中没有写构造方法时,系统会默认生成一个无参构造方法,这个构造方法什么也不会做。注意:int a=10;int b=a;时,a=b,同时a和b的内存地址相同,也就是说,当a=9,即使没有写“b=9”,最后单独输出b的值,也会变成9.!!!!!

    封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。就像一个QQ,比如我们加好友时就查找QQ好就行,但是这样我们只能看到别人对我们开放的部分,QQ相册有时需要回答问题才能够访问……就是这样,QQ号就是一个接口,有密码时我们就能够修改信息,没有密码,我们就只能够查看某些部分。  

    实现封装:1.修改属性可见性,在属性的前面添加修饰符(private)2.对每个值属性提供对外的公共访问方法,如创建getter/setter(取值和赋值)方法,用于对私有属性的访问3.在getter/setter方法里加入属性的控制语句,例如我们可以加一个判断语句,对非法输入给予否定。

    继承可以看成是类与类之间的衍生关系。比如狗类是动物类,牧羊犬类又是狗类。于是我们可以说狗类继承了动物类,而牧羊犬类就继承了狗类。于是狗类就是动物类的子类(或派生类),动物类就是狗类的父类(或基类)。通过extends继承,其特点:子类拥有父类除private以外的所有属性和方法;子类可以拥有自己的属性和方法;子类可以重写实现父类的方法;Java 中的继承是单继承,一个类只有一个父类。

    方法重载:方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。方法重载一般用于创建一组任务相似但是参数不同的方法。

    方法重写:子类可以继承父类的方法,但如果子类对父类的方法不满意,想在里面加入适合自己的一些操作时,就需要将方法进行重写。并且子类在调用方法中,优先调用子类的方法。当然在方法重写时要注意,重写的方法一定要与原父类的方法语法保持一致,比如返回值类型,参数类型及个数,和方法名都必须一致。

    多态:多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。多态的实现必要条件:继承、重写、父类引用指向子类对象(Animal  a=new Dog();则a可以引用Dog中重写的方法,但是不能够引用Dog自己的方法)。多态实现方式:继承父类进行方法重写,抽象类和抽象方法、接口实现。

    在定义类时,前面加上abstract关键字修饰的类叫抽象类。抽象类中的抽象方法不完整,仅有声明二没有方法体。一般是父类会用到抽象类。抽象类中可以包含普通方法也可以没有抽象方法,包含抽象方法的类就是抽象类。

    接口用于描述类所具有的功能,而不提供功能的实现,功能的实现需要写在实现接口的类中,并且该类必须实现接口中所有的未实现方法。接口的声明语法格式如下:

 

    注意:借口不能用于实例化对象;接口中方法只能是抽象方法、default方法、静态方法;接口成员是static final类型;接口支持多继承。

 

     包(package):使用import关键字可以导入包内的类。定义:package  包名。包的命名规范是全小写字母拼写。

  第三章  java常用类,异常处理

    Arrays类包含用于操作数组的各种方法。

    Stringbuilder类是可变的。它是String的对等类,它可以增加和编写字符的可变序列,并且能够将字符插入到字符中间或附加到字符串末尾。

    math类:包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数……

    Random类用于生成伪随机数流,在java.util包下。

    异常指不期而至的各种状况,它在程序运行的过程中发生。受检异常是编译器要求必须处理的异常,必须使用try catch处理(捕获异常),或者使用throw抛出,交给上层调用者处理。异常抛出语句“throw new 异常类();”。异常传递:如果下级方法中没有异常处理,将会把异常传递给上级调用方法。自定义一个异常类非常简单,只需要让它继承 Exception 或其子类就行。在自定义异常类的时候,建议同时提供无参构造方法和带字符串参数的构造方法,后者可以为你在调试时提供更加详细的信息。

    标准I/O输入输出流:System.in,System.out,System.err

    OO设计五原则:单一职责原则(SRP)、开放封闭原则(OCP)、Liskov代替原则(LSP)、接口分离原则(ISP)、依赖倒置原则(DIP)。

  第四章  java Socket编程

    端口(port)关系到两台电脑能否接通。

      ……………………QWQ真的忘了

  第五章 线性结构

    数据结构=逻辑结构+物理结构+算法

    集合:是一种聚集、组织了其他对象的对象。

    逻辑结构:逻辑上有一定顺序得到结构。分为线性结构、非线性结构。其中线性结构包括线性表、链表、栈、队、串、数组,非线性结构包括树、图。

    物理结构:又称为存储结构,实际上的存储结构。包括顺序结构、链表结构、索引结构、散列结构。

    数组的随机存取:只要知道位置,就能够直接读出。比如给你一列纵队的人,让你找到位置5的人,第一种方法是你从第一个位置开始一个一个往后找,直到找到魏志伟5 的人,这样就是顺序存取;而如果你已经知道5的位置,不需要经过前面的四个位置直接到位置为5 的位置,那么这样就是随机存取。

    线性表(列表List):可分为有序列表、无序列表、索引列表。栈和队是特殊的线性表。是顺序结构。

    链表(Linear):链表结构,有结点信息(data)和相邻结点地址(next),注意头引用(头指针head)、单链表初始化、头插法、尾插法、查找、删除、修改……

    栈(Stack):特殊的线性表,先进后出,有两种物理结构:顺序结构和链表结构。注意入栈(push)、出栈(pop)、读栈顶的元素(peek)、判断栈是否为空(isempty)……

      链表实现栈:top->D,next->C,next->B,next->A,null

      栈的应用:数制转换、表达式转换和计算(由原表达式求得后缀式、后缀表达式求值)。

    队列(Queue):特殊的线性表,先进先出。注意:入队、出队、循环队列。

  第六章 查找与排序

    查找又叫检索,有线性查找(哨兵)、折半查找(前提:有序列、顺序存储)、分块查找(索引顺序表)、哈希表(又叫散列表)。

    排序,可以分为内部排序(在内存中排序)和外部排序(在内存和外存中交互排序)。也可分为插入排序、交换排序(冒泡排序、快速排序)、选择排序、基数排序、归并排序。

  第七章  树结构

    1对多(现实中的树模型:家谱,单位的组织结构,计算机博弈,DNS结构)。除根结点以外的每个结点有且仅有一个直接的前驱;每个结点可以有多个直接后继。结结点有几个后继就有就有几个度。根为第一层,依次列推。

    存储结构:双亲表示法、孩子表示法、孩子兄弟表示法。

    二叉树:结点度数至多为2,至多两颗子树,有序树,子树有左右之分。所有树都能够转换成二叉树。存储结构:顺序存储结构(数组)、链式存储结构(树结点结构又叫“二叉链表”、三叉链表)。遍历:运用递归方法进行先序遍历(根左右)、中序遍历(左根右)、后序遍历(左右根)、层序遍历。应用:查询某一结点、求叶结点的个数、求树的高度、建立树的存储结构……

    满二叉树:每层都“充满”了结点。

    完全二叉树:树中所含的n和结点和满二叉树中的编号为1至n的结点一一对应(满二叉树去掉最下层最右边的若干结点)。

  第八章 二叉排序树、堆

    二叉排序树:左子树的结点都小于根结点,右子树的结点都大于等于根结点;左子树、右子树也都是二叉排序树;中序遍历时是升序数列。

      1.二叉排序树的查找算法(递归)

        首先树为空,则查找不成功;若不为空,则将给定值先与根结点比较,定值大于根结点就去右子树,反之则去左子树。

      2.在二叉排序树上插入新元素

        先查找,找到合适的位置(恰好没有这个结点),再插入。

      3.二叉排序树的删除算法

        和插入相反,删除发生在查找成功之后。

        (1)被删除结点的是叶结点;直接删除,null

        (2)被删除的结点只有左子树,或只有右子树:该结点的双亲结点直接指向该结点的孩子(左或右)结点

        (3)被删除的结点既有左子树,又有右子树:前驱结点(左子树中最大的值)或后继节点(右子树中最小的值)替换该结点,然后删除前驱结点(后继结点);若删除前驱结点(后继结点)又出现了本情况,接着进行类似操作。

    堆:是一颗完全二叉树,每个结点小于或者等于其左孩子和右孩子(小顶堆)。最小堆(小顶堆):树根(顶)是最小的数;最大堆(大顶堆):树根(顶)是最大的数,每个结点大于或者等于其左孩子和右孩子。堆的最值在根结点。

      1.插入是作为叶子结点进行插入。插入的结点数小于最小堆的顶时,需要重排序。

      2.删除最小值(小顶堆):用最后一片叶子替换根结点,在进行相关排序操作。

      3.排序(堆排序):

      (1)是对简单选择排序的一种改进。

      (2)用顺序结构存储(数组存储)最为合适(方便定位索引,方便交换)。

      (3)堆作为无序区:

        ①构建大顶堆:先将n个元素排序成完全二叉树,再从无序序列第[n/2](向下取整)个元素开始(对应于完全二叉树的最后一个非终端结点(非叶子结点,从最下面开始))进行筛选。序号为i的结点,其左孩子的序号为2i,右孩子的序号为2i+1;

        ②(针对大顶堆)排序(特殊选择排序):删除根结点,将根结点放入排序数组的最后,然后将最后的叶子结点替换到根结点,又进行筛选,恢复成大顶堆,再重复操作,数组位置向前挪一位。

      4.堆调整:①筛选:首先比较根结点和它的左孩子的大小,再比较它的右子树(一般情况),当根结点同时小于或者大于左、右孩子,则比较左右孩子,根结点按照要求与其中之一进行交换。

    最优二叉树解决平均编码长度最短问题。

    哈夫曼编码解决了最优前缀码问题。

  第九章  图

    1.图的特点:用点表示,用边表示有关系(点集、边集)。

    2.图的逻辑结构:

      (1)表示方式:集合表示、图形表示。

      (2)基本术语:有向图、无向图、稀疏图、稠密图、邻接点、关联边,边的权、网、度(出度、入度)、路径、回路、子图、连通图和非连通图、生成树……

      (3)存储:邻接矩阵、邻接表、十字链表、邻接多重表……

    3.遍历

      (1)查找:广度遍历、深度优先遍历。

      (2)最小生成树:Prime算法,Kruskal算法。

    4.图的最短路径问题(单源“单一源点”最短算法):Dijkstra算法

    5.有向无环图及其应用

      (1)AOV网:用顶点表示活动,用弧表示活动间的优先关系的有向图。

      (2)AOE网:顶点表示若干事件,弧(边)代表一些活动,弧(边)的权值表示活动持续的时间。用以研究像“完成整项工程至少需要多少时间”的问题。

二、总结所做过的作业

  作业1:实验三 面向对象程序设计(1)

  作业2:实验三 面向对象程序设计(2)

  作业3:实验三 面向对象程序设计(3)

  作业4:实验三 面向对象程序设计(4)

  作业5:实验三 面向对象程序设计(5)

  在上述5个作业中主要练习了封装、继承、多态,根据老师提供的网址进行学习和单元测试,学会了TDD的用法,理解并掌握了封装、继承、多态,能够用UML建模。成功编写了一个复数类的计算器。提高了自己的学习能力。

  作业6:封装继承多态重写重载文件字符字节读写-测试

  这个作业我偷了懒,我在上课的时候把老师的代码copy了一下,在老师的代码的基础上做了调整,当然copy得并不完整,所以还是花了些时间去理解某些语句的用法。最后还是按时按质的完成了。

  作业7:实验四(1)java Socket编程

  作业8:实验四(2)java和密码学

  作业9:实验四(3)编写有理数/复数计算器

  作业10:实验四(4)远程有理数计算器

  作业11:实验四(5)远程复数计算器

  这5个实验是搭档两人共同完成的,双方虽然都是一知半解,但是通过网络和资料查询都有所掌握,虽然过程不是特别顺利,比如两人的电脑总是连接不上,但我们还是解决了这些问题。计算器就直接捡便宜,因为前面的实验有编写过。

  作业12:实现自己的ArrayList

  这个作业我自己做的不是很满意,因为我没有编写成功,在我的ArrayList类中,我调用了java类库中自带的Arrays类。在类的方法编写上还有待提升,(实际上,我现在还有些不会QWQ)。

  作业13:ArrayStack测试

  这个作业让我印象特别深刻。我当时就编了一个Auxiliary(辅助)类,通过push()入栈的方法将五个英雄入栈,但是在进行删除测试时总是不过,当时让我记了好久,最后通过调试发现问题所在才解决。

  作业14:栈应用-进制转换

  这个进制转换主要用到模运算和简单除法运算,再加上循环语句就行了。而循环条件和进制数有关。

  作业15:最小生成树测试

  这个作业是在课堂完成的,刚上完课就做的,但是最后因为有个地方有些小问题,就不了了之了(?应该吧)。这个作业就是让我们真正的理清楚Prime算法和Kruskal算法的本质。

三、实验报告链接汇总

  实验一  《Linux基础和Java开发环境》:Linux系统下的VIM操作和java编写

    链接:20202320 2021-2022-1 实验一《Linux基础和Java开发环境》实验报告 - 20202320-陈欢 - 博客园 (cnblogs.com)

  实验二  《数据结构与面向对象程序设计》:简单计算器

    链接:20202320 2021-2022-1《数据结构与面向对象程序设计》实验二报告 - 20202320-陈欢 - 博客园 (cnblogs.com)

  实验三  《面向对象程序设计》:TDD,掌握封装继承多态和UML建模

    链接:20202320 2021-2022-1 实验三《面向对象程序设计》实验报告 - 20202320-陈欢 - 博客园 (cnblogs.com)

  实验四  《数据结构与面向对象程序设计》:Java Socket编程、远程计算器

    链接:20202320 实验四 《数据结构与面向对象程序设计》实验报告 - 20202320-陈欢 - 博客园 (cnblogs.com)

  实验五和六  《数据结构与面向对象程序设计》:链表的插入、删除、输出、排序,Android平台开发设计

    链接:20202320 2021-2022-1 《数据结构与面向对象程序设计》实验五和六报告 - 20202320-陈欢 - 博客园 (cnblogs.com)

  实验七  《查找与排序》:实现至少三个排序方法,要求不少于10个测试用例,编写Android程序对实现各种查找与排序算法进行测试

    链接:20202320 2021-2022-1 实验七《查找与排序》实验报告 - 20202320-陈欢 - 博客园 (cnblogs.com)

  实验八  《数据结构与面向对象程序设计——树》:完成链树、构造唯一一颗二叉树、设计并实现一颗决策树、表达式转换(中缀转后缀)

    链接:20202320 2021-2022-1 实验八《数据结构与面向对象程序设计——树》实验报告 - 20202320-陈欢 - 博客园 (cnblogs.com)

  实验九  《数据结构与面向对象程序设计——图》:构建有向图和无向图,实现图的遍历、有向图的拓扑排序和单源最短路径求解、完成无向图的最小生成树

    链接:20202320 实验九《数据结构与面向对象程序设计——图》实验报告 - 20202320-陈欢 - 博客园 (cnblogs.com)

四、代码托管链接:2023Java_DS/陈欢20202320 (gitee.com)

  

 

 

 

 五、课程收获与不足

  收获:肯定是学到了新的事物,可以回家和别人炫耀“诶!我会Java!”,但是学的不精,现阶段的学习,我只能够叫做略懂。正如老师所说,今年我们的课业压力小了不少,同时,我也不是一个非常自律的人,所以我的投入并不算多。我是属于上课可以很认真的人,很多知识我都懂,但就是懒 ,不想自己动手,即使有现成的代码,也懒得敲QWQ。所以效果也不是很好,经常DDL。

  改进:上面也说过了,不够自律和勤奋。但是活到老,学到老,还是需要有这样的坚持。

 

posted @ 2022-01-02 23:52  20202320-陈欢  阅读(95)  评论(1编辑  收藏  举报