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

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

课程:《数据结构与面向对象程序设计》
班级:1923班
姓名:杨佳宁
学号:20192303
任课教师:王志强
必修/选修:必修

一、课程内容总结

第一章
1、所有的JAVA应用都有一个main方法,它是程序处理开始的地方。每次执行main方法中的一条程序语句,并按序执行,直至到达方法的最后。JAVA程序的main方法的前面总有关键字public,static,void。
2、编写程序时使用的各种各样的字称为标识符
(1)编写程序时程序员新建的名字(Lincoln和args)
(2)其他程序员选择的名字(String、System、out、println、main)
(3)语言中为特殊用途而保留的单词(class、public、static、void)
3、JAVA是大小写敏感的,大写和小写字母是有区别的。
4、开发程序时会遇到三类错误
(1)编译时错误
(2)运行时错误
(3)逻辑错误
5、软件开发的四个基本开发行为
(1)建立需求
(2)生成设计
(3)实现设计
(4)测试
6、类是对象的蓝图,一个类定义可以创建多个对象
第二章
1、字符串常量可以含有任何合法字符,包括数字、标点符号及其他具体的字符。
2、在JAVA中有8中基本数据类型:byte、short、int、long、float、double、char、boolean
3、所有的表达式的计算都依赖于运算符的优先级。乘法、除法及取余有相同的优先级,他们在加法和减法之前先计算。加法和减法有相同的优先级。
4、基本类型之间的转换分为两种情况:加宽转换与缩窄转换。加宽转换是最安全的,因为通常不会丢失任何信息,缩窄转换和可能会损失精度。
5、在JAVA中,有三种转换方式
(1)赋值转换
(2)提升
(3)强制类型转换
第三章
1、new运算符返回新创建对象的引用
2、String类中比较有用的方法:
(1)String(String str)
构造方法:用字符串str创建一个新的字符串对象
(2)char charAt(int index)
返回位于指定的index处的字符
(3)int CompareTo(String str)
根据字符串与str按字典序列的相互次序返回一个整数值。如果该字符串排在str之前,则返回负值;相等,则返回0值;排在str之后,则返回正值
3、伪随机数生成器执行复杂的计算并得到伪随机数
4、Math类的所有方法都是静态的,即通过类名来调用它们
第四章
1、数据比较
(1)浮点数比较:计算两个差值的绝对值,再与公差进行比较
(2)字符比较:JAVA中字符的相对顺序有Unicode字符集定义
(3)对象比较:可以使用compareTo方法来判定字符串之间的相对顺序
2、break语句常用在switch语句的每个case分支的最后
3、while语句重复地执行相同的语句,直到它的条件为假时为止
4、do语句至少执行一次循环体
5、当循环有确定的执行次数时,通常使用for语句
第五章
1、静态变量:有时也称类变量,它由类的所有实例共享。对于类的所有对象来说,静态变量只有一个副本。所以,在一个对象中修改静态变量的值,就等于修改了其他所有对象中该静态变量的值。
2、静态方法也称类方法,静态方法可以通过类名来调用
3、软件系统中的类之间有不同类型的关系
(1)依赖
(2)聚合
(3)继承
4、方法重载:重载方法的各版本由参数个数、类型及次序来区分
5、测试
(1)审核
(2)缺陷测试
(3)单元测试
(4)集成测试
(5)系统测试
(6)测试驱动的开发
第六章
在Java中建立一个GUI程序至少需要三类对象:组件、事件、侦听器。
第七章
1、在JAVA中,数组是一个对象,必须要进行实例化
2、对象数组的实例化,只是分配了保存引用的空间。每个元素中保存的对象还必须分别进行实例化
3、命令行参数保存在String对象数组中,并传递给main方法
4、在面向对象的系统中很少使用二维以上的多维数组
5、可以定义接收变长个数的参数的JAVA方法
6、边界检查确保指向数组元素的下标在有效范围内
第八章
1、继承是从已有类派生一个新类的过程
2、一个类的子类可以是一个或多个其他类的父类,这样形成了类层次
3、抽象类不能实例化,它提供的概念可以由其他类来定义
4、final修饰符可用来限制继承
第九章
1、接口是一组抽象方法,与抽象类一样不能被实例化
2、继承可用于接口,所以一个接口可以派生于另一个接口
3、接口引用可以指向实现这个接口的任意类的作何对象
4、方法的参数可以是多态的
5、多态引用在不同的时候可以指向不同类型的对象
第十章
1、错误和异常代表不常见的或不正确处理的对象
2、抛出异常时输出的消息提供了方法调用栈的轨迹
3、每个catch 子句处理try块中可能抛出的一种特定类型的异常
4、不论是正常退出的try块,还是因抛出一个异常而退出,都要执行finally子句
5、System类中的三个公有引用变量标准I/O流
(1)System.in
(2)System.out
(3)System.err
第十一章
1、递归是一种程序设计手段,允许方法调用自己
2、每次递归调用一个方法时,都创建了新的局部变量和参数
3、递归时解决某些问题的最佳方法,但另一方面,它不如迭代方法直观
第十二章
1、计算机系统中最重要的资源之一是CPU时间,完成具体任务的算法效率是决定程序执行速度的一个主要因素。
2、算法的阶由算法增长函数的主项决定
3、算法的阶给出了算法增长函数的上界
4、嵌套循环的分析必须要考虑内层和外层循环的执行情况
第十三章
1、排序算法:
(1)选择排序:分别将每个值放在排好序的最终位置,从而完成一组值的排序。
(2)插入排序:将一个具体的值插入到表中已有序的子系列中,从而完成一组值的排序。
(3)冒泡排序:重复地比较表中的相邻元素,如果它们不符合要求则交换他们。
(4)快速排序:根据一个任意选定的划分元素来对表进行划分,然后再递归地对划分元素两边的字段进行排序,从而完成对表的排序。
(5)归并排序:递归地对分表,知道每个子表只含有一个元素时为止,然后再将子表按序合并,从而完成对表的排序。
第十四章
1、集合是收集并组织其他对象的对象,它定义了访问及管理成为集合元素的其他对象的而一种具体方式
2、集合中元素之间的组织方式通常由它们加入集合的次序和元素之间的某些固有的关系决定
3、栈
(1)只允许在表尾插入和删除的线性表
(2)允许插入和删除的一端成为栈顶,另一端为栈底
(3)后进先出
4、常用操作
push将元素添加到栈顶
pop删除栈顶元素
peek查看栈顶元素
isEmpty判断栈是否为空
size判断栈中元素的个数
第十五章
1、队列是一个线性集合,它在一端添加元素,在另一端删除元素
2、队列的基本操作
(1)enqueue:在队尾添加一个元素
(2)dequeue:从队头删除一个元素
(3)first:返回指向队头元素的指针
(4)isEmpty:如果队列为空,则返回true,否则返回false
(5)size:返回队列中元素的个数
3、因为队列操作修改集合的两端,所以将一端固定在下标为0的位置就会让元素移动
4、采用数组实现队列时,把数组看成是一个环,可以避免移动元素
第十六章
1、树由一组节点及一组边构成,结点用来保存元素
2、树的遍历
(1)先序遍历
(2)中序遍历
(3)后序遍历
(4) 层序遍历
3、树是非线性结构,其元素组织为一个层次结构
4、树的度表示树中任意结点的最大子结点数
5、进行层序遍历法时可用队列来存储树中的元素
第十七章
1、左子树小于结点,右子树大于结点
2、最有效的二叉查找树是平衡的
3、可以对二叉树进行旋转使其达到平衡
第十八章
1、堆是一棵完全二叉树,其中每个元素大于等于其所有子结点的值
2、向堆中添加一个元素的方法是,首先将这个元素添加为叶结点,然后将其向上移动到合适的位置
3、从堆中删除最大元素的方法是,利用最后的叶结点来取代根,然后将其向下移动到合适的位置
4、堆排序利用堆的基本特性对一组元素进行排序
第十九章
1、图中每条边都对应一个权值的图成为带权图,有时也称为网络
2、如果图中的两个顶点之间有边连接,则称它们是邻接的
3、路径是图中连接两个顶点的边的序列
4、第一个顶点和最后一个顶点相同且边不重复的路径称为环

二、总结作业

作业1:截图证明自己已经安装成功虚拟的Linux系统。截图需要截全屏,且加学号水印
作业1链接:作业1

作业2:课堂实践,使用Vim编辑器编写JAVA程序
作业2链接:作业2

作业3:编写简单的类
(1)编写一个类(书、人、动物、汽车、球员、游课程、戏角色等),定义类的属性和方法。
(2)编写测试类(暂用包含main方法的类),new一个上面类的对象并初始化,然后调用类的属性和方法。
(3)编译运行通过,代码传到码云。
作业3链接:作业3

作业4:类继承作业
编写一个类,要求实现继承,可以以游戏、书籍、球员、复数等为例。
1.必须包含至少1个抽象方法。(1分)
2.必须测试,测试参数来自命令行参数。(1分)
3.简单测试一下Object类的方法。(1分)
4.要求能够实现两个对象的比较(Comparable接口)(2分)
作业4链接:作业4

作业5:复数计算器
实现复数类(加减乘除运算和比较大小)
要求使用Comparable接口、要求自定义接口、要求使用继承。
作业5链接:作业5

作业6:栈实践
用数组实现自己的栈,ArrayStackADT,需要包含栈的常规操作,并测试。
需要包含push、pop、peek、size、isEmpty等操作。
作业6链接:作业6

作业7:二分查找(折半查找)实践
给Searching类添加二分查找算法的递归实现方法。创建驱动程序来演示这个实现机制。
(1)编程实现递归。
(2)创建一个测试类,测试递归实现的二分查找是否正确。
作业7链接:作业7

作业8:二叉树的建立和层序遍历法实践
(1)给定一个序列AB#CD###E#F##建立一颗树,根据“二叉树的生成”算法构造这颗树。
(2)使用层序遍历方法完成遍历并测试。
作业8链接:作业8

作业9:哈夫曼编码实践
设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。
给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树。
并完成对英文文件的编码和解码。
作业9链接:作业9

作业10:查找及ASL作业(计算)
作业10链接:作业10

作业11:排序
使用选择和插入排序法,写出第3次排序的结果:3 1 9 3 6 2 10
作业11链接:作业11

作业12:树计算题
作业12链接:作业12

作业13:哈夫曼编码测试
哈夫曼编码测试,画出哈夫曼树,写出各个叶子节点的编码。
作业13链接:作业13

作业14:最小生成树测试
作业14链接:作业14

作业15:拓扑排序实践测试
作业15链接:作业15

作业16:迪杰斯特拉算法测试
作业16链接:作业16

作业17:地图染色问题
作业17链接:作业17

三、实验报告链接汇总

实验一 :Linux基本操作与简单JAVA程序编写
(1)基于命令行和IDE(Intellj IDEA 简易教程](http://www.cnblogs.com/rocedu/p/4421202.html)进行简单的Java程序编辑、编译、运行和调试。
(2)练习Linux基本命令;
(3)学习Java程序的JDB调试技能:https://www.cnblogs.com/rocedu/p/6371262.html
(4)编写简单的Java程序。
实验一链接

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

实验三 :IDEA的使用
下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)。
(1)初步掌握单元测试和TDD。
(2)理解并掌握面向对象三要素:封装、继承、多态。
(3)初步掌握UML建模。
(4)完成蓝墨云上 (1)-(5)实验。
实验三链接:https://www.cnblogs.com/20192303yjn/p/13812497.html

实验四
(1)Java Socket编程
学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程并与结对伙伴实现客户端与服务器。
(2)Java和密码学
以结对的方式完成Java密码学相关内容的学习。提交学习成果码云链接和代表性成果截图,要有学号水印。
(3)编写有理数/复数计算器
(4)远程有理数计算器
(5)远程复数计算器
实验四链接:https://www.cnblogs.com/20192303yjn/p/13904911.html

实验五:Android Stduio的相关测试
(1)学习Android Stuidio调试应用程序
(2)Activity测试
参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十五章:
构建项目,运行教材相关代码
创建 ThirdActivity, 在ThirdActivity中显示自己的学号,修改代码让MainActivity启动ThirdActivity
(3)UI测试
参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十六章:
构建项目,运行教材相关代码
修改代码让Toast消息中显示自己的学号信息
(4)布局测试:
参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十七章:
构建项目,运行教材相关代码
修改布局让P290页的界面与教材不同
(5)事件处理测试:
参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十八章:
构建项目,运行教材相关代码
提交代码运行截图和码云Git链接,截图要有学号水印,否则会扣分
实验五链接:https://www.cnblogs.com/20192303yjn/p/13908422.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 (你的名字)来表示元素的总数。

4.在android上实现实验(1)和(2)

5.在android平台上实现实验(3)
实验六链接:https://www.cnblogs.com/20192303yjn/p/13959893.html

实验七
1、定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位
提交运行结果图。
2、重构你的代码
把Sorting.java Searching.java放入 cn.edu.besti.cs1823.(姓名首字母+四位学号) 包中(例如: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/20192303yjn/p/14056292.html

实验八
(一)参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
1、用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
2、课下把代码推送到代码托管平台
(二)基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
1、用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
2、课下把代码推送到代码托管平台
(三)自己设计并实现一颗决策树
1、提交测试代码运行截图,要全屏,包含自己的学号信息
2、课下把代码推送到代码托管平台
(四)输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
1、提交测试代码运行截图,要全屏,包含自己的学号信息
实验八链接:https://www.cnblogs.com/20192303yjn/p/14110611.html

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

四、代码托管链接:


1、给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
勉强完成本学期的代码

2、加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
只有在理解的基础上编写代码并加入自己的想法才能有所进步有所提高
3、积极主动敲代码做到没?教材实践上有什么经验教训?
基本上做到了
在将教材中的代码运用到实际编程时,不能生搬硬套,要根据具体情况进行修改

五、课程收获与不足

1、自己的收获(投入,效率,效果等)
提高了我的自学能力。在高中时期,更多的是依赖老师讲,上了大学也没有及时调整学习模式,因此在刚进行学习时是有些吃力的,但现在遇到不会的问题,能够主动查询资料,自己寻找解决的方法
2、自己需要改进的地方
要提高自己的效率,每次完成实验都需要花费大量的时间。另外,在编写代码前还应该多进行思考
3、结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
在完成实验四时,遇到了一些问题,在与结对伙伴共同探讨后得到了解决
我认为可以适当再增加一些需要结对完成的作业
问卷调查
1、你平均每周投入到本课程有效学习时间有多少?
大概20个小时
2、每周的学习效率有提高吗?你是怎么衡量的?
应该是有提高的
后几周在完成课堂测试时要比刚开始学习这门课程时要轻松许多
3、蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?
有促进作用,通过自主学习云班课中的资料我对知识会有更深一步的掌握
4、你觉得这门课老师应该继续做哪一件事情?
在上课时多带我们敲敲代码
5、你觉得这门课老师应该停止做哪一件事情?

posted @ 2020-12-31 23:07  20192303杨佳宁  阅读(248)  评论(0编辑  收藏  举报