20182312 2018-2019-1《程序设计与数据结构》课程总结
20182312 2018-2019-1《程序设计与数据结构》课程总结
每周链接汇总
-
第一周作业:学习教材第一章,学习使用vim、命令行的使用。
-
第二、三周作业:学习教材第二、三章,数据和表达式,使用类和对象。
-
第四周作业:学习教材第四、五章,迭代器和编写类。
-
第五周作业:学习教材第八章,继承。
-
第六周作业:学习教材第九、十章,学习了多态和异常,用接口和继承实现多态,try-catch语句捕获异常。
-
第七周作业:学习教材第十二、十四、十五章,学习了算法分析,栈,队列。
-
第八周作业:学习教材第十三章,查找和排序,选择排序,插入排序,冒泡排序等。
-
第九周作业:学习教材第十六、十七章,树,二叉查找树。
-
第十周作业:学习教材第十九章,图 ,深度广度优先遍历,最小生成树,拓扑排序。
自认为写得最好一篇博客是?为什么?
-
自认为写的最好的是第十周作业,原因如下:
-
这是我最熟悉的一章,因此可以写的东西很多,不是憋出来的博客。
-
这是本学期第一次在每周总结中加上目录,看起来舒服多了。
-
博客图文并茂,还插入了点代码,是我一次次看别人博客逐渐改进的最后成果。
作业中阅读量最高的一篇博客是?谈谈经验
- 本学期阅读量最高的一篇博客是第二、三周作业
- 经验:早点交,供后来者查阅。
实验报告链接汇总
-
实验一:用vim进行编程,单步调试,git push到码云。
-
实验二:编写计算器及相应的测试代码。
-
实验三:封装、继承、多态,uml建模。
-
实验四:编写有理数,复数计算器,及和服务器有关的远程有理数、复数计算器。
-
实验五:Android Studio的Activity、UI、布局、事件处理测试。
-
实验六:建立并打印链表,并在Android上实现。
-
实验七:选择与排序。
-
实验八:链树和决策树的实现,实现中缀转后缀。
-
实验九:有向图,无向图,拓扑排序,最小生成树。
团队项目报告链接汇总
代码托管链接
给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
-
代码量已经达到在12297行代码中,有效的代码行数未10789
-
代码量多是有原因的,由于课时的压缩以及各种实验和pp项目,我们很多的代码有的是直接对着书敲的,有的是老师给的,还有的是需要自己从网上自己搜索自己理解修改的。
-
真正的算是我自己思考手动敲出来的大概就只有4000行甚至更少吧,因为我在编程上下的功夫确实不够深,所以我在看见编程能力强的同学的代码的时候颇为惊叹。
-
学无止境,虽然本学期Java课程已经结束了,但我觉得Java作为一个工具还是很值得学习的,因此我之后依然会抽时间去学习它。
加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
- 在编程的智慧中提到“反复推敲代码”、“写优雅的代码”、“写模块化的代码”、“写简单的代码”、“写直观的代码”,经过一个学期的学习之后我深有体会,在我研究理解网上的相关的代码的时候,或者在看同学的代码的时候,我有过的最深刻的体会就是:编码能力强的人思考的是一整块的代码,他们在写这个方法的时候已经在脑海中构思出了自己需要调用的东西,并且,与学的不好的人不同,他们会习惯性的加上注释,并且不会随意的省略一些东西,这样使得他们的代码不论是自己看还是别人看都很直观,方便理解,看起来赏心悦目。在我看来,这不仅需要大量的练习,还需要培养自己的逻辑思想,我自愧不如,但路漫漫其修远兮,吾将上下而求索。
- “加点代码,改点代码是理解的最好方式”这句话一开始在我看来和抄袭无异,但是在学习了一段时间后我发现,在大家都是入门新手的时候,大家其实都是这样学习的,并且,很多时候当我们卡在一个功能无法实现时,我们需要接受一下别人的思想,看了别人的代码之后,才能逐渐构建自己的思想体系,从而能够自己编写出带有自己风格的代码。
积极主动敲代码做到没?教材实践上有什么经验教训?
- 本学期很遗憾,我并未能做到积极主动敲代码,这个我没啥好找理由的,课程多且难本不该成为我没学好Java的借口,在课余时间未能主动的去研究代码和数据结构才是我最终没能和班里最好的那些同学一样有那样强的编程能力的原因,除了ddl的临近不碰Java,不问Java,这使得我自始至终都感觉自己是在被课程拖着走。
- 关于教材实践方面,我每次对着书上敲代码不是这里错就是那里错,但是感觉对这个情况早有预料,而且在一次次修改书本上代码的时候,锻炼了我查错的能力,现在我已经可以熟练的解决很多代码的报错了。
课堂项目实践
-
Scanner&JDB练习:输入两个数,计算两个数的加、减、乘、除运算结果,并输出。
-
类的编写实践:编写一个Book类,其实例数据分别表示书名、作者、出版社以及版权日期。
-
Random和NumberFormat测试:生成-10~10之间的随机数,并格式化输出(0.###)
-
Interface实践:定义一个接口People,并定义另外一个Student类,实现该接口。
-
文件读写:学习字节流和字符流,实现创建文件,采用四种方法写入和读取文件
-
时间复杂度分析:计算时间复杂度,用大O记法进行表示。
-
ArrayStack类的实现和测试:完成课本中ArrayStack类的实现,特别是完成peek、isEmpty、size和toString方法的实现,并完成四个方法的测试。
-
后缀表达式求值:从命令行输出一个后缀表达式:7 4 -3 * 1 5 + / *利用栈计算该表达式的值。
-
链表插入:写出链表中节点插入的伪代码。
-
链表实践:通过键盘输入一些整数,建立一个链表;实现节点插入、删除、输出操作;使用冒泡排序法或者选择排序法根据数值大小对链表进行排序。
-
链栈补全(LinkedStack补全)size\isEmpty\toString\Push:实现size、isEmpty和toString等方法并进行测试。
-
CircularArrayQueue方法补全:PP15.2完成CircularArrayQueue类的实现,包括所有的方法。要求通过入队和出队操作,出现队空和队满的情况。
-
线性表实践(ArrayList、LinkedList):学习ArrayList和LinkedList类,并在Android平台上实现添加、删除、修改等操作(数据可以自己定义),并实现倒置。
-
查找及ASL作业(编程+计算):给定关键字序列19 14 23 1 68 20 84 27 55 11 10 79,试分别用顺序查找、折半查找、二叉排序树查找、散列查找(用线性探查法和链地址法)来实现查找。试画出它们的对应存储形式(顺序查找的顺序表,二分查找的判定树,二叉排序树查找的二叉排序树,两种散列查找的散列表),并求出每一种查找的成功平均查找长度。其中,散列函数H(k)=k%11。
-
二分查找(折半查找)实践:给Searching类添加二分查找算法的递归实现方法。创建驱动程序来演示这个实现机制。
(1)编程实现递归
(2)创建一个测试类,测试递归实现的二分查找是否正确。 -
快速排序测试(必须有中间过程):{49,38,65,97,76,13,27,49,55,04}快速排序第一趟的结果是?
-
选择排序最坏情况:用一个例子分析,为什么选择排序元素移动次数的最坏情况是3(n-1)次?
-
树-计算题:
1.有1023个结点的完全二叉树,其高度是多少?叶结点数是多少?
2.高度为h的完全二叉树至少有多少个结点?至多有多少个结点?
3.已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点,…,nm个度为m的结点,问该树中有多少个叶结点? -
中序和先序计算二叉树结构:若已知中序和先序序列,计算二叉树结构
例:已知一棵二叉树的先序序列和中序序列分别为ABDGHCEFI 和 GDHBAECIF,试确定二叉树结构。 -
二叉树的建立和层序遍历法实践:(1)给定一个序列AB#CD###E#F##建立一颗树,根据“二叉树的生成”算法构造这颗树。
(2)使用层序遍历方法完成遍历并测试。 -
递归前中后序和非递归前中序遍历实践:
课堂中,给定一个序列AB#CD###E#F##建立了一颗树。
在此基础上,分别实现:
(1)递归方法实现前序遍历、中序遍历、后序遍历。
(2)非递归方法实现前序遍历和中序遍历。 -
堆排序过程测试:写出图中后续排序过程
-
二叉排序树实践
建立一颗二叉排序树,样例如附件所示。完成:
(1)创建二叉排序树
(2)查找一个元素,包含查找成功和失败的例子;
(3)插入2个元素,1个插入到左子树,1个插入到右子树;
(4)删除一个元素,要考虑不同情况。 -
哈夫曼编码实践:设有字符集: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)准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率
(2)构造哈夫曼树
(3)对英文文件进行编码,输出一个编码后的文件
(4)对编码文件进行解码,输出一个解码后的文件 -
实验记录博客:哈夫曼编码对文件进行加密解密
-
哈夫曼编码测试:哈夫曼编码测试,画出哈夫曼树,写出各个叶子节点的编码。
-
图实践:图的存储表示以及计算结点的度。
(1)定义有向图和无向图(把附件图中的箭头去掉)的顶点矩阵和邻接矩阵,并计算每个结点的入度和出度。
(2)定义有向图的带权临街表,并计算每个节点的出度
-
十字链表练习:画出十一链表结构
-
图的DFS和BFS测试:写出图的BFS和DFS遍历序列
-
考试安排冲突问题:画图
-
最小生成树测试:
1.画出Prim算法的最小生成树的生成过程
2.画出Kruscal算法的最小生成树的生成过程
3.计算最小权值
-
Dijkstra(迪杰斯特拉)算法测试:使用Dijkstra(迪杰斯特拉)算法计算单源(V1出发)最短路径。
图2是课堂介绍的示例。
要求
(1)写出V1到各个顶点的最短路径
(2)要求写出最短路径计算过程(类似于图2)
- AOE/AOV练习:
1、求关键路径,v1和ve的值并写出具体步骤
2、画出图一可能的拓扑序列
3、画出图二所示无向图的邻接矩阵、邻接链表,并列出深度优先和广度优先遍历图所得的顶点序列。
4、写出图三的邻接矩阵,并用prim算法求最小生成树,画出产生过程
-
拓扑排序实践测试:
编程实践:
(1)编写代码初始化有向无环图和有向有环图(见附件1和2),使用邻接表初始化图。
(2)使用堆栈实现拓扑排序算法,输出附件1图的拓扑排序序列且没有环,检测附件图2存在环。
-
课堂实践对提高应用能力有帮助吗?
- 课堂实践的内容一般都是当堂讲过的用以检验我们是不是认真听了课,有没有消化所学知识,对于检验听讲成效颇有帮助,对于应用能力的提高也有一定的作用。
-
课堂实践上自己有什么经验教训?
- 上课得好好听,不好好听实践的时候不知道老师要你干什么。
-
课堂实践上对老师有什么教学建议?
- 每次的课堂实践,给做错的人一个补救的机会而非直接不给分,比如写一篇博客,实践的目的并非拉开分差,而是督促同学们认真听讲提高应用能力。
课程收获与不足
-
自己的收获(投入,效率,效果等):
本学期的Java课让我投入了最多的时间,效率却不是很高,因为我很缺乏自觉性,不能积极自主的敲代码,效果前期不太好,后期较为显著,前期为了完成作业学Java,后期利用之前学的Java实现各种数据结构,颇有意思。 -
自己需要改进的地方:
应该更加自主的敲代码,研究代码,提高自己的编码能力,目前和最好的那些人差距还是肉眼可见的,原因可能是别人思考了代码为什么这么改,而我只是会改,而并非理解了每一行代码。 -
结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议。
真正贯彻了。我选修过离散,因此对数据结构稍微熟悉一点,因此常常帮助未能理解这些的结对伙伴,而他会将自己学到的有关Java的各种语句分享给我,我们在此互帮互助的情况下互有提升。建议每个组的人可以多一点,有时候两个或者三个人都很菜,沟通就很麻烦,容易互相听不懂对方在说什么。
问卷调查
-
你平均每周投入到本课程有效学习时间有多少?
- 大概每周20小时吧,实践和实验频繁的话会更多,因为我很多时候都不是复制代码,而是先用自己的想法尝试去写,常常花去一个下午或晚上,纵使没能自己完成,对我而言这也是有效的学习。
-
每周的学习效率有提高吗?你是怎么衡量的?
- 每周的学习效率是从学期初的高到中期的低再到最后的回升的。我通过每节课的疲惫程度来衡量,学期中事情多学习效率大幅下滑,学期的头尾没啥事,能抽出时间好好看看Java。
-
蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?
- 有促进作用,那个时间规定让我倍感紧迫。建议老师开始就设置课代表当助教,以便根据情况改变提交时间。
-
你觉得这门课老师应该继续做哪一件事情?
- 博客、课堂实践、编程演示、算法讲解,锻炼学生编码能力。
-
你觉得这门课老师应该停止做哪一件事情?
- 课堂测试,这个东西明明规定不能上网查,但难以监管,里面的题也是车轱辘话颠过来倒过去,除了翻译问题,没太大意义。
其他
- 强哥要保重身体啊,少熬夜,你已经不是我们这些年轻人了。
给出你的总结中涉及到的链接的二维码
-
实验记录博客:哈夫曼编码对文件进行加密解密