20172305 2017-2018-2《程序设计与数据结构》课程总结
每周作业链接汇总
- 第一周作业:软件质量与算法分析
- 第二周作业:集合概念、栈及实现栈的方式(数组和链表)
- 第三周作业:队列及实现队列的方式(数组和链表)、定长和环形数组
- 第四周作业:列表(有序表、无序表和索引表)及实现列表的方式(数组和链表)
- 第五周作业:排序(选择排序、插入排序、冒泡排序、快速排序、归并排序)与查找(线性查找和二叉查找)
- 第六周作业:树及树的遍历方式和实现树的策略
- 第七周作业:二叉查找树、AVL树和红黑树
- 第八周作业:优先队列与堆,以及实现堆的方式(数组和链表)
- 第九周作业:图(无向图、有向图和网络)以及实现的方式(邻接列表和邻接矩阵),图的相关算法
写得最好一篇博客
- 原因:该周学习的是有关列表的相关知识,我觉的本周写的比较好的是代码部分的总结,将列表的共有方法以数组和链表两种形式进行分析的。还对本周的编程任务进行较为详细的编写。但是,该周也有不足的地方就是在结对互评的地方,对结对伙伴的评价较少。
阅读量最高的一篇博客
- 原因:我觉得可能是自己发布的比较早,其次我觉得是自己的教材总结问题是大部分同学的会存在的,而且我在查找较多博客之后总结的也比较详细。
报告链接汇总
-
实验
-
团队项目 奔跑吧! DKY
- 团队展示
- 团队选题
- 需求规格说明书
- 完善需求规格说明书
- 制定团队编码规范
- 通过团队项目数据库设计
代码托管链接
-
给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
- 达到本学期的代码量,并超额完成。
-
加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
- 已经编写过一个学期的代码了,记得上次说过指尖上的劳作。我觉的这个学习的算是往上个学期的铺的砖,逐渐逐渐的堆砌城墙的过程。就像一句话“实践是检验真理的唯一标准”,代码变得变得怎么样?代码规范标不标准?程序效率高不高等问题都是要在尝试的过程中才会知道的。
-
积极主动敲代码做到没?教材实践上有什么经验教训?
- 真的是认真认真的敲了,至于本学期的书就不做过多评价了。给的示例代码用到的编写类没有显示、书上知识点讲解与主流发展有相违背的地方、还有书上错误的地方都有很多。所以,尽信书不如无书,走了很多的弯路,多次的尝试才完成相关内容和有关知识的学习。还在,这样到还是让自己印象深刻一些。
课堂项目实践
-
实践一:时间复杂度分析
(1)for(i=1;i<=n;i++) for(j=1;j<=i;j++) for(k=1;k<=j;k++) (2)void fun(int n) { int i=l; while(i<=n) i=i*10; } (3)int i, j,sum; i=0; j=0; sum = i+j; (4)void fun (int n){ int i=0; while(i*i*i<=n) i++; }
-
实践二:完成课本中ArrayStack类的实现,特别是完成peek、isEmpty、size和toString方法的实现,并完成四个方法的测试。
public T peek() throws EmptyCollectionException { } public boolean isEmpty() { // To be completed as a Programming Project } public int size() { // To be completed as a Programming Project } public String toString() { // To be completed as a Programming Project }
-
实践三:写出链表中节点插入的操作代码(伪代码)
public static void InsertNode(Student2 Head, Student2 node){ }
-
实践四:链表练习,要求实现下列功能
- (1)通过键盘输入一些整数,建立一个链表
- (2)实现节点插入、删除、输出操作
- (3)使用冒泡排序法或者选择排序法根据数值大小对链表进行排序
-
实践五:运行PP28,PP28页的程序
- 根据个人学号输入后缀表达式并计算。(例如,学号172301,输入1 7 + 2 3 0 1 - + *)
-
实践六:给出size、isEmpty和toString等方法的定义,以完成LinkedStack
类的实现。 - 1.能够运行
- 2.需要测试各个方法
- 3.把代码上传到码云,并将关键代码和运行结果截图加水印(学号)上传。
-
实践七:代码检查P72-P73
- 凯撒密码程序。
- 把结果截图,加学号水印,上传到蓝墨云。
-
实践八:使用循环队列输出杨辉三角
- (1)用数组实现循环队列(要考虑扩容问题,否则不加分)
- (2)输出杨辉三角
- (3)代码运行结果添加学号水印,并上传;代码传到码云,附上码云链接。
-
实践九:栈队列测试题
-
实践十:运行PP6.8和PP6.11的程序,
-
实践十一:定义一个商品类Product,需要包括商品名称、价格等信息,使用链式存储结构实现一个线性表,存储商店中的商品。支持插入、删除、选择排序、查找等功能,并进行简单测试。需要使用的知识点:
- 1.泛型
- 2.实现Comparable接口中的方法
- 3.链式存储结构
-
实践十二:已知线性表具有元素{5,13,19,21,37,56,64,75,80,88,92} 如果使用折半查找法,ASL是多少?
-
实践十三:画出存储形式和asl的计算
-
实践十四:把自己的学号加21,例如学号为1,把22添加到序列后面,使用链地址法,解决冲突。编程实现,并测试。
- 要求计算asl,输出冲突次数。
-
实践十五:当D2等于2时,第2趟排序结果是?
-
实践十六:计算题
- 1.有1023个结点的完全二叉树,其高度是多少?叶结点数是多少?
- 2.高度为h的完全二叉树至少有多少个结点?至多有多少个结点?
- 3.已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点,…,nm个度为m的结点,问该树中有多少个叶结点?
-
实践十七:参考下面叶子节点计算的伪代码,计算课本中背部疼痛诊断器中决策树的叶子节点个数?
int CountLeaf ( BiTree T, int &count ) { if ( T ) { if ( (!T->lchild) && (!T->rchild) ) count++; // 对叶子结点计数 CountLeaf( T->lchild, count); CountLeaf( T->rchild, count); } }
-
实践十八:若已知中序和先序序列,计算二叉树结构
- 例:已知一棵二叉树的先序序列和中序序列分别为ABDGHCEFI 和 GDHBAECIF,试确定二叉树结构。
- 根据课堂介绍的递归树深度计算算法,计算决策树的深度。
-
实践十九:使用递归实现层次遍历背部疼痛决策树,并按照层次顺序输出每个节点内容。
- 非递归的层次遍历法算法如下:
- 根结点入队;从队头取元素,并执行如下3个动作:
- (1)访问该结点;
- (2)如果该元素有左孩子,则左孩子入队;
- (3)如果该元素有右孩子,则右孩子入队;
- 重复执行上述过程,直至队列为空。此时,二叉树遍历结束。按照上述算法,编程实现层序遍历,按照层序的方法,遍历并依次输出每个节点内容。(3分)
-
实践二十:根据关键字序列:36,30,18,40,32,45,22,50,构造一颗小顶堆,并排序?画出构造堆过程(树+数组)
-
实践二十一:根据关键字序列:36,30,18,40,32,45,22,50,利用数组构造一颗大顶堆,并排序。
要求:- (1)输出构造好的大顶堆序列(层序)
- (2)输出每轮排序的结果(数组的结果)
- 把结果截图并加学号水印上传到蓝墨云,代码上传到码云。
-
实践二十二:使用Dijkstra(迪杰斯特拉)算法计算单源(V1出发)最短路径。
- (1)写出V1到各个顶点的最短路径
- (2)要求写出最短路径计算过程(类似于图2)
-
实践二十三: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)准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率
- (2)构造哈夫曼树
- (3)对英文文件进行编码,输出一个编码后的文件
- (4)对编码文件进行解码,输出一个解码后的文件
- (5)撰写博客记录实验的设计和实现过程,并将源代码传到码云
-
课堂实践对提高应用能力有帮助吗?
- 我觉得课堂实践可以提高部分同学的能力,接受能力比较慢的同学需要温习一下才能熟练运用。我觉得可以课堂实践与课后实践相结合,或是课堂实践采用难度比较适合大多人的程度会比较好。
-
课堂实践上自己有什么经验教训?
- 像算法之类的计算问题或是简单的编程问题都是很简单就解决的,但是比较困难的编程问题就很难了,需要细细的思考或要考虑清楚,这样的话就有可能完不成课堂实践的相关内容。为了能够赶上别的同学,需要更多次的尝试和提前的学习来弥补不足。
-
课堂实践上对老师有什么教学建议?
- 没有什么意见,比对两个学期的课堂实践,本学期的明显增多,而且也开设了许多的额外实践,为大家提供了不同的实践课程,很好的。
课程收获与不足
-
自己的收获(投入,效率,效果等)
- 这学期的课程过得很快,没什么感觉就到期末了,对于《程序设计与数据结构》这门课程,这学期的学习和上学期的有很大不同,上学期感觉学习的是基础,而这学期更侧重的是算法内容,逻辑性很强,无疑增加了编码的难度。所以,感觉这学期的更费力了,此外,有幸跟学长进行实验操作,因此谈及收获其实还是蛮多的,课内的课外的,感触颇深的是大数据的处理上,平时的小打小闹,感觉用这个用那个的都可以达到最终结果,但是一旦和大数据接触上就会发现有些真的是很慢很慢的。至于本学期的效率问题,感觉就是由高到低再到高的过程,中间学习的时候处于低谷是因为有些编程真的是做到自闭的感觉,后来面对团队项目的时候我发现自闭也解决不了问题了...只能硬着头皮干代码!至于效果的问题,在日常学习中学习了很多的算法和存储结构,在团队项目中学习了很多有管动画的内容,此外游戏碰撞、数据库、PS都尝试了一番。
-
自己需要改进的地方
- 至于改进的地方就是,对于自己软肋的部分知识不想触碰的要去尝试,递归的编写就要一直是自己的不足,搞来搞去的就不知道哪是哪了。而且,在以后的课程上,我们没有直接学习的机会,更是要时不时的来个代码编写编写。
-
结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
- 本学期和两位同学的合作很愉快,同时也学到了很多。而且,到了最后的编程项目的时候我们团队也加进了新的同学,在合作的过程中我们遇到困难的时候有人开句玩笑也就没有那么累了,遇到成功的时候我们也可以一起将这份快乐放大。我觉得可以多次尝试这种团队的问题,可以增长我们的相关知识和与同学的融洽。
问卷调查
-
你平均每周投入到本课程有效学习时间有多少?
- 几乎是每天都或多或少的学习着,视当时任务量的多少来定。
-
每周的学习效率有提高吗?你是怎么衡量的?
- 时高时低,有些时候其他课程的任务比较多就会效率高些,因为没有时间在Java上浪费。我觉得衡量标准就要看个人的能力和工作时间吧,有的同学能力比较强就可以在很短的实践内编写了,有的同学就需要较长的实践来编写任务了。
-
蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?
- 有一定的促进作用,但是有些周视频量太大,完全没时间看。但是这学期老师让我们同学进行知识视频的录制,觉得这个部分的内容很不错。
-
你觉得这门课老师应该继续做哪一件事情?
- 博客(可以回顾自己一周的学习内容)、课堂实践(强制性促进自己消化新知识)、编程项目多一点(增加综合实践能力)
-
你觉得这门课老师应该停止做哪一件事情?
- 个人感觉没有什么事情是应该停止的。
-
你觉得这门课老师应该开始做什么新的事情?
- 一个小建议就是可以增加不同的编程项目,扩展同学们的视野和不同领域的相关知识。
二维码
-
总结中涉及到的链接的二维码
-
学习博客
- 第一周作业:
- 第二周作业:
- 第三周作业:
- 第四周作业:
- 第五周作业:
- 第六周作业:
- 第七周作业:
- 第八周作业:
- 第九周作业:
- 第一周作业:
- 实验博客
- 实验一:
- 实验二:
- 实验三:
- 实验一:
- 项目博客
- 第一周博客:
- 第二周博客:
- 冲刺阶段-Day 1:
- 冲刺阶段-Day 2:
- 冲刺阶段-Day 2:
- 冲刺阶段-Day 3:
- 冲刺阶段-Day 4:
- 冲刺阶段-Day 5:
- 冲刺阶段-Day 6:
- 冲刺阶段-Day 7:
- 第一周博客:
- 其他博客
- 课堂实践补写博客
- 哈夫曼编码博客
- 暑假作业博客
- 课堂实践补写博客