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

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

  课程内容总结

  第一章:引言——Java程序设计入门

 

  1. Java是一种面对对象的编程语言。
  2. Java编程语言中,程序是由一个及以上的类所组成,类中包含一个及以上个方法。
  3. 习惯上以“骆驼体”命名我们的类,如:public class JavaSocket。
  4. 类名下书写可运行的方法体:public static void main(String[ ] args){},即方法头psvm,大括号中书写方法体。
  5. 命令行基本操作:cd  进入某目录、cd .. 进入上级目录、ls 列出当前目录下的文件、rm 删除当前目录下某个文件、mkdir  创建文件夹、cp 复制某文件至某地址、mv 将某文件转移或重命名、man  查找命令的使用方法等、vi/vim 创建文件并进入编辑、“//”或“/* */”或“/** */” 注释代码 等等

 

  第二章:数据与表达式

 

  1. 字符串的输出采用System.out.print/println("XXX");
  2. 数据类型分为整形和浮点型(byte、int、float等)、字符型(char)、布尔型(Boolean等)

    基本类型:byte,short,int,long,float,double,boolean,char;

    数字类型:byte,short,int,long,float,double;

    整数类型:byte,short,int,long;

  3. 算数表达式包括:+-*%/,要注意前后的数据类型是否需要强制转换。
  4. 常量、变量的定义:int AB = 10;(定义变量AB)final int MAX_AB=10;(定义常量MAX_AB)。
  5. 其他运算符:++、--、+=等。
  6. 类型转换与强制类型转换:赋值类型转换;提升类型转换;强制类型转换;(压缩类型转换可能丢失信息)。
  7. Scanner类提供了一些从不同数据源读取各种类型数据的方法。
  8. debug调试,设置断点。

 

  第三章:类与对象

 

  1. String类:String用于操作字符串,但需要提前声明String name=new String。
  2. new运算符返回对新创作对象的引用。多个引用变量可以引用同一对象。
  3. 在Java中文件通常放在包中用于归纳整理与调用,并放在java标准库中。Java标准类库是按包分组的 。
  4. 随机数的生成:Random()。
  5. 数学方法的使用:Math类。Math类的所有方法都是静态方法,通过类名称即可调用它们。
  6. 枚举方法: enum Grade{a,b,c,d,f};
  7. 包装器类:Integer.parselnt( )  Integer.toHexString( )。包装器类如下将基本类型数据作为对象管理。

 

  第四章:OO设计

 

  1. OO是指“Object Oriented”,即面对对象的设计模,包括封装、继承、多态三大类。
  2. 在枚举类型的类定义中可以增加属性和方法,枚举类型得到值是具有该枚举类型的静态变量,静态变量由类的所有实例共享。
  3. 类间关系:若是一个类需要另一个类中包含有的方法,那么可以根据情况使用静态方法或非静态方法进行实现。
  4. java中常用到接口的使用。抽象的方法使用abstract,实现接口使用implement,类若是调用接口,便可以使用接口中的方法了。
  5. 接口是抽象方法的集合,因而不能被实例化。常用接口有以下两个:Comparable和Iterator。
  6. 封装:就是将抽象性的接口的实现细节部分包装、隐藏的过程。修改属性的可见性来限制对属性的访问(一般限制为private)。
  7. this关键字的使用时调用自己类中的方法,避免与其他类中相同名称的方法搞混。
  8. 继承:就是使得子类对象具有父类的方法。在 Java 中通过 extends 关键字可以申明子类是从父类继承而来的。需要注意的是 Java 不支持多继承,但支持多重继承。使用super引用可以调用父类的构造方法。子类方法可重写(重定义)它所继承的父类方法。
  9. 多态:在同一个接口下,能够使用不同的实例并执行不同操作。多态性允许用一致性的方法实现不一致的行为。
  10. 程序测试绝不能保证程序已没有错误存在,成功的程序就是能够发现错误的程序,对程序所有可能的输入数据和用户操作进行穷尽式的测试是不现实的。

 

  第五章:线性表

 

  1. 线性表定义:线性表是具有相同数据类型的元素构成的一个有限序列。线性表属于线性结构。
  2. 结点类型队列定义为:LinearNode<T>;链队列类型队列定义为:LinkedQueue<T>。其中front表示队头指针,rear表示队尾指针。
  3. 队列是一段连续的空间以存储元素,因此我们设定了两个指针进行指示操作。在非空队列中,front指向队头元素,rear指向队尾元素的下一个空位。
  4. 如果队列是循环的,那么移动指针的时候要i=(i+1)%MAX。
  5. 线性表的实现可以用数组来完成,因为线性表中的元素可以随意添加,因此数组中的元素需要不断移动。与之匹配的是ArrayList类,这是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,可以添加或删除元素。其中的方法有:add( )——添加元素;get( )——访问元素;set( )——修改元素;remove( )——删除元素;size( )——计算大小;
  6. 而在链式的线性表中,我们使用到的是LinkedList类,其用法基本上与ArrayList一致,不过在几种情况下提供了更高效的方法,如,addFirst( )——在列表开头添加元素;removeFirst( )——在列表开头移除元素;getFirst( )——获取头部元素;getLast( )——获取列表结尾元素等。

 

  第六章:栈

 

  1. 栈是一种线性集合,其元素的添加和删除都是在同一侧进行了,特性是先进后出,后进先出的原则,即只允许在表尾插入和删除的线性表。允许插入和删除的一段叫做栈顶(top),而将另一端称为栈底(bottom)。
  2. 表达式有三种标识法,分别是前、中、后缀表示法。其中,前缀表示法的操作是,连续出现的两个操作数和在前面紧靠着它们的运算符构成表达式。后缀表示法是指运算符的顺序就是表达式的运算顺序。中缀表达法是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间。
  3. 栈的优点是,存取速度快,且栈之间的数据可以共享;缺点是缺乏灵活性,存于栈中的数据大小和生存期必须确定。
  4. 栈的初始化命令为:stack,基本操作和命令有isEmpty( )——判断栈是否为空;add()——返回true或false;peek( )——取栈顶值;push——入栈;pop( )——出栈;size——返回栈的元素数目。

 

  第七章:查找与排序

 

  1. 查找是根据所确定的数在表中寻找等同的记录或元素的过程。常用的方法有线性查找法、二分查找法、分块查找法、索引查找法。
    • 线性查找,也就是顺序查找。遍历表中所有元素,只适用于表中元素数量少的。
    • 折半查找,也叫二分查找。从中间开始,要求表是有序的,每次比较后可以减少查找池中的一半元素。
    • 分块查找,是折半查找和顺序查找的改进方法。即先二分查找,再线性查找或先线性查找再二分查找。
    • 哈希表算法,它可以提供快速的插入操作和查找操作。通过关键字找到存储地址,不论哈希表中有多少数据,插入和删除,只需要接近常量的时间即0(1)的时间级。
  2. 由于需要量化查找的效率,我们引进了ASL(平均查找长度),ASL=PiCi累加运算,若每一个元素被查找的概率相同,则查找每一个元素所需的比较次数之和再平均就是ASL。
  3. 排序是这样一个过程,即基于某一标准,将某一组项目按照某个规定顺序排列。
  4. 选择排序算法通过反复地将某一特定值放到它在列表中的最终已排序位置从而完成对某一列表值的排序。
  5. 插入排序算法通过反复地将某一特定值插入到该列表某个已排序的子集中来完成对列表值的排序。
  6. 冒泡排序算法通过重复地比较相邻元素且在必要时将它们互换,从而完成对某个列表的排序。
  7. 快速排序算法通过将列表分区,然后对这两个分区进行递归式排序,从而完成对整个列表的排序。
  8. 归并排序算法通过将列表递归式分成两半直至每一子列表都含有一个元素,然后将这些子列表归并到一个排序顺序中,从而完成对列表的排序。
  9. 基数排序是基于队列处理的。

 

  第七章:树与二叉树

 

  1. 树是n个结点的有限集,有且仅有一个特定的称为根(root)的结点,当n大于1时,其余结点可以分为m个互不相交的有限集,每个集均为树且不相交。
  2. 结点的层次:根为第一层,其他的依次增加。
  3. 树的深度:节点的最大层次;
  4. 有序/无序树
  5. 基本操作:查找类、插入类、删除类
    • getRoot( );——返回根结点
    • getParent( );——返回父结点
    • getChildCount( );——返回孩子结点数
    • getFirstChild( );——返回第一个孩子结点
    • getNextChild( );——返回下一个兄弟结点
    • isEmpty( );——判定树是否为空
    • depth( );——求树的深度
    • traverse( );——遍历树
    • tree( );——初始化一棵空树
    • insert();——插入结点
    • delete( );——删除操作
  6. 存储结构:双亲表示法、孩子表示法(1.多重链表;2.孩子链表)、双亲孩子表示法、孩子兄弟表示法。
  7. 二叉树:子树有左右之分,结点度数至多为2。
  8. 满二叉树:每层都“充满”结点的二叉树。
  9. 完全二叉树:满二叉树去掉最下层最右边若干结点。
  10. 二叉排序树:左子树小于父结点,右子树大于或等于父结点。
  11. 平衡二叉树、二叉排序树的平衡化(AVL树)
  12. 最优二叉树:平均编码长度最短。最优前缀码——哈夫曼编码。

 

  第八章:图

 

    1. 图是一种非线性的数据结构,一般用于反映数据所对应元素之间的几何关系和拓扑关系;
    2. 无向图:任意两个顶点之间的边都是无向边。
    3. 有向图:图中所有边都是有向边。
    4. 邻接点:边的两个顶点。
    5. 边的权:图的边带有与边相关的数据。
    6. 带权图:结点与结点之间的边有一个数值与之相对应;
    7. 入度、出度、路径、回路、子图、连通图、非连通图、生成树。
    8. 图的表示法:邻接矩阵(无向图邻接矩阵、有向图邻接矩阵)、边集数组、邻接表、十字链表、邻接多重表
    9. 图的遍历:
      • 广度优先遍历:从一个顶点开始,优先遍历周围区域。
      • 深度优先遍历:从一个顶点开始,优先遍历节点拓展出的结点。
    10. 最小生成树:prime算法,Kruska算法
    11. 单源最短路径:Dijkstra算法
    12. 拓扑排序

 

  云班课所做作业

  这里是我在云班课里的做过的作业)

  作业一: 第一章和第二章测试活动(选择题)

  作业二:第三章 类和对象

  作业三:实验三的做实验内容,即封装继承多态,单元测试、UML的实现。(这里五个只完成了三个 3,4没有做

  作业四:第四章和第五章测试(选择题)

  作业五:第六章和第七章测试

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

  作业七:实现自己的ArrayList(实现增加、删除、修改、查找、判断是否为空、返回list长度等操作、测试)

  作业八:第九、十、十一章继承多态异常(选择题)

  作业九:实验四内容截图加学号水印

  作业十:ArrayStack测试

  作业十一:尾插法

  作业十二:栈应用—进制转换

  作业十三:树和图(选择题)

  作业十四:最小生成树测试

  作业十五:栈和队列测试(选择题)

  作业十六:快速排序测试

  作业十七:最后一次测试

  实验报告链接汇总

  实验一:https://www.cnblogs.com/1076153186ljx/p/15327897.html

  内容:

  1.基于命令行进行简单的java程序编辑、编译、运行和调试;

  2.练习Linux基本命令;

  3.学习java程序的JDB调试技能

  4.编写简单的java程序。

 

  实验二:https://www.cnblogs.com/1076153186ljx/p/15358517.html

  内容:

  (1) 编写简单的计算器,完成加减乘除模运算。
  (2) 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
  (3) 编写测试代码,测试验证。

 

  实验三:https://www.cnblogs.com/1076153186ljx/p/15758802.html

  内容:

  下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)。

  1. 初步掌握单元测试和TDD
  2. 理解并掌握面向对象三要素:封装、继承、多态
  3. 初步掌握UML建模
  4. 完成蓝墨云上 (1)-(5)实验。

 

  实验四:https://www.cnblogs.com/1076153186ljx/p/15456391.html

  内容:

  (一)Java Socket编程

  (二)Java和密码学

  参考 http://www.cnblogs.com/rocedu/p/6683948.html

  (三)编写有理数/复数计算器

  (四)远程有理数计算器

  (五)远程复数计算器

  (六)实验报告

 

  实验五和六:https://www.cnblogs.com/1076153186ljx/p/15522416.html

  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 (你的名字)来表示元素的总数。

 

  实验七:https://www.cnblogs.com/1076153186ljx/p/15553281.html

  内容:

  1.定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位提交运行结果图。

  2.重构你的代码把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)把测试代码放test包中重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种)

  3.参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试提交运行结果截图

  4.实现排序方法等(至少3个)测试实现的算法(正常,异常,边界)提交运行结果截图(如果编写多个排序算法,即使其中三个排序程序有瑕疵,也可以酌情得满分)

  5.编写Android程序对实现各种查找与排序算法进行测试提交运行结果截图推送代码到码云(选做,额外加分)

 

  实验八:https://www.cnblogs.com/1076153186ljx/p/15617066.html

  内容:

  1.参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息课下把代码推送到代码托管平台

  2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息课下把代码推送到代码托管平台

  3.自己设计并实现一颗决策树 提交测试代码运行截图,要全屏,包含自己的学号信息 课下把代码推送到代码托管平台

  4.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分) 提交测试代码运行截图,要全屏,包含自己的学号信息

 

  实验九:https://www.cnblogs.com/1076153186ljx/p/15725617.html

  内容:

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

  以上为所以实验内容及实验博客链接

  代码托管

  这里有一次在晚上敲代码,结果电脑没电关机了,第二天打开idea结果代码都没了。 后来我又补了一些,包括准备最后测试时写的一些代码。

  课程收获与不足

  这学期的学习包括两部分,Java和数据结构。这两部分给我的感觉完全不同(只能说这个学期我确实前期与后期的态度发生了改变)总体的说,可能是C语言给我留下了不好的影响,在学习Java时还是有些吃力(但不是完全不懂,只是感觉在编程方面可能存在问题),Java的各种知识确实比较杂,但王老师总能以生活中的例子将知识方法讲清楚。再到后来的数据结构,我对这方面的知识可以说是非常感兴趣(可能是数学没有好好学,感觉课上的方法都非常奇妙,灵活)我在下课后也时时想起所学的方法,站在机器的视觉分析解决问题(呃,这个应该是我高中时和我朋友一起自学的内容《机器视觉》)。总之对于数据结构的知识掌握得还是很好,但一到用Java编程,我又又又有些懵了,感觉用Java语言编译的结果与自己所学的知识还有些差距、差异,在一次次的学习与练习中,慢慢掌握了其中的规律。我也开始将曾经的一些方法技巧通过程序的方式展现在我的面前,当时我感觉非常开心,毕竟自上大学以来还没有过这么大的变化。Java与数据结构虽难,但也不是没有办法。除了听王老师讲课、课下练习编程,我认为带着自己的思维与机器互动,找到其中的差异,或许可以让你更全面的了解编程语言的意义(虽然我现在也没有看出什么端倪)。其实我还是在学习中存在一些问题,在王老师布置的作业里,还是会有许多不懂的问题,不能每次都完成,我也在作业里有些挫伤了自己高涨的士气。这个学期对我而言至关重要,可能会改变我未来大学的生活和人生发展的走向,但发生在我身上的顽疾还没有根本解决(放荡,懒惰,对于自己不喜欢的学科抱有强烈抵触心理),只希望在将来可以慢慢改变。

  最后写完总结时感觉也应该总结一下自高考以来的自己的生活了,此处有些许与Java课程无关,王老师也不必在意学生的胡言乱语。

  (在我得知被dky录取后,我就已经明白学习编程语言将是我的必修课,我也和我身边的朋友积极讨论学习有关编程的一切。等我上大一的时候第一次真正学习C语言,然而当时的我过于放荡不羁,没有约束自己。结果是什么也没有学到,反而更加加剧了我对编程语言的反感。在这个学期,刚学习Java的时候也是有一些的反感,上课也有些不认真。大约是两三个星期后,我再和曾经的朋友聊时,感觉自己不应该如此荒废,至少我曾经的成绩不差,我在心中暗下决心。再后来王老师找到我,和我聊了许多,我当时只恨自己之前的所作所为,没有完成自己的学业,只觉着自己可能已经落人许多。此后,我转变了自己的学习态度。可能是已经有些课程没有学习好,有些知识可能学起来有些吃力,我也尽量想方法解决。现在就是尽量避免挂科,可能以后的一段时间里,我都在做着填窟窿的事,但窟窿总归是越填越小的。我也希望着窟窿填好的那一天到来,在此之前我都要为之前的放荡,懒惰,嬉戏付出代价。我不希望大学在我这里只是不停地添窟窿,但想改变现实,我会加倍努力的,我想看到所有人对我的变化所产生惊讶的表情。我在这里感谢王老师,也希望王老师可以监督我完成我既定的计划。)

 

 

 

  

 

posted @ 2022-01-02 23:54  20202327李佳欣  阅读(140)  评论(2编辑  收藏  举报