20182316胡泊 2019-2020-1 《数据结构与面向对象程序设计》课程总结
每周作业链接汇总
- 第一周总结
- 主要内容:虚拟机的安装,git的使用,linux操作命令,简单的java程序。
- 第二、三周总结
- 第四周总结
- 主要内容:编写自己的类,并实例化,用StarUml画uml类图,学习封装的概念和方法,对上周学习的类和方法的使用。
- 第五周总结
- 主要内容:学习继承的思想和方法,super引用,方法的重写和重载,成员私有、共有,Object类。
- 第六周总结
- 主要内容:学习多态的思想和方法,接口的含义和使用方法,异常:try-catch和finally语句,自己定义异常。
- 第七周总结
- 算法分析,时间复杂度O,ASL,栈Stack和链Linked的性质、实现以及包含的操作(pop、push、delete...),泛型,链栈的实现,
- 第八周总结
- 两种查找方法(线性查找和二分查找)及其比较;六种排序方法(选择排序、插入排序、冒泡排序、快速排序、归并排序和基排序);查找方法和排序方法的时间复杂度分析。
- 第九周总结
- 树的相关术语、分类及四种遍历方法;二叉树的概念;二叉树的性质;用数组实现二叉树;用链表实现二叉树;二叉树的应用(决策树);二叉查找树的概念;二叉查找树及其方法的实现;前驱结点和后继结点;平衡二叉查找树的方法(查找,增加,删除);
- 第十周总结
- 图的概念及分类;广度优先遍历(BFS)和深度优先遍历(DFS);寻找最小生成树(Prim算法,Kruscal算法);判断最短路径(Dijkstra算法);图的实现策略(邻接列表和邻接矩阵);拓扑排序。
自认为写得最好一篇博客是?为什么?
- 我认为从第六周及之后的博客普遍都挺好ヾ(๑╹◡╹)ノ"(臭不要脸),因为这之后的博客我不仅增加了很多自己的理解并用绿色字体标出,还更有意识的在平时敲代码的同时收集自己遇到的的问题(其实是遇到的问题突然暴增),并将详细的解决步骤记下来,这一步也敦促我对待错误更加认真,更有追究到底的精神和毅力了。
- 而最好的我感觉是第七周总结,因为就和上面说的一样,在这周的学习中,我对于书本上的知识点和代码都有着比较全面的了解,和自己的理解,因此在总结知识点时满满的绿色(自己的理解),并且对于代码遇到的问题都用自己的理解得到了接近完美的解决。
- 当然还是有些许不足,比如虽然内容满满,但有很多是我口语化的表达,略显冗长,并且文字过多,没有几个图片,如果再写一次的话我会增加更多的图片,使他更图文并茂,言简意赅。
作业中阅读量最高的一篇博客是?谈谈经验
- 第二、三周总结
- 经验:实在不好意思说是经验,因为这篇最高的也就47次,但至于它为什么比其他的要高,我觉得有以下几个原因。首先是天时(开玩笑的),因为当时是我们的第二篇博客,第一篇主要是配置我们将来学习的硬件的,而这一篇才是理论上的第一篇,因此大家都没什么经验,就只能借鉴一下别人的。其次是地利,我这篇交的比较早,占了靠前的位置。最后是人和,当学姐跟我说了最好总结一下知识点后,我将书上的知识点比较详细的列举出来,同时结合了一些不懂的、网上找的知识点,内容就比较充实,并且代码调试的问题,可能我比一些同学稍早有记录问题的意识,因此我的错题写的比较多,比较详细。
实验报告链接汇总
-
- 基于命令行和IDEA IDEA简易教程进行简单的Java程序编辑、编译、运行和调试。(本次实验主要使用命令行的方式)
- 练习Linux基本命令
- 学习Java程序的JDB调试技能:https://www.cnblogs.com/rocedu/p/6371262.html
,编写简单的Java程序。
-
- 编写简单的计算器,完成加减乘除模运算。
- 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
- 编写测试代码,测试验证。(https://www.cnblogs.com/rocedu/p/4472842.html)
-
- 参考《实验二 Java面向对象程序设计》:http://www.cnblogs.com/rocedu/p/6736847.html实验内容
- 下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)。
- 初步掌握单元测试和TDD
- 理解并掌握面向对象三要素:封装、继承、多态(自己去学!)
- 初步掌握UML建模
- 完成蓝墨云上 (1)-(5)实验。
-
-
(一)Java Socket编程
- 学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程
- 结对编程。结对伙伴A编写客户端SocketClient.java,结对伙伴B编写服务器端。
- 截图加学号水印上传蓝墨云,代码push到码云,并撰写实验报告。
-
(二)Java和密码学
- 以结对的方式完成Java密码学相关内容的学习。提交学习成果码云链接和代表性成果截图,要有学号水印。
-
(三)编写有理数/复数计算器
- 结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。截图加水印上传蓝墨云,代码push码云。
-
(四)远程有理数计算器
- 结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
- 客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
-
(五)远程复数计算器
- 结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
- 注意实验四(4)和实验四(5),一个人不能仅实现客户端,必须实现一个客户端和服务器,否则两个实验均不得分!!!
-
(六)实验报告
- 在规定时间前发表博客,标题“学号 实验四 《数据结构与面向对象程序设计》实验报告”
-
-
- Android Stuidio的安装测试:
- 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号,自己学号前后一名同学的学号
- 学习Android Stuidio调试应用程序
- Activity测试
- 构建项目,运行教材相关代码
- 创建 ThirdActivity
- 在ThirdActivity中显示自己的学号,修改代码让MainActivity启动ThirdActivity
- UI测试
- 构建项目,运行教材相关代码
- 修改代码让Toast消息中显示自己的学号信息
- 布局测试:
- 构建项目,运行教材相关代码
- 修改布局让P290页的界面与教材不同
- 事件处理测试:
- 构建项目,运行教材相关代码
- 提交代码运行截图和码云Git链接,截图要有学号水印,否则会扣分
- Android Stuidio的安装测试:
-
-
链表练习,要求实现下列功能:
- 通过键盘输入一些整数,建立一个链表;
- 这些数是你学号中依次取出的两位数。 再加上今天的时间。
- 打印所有链表元素, 并输出元素的总数。
- 在你的程序中,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。
- 做完这一步,把你的程序签入源代码控制(git push)。
-
链表练习,要求实现下列功能:
- 实现节点插入、删除、输出操作;
- 继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
- 从磁盘读取一个文件, 这个文件有两个数字。
- 从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。
- 从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
- 从链表中删除刚才的数字1,并打印所有数字和元素的总数。
-
链表练习,要求实现下列功能:
- 使用冒泡排序法或者选择排序法根据数值大小对链表进行排序;
- 如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
- 在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
- 在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。
-
在android上实现实验1和2
-
在android平台上实现实验3
-
-
-
定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
-
重构你的代码
- 把Sorting.java Searching.java放入 cn.edu.besti.cs1823.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)
- 把测试代码放test包中
-
参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试
-
补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等(至少3个)
-
编写Android程序对实现各种查找与排序算法进行测试,提交运行结果截图
-
-
- 完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
- 用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
- 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树,用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
- 自己设计并实现一颗决策树
- 提交测试代码运行截图,要全屏,包含自己的学号信息
- 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
- 完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
-
- 完成图的综合实践
- 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数
- 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)
- 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环
- 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出
- 完成有向图的单源最短路径求解(迪杰斯特拉算法)
- 完成图的综合实践
团队项目报告链接汇总
代码托管链接
- 给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
- 本学期的代码量为18120,第一次接触java,与之前的c语言学习方法变化很大,我付出的时间与精力也是不能比的,比预期的10000行要多了很多,总体上达到了我的预期。
- 加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
- 上网搜索了一下编程的智慧,并进行了快速的阅读,启发还是挺多的,我一直觉得敲代码是一个很枯燥无聊的过程,因为想不出来的时候真的很难受,但我从来没有想过编程还可以用“优雅”来形容,就给人一种非常从容自信的感觉,人们总是嘲讽程序员是“程序猿”“码农”,可能在开始学习计算机之后我也有些不由自主地把自己代入这种角色中,“码农”值得是不思考的机械的敲代码的程序员,如果能够将敲出优雅的代码作为目标,并经常思考怎样才能使代码变得更简单、更直观可读,那么敲代码其实就成为一种艺术了,耕耘艺术的人是绝对不会允许自己仅仅局限于“程序猿”“码农”的。
- 积极主动敲代码做到没?教材实践上有什么经验教训?
- 我认为我基本做到了,尤其是开学之初和前大半部分学期,因为吸取了上学期c语言的教训,从一开始就想尽办法跟上老师进度,不然你就会被越拉越远,花费了大量时间,将自己的java水平保持在班上的前列,在刚学习类的定义时,很自然地就想到应该实际敲一敲去实践一下,包括后来有一次敲书上代码的时候发现了代码有很多错误,如果不是自己敲而是直接复制粘贴别人的那就不可能发现这些错误了。所以说敲代码的时候一定要动脑子想,而不要只是机械地把代码从书本复制到IDEA上,这样对理解课本内容也非常有好处,就比如学广度优先遍历和深度优先遍历的时候,其实看教材的时候我完全不清楚它的原理,但是在仔细看了代码看懂之后就明白这两种遍历方法是怎么实现的了。
课堂项目实践
- 课堂实践链接
- 鉴于实践内容与次数都很多,也很杂,就放一个我的蓝墨云班课的链接吧。
- 课堂实践对提高应用能力有帮助吗?
- 还是比较有用的,因为课堂实践主要是检验我们在课堂上和书本上学习的知识是否掌握牢固,对于督促我上课好好听讲有挺大的作用。
- 课堂实践上自己有什么经验教训?
- 上课认真听讲真的非常非常非常重要,这个学期有时候还因为感觉听不懂所以听不进去,所以经常用下课问同学的方法来弥补,但是当我每一堂课都认认真真听下来后,发现收获很大。
- 课堂实践部分如果是用代码实现的实践还可能费点时间,但是那种纯靠思考手写的一般都会写,不过还是容易犯粗心的毛病。
- 课堂实践上对老师有什么教学建议?
- 首先希望老师之后还会教我们学弟学妹的话一定要保持现在的讲课方式方法,真心觉得这学期讲得很好,而且每一节课都挺清楚的。
- 课堂实践方面的话,希望老师不要总是对我们太高估,认为我们很轻易就能把实践做完,有些实践的结束时间可以稍微设的晚点。
课程收获与不足
- 自己的收获(投入,效率,效果等)
- 这个学期的java课,我是作为最重要的一门专业课来学的,我感觉把java学习融入到了我的生活(捂脸)。
- 然后就是关于java的学习模式,形成了一套固定的而且相对而言比较成熟的学习模式,就是先把教材内容看完,然后敲代码做课后题,最后再写博客。因为在敲代码的过程中经常会对课本内容有一些更深刻的理解,这样在写教材内容总结的时候也能够更充实,形成了一种良性循环。
- 但后期稍微有点乏力了,对于java的学习没有刚开学那么伤心了。
- 自己需要改进的地方
- 首先是效率问题,感觉对java虽然对内容学得比较清楚,但是效率真的不高,尤其是写博客的效率,经常在一个小地方卡半天。
- 然后还有一点,可能因为后期学习的时间有所减少,所以对于教材上的内容深究的不多了,很多东西都只是浮于表面,我觉得这也是我博客中提出的问题很少的原因所在,在今后的学习中一定要努力避免这种情况。
- 结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
- emmm,说实在的,我和结对伙伴并没有很好的结对学习,主要是我们学习大部分时间都在自己钻研,遇到不会的一般都是上网查询,大部分也都能解决,但是我们还是会时不时讨论一下java学习的近况,以及自己遇到的知识上的问题,吐槽一下什么的。
问卷调查
- 你平均每周投入到本课程有效学习时间有多少?
- 大概15-30个小时左右,这周实践难的话时间就多一点,不难的话时间还是很多(狗头)
- 每周的学习效率有提高吗?你是怎么衡量的?
- 感觉有了前期的积累,后期学起来要效率要高一点,万事开头难,度过了由c语言到java的过渡期就轻松一点了。
- 首先是有了(自认为的)规范的学习模式,再其次是后期的学习内容基本都和栈,链表,树是相关的,学习起来比较连贯,课后实践也基本前后有联系,相对而言效率要比前期高。
- 蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?
- 有,PPT看起来更方便了,可以随时巩固课上学习的知识,还有课堂实践有效的督促我们学习java。
- 建议是希望班课上的资源还是文档类的比较好,视频类的真的不方便看,而且设置成进度条不可拖拽的话有些时候比较打击积极性并且浪费时间。
- 你觉得这门课老师应该继续做哪一件事情?
- 继续这种(自我感觉)前松后紧的学习模式,这样让我们不仅真正学习到了知识,并且在期末的时候压力减轻了许多。
- 上课不仅局限于课本。强哥课上经常讲一些课外的知识,感觉真的见识学习到了很多。
- 你觉得这门课老师应该停止做哪一件事情?
- 课程分数自我感觉不太合理,就单纯看平时成绩评估有点困难,而且有水分,这也导致了我刚开始学习很有动力,但当我发现了这个事实后,的确很打击积极性(我身边很多同学也是这样),希望尽量改进吧。
其他自由发挥
- 写到这里其实可以说整个程序设计与数据结构课程的学习也就接近尾声了,想想这是最后一篇博客了还有些不舍(并不)。
- 说实话博客是我整个学习过程中最磨人的小妖精了,经常因为写博客花费很多时间,一直再纠结应该怎么写,而且我有一些功利心理,所以总想着怎么才能把博客写好拿到加分,有时候周围人比自己博客写的晚但交得早那种感觉真的感觉血亏,如果有一篇博客自己觉得写得贼好结果最后没拿到加分,心里也挺难受。这种功利的追求加分真的把自己搞得很累的,不过起码写出来的博客都还让自己比较满意,内容还算充实。
- 我一直很清楚我不是那种java学的好的人,到现在为止还有些东西可能概念还是不清晰,强哥在课上提问的时候,我就很慌,赶紧翻以前的博客去看。人都是有忘性的,所以说知识是要及时复习的,因为java学习和其他课程的学习形式有所不同,让我经常忽略这点,在以后其他课程的学习中一定要注意及时复习。
- 总而言之,整个java的学习过程还是痛并快乐着的,那种Debug了好多次改了好久的代码最后终于运行成功的开心可能是我在其他事情上很难感受到的。
- 最后,博客园再见,码云再见,csdn再见,蓝墨云再见,以后我看见你们一次关闭你们一次,还有强哥注意身体,少熬夜,爱您。
给出你的总结中涉及到的链接的二维码
-
实验6报告
-
实验7报告
-
实验8报告
-
实验9报告