20202325 2020-2021-2《数据结构与面向对象程序设计》课程总结
课程总结
课程:《程序设计与数据结构》
班级: 2023
姓名:和宇
学号:20202325
实验教师:王志强
总结日期:2022年1月1日
必修/选修: 必修
课程内容总结
第一章:java程序设计入门
1.计算机的基本结构
2.程序开发:java程序设计入门及基础
3.java简介:java是一种面向对象的编程语言
java应用程序结构:java编程语言中,一个程序一个或多个类组成,类中又包含若干的方法,每一个方法都由程序语句构成
4.Linux基础与java开发环境:a.Linux基本操作命令:ls——列出当前命令下的文件、mkdir——创造一个子目录、cd——打开某个文件、rm——删除当前目录下的某个文件、vi/vim——创造并进入文件进行编辑、javac——将一个文件进行java编译、java——运行某个java程序
b.VIM命令:分为普通模式、插入模式以及命令行模式;普通模式按“i”进入插入模式 ,按“:”进入命令行模式,输入“wq”为保存并退出;命令行模式按“Esc”进入普通模式;在普通模式下 ,“.(小数点)”表示重复上一次操作……
第二章:数据与 表达式
1.字符串与输出
a.输出语言分为System.out.println(输出后自动跳到下一行)/print();
b.输出内容有“”时输出““内的内容,如System.out.println("Hello World!")则输出 Hello World!;括号内输出内容无”“,则输出括号内容所表示的数据,如:int c=3;System.out.println(c);则输出 3;
2.变量与赋值
变量:int a=1;
常量:final int b=2;final修饰后其值不可改变;
3.数据类型
a.整数类型:byte(1字节,8位)、shor(短整型,2字节,16位)、int(整型,4字节,32位)、long(长整型,8字节,64位);
b.浮点类型:float(浮点数,4字节,32位)、double(双精度浮点数,8字节,64位);
c.char:2字节,16位,用于存储一个字符;
d.boolean:1字节,8位,用于存储逻辑变量,如true、false等。
4.运算符号与优先级
a.+(加),-(减),*(乘),/(除),%(取余),!(否);
b.优先级:最一梯队:()、第二梯队:! 、+(正)、-(负)、++、--;第三梯队:*、/、%;第四梯队:+、-;
5.数据类型转换分为三种方法,a.赋值类型转换、b.提升类型转换、c.强制类型转换;
6.程序调试,设置方法断点和行断点。
第三章:类与对象
类=属性(变量)+方法(函数)
1.String对象的创建和和使用,String的本质是字符数组char[];a.在常量池中获取对象,如:String=”a“;b.创造两个字符串类型,一个在堆中,一个在常量池中,如String str=new String(”a“);
2.包:把功能相关或相似的类或接口组织在同一个包里,方便类的查找和使用;
3.Random类:专门用于生成伪随机数,其产生的随机数由种子和顺序决定 ;
4.Math类:属于java.lang包中,包含执行基础数学运算的大部分方法,如 求根,正弦、余弦等;
5.静态类和非静态类的格式化输出;
6.包装器:Integer num=new Integer(10)、num=Integer.parselnt("10") 、Integer.toHexString(num);
第四章:OO设计
1.理解:OO设计就是面向对象 的软件系统设计,以对象为中心,类和继承为构造机制,充分利用接口和多态等。
软件开发过程中,实现从伪代码到产品代码再到测试代码的过程。
2.类间关系:依赖:类A的方法需要使用类B的方法,静态方法:在 A中 直接使用B.xxx;非静态方法:在A中实例化B,B b=new B();b.xxx;聚合、关联、组合、继承等;
3.封装:隐藏对象属性和实现细节,对外开放接口;继承:从已有的类中派生出新的类;多态:在父类中定义的属性和方法被子类继承后,可以具有不同的数据类型或表现出不同的行为。
4.接口:a.接口无法被实例化;b.抽象方法可以用abstract,但一般是默认的,不需要使用;c.实现接口的类使用implements保留字,必须实现接口中所有的方法;
5.java类库中两个重要 接口:Comparable接口和Iterator接口;
第五章:线性表-列表
1.线性表的基本概念:线性表是具有相同性质元素组成的一个有限数列,线性结构的一种;
2.线性表的实现:a.使用数组实现,顺序结构;b.使用链式结构实现,使用LineaNode类,head及tail可以保留,tail的作用类似于count;c.栈和队列的线性表;
3.顺序结构:即两个元素在物理上的物理上的存储地址和逻辑上的存储地址是一致的,无论是物理上还是逻辑上,两者都是相邻的;
4.链式结构:是相对顺序结构而言,其中各个元素的物理地址和逻辑地址不确定,即逻辑上相邻,物理上不一定相邻;单链表、双链表和循环链表;
5.队列,先进先出,数据从队尾入队列,从对头出队列,,队伍头指向队列的第一个数据,队尾指向队列的最后一个数据;
6.队列的实现,普遍采用链式存储,节点对象包含具体数据和下一个结点的引用,成员变量包括front、rear、size等,对应的方法有入队、出队、计算队列内元素个数以及判断队列是否为空;
第六章:栈(Stack)
1.定义:是一种数据项按序排列的数据结构,具有先进后出、后进先出的性质,只能在其一端,即栈顶(top)对数据进行插入和删除,另一端叫做栈底(bottom);
2.优缺点:优点:存取速度快;缺点:存于栈中的数据大小和生存期必须确定,缺乏灵活性。
3.栈的使用:a.实例化:Stack stack =new Stack();b.操作:1.stack.push,进栈操作,返回入栈内容、stack.add(返回true或false);2.stack.pop(输出并删除栈顶元素),stack.peek(输出不删除栈顶元素);3.stack.isEmpty(判断是否为空 );4.System.out.println(stack),用于输出栈;
4.栈的实现方法:a.基于简单数组的实现方法;b.基于动态数组的实现方法;c.基于链表的实现方法,在链表表头插入元素实现push方式,删除链表表头结点实现pop方式,表头结点即为栈顶;
第七章:查找和排序
1.查找的定义:查询某个特定的数据是否在表中;分为有序查找和无序查找;
2.查找的分类即查找性能:a.顺序查找,时间复杂度O(n);b.分块查找,时间复杂度O(log n+n/m);c.二分查找,时间复杂度O(log n);d.插值查找,时间复杂度O(log(log n));e.哈希查找,时间复杂度O(1);
3.a.线性查找:顺序查找适用于存储结构为顺序存储或链接存储的线性表;
b.二分查找:折半查找,属于有序查找算法,先将表进行从小到大的排序后,给一个定值与中间结点的关键字作比较,之后中间结点把线形表分成了两个子表,若相等则查找成功;若不相等,再根据最先给出的该定制与该中间结点关键字的比较结果确定下一步查找哪个子表;
c.插值查找,基于二分查找,将查找点的选择改进为自适应选择;
d.分块查找,使用 索引表,作为分块查找的一个分块依据,索引表是二分查找,随后进行顺序查找;
e.哈希表法;
4.排序的定义;内部排序和外部排序,基于基本数据类型,对数据的大小进行一个排列,使其从无序状态变为有序状态;
5.排序方法;a.插入排序,将未排序数列中的第一个元素插入到排列表中的适当位置,包括直接插入排序、二分法插入排序、希尔排序;
b.交换排序,每次比较两个数字,然后根据要求决定是否换位置,包括冒泡排序,快速排序;
c.选择排序,选取未排序序列中的合适元素,安排在排列序列的最后的位置,包括简单选择排序,堆排序;
d.归并排序 ;e.基数排序;
第七章:树与二叉树
1.树的定义;树是n个结点的有限集,有且仅有一个特定的称为根(root)的结点,当n大于1时,其余结点可以分为m个互不相交的有限集,每个集均为树且不相交;
2.树是非线性关系,表示一对多的数据结构类型;
3.结点层次:根为第一层,以此类推;
4.树的深度:节点的最大层次;
5.树的基本操作:
a.getRoot()/返回根结点;
b.getParent()/返回父结点;
c.getChildCount()/返回子结点数;
d.getFirstChild() /返回第一个孩子结点;
e.getNextChild() /返回下一个兄弟结点;
f.isEmpty()/判定树是否为空;
g.depth()/求树的深度;
h.traverse()/ 遍历树
i.tree()/构造函数,初始化置空树;
j.insert()/插入结点;
6.树的存储结构
a.双亲表示法
b.孩子表示法:1.多重链表;2.孩子链表;
c.双亲孩子表示法
d.孩子兄弟表示法
7.二叉树
a.定义:结点度数至多为2的树;有序树,子树有左右之分;
b.满二叉树:每层的结点都是满的;
c.完全二叉树:满二叉树去掉最下层最右的若干结点;
d.二叉树的数据存储结构:1.顺序存储结构;2.链式存储结构;
第八章:图
1.图是一种非线性的数据结构,一般用于反映数据所对应元素之间的几何关系和拓扑关系;
2.图的构成:顶点(图的数据元素之一)、边(连接结点的线)、路径(从一个结点到另一个结点的序列);
3.无向图:在一个图的构成中,所有的边都没有方向;
4.有向图:一个图结构中,边是由方向性的;
5.带权图:结点与结点之间的边有一个数值与之相对应;
6.图的表示方法:a.邻接矩阵(二维数组表示)b.邻接表(链表表示)c.十字链表法;
7.图的遍历:a.广度优先遍历,从一个顶点开始,优先遍历其周围较广的区域;b.深度优先遍历,
8.最小生成树:Prim算法,Kruskal算法
9.单源最短路径:Dijkstra算法;
10.拓扑排序;
作业总结
作业一:封装继承多态重写重载文件字符字节读写-测试
编写一组程序,要体现一下知识点: (1)继承 (2)多态 (3)重写 (4)重载 (5)目录创建 (6)文件创建 (7)字节流读写 (8)字符流读写
作业二:实现自己的ArrayList
1.编写自己的ArrayList类 要求:实现增加、删除、修改、查找、判断是否为空、返回list长度等操作。 2.测试。
作业三:ArrayStack测试
1.撰写自己的类; 2.提供StackADT,ArrayStack(框架),实现ArrayStack里面的剩余方法; 3.编写测试类,测试所写的方法是否正确。
作业四:栈应用-进制转换
算法基于原理: 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 要求输入一个十进制数,转换成任意进制数并输出。
作业五:最小生成树测试
1.画出Prim算法的最小生成树的生成过程 2.画出Kruscal算法的最小生成树的生成过程 3.计算最小权值
作业六:快速排序测试
3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
快速排序
给出第一趟快速排序的结果!
作业七:最后一次测试
期末测试,接口,类,栈,文件读取,图等;
实验报告链接汇总:
实验一:https://www.cnblogs.com/HY20202325/p/15322130.html
内容:
1.基于命令行进行简单的java程序编辑、编译、运行和调试;
2.练习Linux基本命令;
3.学习java程序的JDB调试技能:https://www.com/rocedu/p/6371262.htlm;
4.编写简单的java程序。
实验二:https://www.cnblogs.com/HY20202325/p/15354477.html
内容;
(1) 编写简单的计算器,完成加减乘除模运算。
(2) 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
(3) 编写测试代码,测试验证。
实验三:https://www.cnblogs.com/HY20202325/p/15399787.html
内容;
下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)。
1. 初步掌握单元测试和TDD
2. 理解并掌握面向对象三要素:封装、继承、多态
3. 初步掌握UML建模
4. 完成蓝墨云上 (1)-(5)实验。
实验四:https://www.cnblogs.com/HY20202325/p/15455612.html
内容:
(一)Java Socket编程
(二)Java和密码学
参考 http://www.cnblogs.com/rocedu/p/6683948.html
(三)编写有理数/复数计算器
(四)远程有理数计算器
(五)远程复数计算器
(六)实验报告
实验五和六:https://www.cnblogs.com/HY20202325/p/15521192.html
内容:
1.链表练习,要求实现下列功能:
- 通过键盘输入一些整数,建立一个链表;
这些数是你学号中依次取出的两位数。 再加上今天的时间。
-
2.链表练习,要求实现下列功能:
-
实现节点插入、删除、输出操作;
- 继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
3.链表练习,要求实现下列功能:
- 使用冒泡排序法或者选择排序法根据数值大小对链表进行排序;
如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素
4.在android上实现实验(1)和(2)
5.在android平台上实现实验(3)
实验七:https://www.cnblogs.com/HY20202325/p/15553782.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/HY20202325/p/15615455.html
内容:
1.完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder),用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
2.基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
3.自己设计并实现一颗决策树,提交测试代码运行截图,要全屏,包含自己的学号信息
4.输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
实验九:https://www.cnblogs.com/HY20202325/p/15721283.html
内容:
(1) 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,然后再输入顶点和边数)
(2) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)
(3) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环
(4) 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出
(5) 完成有向图的单源最短路径求解(迪杰斯特拉算法)
四.代码托管链接:
五.课程收获与不足
经过一个学期的学习,我更加认识到了自己的不足,java是我接触到的第二门编程课程(C语言是第一门),和C语言一样,咋一看到java课本厚度时的我是崩溃的,在我原本看来,java的书本厚度确实是C语言课本的两倍,也意味着其包含的内容比C语言多了许多,难度自然是提高了很多,学习C语言都力有不逮,更甭说java了,这一个学期能学完吗?但是当我慢慢接触java之后,我才意识到,任何一门的编程语言无论其现在的知识量多寡,你都是学不完的,因为随着信息化和电子化的发展加深,每一门编程语言都在快速的”进化“当中,在学习这一个路途上,你只能深刻践行活到老学到老这一个与时俱进的理念,才不会被时代的洪流冲到沙滩上。
在这个学期的java学习中,我们和王老师度过了愉快,难忘且充实的四个月,王老师是一个有趣的老师,总能和我们打成一片,比起条条框框的束缚教学,王老师更喜欢激发同学们的自学热情,提倡我们在课下多学多练,在一开始,我还在想着课上学的就够了,下课写写作业更是完美无缺,至于查课外资料啥的,懒癌后期的我怎么可能会行动呢?很快,事实就证明命运挥向懒人的每一刀都是暴击,每一刀都是真伤,老师布置的题目真是越看越像天书,还好我迷途知返,幡然醒悟,开始慢慢在课外展开了对java的学习和探究,在这个过程中,不仅开阔了我的认识,也让我交到了更多学习上的好朋友。当我遇到不懂得问题时,王老师总是细心的给我解说,帮我拨开迷雾。
让我对java也产生了不小的兴趣,让我更加完善自己。