• 20192317邓子彦 2020-2021-1《数据结构与面向对象程序设计》课程总结


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

    一、课程内容总结

    第一章 绪论

    本章介绍了Java程序设计语言和基本的程序开发过程。介绍了面向对象的开发方法,包括相关的概念和术语。

    了解Java程序设计语言,了解程序编译运行的步骤,理解问题求解的一般方法,了解软件开发的一般过程,了解面向对象技术相关概念,面向对象的程序设计,类是对象的蓝图,虚拟机介绍与安装,IDEA介绍与安装。

    第二章 数据和表达式

    介绍了Java中使用的基本数据类型及执行计算时表达式的使用。讨论了数据类型之间的转换,以及如何借助于Scanner类交互地从用户读入输入。

    字符串
    • print及println方法
    • 字符串连接
    • 转义字符
    • 变量和赋值
    变量
    • 赋值语句
    • 常量
    • 基本数据类型
    • 整型和浮点型
    • 字符类型
    • boolean类型
    表达式
    • 算术运算符
    • 运算符优先级
    • 自增及自减运算符
    • 赋值运算符
    数据转换
    • 转换技术
    读输入数据
    • Scanner类
    第三章 使用类和对象

    本章介绍了讨论对象的创建及对象引用变量的使用,探讨String类提供的服务,探讨Random类和Math类提供的服务。

    • 创建对象
    • String类
    • Random类
    • Math类
    第四章 条件和循环

    本章主要介绍了if和switch语句执行基本的判定,分别使用while、do、和for循环重复执行语句,探讨用于判定的布尔表达式,为了分析并读入文本文件中的重复输入,再次讨论了Scanner类。

    • if语句可以让程序选择是否执行一条特定的语句。
    • 循环语句可让程序多次执行同一条语句。
    • 可用逻辑运算符构造复杂的条件。
    • if-else语句可在条件为真时实现一个操作,在条件为假时实现另一个操作。
    • 在嵌套的if语句中, else子句与最近尚未匹配的if相匹配
    第五章 编写类
    编写类
    • 类的定义:属性+方法;
    • 类的封装、形参实参;
    • 构造方法不应该有返回值;
    • 构造方法提倡封装;
    • 程序的测试;
    第七章 数组

    本章主要讲了定义并使用数组来组织数据,讨论边界检查及容量管理技术,讨论数组作为对象及对象数组的问题。

    数组
    • 数组实例化;
    • 数组越界问题排查与预防;
    第八章 继承

    本章主要讨论类继承的设计机制,说明抽象类的目的及使用方法,讨论与继承有关的可见性问题

    继承
    • 继承是从已有类派生出新类的过程;
    • 父类与子类;
    • 子类可以复写父类的方法;
    • 抽象类不能实例化;
    第九章 多态

    探讨了绑定的概念,以及它与多态的关系。之后研究了如何使用继承或接口来完成多态引用。与多态相关的设计问题也在这一章介绍。

    多态
    • 多态引用可以在不同的时候指向不同类型的对象;
    • 接口是一组抽象方法,所以不能被实例化;
    • 方法的参数可以是抽象的;
    第十章 异常

    介绍了异常处理及不捕获异常时的后果。探讨了try-catch语句,分析了异常的传播。本章还介绍了处理输人/输出时的异常使用,给出了一个编写文本文件的例子。

    异常
    • 异常代未正确处理的对象;
    • trycatch语句可以处理特定类型的异常;
    • I/O异常及其处理;
    第十一章 递归

    介绍了递归的概念、递归的实现及其正确的用法。

    递归
    • 递归允许方法调用自己;
    • 每次递归调用某一方法时,都创建了新的局部变量和参数;
    第十二章 算法分析

    讨论了包括递归算法在内的算法复杂度的分析技术,介绍了大0符号。

    第十三章 查找与排序
    • 探讨了线性查找和二分查找算法,还介绍了5个排序算法,其中包括平方阶及O(n logn)的算法。同时还研究了这些算法的效率。

    查找与排序

    • 高效的查找可以减少查找次数与时间;
    • 二分查找等查找算法各自适用于不同的情况;
    • 选择排序、插入排序等排序方法也是需要面对不同情况具体分析;
      第十四章栈

    介绍了集合的概念,确立了将接口与实现分开的重要意义。我们将栈作为集合的第一个例子,介绍了栈的动态及定长的两种实现方式。

    • 后进先出;
    • 集合的介绍;
    • 链表的介绍;
    • 栈、链表各有优劣
    第十五章 队列

    介绍了队列的概念,然后作为工具来帮助我们解决问题,最后研究所使用的数据结构。讨论了基于数组和动态链表的两种实现方式。

    队列
    • 队列的介绍
    • 先进先出
    第十六章 树

    介绍了树的术语和相关概念,讨论了不同的实现策略,详细介绍了递归的链式实现方法。

    第十七章 二叉排序树
    二叉查找树
    • 左子树小于结点,右子树大于结点;
    • 最有效的二叉查找树是平衡的;
    • 可以对二叉树进行旋转使其达到平衡;
    第十八章 堆和优先队列

    介绍了查找树的概念,以及典型的二叉查找树的链式实现。

    • 堆是一个完全二叉树;
    • 大顶堆、小顶堆;
    • 堆中元素的添加、删除;
    第十九章 图
    • 无向图、有向图;
    • 邻接,路径;
    • 边的权;
    • 邻接矩阵;
    • 图的遍历:广度优先与深度优先;
    第二十章 哈希算法

    涉及创建哈希表以便于存储及获取对象的相关概念。本章还介绍了Java API中与哈希相关的几种应用。

    二、总结所做过的作业

    • 安装虚拟机;
    • 实践一,虚拟机编写简单程序;
    • 编写简单的类;
    • 测试一
    • 复数计算器
    • 类的继承
    • 概念常识问答
    • 测试二;
    • 栈实践;
    • 二分查找实践;
    • 树——计算;
    • 二叉树建立,层序遍历实践;
    • 哈夫曼编码实践;
    • 测试三;
    • 地图染色实践;
    • 迪杰斯特拉算法实践;
    • 拓扑排序;
    • 最小生成树测试;
    • 英语打卡;

    三、实验报告链接汇总

    实验一 Linux基础与Java开发环境

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

    (2)练习Linux基本命令;

    (3)学习Java程序的JDB调试技能。

    (4)编写简单的Java程序。

    实验二

    (1)编写简单的计算器,完成加减乘除模运算。

    (2)要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。

    (3)编写测试代码,测试验证。

    实验三

    下载安装并使用IDEA,完成下面实验。

    (1)初步掌握单元测试和TDD

    (2)理解并掌握面向对象三要素:封装、继承、多态

    (3)初步掌握UML建模

    (4)完成蓝墨云上 (1)-(5)实验。

    实验四

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

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

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

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

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

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

    实验五

    (1)Android Stuidio的安装测试:
    参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十四章:
    参考http://www.cnblogs.com/rocedu/p/6371315.html#SECANDROID,安装 Android Stuidio
    完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号,自己学号前后一名同学的学号,提交代码运行截图和码云Git链接,截图没有学号要扣分
    学习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链接,截图要有学号水印,否则会扣分

    实验六

    (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)

    实验七

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

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

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

    (4)补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等(至少3个)
    测试实现的算法(正常,异常,边界)
    提交运行结果截图(如果编写多个排序算法,即使其中三个排序程序有瑕疵,也可以酌情得满分)

    (5)编写Android程序对实现各种查找与排序算法进行测试

    提交运行结果截图

    推送代码到码云(选做,加分)

    实验八

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

    课下把代码推送到代码托管平台

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

    课下把代码推送到代码托管平台

    (3)自己设计并实现一颗决策树
    提交测试代码运行截图,要全屏,包含自己的学号信息

    课下把代码推送到代码托管平台

    (4)输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)

    提交测试代码运行截图,要全屏,包含自己的学号信息

    实验九 图的综合实践

    (1) 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)(2分)

    (2) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)(4分)

    (3) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环(3分)

    、(4) 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出(3分)

    (5) 完成有向图的单源最短路径求解(迪杰斯特拉算法)(3分)

    四、代码托管链接

    码云链接:https://gitee.com/besti1923/feimao-has-no-legs

    • 给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?

    本学期代码3860行,相对来说应该是少了一点,但因为我的C语言学得也不是很踏实,所有Java学起来也很吃力,这个学期的课程又十分紧张。

    • 加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得

    其实要自己从头到尾实现代码是很困难的,加点代码和改点代码在我理解来就是先去看看别人写的代码,然后理解别人代码的思路和做法,然后加点东西和改点代码就变成自己的东西。

    • 积极主动敲代码做到没?教材实践上有什么经验教训?
      说实话并没有做到积极主动,因为这个学期总体课程被压缩得厉害,其他课程也在赶进度,我本来其他课程的基础不太牢固,编程基础也不牢固,所以作业做起来会十分吃力,要敲代码的时候基本都是要交作业和实验的时候。

    五、课程收获与不足

    • 自己的收获(投入,效率,效果等)

    学习Java这门课程,与其说学习Java,不如是说培养一种能力,自学的能力。很多东西老师并没有完全讲完,只是把我们领进了门,之后的内容需要我们自己去探索,这就需要我们的自学能力去自学一些知识,然后反过来给课堂上学到的知识一个照应。学习这门课,我不敢说自己的Java学得怎么用,但是可以说我现在学会了怎么样去自学一个东西。

    • 自己需要改进的地方

    对于Java的学习还不够积极,其他课程的基础没有打好,还有C语言的基础也没打好,所以整体学习起来十分吃力。我觉得自己应该做出一点改变,在之后的学习中都脚踏实地掌握多的知识点,实现一个知识网,才能在当下和未来的学习中做到步步为营。

    • 结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议

    这个学期并没有结对学习,在socket编程中是自己完成了两个。因为我是一个比较追求细节的人,所以有一些小细节的问题我会提醒身边一起学习的同学,因为我基础比较差,我也会经常向他们询问一些问题和解决方法。对老师的建议,多带

    六、问卷调查

    • 你平均每周投入到本课程有效学习时间有多少?

    每周应该不超过24个小时

    • 每周的学习效率有提高吗?你是怎么衡量的?

    提高一点,因为对于工具越来越熟悉。根据自己做实验时候的感觉来衡量。

    • 蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?

    还是有点促进的,因为将任务点分散来发布,但自身又是一个资源的汇合点,所以使用起来比较方便。

    • 你觉得这门课老师应该继续做哪一件事情?

    课堂上随机抽人回答问题

    七、总结中涉及到的链接的二维码

    • 码云项目链接:

    • 实验一 Linux基础与Java开发环境:

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

    • 实验三 下载安装并使用IDEA:

    • 实验四 Java Socket编程:

    • 实验五 Android Stuidio的安装测试:

    • 实验六 链表练习:

    • 实验七 定义一个Searching和Sorting类:

    • 实验八 完成链树LinkedBinaryTree的实现:

    • 实验九 图的综合实践:

    本学期《数据结构与面向对象程序设计》完结!!!

  • 相关阅读:
    Spring框架 基础01
    Mybatis框架 基础
    字节流,字符流
    集合的应用(练习:学生档案)
    集合
    时间类型的格式化(字符串和时间类型 之间的相互转换)
    逢三退一(boolean数组的使用)
    电子宠物(线程,实现方法)
    点是否在圆里
    sqlserver 指定上月25-本单据日期/本月24 数据汇总的保存后存储过程
  • 原文地址:https://www.cnblogs.com/dengziyan/p/14218276.html
Copyright © 2020-2023  润新知