20182304 2018-2019-1《程序设计与数据结构》课程总结
(按顺序)每周作业链接汇总
-
第一周作业:学习命令行使用、vi编辑器、编写简单Java程序、理解面向对象程序设计基本概念
-
第二周、第三周作业 :在第二章中,学习了字符串的使用,学会了定义、赋值、使用各种数据类型的变量,掌握了如何使用Scanner类提供的不同方法输入数据。第三章中,我学到了由类创建对象(即实例化对象),并用点运算符调用包括String,Random,Math,Numberformat,Decimalformat类的丰富方法来满足来满足程序设计的需求
-
第四周作业 :本周我们学习了使用并编写我们自己的类、通过实例化对象使用类里的所有方法、熟悉封装和接口概念、使用可见性修饰符。
-
第五周作业 :本周解释了继承的概念、继承是从已有类派生新类的一个过程,是支持软件复用思想的一种方法。继承在子类与父类之间建立了"is a"关系,继承是单向的,不允许多重继承
-
第六周作业 :本周学习多态,多态引用可以在不同时间指向不同类型对象,即运行一致性的方法出现不一致的行为。使用父类声明的引用变量可以指向子类的对象,接口也可以实现多态。学习使用try-catch来实现未捕获的异常的处理与自定义异常
-
第七周作业 :本周开始学习数据结构,首先是时间复杂度分析,熟悉栈、链表、队列的概念与具体实现
-
第八周作业 :本周学习查找与排序。查找学习了基础的线性查找、二分查找,同时也学习了哈希线性查找、哈希链表查找、二叉树查找以及它们的具体实现,同时也学习了五种排序算法:选择排序 、冒泡排序、插入排序、快速排序以及归并排序,了解了算法稳定性、ASL(平均查找性能分析)
-
第九周作业 :本周我们学习了树和树的遍历,以及代码具体实现
-
第十周作业 :本周我们学习了图的概念与表示,并着重实现了图的各种遍历方法
-
自认为写得最好一篇博客是?为什么?
- 第十周作业 总体写的比较认真细致,图文并茂。我尽量完整罗列和梳理知识点,将不熟悉的内容从头到尾整理了一下,较为完整的呈现了图这一章的概念,将几个图的算法完整实现了,并附上了实现的概念、思路、代码
-
作业中阅读量最高的一篇博客是?谈谈经验
- 作业中阅读量最高的一篇博客是实验三,单纯是交的比较早,大家写自己的博客时会拿交作业同学的博客参考一下
(按顺序)实验报告链接汇总
-
实验一 Linux基础与Java开发环境
- 基于命令行和IDE(Intellj IDEA 简易教程](http://www.cnblogs.com/rocedu/p/4421202.html)进行简单的Java程序编辑、编译、运行和调试。(本次实验主要使用命令行的方式)
- 练习Linux基本命令
- 学习Java程序的JDB调试技能:https://www.cnblogs.com/rocedu/p/6371262.html
- 编写简单的Java程序
-
实验二 Java基础(数据/表达式、判定/循环语句)
- 编写简单的计算器,完成加减乘除模运算
- 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出
- 编写测试代码,测试验证。(https://www.cnblogs.com/rocedu/p/4472842.html)
-
实验三 面向对象程序设计
- 下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)
- 初步掌握单元测试和TDD
- 理解并掌握面向对象三要素:封装、继承、多态(自己去学!)
- 初步掌握UML建模
-
实验四 Java Socket编程
- Java Socket编程
- Java和密码学
- 编写有理数/复数计算器
- 远程有理数计算器
- 远程复数计算器
-
实验五 Android程序设计
- Android Stuidio的安装测试
- Activity测试
- UI测试
- 布局测试
- 事件处理测试
-
实验六 线性结构之链表
- 建立链表,按要求补全链表功能
- 建立链表,按要求补全链表功能
-
实验七 查找与排序
- 定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位
提交运行结果图。 - 重构你的代码,把Sorting.java Searching.java放入 cn.edu.besti.cs1823.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)
把测试代码放test包中,重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种) - 参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试,提交运行结果截图
- 补充实现课上讲过的排序方法
- 定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
-
实验八 树
- 参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
- 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
- 自己设计并实现一颗决策树;提交测试代码运行截图,要全屏,包含自己的学号信息
- 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果
-
- 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)(2分)
- 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)(4分)
- 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环(3分)
- 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出(3分)
- 完成有向图的单源最短路径求解(迪杰斯特拉算法)(3分)
(按顺序)团队项目报告链接汇总
代码:
-
给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
- 本学期的代码目标是达到了,还比预期多一些。一方面我按要求敲了书上很多源代码,另一方面数据结构的实践和实验中有些代码相当复杂,实现起来代码量特别大,所以代码速度增长是较快的
-
加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
- 我十分认同这个观点,有时我们使用书上和网络上的代码时,只是好像大致知道代码思路与结构,实际上并不确定我们是否真的理解掌握。如果我们稍微改变一点代码,程序还可以正常按照我们预设的思路运行,说明程序可以为我们所用,我们对程序的理解是到位的;如果程序无法正常运行,说明我们的理解存在问题,这时我们需要进一步阅读相应代码、进行单步调试,使代码正常运行,这时我们对代码的理解才比较深入
-
积极主动敲代码做到没?教材实践上有什么经验教训?
- 我在Java前半个学期学习主动性还不错,主动敲了一些代码。学期中的时候事情比较多,数据结构部分例如树的实现又很复杂,实践和实验任务也很重,就没心情和时间积极敲代码了。教材实践方面,经验教训是要注意审题,我有一次题目看错了导致代码功能不对;另一方面书上的代码也存在着一些问题,一些类根本没有实现。尽信书不如无书,我们不能迷信书本,出现问题要及时上网搜索解决。同时还要多动手敲代码尝试,否则无法牢固理解书中内容
课堂项目实践
-
Scanner&JDB练习:输入两个数,计算两个数的加、减、乘、除运算结果,并输出。
-
类的编写实践:编写一个Book类,其实例数据分别表示书名、作者、出版社以及版权日期。
-
Random和NumberFormat测试:生成-10~10之间的随机数,并格式化输出(0.###)
-
时间复杂度分析:计算时间复杂度,用大O记法进行表示。
-
ArrayStack类的实现和测试:完成课本中ArrayStack类的实现,特别是完成peek、isEmpty、size和toString方法的实现,并完成四个方法的测试。
-
[链表插入:写出链表中节点插入的伪代码。]
-
链表实践:通过键盘输入一些整数,建立一个链表;实现节点插入、删除、输出操作;使用冒泡排序法或者选择排序法根据数值大小对链表进行排序。
-
链栈补全(LinkedStack补全)sizeisEmpty oStringPush:实现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。
-
树-计算题:
- 1.有1023个结点的完全二叉树,其高度是多少?叶结点数是多少?
- 2.高度为h的完全二叉树至少有多少个结点?至多有多少个结点?
- 3.已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点,…,nm个度为m的结点,问该树中有多少个叶结点?
-
中序和先序计算二叉树结构:若已知中序和先序序列,计算二叉树结构
-
二叉树的建立和层序遍历法实践:
-(1)给定一个序列AB#CD###E#F##建立一颗树,根据“二叉树的生成”算法构造这颗树。
-(2)使用层序遍历方法完成遍历并测试。
-
堆排序过程测试:写出图中后续排序过程
-
课堂实践对提高应用能力有帮助吗?
- 有帮助。课堂实践锻炼了我们限时解决问题的能力,强制我们在短时间内快速理解并应用我们新学的知识,有力检验我们在课上是否听懂。同时也提高了我们的听课效率,使我们摸清听课重点。如果我们实践做错了,也能及时向老师同学询问,改正错误。
-
课堂实践上自己有什么经验教训?
- 有一次我忘记了提交代码链接,导致成绩无效。还有些我本以为课上听懂了,实践的时候却仍然没有思路,说明我的掌握还是很不牢固的。
-
课堂实践上对老师有什么教学建议?
- 老师应该尽力让我们大家都明白再进行实践,要合理考虑实践时间和实践题目难度
课程收获与不足
- 自己的收获(投入,效率,效果等)
- 收获:在上这门课之前,自己的自学能力确实比较差劲,经过一学期的锻炼,我遇到不懂的问题可以上网找博客自学。现在对面向对象编程的理论和数据结构都有了一定的理解
- 不足:对一些数据结构的具体实现理解的不是很好,编程解决问题的能力总体来说仍不是很强
- 我投入的时间还算可以,效率却相对很低,新学一些复杂的内容时理解起来很吃力。不过一学期下来,我还是学会了一些新的学习方法与知识
- 自己需要改进的地方
- 一方面是太过懒惰了,做事能拖就拖。另一方面是学习方法有问题,学东西是不能聚精会神,容易分神,导致效率很低
- 结对学习是不是真正贯彻了?写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
- 贯彻了一部分,我们结对学习主要体现在相互提醒完成作业与错题讲解上,合作探究较少。老师应该考虑到大家学习能力的差距,避免两极分化
问卷调查
- 你平均每周投入到本课程有效学习时间有多少?
- 大约一周三十小时左右,有效时间可能二十小时多一点(学习容易走神)
- 每周的学习效率有提高吗?你是怎么衡量的?
- 比较一般,对学习内容熟悉后有提高,但是学到了全新的东西后,理解起来吃力,学习效率就又不行了。我按理解知识点与完成好作业的速度来衡量学习效率
- 蓝墨云班课的使用对你的学习有促进吗?有什么建议和意见吗?
- 有促进,学习、提交作业比较方便。建议老师放的资源尽量少而精,目前很多资源要么过时了要么我们根本用不上
- 你觉得这门课老师应该继续做哪一件事情?
- 使用蓝墨云班课,进行随堂实践
- 你觉得这门课老师应该停止做哪一件事情?
- 占用宝贵的课堂时间考一大堆纯英文绕来绕去的选择题,这对概念理解帮助不大,也无法有效测试同学真正的水平