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

每周作业链接汇总

第一周作业:算法分析
第二周作业:集合概述、链式结构——栈
第三周作业:队列
第四周作业:列表
第五周作业:排序与查找
第六周作业:树
第七周作业:二叉查找树
第八周作业:优先队列与堆
第九周作业:图

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

  • 我自己认为写的最好的一篇博客是——第五周作业:排序与查找

  • 我觉得写博客的目的应该是对课本知识的预习,编写代码并记录问题提醒自己,总结课本并巩固的一个过程。而我认为我在这篇博客里都做到了

  • 首先是预习:这章的知识点梳理是我在课前就看完课本并敲进来的,而且对于一些概念的定义加以自己的理解,并百度了相关的动图加以形象的解释

  • 然后是教材知识上的问题解决:在阅读课本知识的过程中遇到的问题,小的问题已经在知识梳理的过程中加入进去。可能几句话说不清楚的问题于是就放在了这里:
    例如,课本上并没有对归并排序的后半部分合并做详细的说明,然后通过百度等方法补充这一点,也让自己理解的更加透彻;
    再比如关于课本上冒泡排序只讲了一个常规操作,从一边按升序或降序冒泡,在百度相关资料的同时,发现了还有其他变形的冒泡算法,于是也补充在博客里,这也是对自己的一个思考:课本上可能有很多算法都有其他的实现方式,而缺乏自己的思考,一味的照着课本来,会限制自己的想象

  • 还有代码的运行问题:这一次的博客因为有充足的时间去完成,所以对出现的第一个问题有了想要一探究竟的客观条件,也找到了两种解决方法的思路,也有了与同学深入交流的时间。
    第二个问题虽然是个小问题,百度一下就可以找到解决办法,但是仔细看了一下结果,又会发现新的问题“ 排好序的列表排序的时间甚至比没排好序的列表花费的时间还要多 ”,虽然这个问题现在还没找到答案

  • 最后是博客互评:仔细看完了互评伙伴的博客,也确实学到了东西,比如编程实现的其它方法,界面排版,说明问题的方式等等;
    并评论、记录在了博客里,

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

  • 作业中阅读量最高的一篇博客是——实验三《程序设计与数据结构》查找与排序

  • 这篇博客应该是我博客问题记录当中记录的最详细的一篇了
    包括两个小小问题:虽然很简短,但有的时候就会卡在这种想不起来或者自己没有掌握,又或者容易让人忽略的小问题上。不放过每一个问题,这种严谨的态度也应该是我们以后学习过程中要加强的
    还有就是对待学习应该相信自己的思考判断出来的结果,就算是错误的也能从中学到东西,然而有的时候别人给的也不一定就是对的,就像这次给的参考博客里的参考代码就存在问题,于是在博客里写下了这个问题

  • 博客交的早,加上其他同学们对学习的热情也占据了很大的原因

实验报告链接汇总

实验一《程序设计与数据结构》线性结构
线性结构之链表(1):通过键盘输入一些整数,建立一个链表,打印所有链表元素, 并输出元素的总数。
线性结构之链表(2):实现节点插入、删除、输出操作,扩展功能,从磁盘读取一个文件,从链表中删除刚才的数字1. 并打印所有数字和元素的总数。
线性结构之链表(3):使用选择排序法根据数值大小对链表进行排序,在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
线性结构之数组(4):通过键盘输入一些整数,建立一个数组,打印所有数组元素, 并输出元素的总数;实现数组插入、删除、输出操作, 扩展功能,从磁盘读取一个文件,从链表中删除刚才的数字1. 并打印所有数字和元素的总数。
线性结构之数组(5):使用选择排序法根据数值大小对数组进行排序,在排序的每一个轮次中, 打印元素的总数,和目前数组的所有元素。

实验二《程序设计与数据结构》树
(1)树之实现二叉树:完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder),并测试
(2)树之中序先序序列构造二叉树:基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,并测试
(3)树之决策树:自己设计并实现一颗决策树
(4)树之表达式树:输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,则为0分)
(5)树之二叉查找树:完成PP11.3
(6)树之红黑树分析:参考相关资料对Java中的红黑树(TreeMap,HashMap)进行源码分析,并在实验报告中体现分析结果

实验三《程序设计与数据结构》查找与排序
查找与排序-1:定义一个Searching和Sorting类,并在类中实现linearSearch, SelectionSort方法
查找与排序-2:重构代码
查找与排序-3:参考http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中补充查找算法并测试
查找与排序-4:补充实现课上讲过的排序方法
查找与排序-5:编写Android程序对各种查找与排序算法进行测试

团队项目报告链接汇总

代码托管链接

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

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

* 反复推敲代码 *

**“ **有些人喜欢炫耀自己写了多少多少万行的代码,仿佛代码的数量是衡量编程水平的标准。然而,如果你总是匆匆写出代码,却从来不回头去推敲,修改和提炼,其实是不可能提高编程水平的。你会制造出越来越多平庸甚至糟糕的代码

作为一个学过编程语言的人,我也知道写出好的代码很重要,但直到看到编程的智慧里关于反复推敲代码重要性的描述,我才真正意识到它的重要性。

老师的要求是一学期五千行的代码,而我一直认为只要代码量达标了就可以了。甚至有的同学一学期就达到了万行左右。回想初触Java时,老师问过的一个问题“你觉得一学期五千行代码是否太多了”。这么一看好像没有人没达标,这个标准也不是很高。知道看到这个题目我才意识到五千行的代码不应该是第一次敲上去的、可以运行的、没有代码错误组成的程序,而应该是反复推敲的代码:简洁易懂,不重复啰嗦。

而更让我得到学习的是:反复推敲,两次不是反复,三次不是,四次不是,五次。。。这应该是一个不断学习的过程,每一次在新的学习当中都会有新的收获,回头看以前的代码都会有新的感受,新的方法实现。

* 写可读的代码 *

有些人以为写很多注释就可以让代码更加可读,然而却发现事与愿违。注释不但没能让代码变得可读,反而由于大量的注释充斥在代码中间,让程序变得障眼难读。而且代码的逻辑一旦修改,就会有很多的注释变得过时,需要更新。修改注释是相当大的负担,所以大量的注释,反而成为了妨碍改进代码的绊脚石

这也是让我得到反思学习的地方。以前在写代码时,包括看别人代码时都会把每一句代码加上注释,甚至新建了一个变量我都会加行注释说明它是用来干嘛的。虽然这样确实让人能看懂,但是忽略的一点是其实有些注释不加别人也能知道什么意思,毕竟都是学编程语言的。现在是初始阶段,所以并不会有经常修改代码逻辑的情况。但确实是以后发生这种情况,代码注释将变成了累赘。而我们现在其实就应该培养这种意识,在恰当的地方加入注释

还有这一部分里提到的关于变量名的命名应该尽量表达变量的用途,局部变量应当尽量靠近它所被用的地方等等都应该是我以后要注意的地方(以前看别人的代码都是讲声明的变量统一放在开头,觉得看起来很好看,却从来没想过要把它放在易读的地方)

善于提出方法代码也是很需要注意的地方。有的时候确实为了要得到某个值或其它的会写一长串的代码去得到它,其实也完全可以把它提取出来写成方法直接调用,这样不仅在其他的地方可以用,也使代码更简洁,更易读

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

说实话,我并没有做到积极主动敲代码。
就像上面所说的,代码的质量方面,没有做到反复推敲代码,我写出来的代码甚至没有过二次修改,只要运行结果达到目的就算完成任务了。然而上面也分析了,这样是不对的。代码的可读性也确实不高,除了自己估计别人也读不懂。所以在这方面自己还需要端正态度,提高兴趣,做到积极主动,写出好代码。

代码的数量方面,当然代码量是达标了,但是仔细反思一下,这里的代码量应该是积极主动编写或尝试更多程序,提升自己敲代码能力的代码量。比如课本后面除了作业要求以外的程序编写,或者同一个程序不同代码的实现。这样反复锻炼自己代码能力的,才应该是真正做到积极主动。我也在这里反思,这些也应该是我要做到的,并且在以后的学习过程中这样要求自己

教材实践上当然也有过教训。代码能力不足当然是直接反映在代码编写上。不熟悉的一些代码就不容易想到也不容易理解,所以在写到杨辉三角这次实践的代码时,由于没有理解好所用的方法,以及内在的逻辑导致本次实践没能完成

课堂项目实践

参考2018-2019-1 《Java 程序设计》课堂实践项目

  • 实践一:时间复杂度分析

  • 实践二:完成课本中ArrayStack类的实现,特别是完成peek、isEmpty、size和toString方法的实现,并完成四个方法的测试。

  • 实践三:写出链表中节点插入的操作代码(伪代码)

  • 实践四:链表练习,要求实现下列功能
    (1)通过键盘输入一些整数,建立一个链表
    (2)实现节点插入、删除、输出操作
    (3)使用冒泡排序法或者选择排序法根据数值大小对链表进行排序

  • 实践五:运行PP28,PP28页的程序
    根据个人学号输入后缀表达式并计算

  • 实践六:给出size、isEmpty和toString等方法的定义,以完成LinkedStack类的实现。
    1.能够运行
    2.需要测试各个方法
    3.把代码上传到码云,并将关键代码和运行结果截图加水印(学号)上传

  • 实践七:代码检查P72-P73
    凯撒密码程序。
    把结果截图,加学号水印,上传到蓝墨云

  • 实践八:使用循环队列输出杨辉三角
    (1)用数组实现循环队列(要考虑扩容问题,否则不加分)
    (2)输出杨辉三角
    (3)代码运行结果添加学号水印,并上传;代码传到码云,附上码云链接

  • 实践九:栈队列测试题

  • 实践十:运行PP6.8和PP6.11的程序

  • 实践十一:定义一个商品类Product,需要包括商品名称、价格等信息,使用链式存储结构实现一个线性表,存储商店中的商品。
    支持插入、删除、选择排序、查找等功能,并进行简单测试

  • 实践十二:已知线性表具有元素{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的结点,问该树中有多少个叶结点?

  • 实践十七:参考叶子节点计算的伪代码,计算课本中背部疼痛诊断器中决策树的叶子节点个数?

  • 实践十八:若已知中序和先序序列,计算二叉树结构
    根据课堂介绍的递归树深度计算算法,计算决策树的深度

  • 实践十九:使用递归实现层次遍历背部疼痛决策树,并按照层次顺序输出每个节点内容。

  • 实践二十:根据关键字序列:36,30,18,40,32,45,22,50,构造一颗小顶堆,并排序?画出构造堆过程(树+数组)

  • 实践二十一:根据关键字序列:36,30,18,40,32,45,22,50,利用数组构造一颗大顶堆,并排序

  • 实践二十二:使用Dijkstra(迪杰斯特拉)算法计算单源(V1出发)最短路径

  • 实践二十三:AOE练习

  • 哈夫曼树实践
    给定一个包含26个英文字母的文件
    统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树
    并完成对英文文件的编码和解码

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

这个无疑肯定是有用的。实践就是锻炼检测我们代码编写能力的一种方式,就像一些编程比赛一样,给了题目自己去思考,能够锻炼自己的代码编写的综合实力,也能拓展自己的思路,找到更好的实现方法

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

就像上面举例的杨辉三角,对课本知识不深入理解,不熟练运用,就很难写出代码

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

实践是很有必要的,建议是关于实践的时间设置
这个主要是根据老师判断实践难易设置,也可以稍稍参考大部分同学们对实践时间的看法,以及在给定时间内同学们的完成度

课程收获与不足

自己的收获

这学期投入在Java上的时间应该也是非常多的,大部分的时间都用来看课本,写博客,编程序。学到了更多的数据结构相关的专业知识。代码的编写能力有了一定的提升。最主要的是明白了自主学习的重要性。现在的我已经认识到了以前抱怨过很多知识没有学过回去用它有点愚蠢,如此庞大的计算机知识不可能指望老师给我们教完,一定要依靠自己主动去学,才能学到更多的知识

其实收获最大的应该是自我学习,还有团队合作。最集中地表现在最后的大实践作业上。从一开始我们以为的不可能做出来什么能用的app或游戏。但是在一步步去做的过程当中,我们团队自主学习那些需要用到的却没学过的知识,比如界面UI设计,数据库等知识。遇到很困难的问题,团队也能互相讨论,互相学习,然后解决问题。

自己需要改进的地方

在实践的过程中发现,基础知识不是很牢固,需要不断的去使用去回忆

花了很多的时间学习Java,但是说到效率的话还是不够高的。尤其是参考了《编程的智慧》之后,对比自己用在Java 上的时间并没有达到理想的效果,写出的代码也没有很高的质量。以后在代码质量方面要多下功夫

在学习Java的过程中容易出现疲惫的心里,以后需要端正自己的态度,时刻以饱满的热情去学习Java才能达到最好的效果

遇到问题会出现逃避思想,总是想直接百度而不先思考,这是一个以后一定要改进的地方

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

在学习过程中是遇到过很多问题,但是大部分问题都是通过百度解决的,并没有刻意的去找结对伙伴讨论问题。但是共同学习还是有的,在学习课本过程中,部分不懂的知识点从侯泽洋同学那里得到了很多帮助,编程过程中也从侯泽洋同学那里学到解决问题的不同的方法。
好好利用结对学习对促进双方学习有很大的帮助作用,只是有的时候执行的情况可能有些不够。如果同学们形成了重视结对学习的意识,一定会取得很好的效果。如果没有足够的重视,可能还需要老师的督促来帮助我们重视起来。定期反馈结对学习情况可能会起些作用。

问卷调查

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

一天保证两小时以上,周末三小时左右,一周16个小时左右

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

根据每周学习内容,编程的难易程度投入的精力就会不一样。这应该就是我的衡量标准,如果本周内容相对较难,我投入的时间和精力就相对更多。每周的学习效率提高的话可能就是根据所学内容难易上下波动

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

促进作用主要体现在督促我们的学习上:每周的作业发布、测试、点名、抢答等,蓝墨云的作用还是很大的,非常的方便。
实践作业的评测之后还有评论,也能帮助我们了解到哪里出现了错误,对我们的学习也有很大的促进作用

每周还会提醒我经验排名升降情况,这个本来应该是有一定的警示作用的,但因为这个经验的组成除了平时的测验、实践经验,还包括了老师发布资源的阅读得到的经验。所以这个排名并没有得到较大的重视

所以建议一就是:
将资源的阅读经验独立出来(或者赋为0),好让这个排名更有参考意义

建议二:
上学期老师有刻意让我们使用里面的问题讨论功能,但是因为没人讨论才荒废下来了(当然大家肯定还是有问题的)
所以如果能重拾这个功能还是挺好的,具体建议的话,还是要有人带头使用,引起大家的积极性

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

继续坚持实践作业,包括最后的大实践。我认为这还是考察大家综合实力,提高大家编程兴趣,检测编程水平,促进团队合作的一件事
博客也应该继续写

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

博客确实应该继续写,因为他对培养我们记录问题,解决问题能力是有帮助的
但是博客加分需要再调整一点点

虽然比上学期博客加分已经少很多了,但是,,,一次好的博客都跟一次额外加分的作业一样的分值了,比如查资料写博客录视频这一项作业,做出来还是挺麻烦的
当然,博客写的好这样的同学编程实力也一定不会差的

结课感想

学习Java已经两学期了,而这也是最后一篇课程博客了。
起初接触Java时,还是兴趣满满的。但是编程这种东西涉及的知识真的太广了,像编程工具就有很多:从一开始的Linux里的编程,命令行的使用;还没用好Linux又接触了IDEA,然后又是Android Studio。要学的东西越来越多,老师讲的越来越少,需要自己百度的越来越多。。。

一章接着一章,越来越少的时间去花在每一章的钻研上,当然对Java兴趣日下也占了一部分原因,让我很少再主动去学习,去拓展学习。这也应该跟我学习的方式有很大关系,对于喜欢的东西会想去学习它,但是它往往涉及到一个庞大的知识体系,让自己不知从何下手,难以入门或是长时间入门后又兴趣缺缺。也许专注一点,不朝三暮四会是解决这种情况的方法

下学期依然会选相关的课程,希望自己那时能做到专心致志,主动学习,持之以恒,一以贯之

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

所有博客都可在下方二维码中扫描获得

posted @ 2018-12-27 22:16  20172308周亚杰  阅读(283)  评论(0编辑  收藏  举报