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

      • 课程内容总结

        • 第一章 简要内容
          • 其实说实在的,哈哈哈哈,第一章,我不是很记得来着,我记得上课之前需要安装虚拟机和基本配置环境,我。。。上第一节课的时候就没装好,所以印象还挺深刻的,所以接下来说点基本点。
          • 简要介绍了计算机的组成、基础的面向对象程序设计思想与Java程序的一些编写原则。
          • 在我的理解里,面向过程注重于分析并解决问题所需要的具体步骤,是一个更注重细微处的微观思想;面向对象是从一个相对宏观的角度出发,把构成问题的事件分解成许多系统——即对象,然后设计这每个对象中以组为单位的行为。
          • 了解了计算机的基本结构,也学习到了基本的Java程序的结构(比如方法体,方法头之类的),包括Java中各种关键字,标注体,标识符之类的。
          • 深刻认识了“类”这个新鲜的名词,即构建程序的蓝图。
          • 还偶然了解了git的用法,虽然上课并没有教,而且自己学得很吃力来着。。
        •  
        • 第二章 简要内容
          • 主要讲的是数据和表达式,介绍了字符串连接、变量和赋值、基本数据类型等编写程序所需了解具备的基础知识,与读输入数据等最简单的语句使用方法
          • Java中三种输出方法:print输出不换行;println输出且换行;printf允许打印包含数据值在内的格式化字符串
          • “+”的使用方法:连接字符串;用于加法的算术运算符
          • 特殊的转义字符:
          转义字符含义
          \" 双引号
          \' 单引号
          \\ 反斜杠
          • 一般不能将一个类型的变量的值赋值给与之不匹配的另一个类型的变量,但若要用于强制转换数据类型,可以使用直接赋值来进行转换。赋值转换中加宽转换是允许且不会丢失数据的,缩窄转换会引起编译程序的错误信息,信息容易丢失
          • 关键字final说明该被声明的标识符是常量
          • 各类型常量的声明:
            26
        • 第三章 简要内容
          • 主要讲的是使用类和对象,介绍了几个常用的类及其方法,如String类、Random类、Math类以及可用于格式化输出的NumberFormat和DecimalFormat两个类;进一步揭示了包、类、对象、方法之间的关系
          • 读输入数据:Scanner类
            • 调用Scanner类的方法——创建一个对象:Scanner scan = new Scanner(System.in);
            • System.in对象代表标准输入流
            • Scanner类的next方法用来读入不同类型的数据
          • new运算符创建对象时,先调用构造方法来创建它。构造方法是与类同名的一个特殊方法。
            • 创建String对象时,不用特意调用new运算符,因为当出现字符串常量时,系统会自动创建一个String对象。
          • 别名:指向同一个对象的不同的引用变量(reference variable)
          • String类
            • String对象是不可变的,但String类中的方法可以修改原字符串。
            • 方法是对一个具体对象施加的,所以该对象被方法修改时的状态会影响执行的结果
          • import声明
            • 除了java.lang包中的类是自动使用的以外,若要调用其他包中的类,需要使用一个import声明
            • *号代表包中可能会用在程序中的任何类
          • Random类
            • 可用于生成伪随机数
            • int nextInt(N)-M方法:生成0-M~N-1-M范围内的int型随机数
            • float nextFloat()*N-M方法:生成0-M~N-1-M范围内的float型随机数
          • Math类
            • 所有方法都是静态方法,不需要事先实例化对象
            • 可计算绝对值、余弦、正弦等来解决数学问题
          • 格式化输出
            • NumberFormat:含有两个方法可用于返回货币格式与百分比格式
            • DecimalFormat:模式化字符串“0.###”可用于格式化小数的输出
          • 进一步揭示了包、类、对象、方法之间的关系,简要理解就是:包 > 类 > 对象 > 方法,且基本类型值也可以“包装”为一个对象。每个类都属于一个具体的包,类作为对象的蓝图可以创建多个对象,用了对象就有了实例,可以调用具体的方法来达到应用的目的。
        • 第四章 简要内容
          • 在重温了类是对象的蓝图等基础概念后,进一步拓展了如构造方法、封装、局部数据等的知识概念。
          • 接着介绍了UML类图,还有参数的介绍。
          • 可见性修饰符:public,private,protected,私有的数据只能在类的方法内访问,这样可以提高程序的安全性。
          • 引入了测试的概念,其运行原理大致是通过编写测试代码来测验代码的缺陷,通过测试来完成代码,好的测试是发现错误的测试。
          • 最重要的介绍就是面向对象三要素之一:封装。封装如包装,却绝不仅限于此。封装既能做到控制外部对内部隐藏属性的操作行为,提高程序的安全性,还能降低模块之间的耦合性,使之相互独立,让系统不易崩溃。
        • 第五章 简要内容
          • 大题目为编写类,是进一步讨论了类和对象所涉及的技术。在重温了类是对象的蓝图等基础概念后,进一步拓展了如构造方法、封装、局部数据等的知识概念。更重要的是引入了测试的概念,其运行原理大致是通过编写测试代码来测验产品代码的缺陷、运行,从而达到完善代码的目的。
          • 迭代器
            • hasNext()方法:判断还有没有下一个元素
            • next()方法:取出集合的下一个元素
            • for循环:用来遍历数组和集合
          • 类与对象:
            • 类是对象的蓝图
            • 对象有一个状态(state),它由与对象相关的属性(attribute)来定义
            • 对象还具有行为(behavior),这由与对象相关的操作(operation)来定义
            • 类的数据和方法都称为类的成员
          • 构造方法:
            • 与类同名的特殊方法
            • 常用于初始化每个对象对应的变量
            • 不能有返回值,即使是void也不允许
            • 若没有提供构造方法,系统会自动创建并使用一个默认的不带参数的构造方法
          • 可见性修饰符:public,private,protected
          • 访问方法和设值方法:
            • 实例数据通常被设为私有的,访问方法getX与设值方法setX可以控制管理数据
          • 参数:
            • 形参(formal parameter):方法声明头部的参数名称
            • 实参(actual parameter):调用方法时传给方法的值
          • 局部数据:在类中但不在任何方法内声明的数据
          • this引用:this是一个保留字,能让一个对象指向自己
          • 方法重载:两个或多个方法具有相同的名字
          • 测试:通过测试来完成代码,好的测试是发现错误的测试
        • 第六章 简要内容
          • 主要讲判断与循环,与第五章内容差不多,主导判断与决策。
          • switch语句将指定的句子主要与case语句中的值进行搭配使用
          • do语句与for语句常用来进行循环。
        • 第七章 简要内容
          • 本章主要内容主要讲的是数组,可以将数据进行修改或者排列,然后方便我们去进行修改以及存储,Arraylist类就是通过数组实现的。而且数组必须是实例化对象,对于边界值的测试也是十分重要的。
        • 第八章 简要内容
          • 面向对象三要素之一:继承。本章解释了继承的概念,引出了组织并创建类的基础,即父类及子类间的关系。简要可理解为父类是一个较为抽象的类,子类要具体一层,子类的子类便会更加具体下去,兄弟(sibling)间层次相同。保留字extends来说明从已有类中派生一个新类。
          • protected修饰符:保护可见性提供了继承之间最恰当的封装机制
          • super引用:常用于调用父类的构造方法
          • 多重继承:一个子类继承于多个父类
          • 方法重写:子类可以重写继承自父类的方法
          • Object类:
            • Java的所有类都直接或间接地派生于Object类,Java程序中的每个类都继承了toString和equals方法

          • 抽象类:
            • 抽象类不能实例化
            • 派生于抽象父类的类必须重写父类中的所有的抽象方法,否则派生的类仍为抽象类
          • final修饰符:
            • 可用来限制继承
            • 可用于整个类,终极类不能被继承。
        • 第九章 简要内容
          • 面向对象三要素之一:多态 本章介绍了面向对象程序设计三要素的最后一个要素:多态。它是指一个在不同时刻可以指向不同类型对象的引用变量。也分别介绍了用继承、接口实现多态,也进一步深化了继承和接口的知识概念体系。
          • 用继承实现多态
            • 引用变量可以指向声明继承于它的任意类的任何对象
            • 对象的类型决定调用的是方法的哪个版本
          • 接口
            • 接口是一组抽象方法,不能被实例化
            • 实现接口:一个类给出了接口中定义的每个抽象方法的实现
            • 实现接口的类在类头使用保留字implements
            • 多个类可以实现同一个接口
            • 一个类可以实现多个接口
          • 接口层次
            • 继承可用于接口,所以一个接口可派生于另一个接口
            • 实现子接口的任何一个类必须实现所有的方法
            • 接口中的所有成员都是公有的
          • Iterator接口
            • 用来表示类的一组对象,提供一种从头至尾每次访问一个对象的机制
            • hasNext返回一个布尔结果;next返回一个对象
          • 用接口实现多态
            • 接口名可用来声明对象引用变量
            • 接口引用可以指向实现这个接口的任意类的任何对象
            • 方法参数可以是多态的
        • 第十章 简要内容
          • 主要对于Java程序中出现的错误和异常进行了讨论。分别介绍了异常的主要种类、异常的处理方式、try-catch语句、异常的传播等知识。
          • 处理异常
            • 不处理异常
            • 在异常发生的地方处理
            • 在程序的其他地方处理异常
          • try-catch语句
            • 一个try块可以有几个catch语句
            • 执行try块期间无论在哪里出现异常,控制将立即转向对应的catch处理器
            • 无论以何种方法退出try块时都要执行finally子句
          • 异常传播
            • 若在发生异常的方法内没有捕获并处理它,控制立即转向产生异常的这个方法的调用方法;异常会这样一直被传播,直到捕获并处理它,或是传出main方法,后者将导致程序中断
          • 必检异常和免检异常
            • 必检异常必须被一个方法捕获,或者必须列在抛出它或传播它的任意方法的throws子句中;只有RuntimeException或其后代类的对象才是免检异常
        • 第十二章 简要内容
          • 主要讲的是算法分析 从算法效率角度分析了软件开发的目标,介绍了算法分析的概念,引进了增长函数与时间复杂度的概念。通过比较不同的算法的增长函数与时间复杂度来分析算法的效率。
          • 记算机系统中最重要的资源之一是CPU时间。完成具体任务的算法效率是决定程序执行速度的一个主要因素。
          • 增长函数显示了与问题大小相关的时间或空间利用率。
        • 第十三章简要内容
          • 主要介绍了查找和排序的概念,通过举出不同的例子来具体说明。查找部分以线性查找和二分查找为例,比较了二者的优劣与各自特性;排序部分以选择排序、插入排序、冒泡排序、快速排序、归并排序为例,详细介绍了每一种排序方法的思想与运作机制,比较了各算法之间的时间复杂度。
          • 查找
            • 查找是指在一组数据项中找到指定的目标元素
            • 线性查找
              • 扫描整个表,依次将每个值与目标元素进行比较,退出情况为找到目标或扫描至表尾。
              • 1
            • 二分查找
              • 首先,二分查找可应用的数据项必须是有序的
              • 每次查找从中间开始,每次与所选值进行比较后可以减少查找池中一半的元素。
              • 2
            • 比较分析:一般情况下,二分查找比线性查找更有效,但二分查找只可应用于有序的表。
          • 排序
            • 排序是按某种标准将一列数据项按确定的次序重排的过程
            • 选择排序
              • 扫描整个表,分别将每个值放到排好序的最终位置,从而完成一组值的排序
              • 循环中的判断语句条件的更改,可决定排序的形式:升序或降序
            • 插入排序
              • 重复地将一个具体的值插入到表中已有序的子序列中
            • 冒泡排序
              • 扫描整个表,重复地比较表中的相邻元素,如果呈逆序就交换
              • 3
            • 快速排序
              • 先选择表中的一个元素作为划分元素,小于划分元素的所有元素放到划分元素左侧,大于划分元素的所有元素放到它的右侧
              • 当扫描过程在划分点相遇时,划分完成
            • 归并排序
              • 归并排序递归地将表平分为两部分,直到每个子表中只含有一个元素,然后将这些子表归并为有序表,从而完成排序
            • 比较分析:选择排序、插入排序、冒泡排序都有着相近的效率,时间复杂度皆为O(n^2),但是插入排序的最优情形依赖于初始数据的情况,可以为O(n)。
        • 第十四章 简要内容
          • 引进了这个“先进后出”的线性集合的概念,介绍了栈相关的push,pop,peek等操作。与继承、多态的知识相关联引出了泛型的概念,并以计算后缀表达式为例演示了栈的应用。
          • 栈是一个线性集合,处理方式是后进先出。
          • 泛型的使用:可以定义一个类,它保存、操作并管理直到实例化时才确定类型的对象。
        • 第十五章 简要内容
          • 引进了队列这个“先进先出”的线性集合的概念,介绍了队列的enqueue,dequeue等操作。介绍了循环数组解决队空队满情况的方法。
          • 队列是一个线性集合,处理方式是先进先出。
          • 采用数组实现队列时,把数组看成是一个环,可以避免移动元素。
        • 第十六章 简要内容
          • 介绍了另一种数据结构:树。不同于之前学习的栈、队列、链表等线性集合,树是一种非线性集合,其中的元素组织为层次结构。本章还介绍了包括树的分类、四种遍历树的方法在内的知识,完善了树的基本知识的框架。
            • 树是非线性结构,其中的元素组织为层次结构
            • 树只有唯一的根结点
            • 树的度表示树中任意结点的最大子结点数
            • 有m个元素的平衡n叉树的高度是logn(m)
          • 结点
            • 没有任何子结点的结点称为叶结点
            • 结点的层是从根到该结点的路径长度,而路径长度为从根到该结点的路径上的边数
          • 树的遍历
            • 先序遍历:访问根,自左至右遍历子树
            • 中序遍历:遍历左子树,再访问根,然后自左至右遍历剩余子树
            • 后序遍历:自左至右遍历子树,最后访问根
            • 层序遍历:从树顶到树底,从左至右访问每个结点
              • 进行层序遍历时可用队列来存储树中的元素
          • 数组计算链
            • 对于存储在数组中位置为n的元素,元素的左子结点存储在(2n+1)的位置,元素的右子结点存储在(2*(n+1))的位置
            • 树的基于数组的存储链实现方式可以占据数组中的连续位置,不管树是不是完全树
          • 二叉查找树
            • 对于二叉查找树的每个结点,左子树上的元素小于父结点的值,右子树上的元素大于等于父结点的值
            • 最有效的二叉查找树是平衡的,所以每次比较时可以排除一半的元素
            • 删除元素时需要考虑的三种情况
              • 叶结点
              • 有一个子结点
              • 有两个子结点
        • 第十九章 简要内容
          • 主要介绍了另一种非线性数据结构:图。与树不同的是,图没有特定的父子关系,图中的结点可以与许多其他的结点相连接,所以从另一个角度来说,树就是图。本章从图的两种分类:无向图与有向图介绍起,解释了各自的概念与异同,并扩展知识应用,延伸出了如广度优先遍历、深度优先遍历、带权图、最小生成树等知识。
          • 无向图
            • 表示边的顶点对是无序的
            • 如果图中两个顶点之间有边连接,则称它们是邻接的
            • 含有最多条边的无向图成为完全图
            • 无向图中的路径是双向的
            • 若无向图中任意两个顶点间都有路径,则无向图称为连通的
          • 有向图
            • 边是顶点的有序对
            • 有向图中的路径是连接图中两个顶点的有向边的序列
              1
          • 带权图
            • 每条边上都对应一个权值的图
            • 应用:计算最小路径;构建最小生成树
              2
          • 遍历方式
            • 广度优先遍历
              • 类似于树的层序遍历
            • 深度优先遍历
              • 类似于树的先序遍历
            • 图的深度优先遍历与广度优先遍历的主要差别在于用栈代替队列来管理遍历过程
          • 测试连通性
            • 当且仅当从任意顶点开始的广度优先遍历中得到的顶点数等于图中所含的顶点数时,图是连通的
          • 最小生成树
            • 生成树是包含图中所有顶点及图中部分(可能不是全部)边的一棵树
            • 最小生成树是其所含边的权值之和小于等于图的任意其他生成树的边的权值之和的生成树
          • 邻接矩阵
            • 用一个二维数组的每个位置表示图中两个顶点的交叉点,在每个这样的交叉点用一个布尔值来表示两个顶点是否邻接
      • (按顺序)总结所做过的作业
        • 作业1:(谢谢,这玩意儿啊,当时人快吓傻了)
          • VirtualBox虚拟机的安装
          • Linux操作系统的环境配置以及JDK的安装
          • 想法:Linux的操作方式是完全命令行操作,与过往熟悉的Windows图形界面操作方式截然不同。无法再使用鼠标来点击操作,操作全依赖于命令的形式,而且在第一次接触码云的时候,我不会啊,对心里造成了一定的物理伤害。
        • 作业2:实验三 面向对象程序设计(1)
        • 作业3:实验三 面向对象程序设计(2)
        • 作业4:实验三 面向对象程序设计(3)
        • 作业5:实验三 面向对象程序设计(4)
        • 作业6:实验三 面向对象程序设计(5)
        • 作业7:编写一组程序,要体现一下知识点:
          (1)继承
          (2)多态
          (3)重写
          (4)重载
          (5)目录创建
          (6)文件创建
          (7)字节流读写
          (8)字符流读写
          • 想法:在逐渐掌握学习技巧之后,这次作业也是对自己的一个锻炼,而且相对于大部分程序,上课的时候也都实践过,问题我觉得不大。尝试了自己编写简单的类,并在主方法中实例化并调用自定义类的中的方法,就是在相互的连接与应用中有些不大熟练。
        • 作业8:实验四(1)java Socket编程
        • 作业9:实验四(2)java和密码学
        • 作业10:实验四(3)编写有理数/复数计算器
        • 作业11:实验四(4)远程有理数计算器
        • 作业12:实验四(5)远程复数计算器
        • 作业13:ArrayStack测试
(1)撰写自己的类;
(2)提供StackADT,ArrayStack(框架),实现ArrayStack里面的剩余方法;
(3)编写测试类,测试所写的方法是否正确。
        • 想法:之前其实自己实践过这个东西,所以在课堂测试的时候时间相对充足,面对自己编写的一个栈,用数组实现栈是比较容易的。这个时候的栈其实更像是访问受限的数组,数组可以通过下标访问,查找,插入等,但是栈只能从栈顶,或者说数组的末尾进行操作,我们只需要一个指针记录栈顶即可。我觉得提前实现好真的nice!
      • 作业14:
        栈应用-进制转换,
        算法基于原理:     N = (N div d)×d + N mod d  
        例如:(1348)10 = (2504)8 ,其运算过程如下:
                N        N div 8        N mod 8
             1348           168                 4
               168             21                 0
                 21               2                 5
                   2               0                 2
        
        要求输入一个十进制数,转换成任意进制数并输出。
        • 想法:其实这个实验里就实践过,而且大部分实现方法体都已经写好了,然后自己编一下或者上网搜一下进制转换就完全ok的。
      • 作业15:最小生成树测试
        1.画出Prim算法的最小生成树的生成过程
        2.画出Kruscal算法的最小生成树的生成过程
        3.计算最小权值
        
        评分
        (1)Prim(2分)
        (2)Kruscal(2分)
        要求画出过程
        • 想法:主要是我自己上课之后,然后马上实践,最后的结果是先Kruscal算法得出结果,然后反推第一种情况,我觉得我真的是很聪明!!!
      • 作业16:如果愿意的话,还有最后一次测试,就是期末。。(数据结构知识点大杂烩)
        • 想法:我会写,我可真棒!!!!!!!
    • (按顺序)实验报告链接汇总

        • 实验一:Linux基本操作与简单Java程序编写
          • 基于命令行和IDE Intellj IDEA 简易教程
          • 进行简单的Java程序编辑、编译、运行和调试。
          • 练习Linux基本命令;
          • 学习Java程序的JDB调试技能
            编写简单的Java程序。
        • 实验二:编写简单程序并测试
          • 编写简单的计算器,完成加减乘除模运算。
          • 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
          • 编写测试代码,测试验证。
        • 实验三:IDEA的使用、测试代码、UML图的绘制
          • 下载安装并使用IDEA
          • 初步掌握单元测试和TDD
          • 理解并掌握面向对象三要素:封装、继承、多态
          • 初步掌握UML建模
        • 实验四:Socket编程与密码算法
          • Java Socket编程
          • Java和密码学
          • 编写有理数/复数计算器
          • 远程有理数计算器
          • 远程复数计算器
        • 实验五和六:数据结构——链表
          • 设计链表并打印链表元素
          • 实现链表的插入、删除、输出操作
          • 使用冒泡排序法或选择排序法对链表元素进行排序
          • Android实现以上实验
        • 实验七:查找与排序
          • 定义一个Searching和Sorting类
          • 重构代码并命令行运行
          • 在Searching中补充查找算法并测试
          • 补充实现课上讲过的排序方法
          • 编写Android程序对实现各种查找与排序算法进行测试
        • 实验八:数据结构——树
          • 参考教材PP16.1,完成链树LinkedBinaryTree的实现
          • 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能
          • 自己设计并实现一颗决策树
          • 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
        • 实验九:数据结构——图
          • 初始化无向图和有向图
          • 完成有向图和无向图的遍历(深度和广度优先遍历)
          • 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环
          • 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出
          • 完成有向图的单源最短路径求解(迪杰斯特拉算法)
    • 代码托管链接:

      • 码云连接:实验,课本以及其它代码。
      • 给出statistic.sh的运行结果,统计本学期的代码量。
    • 课程收获与不足

      • 自己的收获(投入,效率,效果等)
        • 其实刚接触的时候,真的是感觉很难,在自己编程的过程中,最初始设计程序的时候,总是会思考的过于复杂,导致很多代码都很冗余。但在继续编程的过程中,随着对程序和目标的进一步深入理解,我会回头去删减一些无用代码,或者用更精简的代码实现同样的功能。这并不是无意义的,许多时候重新提炼的代码能更完美地契合程序的目标,而最初的代码往往不能通过动态测试。积极主动敲代码我自认为还是做到了的。在课程的学习过程中,我越发发现,如果代码不自己亲手敲一遍,只是凭借“观察法”去体会代码的意思,学习效果是很差的。自己亲手敲一遍,就算不是自己设计的,是有所借鉴的,在敲的过程中也能更好的去领会原编程者的与该程序所涉及的思想、知识等。虽然都是在照着书上的代码敲,但是亲手敲下来与只是看一遍的差别还是很大的。自以为看过一遍代码就能理解的我,最后花了远远超过预期的时间才完成作业。我觉得自己最大的收获就是独立解决问题的能力大大提高了。最一开始学习的时候,遇到某些问题卡壳久了就会倾向于去寻找各种帮助,向老师、同学,他们总是乐意放下手头的事情为我解答疑惑,尤其是小公主每次都和耐心地叫我们,而不是授我以鱼。久而久之,我养成了独立思考的能力,也能做到独立解决问题了。
      • 自己需要改进的地方
        • 编程能力还是有所欠缺。特别是课程进行到数据结构的部分时,难度经常把我劝退,很多时候我也是放弃了自己去摸索而是去各处寻找借鉴,这是一个很大的不足需要改进。我自己的耐心也很有限,尤其是我自己并不是天赋型选手,而且难度超出预料的时候也很痛苦,往往对待程序就会有摆烂的心态,虽然这些情况还时常发生,但我会努力的,毕竟我不得不写哈哈哈哈哈哈哈哈哈哈,好痛苦啊,期末完了还得写报告,好的吧,老师同学们新年快乐啊,我爱大家!!!!!!!!!!!
posted @ 2022-01-02 21:34  20202303马澜  阅读(79)  评论(1编辑  收藏  举报