20172313 2018-2019-1《程序设计与数据结构》课程总结
写在前面
转眼间,又一个学期也已经过去了,算起来,这是学习Java的第二个学期。回想起来这几个月的学习时光,有欢乐,也有汗水,有喜悦,也有痛苦。经历了自己亲手用Java写出完整数据结构的雀跃,也饱受在深夜写出的Android项目不能实现功能的苦恼。在这段时间里,我学习到了很多,也成长了很多。我也有模有样的进行了最后一次的项目展示。在进行合作项目的那段时间内,虽然天天熬夜,但最后看到app成果的时候还是非常开心的,也确是得到了一个不错的结果。在这里学期里,首先非常感谢王老师,看得出来王老师在每节课前都有认真仔细的准备,课后也能耐心的给我们答疑。还有就是张师瑜和张之睿两位助教,能够仔细的批改我们的作业和博客。在这里向你们表达真挚的感谢。本篇博客也是这学期的最后一篇博客了,就这样为程序设计课程画上一个圆满的句号吧!
每周作业链接
- 第一周作业:初步接触了数据结构的概念,学习大O计数法的表示和时间复杂度的分析。
- 第二周作业:学习练习了自己使用数组和链表进行堆栈。
- 第三周作业:学习练习了自己使用数组和链表去实现队列。
- 第四周作业:学习练习了自己使用数组和链表去实现列表。
- 第五周作业:重新学习了多种查找和排序算法,并使用自己之前写的数据结构进行实现。
- 第六周作业:学习了解树这一数据结构并对其进行实现。
- 第七周作业:学习树中的特例二叉查找树并对其进行实现。
- 第八周作业:学习了优先队列和堆并对其进行实现。
- 第九周作业:学习了图的的相关知识和算法并对其进行实现。
博客两问
你觉得自己写的最好的一篇博客是哪一篇?
我觉得我写的最好的一篇博客应该是第七周的博客。为了学习第七周的内容,我真的是花费了不少时间,我个人认为第七周的学习内容是本学期内最难的,单单是为了弄懂红黑树就花了大概两个晚上的时间,但最后还是没有彻底的理解。这篇博客上面的示意图也都是我自己使用软件进行绘制的,也用了一些时间。也就是这篇博客上面倾注的心血最多,所以我觉的自己写的最好的一篇博客是这篇。
作业中阅读量最高的一篇博客是?谈谈经验
我今天去查看博客园的浏览量的时候,我才发现我的阅读量最多的一篇博客竟然是最后一次任务的总结博客:《Java实现哈夫曼树》我其实感觉这篇博客写的知识性并没有很强,完全就是在按照自己的想法在写,只是大致的记录一下自己在使用Java实现哈夫曼树的过程中的思路和代码,也没有什么自己特别独到的见解。我一直都觉的自己的博客相比于班里的其他人来说写的是比较水的,无论是从内容还是博客整体的易读性和美观度。可能是在这个任务的时候我的博客提交的比较早而已吧!
实验报告链接汇总
- 实验一:对以前学习的知识进行复习,练习排序算法的使用,使用自己编写的数据结构进行实现。
- 实验二:复习Junit测试,对树状数据结构进行深入的学习使用,分析红黑树的源码锻炼看代码的能力并加深理解。
- 实验三:深入学习练习查找和排序的几种算法,使用自己编写的数据结构进行实现。
团队项目报告链接汇总
- 第一周阶段总结
- 团队展示
- 团队选题
- 团队选题
- 团队任务计划
- 采访老师或有经验的学长
- 需求规格说明书
- 第二周阶段总结
- 规格说明书
- 修订历史
- 上次的《需求规格说明书》初稿有哪些不足?
- 团队编码规范
- 使用Powerdesigner绘制ER图
- 后端架构设计
- 团队分工
- (一)核心需求的优先级
- (二)确定子功能的工作量
- (三)TODOList及燃尽图
- 本周分工及工作量比例
- 参考资料
- 规格说明书
- 冲刺周
代码托管
1. 给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
单单从代码量上来看的话,我觉得应该是满足这学期的任务了,但我觉得编程能力的提高不是简单的凭借着代码量的多少就能衡量的。在这学期的代码中,有不少是对已经写好的数据结构的代码进行重复的使用,亦或是对代码修改了一小部分又重新拿过来用。代码量只能称之为学习的一个衡量标准,最重要的还是在实践的项目中能够有所进步。片面的看自己IDEA和AS上的代码量沾沾自喜,安慰自己这学期已经很努力了是没有用的。
2.加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得。
原来不知道在什么地方看到这样一段话,相信大家也看到过,大概是这样的:在进行编程的时候,我们没有必要重新造一个轮子。
是啊,在前人已经造好了一个足够好用的轮子之后,我们没有必要重新开始,考虑这个轮子是如何从原材料进入工厂怎样一步步的变成我们所看到的轮子的模样。我们需要做的是思考怎样才能把这个轮子给应用的足够好,赋予这个轮子以存在的意义。所以我认为在别人代码的基础上加点改点代码是非常重要和必要的。
3.积极主动敲代码做到没?教材实践上有什么经验教训?
林林总总算下来,这学期也敲了不少代码,相比于上个学期来说,最重要的改变就是没有再重复的手敲书上的代码,而是经常对自己已经完成的代码进行修改,应该来说积极主动敲代码大体上是完成了吧。
我觉得教材实践还是很有用的,在学习的过程中,教材是可以依靠的基础,如果没有了这个基础,漫无目的的去东一榔头西一棒槌的学习的话效率会非常的低下。
课堂项目实践
-
时间复杂度分析: 时间复杂度分析,用大O记法写出时间复杂度。
-
ArrayStack的实现和测试: 完成课本中ArrayStack类的实现,特别是完成peek、isEmpty、size和toString方法的实现,并完成四个方法的测试。
-
链表插入: 写出链表中节点插入的操作代码。
-
链表实践: 链表练习,要求实现下列功能:
- 通过键盘输入一些整数,建立一个链表
- 实现节点插入、删除、输出操作
- 使用冒泡排序法或者选择排序法根据数值大小对链表进行排序
-
第四章代码检查: 运行PP28,PP28页的程序,根据个人学号输入后缀表达式并计算。
-
LinkedStack补全: 给出size、isEmpty和toString等方法的定义,以完成LinkedStack类的实现。
-
第五章代码检查-凯撒密码: 代码检查P72-P73,凯撒密码程序。
-
杨辉三角: 使用循环队列输出杨辉三角。
-
栈队列测试:
-
第六章代码检查: 运行PP6.8和PP6.11的程序
-
线性表实践: 定义一个商品类Product,需要包括商品名称、价格等信息,使用链式存储结构实现一个线性表,存储商店中的商品。支持插入、删除、选择排序、查找等功能,并进行简单测试。
-
ASL测试: 已知线性表具有元素{5,13,19,21,37,56,64,75,80,88,92},如果使用折半查找法,ASL是多少?
-
输出后缀表达式。
-
三种查找算法练习:
-
哈希冲突处理实践: 把自己的学号加21,例如学号为1,把22添加到序列后面,使用链地址法,解决冲突。编程实现,并测试。
-
希尔排序测试:
-
树计算题: 计算题:
- 1.有1023个结点的完全二叉树,其高度是多少?叶结点数是多少?
- 2.高度为h的完全二叉树至少有多少个结点?至多有多少个结点?
-
树的深度和叶子个数计算: 计算课本中背部疼痛诊断器中决策树的叶子节点个数?根据课堂介绍的递归树深度计算算法,计算决策树的深度。
-
中序和先序计算二叉树结构:若已知中序和先序序列,计算二叉树结构
-
层序遍历法实践: (1)使用递归实现层次遍历背部疼痛决策树,并按照层次顺序输出每个节点内容。(2)非递归的层次遍历法算法如下:
根结点入队;
从队头取元素, 并执行如下3个动作:- (1)访问该结点;
- (2)如果该元素有左孩子,则左孩子入队;
- (3)如果该元素有右孩子,则右孩子入队;
重复执行上述过程,直至队列为空。 此时,二叉树遍历结束。按照上述算法,编程实现层序遍历,按照层序的方法,遍历并依次输出每个节点内容。
-
堆构造与排序: 根据关键字序列:36,30,18,40,32,45,22,50,构造一颗小顶堆,并排序?
-
堆排序测试: 根据关键字序列:36,30,18,40,32,45,22,50,利用数组构造一颗大顶堆,并排序。
-
十一链表练习: 画出十一链表结构。
-
最小生成树:
- 1.画出Prim算法的最小生成树的生成过程
- 2.画出Kruscal算法的最小生成树的生成过程
- 3.计算最小权值
-
Dijkstra(迪杰斯特拉)算法测试: 使用Dijkstra(迪杰斯特拉)算法计算单源(V1出发)最短路径。
-
AOE练习:
- 1、求关键路径,v1和ve的值并写出具体步骤
- 2、画出图一可能的拓扑序列
- 3、画出图二所示无向图的邻接矩阵、邻接链表,并列出深度优先和广度优先遍历图所得的顶点序列。
- 4、写出图三的邻接矩阵,并用prim算法求最小生成树,画出产生过程
-
哈夫曼测试: 设有字符集: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. 课堂实践上自己有什么经验教训?
及时的对内容进行复习和预习,因为有的时候你可能上节课的知识没有记牢,就无法和这节课的知识所联系起来,从而完不成课堂实践,也有可能你没有进行预习,当节课的内容并没有很好的理解,这样也导致了课堂实践没有办法按时完成。
3. 课堂实践上对老师有什么教学建议?
这学期的课堂实践总体来说还是很好的,难度适中,比较符合课程的进度和内容,但其中有些与课后的练习重复,希望能够有所改进,
课程收获与不足
自己的收获
这个学期相较于上个学期的学习来说,内容更有深度,学习起来自然也就花费了更多的时间,上个学期主要是花费较多的时间来理解代码,来看懂代码讲的到底是什么意思。这个学期花费较多的时间来思考代码究竟是怎么来实现的,捋清楚了思路,其实真正编码的时间并没有很长。自己的收获大多都是锻炼了自己的思考能力吧。
自己需要改进的地方
我在博客园上也经常看其他同学的博客,也发现有很多高品质的博客,内容的分析都很细致,也有不少自己独立的思考。相比之下,我感到自己的学习时间是不太够的,也没有及时的形成文字进行记录。我在前面也提到,自己的博客是比较水的,在这些方面还有很多需要改进的地方。
结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
结对学习的话,我认为还是贯彻了的,小组内的成员也都花费了不少时间在学习上,有不懂的地方也都会一起讨论,每个人在代码上也都倾注了很多心血,我一直坚信着1加1大于2的道理,所以我认为结对学习也是非常必要。提到我所接受的帮助,大多也就是编程的思路和想法,在数据结构的学习中,一旦思路被挑明,写起代码来也就简单许多了。
问卷调查
1. 你平均每周投入到本课程有效学习时间有多少?
大致估计一下的话,平均应该有15-20小时吧,有时候因为自己犯的错误过多使得花费的时间更多,当然这其中也有一部分是无效学习时间。
2. 每周的学习效率有提高吗?你是怎么衡量的?
效率的话,除去十一放假,其他的学习效率还是有所逐渐提高的,但看学习的时间来衡量我觉得有些偏颇,我觉得还是用当周的学习状态,解决问题的速度来衡量要合理一些,毕竟学习效率这个东西只有自己心里清楚。
3. 蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?
蓝墨云班课作为电子平台,相较于传统的教学模式,无论是提交作业还是发布任务上都要方便许多,也免去了老师和学生之间纸质交流的麻烦,还是很有帮助的,意见和建议的话,这个真没有。
4. 你觉得这门课老师应该继续做哪一件事情?
继续进行课堂实践和蓝墨云班课的使用,我觉得这两件事对编程能力的提高有很大的帮助。
5. 你觉得这门课老师应该停止做哪一件事情?
写博客。
6. 你觉得这门课老师应该开始做什么新的事情?
大胆创新,不再进行写博客,写博客的意义在不断学习的过程中已经被淡化了,更重要应该是理解,理解的加深不是单纯的靠写博客就能实现的。