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

课程内容总结

 

课程:《程序设计与数据结构》
班级: 2023
姓名:张修齐
学号:20202326
实验教师:王志强
总结日期:2022年1月1日
必修/选修: 必修

一、课程总结

  第一章:绪论

  • Java程序设计的基础
  • 程序开发
  • 虚拟机的安装
  • Linux操作系统
  • Linux命令

 

          从第一节课的虚拟机安装使用,让我们从系统命令行的方式来熟悉Linux系统基本操作方式,了解基本文件创建,编辑,保存,以及编辑器的使用,让我们从底层操作的角度看到我们日常生活中所使用的

快捷编辑方式的具体运行过程,随后,我们学习了在虚拟机上实现java安装,编辑和使用的相关知识,这也是从底层的角度看到我们平常使用的程序设计软件是如何运行和实现原理,通过本章的学习内容,让我

们从底层的角度看待程序设计的操作实现,为我们后面在进行程序编辑提供理论知识基础。

 

     第二章:引言——java程序设计入门

  • 程序开发
  • Java程序设计入门
  • 计算及体系结构
  • Java程序的编辑与运行

 

      程序开发是指先从程序的语言规范到将程序翻译成计算机能识别并进行相关操作的机器语言,最后还能反馈程序的错误的过程,程序语言可以大致分为四类:机器语言、汇编语言、高级语言、第四代语言

不论什么程序最后都会被翻译成机器语言进行运作,Java作为一种面向对象的汇编语言,通过对象进行消息传递来实现操作,其程序是由类的申明和类的使用,而类的实例就是指对象。Java程序要编辑和运行

需要借助Java编辑器和解释器的使用,Java解释器把Java字节码转换成机器语言然后执行,Java编辑器就是将Java的源代码转译成Java字节码。一般编程人员在程序中所使用的单词称作标识符,在Java中,

标识符包含字母,数字,下划线等等,其中数字不能作为开头,Java同样也是大小写敏感的语言,不同标识符如果首字母大小写不同也代表不同的含义,编程时需要切记!根据编写标识符的对象,标识符可

以分为自定的和他定,自定就是指程序员自己拟定的标识符(sum,div···);而他定就是指不是由自己申明的,但大家都按照这个标识符操作,比如有其他程序员选定的(String、System、out···)还有保留

特殊含义的词语(class、static、void···)其中包含特殊含义的只能按照预定好的方式进行使用。

 

   第三章:数据和表达式

 

  • 字符串与输出
  • 变量与赋值
  • 8种基本数据类型
  • 表达式
  • 优先级
  • 运算符
  • 类型转换
  • Scanner类

       本章从Java的基本数据的申明和使用开始,类比上学期学习的C语言,Java在申明变量的方面略有不同,数据类型跟C一样,分为:整数与浮点型(6种)、字符型(1种)、布尔型(1种)

首先在数据申明的方面,跟C不同的是需要调用一个类的方法(Scanner类),这也是我们学习Java遇到的第一个类,其中大致有: .nextInt(读入下一个输入的整数)、.nextline(读入下一行的数据)···

Java的运算符分为:+ / - / * / % / //。运算优先级时()优先,其次依次是:(!(非) +(正) -(负)++  --)、(* / %)、(+ (加)-(减))、(<  <=  > >=)、(== !=)、(^)、(&&)、(||)、

(?:)、(= += -= *= /= %=)。Java中数据转换类型分为三类:赋值类型转换、提升类型转换、强制类型转换。

 

 

  第四章:类与对象

 

  • String类
  • Random类
  • Math类
  • 格式化输出
  • 枚举类型

       本节课从引入第二个类(String类)开始,讲解了:1、类的基本知识;2、常用系统自带类的种类,使用,包含的方法;3:如何自己定义自己的类,自己的类如何使用,怎么实现自己的类。类的基本知识

:(类=属性(变量)+方法(函数)),Java包里自带的主要常用类有:String(字符型变量),Scanner(数据读入)、Random(随机数)、Math(基本数学函数)等等,每个类有不同的方法,比如Math

类中包含(sin,cos,tan)等常见的函数,在引用时先申明Math型变量Math math = new Math();随后,在使用时:math.tan()就可以实现tan方法的实现过程。Java的枚举方法:enum XXX{a,b,c···}其中

实例的对象属性只能是private。

 

 

  第五章:OO设计

 

 

  • SOLID原则
  • 面向对象三要素
  • 伪代码
  • 类间关系
  • 接口类、抽象类的实现
  • 封装、继承、多态

       本章引入了OO设计的相关知识,OO是指面向对象,OO(面向对象)的三要素是封装、继承、多态,封装就是指包装,将信息隐藏的意思,具体是指利用抽象数据类型将数据和基于数据的操作封装在一起

,继承是指使用已存在的定义作为基础进行新的数据加入等等,多态:只能是子类访问父类拥有的方法和属性。OO是基于对象的概念,以对象为中心、把类和继承作为机制、用接口和多态来丰富。在设计程序

时要明确设计目的,然后进行伪代码的编写,最后编写程序代码,测试代码,测试无误后,才能进行使用。而在编写程序时往往会遇到一个类的编写需要另一个类的方法,比如编写自己类多数据输入类时需要用

到Scanner的方法,这个时候就有两种方法来实现:第一种静态方法:Scanner.(a)每一次使用都需要调用一次Scanner类的方法;第二种:非静态方法:Scanner scan = new Scanner(System.in)这样后面

一切需要用到相关方法时只用scan.(XXX)就可以。SOLID原则指SRP(单一职责原则)、OCP(开放封闭原则)、LSP(Liskov原则)、ISP(接口分离原则)、DIP(依赖倒置原则)。

 

  第六章:线性表

  • 线性表基本概念
  • 线性表的存储方式(顺序,链序)
  • 链序、顺序的基本方法实现
  • 程序实现

       本章介绍了线性表的有关知识,首先线性表是指很多个特性相同的元素组合而成的序列,是最基础的线性结构。根据存储数据方式的不同可以分为:顺序存储结构、链式存储结构。顺序存储结构是指用一段

连续的存储地址单元依次存储线性表的数据就像数组一样。顺序存储有三个必要属性:存储空间的起始位置、所需要的最大存储量、当前长度,其中在任意时刻当前线性表长度应该小于或等于数据的最大容量

主要方法有数据的插入、查找、删除、判断是否为空。链式存储结构不同于顺序结构,链式存储结构是指将线性表元素用链表的方式进行存储,基本原理是一个数据指向它的下一个数据。这就主要涉及到两个

方面:指针和数据,这两个方面通过节点来实现,将数据存储在数据的方面,将指针放在指针方面,链式存储结构同样也有几个必要属性:头节点、头指针、最大存储容量、数据。链式存储结构同样也有数据

的插入、查找、删除、判断是否为空这四个基本方法。

 

 第六章:栈

  • 栈基本概念
  • 栈的存储方式(顺序栈、链栈)
  • 栈的基本方法实现原理
  • 程序实现

       本章介绍了栈的相关知识,栈就是指尽在尾部进行数据的插入或者删除特点是:后进先出;与线性表类似,同样分为顺序存储结构(顺序栈)和链式存储结构(链栈),主要实现的方法有:栈的初始化、

判断是否为空、取栈顶元素(peek)、栈顶的插入(push)、栈顶的删除(pop)其中在栈顶删除叫出栈、在栈顶插入叫入栈,链栈的操作操作是线性表操作的特例,操作很容易实现。顺序链就是栈的顺序

存储结构是利用一组地址连续的存储单元依次存储自地至顶的元素。栈的优势是,存取速度快,且栈之间的数据可以共享;缺点是缺乏灵活性,存取有严格的要求。

 

  第七章:查找与排序

 

  • 查找概念
  • 查找方法
  • 排序基本知识
  • 排序基本方法

       查找与排序的学习标志着学习正是进入数据结构的阶段,查找,即检索,是指给定某个值,在表中确定一个关键字等于给定值,常用的方法有:1、线性查找法;2、二分查找法;3、分块查找法;4、哈希

表查找法。

 

  •     线性查找法:顺序查找(顺序+链序)适用于小型或没有排序的线性表,主要实现方法是利用关键字和每个元素进行对比。
  •      二分查找法:也称为折半查找法,首先将关键字(key)与中间的元素相比,若比中间元素小,则与该元素的左边的中间值比较,同理较大与右边的中间值对比,特点是时间复杂度低,效率高;但具有两点限制性:必须是 排序好  的 顺序存储结构!
  •      分块查找法:在建立顺序表的同时在建立一个索引(该块的起始地址+该块中最大或最小的元素);原理是先折半查找在线性查找;
  •      哈希表查找法:确定哈希函数,得到每个关键字的哈希地址,使哈希地址尽可能的均匀分布在散列空间上。

      排序基本思想是“有序序列”逐步扩大的过程,包含了两种基本操作:比较两个关键字的大小,将关键字和被比较数据位置的交换。基本的排序方法有:插入排序、交换排序、选择排序、基数排序、归并排序

    • 插入排序:将n个待排序元素看成一个有序序列和无序序列,每次将无序序列中取一个元素与有序序列比较,并插入到指定位置。依据不同的查找方法可以将插入排序分为直接插入、折半插入、2路--插入排序和希尔排序。
    • 交换排序:每次比较两个数据,然后交换位置,代表有:冒泡排序,快速排序;冒泡排序就是将相邻的两个元素比较并交换,快速排序是基于冒泡排序后的改进方法,从两端向中间进行比较,较大的元素一次就能交换到后面,小的记录一次就能够交换到前面。
    • 选择排序:再待排序区段的记录序列中选出关键字最大或最小的记录并移动到指定位置。
    • 基数排序:不需要进行关键字的比较,借助多关键字排序的思想来实现但关键字排序。
    • 归并排序:含有n个记录的序列看作n个有序的子序列,两两合并,得到n/2个长度为2或1的有序子序列,最后再两两合并,直到得到一个长度为n的有序序列为止。

 

  第七章:树与二叉树

 

  • 树概念
  • 树的基本操作
  • 树的存储结构
  • 二叉树
  • 二叉树性质
  • 二叉树存储结构

       树是指由n(n  0)个节点组成的有限集合。有一个特定的节点称之为根节点;除根结点以外其他节点划分为m(m  0)个互不相交的有限集合,每个集合又是一个树,并称之为根的字树。树的特点是一对多

每一个节点(除了头节点外)都一个前驱节点。树的基本操作有查找、插入和删除,从分析每个节点的前驱和后驱节点来查找关键字相符数据,插入是指再经过查找到具体位置后进行后驱节点的生成,删除也是

再经过查找到关键词后将前驱节点的后驱节点指向下一节点。树的存储结构主要有:双亲表示法、孩子表示法(多重链表)。二叉树是指节点最多为2的特殊有序树。二叉树具有1:在二叉树的第i层最多有2^

(i-1)个节点;2:深度为k的二叉树最多有2^(k)-1个节点;3:对任何一颗二叉树,如果其叶节点个数为n0,深度为2的节点数为n2,则有:n0=n2+1;二叉树的存储结构也是顺序存储结构和链式存储结构(二

插链表)

 

  第八章:图

  • 图的基本概念
  • 树的基本操作
  • 树的存储结构及实现
  • 图的遍历
  • 图中树的问题
  • 最短路径问题

       一个图是一个序偶<V,E>,其中V={v1,v2····}是优先非空集合Vn称之为节点,V称为节点集;图可以用图形描述,同样也可以通过语言描述,图的基本操作有分为对点的操作和对边的操作,对点的操作主要有

查找,取值,赋值,插入,删除;对边的操作主要有:插入,删除,存取等。图的存储结构可以通过邻接矩阵、边集数组、邻接表、十字链表、邻接多重表来实现,图的遍历根据抓取顺序不同可以分为深

度优先遍历和广度优先遍历深度是每层每层遍历,广度是所有子节点遍历;图中树的基本操作有生成树、最小生成树、prime算法、Kruskal算法,最小生成树就是包含所有节点的边之和最短,prime算法的核心

就是从某一结点出发,每次选择相联的最小的边,再将那个点加入集合,Kruskal算法就是按照权值大小将边集结构排序,逐条检验。最短路径问题就是指两个指定点的最短距离,典型的解决方法就是迪杰斯特拉

算法,算法核心就是将最短边依次收集,这样形成的路径一定是最短,然后将最短的路径逐渐扩展,直到扩展至所有点。

 

二、作业总结

 实验一:Linux命令行和编写简单的Java程序

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

2、练习Linux基本命令;

3、学习Java程序的JDB调试技能:https://www.cnblogs.com/rocedu/p/6371262.html

4、编写简单的Java程序。

       

博客链接:https://www.cnblogs.com/zhangxiuqi/p/15316947.html

 

实验二:编写简单的计算器

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

博客链接:https://www.cnblogs.com/zhangxiuqi/p/15334484.html

 

实验三:面向对象程序设计

  • 初步掌握单元测试和TDD
  • 理解并掌握面向对象三要素:封装、继承、多态
  • 初步掌握UML建    

博客链接:https://www.cnblogs.com/zhangxiuqi/p/15399478.html

 

实验四:Java Socket编写

 1.实验内容

(一)Java Socket编程

1.学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程
2.结对编程。结对伙伴A编写客户端SocketClient.java,结对伙伴B编写服务器端。
3.截图加学号水印上传蓝墨云,代码push到码云,并撰写实验报告。

 

(二)Java和密码学

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

以结对的方式完成Java密码学相关内容的学习(帖子中所有代码和相关知识点需要学习)。提交学习成果码云链接和代表性成果截图,要有学号水印。

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

结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。截图加水印上传蓝墨云,代码push码云。

(四)远程有理数计算器

结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。

(五)远程复数计算器

结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴A(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端B,B收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
注意实验四(4)和实验四(5),一个人不能仅实现客户端,必须实现一个客户端和服务器,否则两个实验均不得分!!!

(六)实验报告

在规定时间前发表博客,标题“学号 实验四 《数据结构与面向对象程序设计》实验报告”

    

 博客链接:https://www.cnblogs.com/zhangxiuqi/p/15456164.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/zhangxiuqi/p/15522316.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/zhangxiuqi/p/15553824.html

 

 

实验八:树

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

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

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

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

 

博客链接:https://www.cnblogs.com/zhangxiuqi/p/15617114.html

 

实验九:图

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

 

博客链接:https://www.cnblogs.com/zhangxiuqi/p/15725695.html

 

代码托管链接

统计本学期的代码量。

 

 

课程收获或不足

  课程收获:通过本学期的程序设计与数据结构的学习,让我对计算机语言方面有了很大认识的改变,虽然是将程序设计和数据结构合并为一门课,并且一学期内上完,但总体上感觉还是收获颇丰,学到了

很多知识,首先,老师第前面的几节课从底层方面带领我们认识了程序设计的基本原理和实现,通过虚拟机上使用Linux系统熟悉了底层实现方法,为我们以后工作中使用Linux系统做铺垫。相对于上学期的

简单程序设计,本学期的难点有两个:1、新的语言JAVA的学习,相比于C语言,我觉得再语言实现,申明两个方面有很大不同,Java更多涉及类的使用;2、本学期的数据结构方面的学习难度陡然增加,代码

量从十几行突然上升至几十行,到最后学到树和图的几百行,还有就是相关概念的增加,可能本学期的两个知识点就已经远远超过上学期所有知识点的总和;在这样的学习环境下,也越发让我不敢懈怠,在面临

长代码的难题中依旧不依不挠,坚持写完,如果错了就一步一步检查,隐隐约约中锻炼了我们不屈不挠,坚韧不拔的精神,课程内容很大,需要我们不仅上课要注意关注重点步骤的实现,基本原理的掌握;还需

要我们在课下进行自我总结,看能不能够自己实现一下这个东西。同时,本课程再平时知识点检测中才用全英文的题目,实在是让人头大,很多时候并不是做不来,而是理解不了,需要我们主动去提升我们的

翻译能力,在每次遇到不熟悉的知识时也会主动去B站或者其他学习资源上查找相关资料,遇到不懂的也会及时向老师或同学提问。自己感觉在动手能力,总结归纳,自我学习能力方面有很大的提升,同时也增

加了看待事物的广度和深度,感谢老师的尊尊教诲,希望自己能够在以后的生活中不断进取。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

        

posted @ 2022-01-02 20:06  20202326张修齐  阅读(94)  评论(1编辑  收藏  举报