20182307 2018-2019-1《程序设计与数据结构》课程总结

20182307 2018-2019-1《程序设计与数据结构》课程总结

每周作业链接汇总

  • 预备作业
    • VirtualBox虚拟机的安装
    • Linux操作系统的基础知识学习
    • 学习心得:初见Linux
      • 由于Linux的操作方式是完全命令行操作,与过往熟悉的Windows图形界面操作方式截然不同。无法再使用鼠标来点击操作,操作全依赖于命令的形式,但命令又难以记忆
      • 解决方式:对于键盘操作的陌生,熟练几个常用快捷键就能大大提高效率;对于命令的难以记忆,我去搜索了Linux指令的英文含义Linux命令英文缩写的含义),借此来顺利记忆其名称与用法
  • 第一周总结
    • 基础的面向对象程序设计思想
    • 编写简单的Java程序
    • 学习心得:C语言与Java的异同
      • 不同点:Java是一种面向对象的语言,而C语言是一种面向过程的语言,这是二者最大的不同。在我的理解里,面向过程注重于分析并解决问题所需要的具体步骤,是一个更注重细微处的微观思想;面向对象是从一个相对宏观的角度出发,把构成问题的事件分解成许多系统——即对象,然后设计这每个对象中以组为单位的行为。
      • 相似点:Java与C语言的语法极其相似,无论是输入输出、还是循环语句,两者只有在格式上有着细微的区别,其内在逻辑与原则基本是一致的
  • 第二、三周总结
    • Java程序编写基础知识
    • 包、类、对象、方法之间的关系
    • 学习心得:Java的核心思想
      • 包、类、对象、方法之间的关系简要可以描述为以下的包含关系:包 > 类 > 对象 > 方法。基本类型值可以“包装”为一个对象。每个类都属于一个具体的包,类作为对象的蓝图可以创建多个对象,用了对象就有了实例,可以调用具体的方法来达到应用的目的。
  • 第四周总结
    • 构造方法的用处及相关知识
    • 面向对象三要素之一——封装
    • 测试的编写
    • 学习心得:Java渐入门——编写类+封装
      • 上周学习的是多个常用类(String,DecimalFormat等)及包含的方法的使用,本周则延续了上周的学习内容,尝试了自己编写简单的类,并在主方法中实例化并调用自定义类的中的方法,接触了Java可谓最核心的操作。
      • 面向对象三要素之一:封装。封装如包装,却绝不仅限于此。封装既能做到控制外部对内部隐藏属性的操作行为,提高程序的安全性,还能降低模块之间的耦合性,使之相互独立,让系统不易崩溃。
  • 第五周总结
    • 面向对象三要素之二:继承
    • 学习心得:Java核心——继承
      • 这周主要学习的就是与继承相关的知识。那么何为继承?继承就是从一个已知类派生一个新类的过程。新类自动包含原类中的变量和方法,在我理解来就是拥有着父类的一切特性。但就像马是哺乳动物的一种一样,它具有哺乳动物的一切特征,但哺乳动物却不可能有马的一切特征。所以,子类就是拥有了其他特征特色的父类,表现为子类可调用父类的一切方法,也可以调用自己的方法 。
  • 第六周总结
    • 面向对象三要素之三:多态
    • 学习心得:Java核心——多态
      • 本周介绍了面向对象程序设计三要素的最后一个要素:多态。它是指一个在不同时刻可以指向不同类型对象的引用变量。 且多态引用只有在运行时才将方法调用与它的定义绑定在一起。
  • 第七周总结
    • 线性数据结构:栈
    • 线性数据结构:队列
    • 学习心得:数据结构入门
      • 栈:“先进后出
      • 队列:“先进先出
      • 本周开始正式接触数据结构的知识。数据结构,指的是相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。比如栈可以用来轻松解决后缀表达式计算的问题,而队列则常用于解决如深度遍历的问题。
  • 第八周总结
    • 查找:在一组数据项中找到指定的目标元素
    • 排序:按某种标准将一列数据项按确定的次序重排的过程
    • 学习心得:查找与排序——算法的优劣
      • 本周学习了多种的查找与排序算法。查找部分以线性查找和二分查找为例,比较了二者的优劣与各自特性;排序部分以选择排序、插入排序、冒泡排序、快速排序、归并排序为例,详细介绍了每一种排序方法的思想与运作机制,比较了各算法之间的时间复杂度,以此评判不同情况下不同算法的效率与优劣。
  • 第九周总结
    • 非线性数据结构:树
    • 学习心得:复杂数据结构及应用
      • 树是非线性结构,其中的元素组织为层次结构。过去离散数学课程上我们曾学习过关于树的知识,所以在理论上理解树的知识并不困难。但空有理论终究是纸上谈兵,真正的实现树这种数据结构是困难重重的。我在学习过程中印象最深刻的就是对于左右子树的理解,与栈这种数据结构的知识相近,左右子树的存在如同链表中next的存在一样,它只是某元素的一种属性,过于复杂抽象的去理解他反而会感到困惑,从程序本身的角度去理解不失为一个极佳的选择。
  • 第十周总结
    • 非线性数据结构:图
    • 学习心得:图与树
      • 本周学习了另一种非线性数据结构:图。与树不同的是,图没有特定的父子关系,图中的结点可以与许多其他的结点相连接,所以从另一个角度来说,树就是图。
      • 非线性数据结构的学习难度要远远大于线性的,无论是从理解上来说要更抽象,还是实现的难度要远超栈、队列。图的核心我认为就在于深度优先遍历与广度优先遍历,实现这两种方法的过程不仅体现了对图这种数据结构的理解,其中涉及的递归思想等也能反映设计程序的能力

自认为写得最好一篇博客是?为什么?

  • 第八周学习总结
  • 第八周主要学习了各类的查找与排序方法。我自认为本篇博客写的较好的理由是因为我在本篇博客中写入了较多的关于本周所学知识的个人感悟,比如对于快速排序的过程及其稳定性的理解。我认为写博客并不是为了达成交作业这样一个肤浅的目的,写博客的过程也是再一次加深自己对知识的理解程度,并真正将其加入自己的知识体系的过程。

作业中阅读量最高的一篇博客是?谈谈经验

  • 预备作业
  • 本篇是预备作业,主要涉及的是Linux操作系统的学习。阅读量最高的原因可能是因为本篇对于知识点的提炼与罗列比较详尽,借鉴意义较大。

实验报告链接汇总

  • 实验一Linux基本操作与简单Java程序编写
    • 基于命令行和IDE Intellj IDEA 简易教程
    • 进行简单的Java程序编辑、编译、运行和调试。
    • 练习Linux基本命令;
    • 学习Java程序的JDB调试技能
      编写简单的Java程序。
  • 实验二编写简单程序并测试
    • 编写简单的计算器,完成加减乘除模运算。
    • 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
    • 编写测试代码,测试验证。
  • 实验三IDEA的使用、测试代码、UML图的绘制
    • 下载安装并使用IDEA
    • 初步掌握单元测试和TDD
    • 理解并掌握面向对象三要素:封装、继承、多态
    • 初步掌握UML建模
  • 实验四Socket编程与密码算法
    • Java Socket编程
    • Java和密码学
    • 编写有理数/复数计算器
    • 远程有理数计算器
    • 远程复数计算器
  • 实验五基础Android学习
    • Android Stuidio的安装测试
    • Activity测试
    • UI测试
    • 布局测试
    • 事件处理测试
  • 实验六数据结构——链表
    • 设计链表并打印链表元素
    • 实现链表的插入、删除、输出操作
    • 使用冒泡排序法或选择排序法对链表元素进行排序
    • Android实现以上实验
  • 实验七查找与排序
    • 定义一个Searching和Sorting类
    • 重构代码并命令行运行
    • 在Searching中补充查找算法并测试
    • 补充实现课上讲过的排序方法
    • 编写Android程序对实现各种查找与排序算法进行测试
  • 实验八数据结构——树
    • 参考教材PP16.1,完成链树LinkedBinaryTree的实现
    • 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能
    • 自己设计并实现一颗决策树
    • 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
  • 实验九数据结构——图
    • 初始化无向图和有向图
    • 完成有向图和无向图的遍历(深度和广度优先遍历)
    • 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环
    • 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出
    • 完成有向图的单源最短路径求解(迪杰斯特拉算法)

团队项目报告链接汇总

  • 第一周
    • 团队展示
    • 团队选题确立
    • 需求规格说明书雏形
  • 第二周
    • 完善需求规格说明书
    • 制定团队编码规范
    • 数据库ER图
    • 项目后端架构设计
    • 确定团队分工
  • 第三、四周
    • 冲刺(7次 Scrum)
    • 团队在日期区间内,任选7天进行冲刺,冲刺当天晚10点前发布一篇随笔,共7篇。具体的博文规范如下:
      • (1) 第 1 篇 Scrum 冲刺博客对整个冲刺阶段起到领航作用,应该主要包含四个部分的内容:
        • 各个成员在 Alpha 阶段认领的任务
        • 明日各个成员的任务安排
        • 整个项目预期的任务量(使用整数表示,与项目预估的总工作小时数一致。比如项目A预估需120小时才能完成,则任务量为120。)
        • 团队成员贡献值的计算规则
      • (2) 第 2-7 篇 Scrum 冲刺博客是冲刺阶段的主要产出,主要包含四个部分的内容:
      • 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图;如果完成的任务为调研任务,需给出对应的调研总结博客链接;如果完成的任务为学习技术任务,需给出学习总结博客链接)
        • 各个成员遇到的问题
        • 明日各个成员的任务安排
        • 各个成员今日对项目的贡献量(使用整数表示,如无产出则为0,整个冲刺阶段所有成员的贡献量总和应与项目预期任务量相近)
      • (3) 第7篇 Scrum 冲刺是对冲刺阶段的总结,主要包含两个部分的内容:
        • 各个成员今日完成的任务(要求同上)
        • 项目的发布说明,主要包含:本版本的新功能,软件对运行环境的要求,系统已知的问题和限制,软件的发布方式以及发布地址。
    • 除上述博客内容外,每次 Scrum 冲刺博客都需要提供当天站立式会议照片一张,发布项目燃尽图,并描述项目整体的进展情况。

代码托管链接

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

  • statistic运行结果
  • 总结:本学期的代码量目标顺利达成了。学期开始时对于10000行代码的目标,我还不敢确定说一定能完成,因为上学期学习C语言时就没能达成那样的代码量。但这学期的学习过程中,不论是因为作业量巨大,还是自己想锻炼能力的意愿,最后都达成了超过10000行的成就,我自己还是比较满意的:-)

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

  • 《编程的智慧》总结
    • 提炼代码是编程的修行
    • 如何写模块化代码
    • 写简单代码
    • 正确处理错误
    • 正确处理null指针
    • 防止过度工程
  • 心得:在参考了《编程的智慧》,并结合自己学习过程中的感悟,我感触最深的就是“提炼代码是编程的修行”这一点了。在自己编程的过程中,最初始设计程序的时候,总是会思考的过于复杂,导致很多代码都很冗余。但在继续编程的过程中,随着对程序和目标的进一步深入理解,我会回头去删减一些无用代码,或者用更精简的代码实现同样的功能。这并不是无意义的,许多时候重新提炼的代码能更完美地契合程序的目标,而最初的代码往往不能通过动态测试。

积极主动敲代码做到没?教材实践上有什么经验教训?

  • 总结:积极主动敲代码我自认为还是做到了的。在课程的学习过程中,我越发发现,如果代码不自己亲手敲一遍,只是凭借“观察法”去体会代码的意思,学习效果是很差的。自己亲手敲一遍,就算不是自己设计的,是有所借鉴的,在敲的过程中也能更好的去领会原编程者的与该程序所涉及的思想、知识等。
  • 教材的实践也是一样。虽然都是在照着书上的代码敲,但是亲手敲下来与只是看一遍的差别还是很大的。教训也是有的,就比如有些作业要求是补全书上代码,自以为看过一遍代码就能理解的我,最后花了远远超过预期的时间才完成作业。

课堂项目实践

课堂实践链接

  • Scanner&JDB练习
    • 输入两个数,计算两个数的加、减、乘、除运算结果,并输出。
  • 类的编写实践
    • 编写一个Book类,其实例数据分别表示书名、作者、出版社以及版权日期。定义一个Book构造方法,接收并初始化实例数据;为所有实例数据定义获取和设置他们的方法;定义一个toString方法,返回几行描述该图书的字符串。创建一个Bookshelf驱动类,其main方法实例化并输出一些Book对象。
  • Interface实践
    • 接口测试(Interface)
    • 定义一个接口People,并定义另外一个Student类,实现该接口。
    • 做简单的测试(StudentTest)
  • 链表实践
    • 通过键盘输入一些整数,建立一个链表
    • 实现节点插入、删除、输出操作
  • 线性表实践(ArrayList、LinkedList)
    • 学习ArrayList和LinkedList类,并在Android平台上实现添加、删除、修改等操作(数据可以自己定义)、,并实现倒置
    • 倒置的意思就是:1 2 3 4 5 变为 5 4 3 2 1
  • 二叉树的建立和层序遍历法实践
    • 给定一个序列AB#CD###E#F##建立一颗树,根据“二叉树的生成”算法构造这颗树
    • 使用层序遍历方法完成遍历并测试
  • 递归前中后序和非递归前中序遍历实践
    • 课堂中,给定一个序列AB#CD###E#F##建立了一颗树。
      在此基础上,分别实现:
      递归方法实现前序遍历、中序遍历、后序遍历
  • 二叉排序树实践
    • 建立一颗二叉排序树,样例如附件所示。完成:
    • 创建二叉排序树
    • 查找一个元素,包含查找成功和失败的例子;
  • 哈夫曼编码实践
    • 设有字符集: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个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树。
      并完成对英文文件的编码和解码。
  • 图实践
    • 图的存储表示以及计算结点的度。
    • 定义有向图和无向图(把附件图中的箭头去掉)的顶点矩阵和邻接矩阵,并计算每个结点的入度和出度
    • 定义有向图的带权临街表,并计算每个节点的出度
  • 拓扑排序实践测试
    • 编写代码初始化有向无环图和有向有环图(见附件1和2),使用邻接表初始化图
    • 使用堆栈实现拓扑排序算法,输出附件1图的拓扑排序序列且没有环,检测附件图2存在环

课堂实践对提高应用能力有帮助吗?

  • 由于本学期的课时紧张,进行的课堂实践并没有编程实践,都是对课堂学习的理论实践。但毫无疑问的是,这样的理论实践对提高应用能力也是很有帮助的。毕竟如果连理论功夫都不扎实,应用就更无从下手了。

课堂实践上自己有什么经验教训?

  • 经验教训就是上课的时候一定要好好听讲,不然最后实践测试的时候就算头发都薅下来也做不出来。

课堂实践上对老师有什么教学建议?

  • 大部分时候老师的讲解都是很棒的。只有偶尔一些时候可能是为了追赶课程进度,讲的快了些,让人有些来不及消化,可以理解。

课程收获与不足

  • 自己的收获
    • 我觉得自己最大的收获就是独立解决问题的能力大大提高了。最一开始学习的时候,遇到某些问题卡壳久了就会倾向于去寻找各种帮助,向老师、助教、同学,他们总是乐意放下手头的事情为我解答疑惑,但老师每次都只会指导我如何自己解决问题,而不是授我以鱼。久而久之,我养成了独立思考的能力,也能做到独立解决问题了。
  • 自己需要改进的地方
    • 编程能力还是有所欠缺。特别是课程进行到数据结构的部分时,难度经常把我劝退,很多时候我也是放弃了自己去摸索而是去各处寻找借鉴,这是一个很大的不足需要改进。
  • 结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
    • 结对学习我认为始终还是贯彻了的。从一开始的Linux学习到最后的大作业,我和郑力元一直都是互帮互助的。印象最深的一次就是Socket结对编程的时候,因为一个字符串的分割让我们困扰了很久,最后是我们一起钻研,自己学习了split方法攻克了难关。

问卷调查

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

  • 前期由于课外活动的缘故,投入并不多,每天最多两个小时。但随着课程的推进,难度与作业量的增大,投入时间也显著增多,很多时候一敲代码就是一晚上(我轻微反弓的颈椎可以作证)

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

  • 学习效率不可能一直在提高,有一个波动的过程,但总体来说后期的效率要远高于前期。衡量标准也没什么特殊的,不过就是完成作业的质量与时间花费,分数可以作证,比如后期我的博客获得优秀的评价次数就远高于前期。

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

  • 云班课是个挺好的提醒学生完成作业的app,既方便又灵活。不但可以在云班课上查找一些需要的视频、文字资料,最关键的是提交作业的时间可以根据实际情况作出人性化的改动,这就很胖了。

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

  • 继续鼓励同学提高自主解决问题的能力。

你觉得这门课老师应该停止做哪一件事情?

  • 别老天天把“我要把你挂了”挂在嘴边了,又舍不得。

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

码云项目链接:

  • 码云:

每周学习总结博客:

  • 预备作业:
  • 第一周总结:
  • 第二、三周总结
  • 第四周总结
  • 第五周总结
  • 第六周总结
  • 第七周总结
  • 第八周总结
  • 第九周总结
  • 第十周总结

实验报告

  • 实验一:Linux基本操作与简单Java程序编写
  • 实验二:编写简单程序并测试
  • 实验三:IDEA的使用、测试代码、UML图的绘制
  • 实验四:Socket编程与密码算法
  • 实验五:基础Android学习
  • 实验六:数据结构——链表
  • 实验七:查找与排序
  • 实验八:数据结构——树
  • 实验九:数据结构——图

实践

  • Scanner&JDB练习
    21
  • 类的编写实践
    22
  • Interface实践
    23
  • 链表实践
    24
  • 线性表实践(ArrayList、LinkedList)
    25
  • 二叉树的建立和层序遍历法实践
    26
  • 递归前中后序和非递归前中序遍历实践
    27
  • 二叉排序树实践
    28
  • 哈夫曼编码实践
    29
  • 图实践
    30
  • 拓扑排序实践测试
    31
posted @ 2019-12-16 20:31  陆彦杰  阅读(295)  评论(0编辑  收藏  举报