20202317向岩杰 2020-2021-2《数据结构与面向对象程序设计》课程总结

20202317向岩杰 2020-2021-2《数据结构与面向对象程序设计》课程总结

  • 课程内容总结

  1. 第一章
    • 简要内容

     基于命令行进行简单的Java程序编辑、编译、运行和调试。

     练习Linux基本命令。

     学习Java程序的JDB调试技能:https://www.cnblogs.com/rocedu/p/6371262.html。

     编写简单的Java程序。

    • 遇到的问题

    - 问题1:首先是在使用linux和vim编辑器的时候,由于是第一次使用这种方式操作系统,特别是对于我这种打字都有点费力的人来说,的确是一个比较大的难题。vim编辑器的使用显得手忙脚乱,刚开始估计都是这样的。
    - 问题1解决方案:这个东西的解决方法,好像也没啥特别的解决方法,自己有在尝试做一些题目,像在csdn上找了一些基础的练习题,单纯是为了练熟代码格式还有就是练手速。
    - 问题2:在安装jdk的时候出现了比较麻烦的事情,主要集中在安装Opera Jdk的时候,可能是由于先已经安装了openjdk的原因,在按照步骤装完opera jdk的时候,java -version仍然只显示openjdk。
    - 问题2解决方案:后来从老师那里知道了其实openjdk对于我们的学习已经够用了。

 

    • 心得体会

     还记得编写的第一个经典程序“hello World”。从那时起我已开始走进Java的世界。当时自己不是很理解为什么main方法一定要这样来定义public static void main(String[] args),能不能不-这样写?问了好多同学,他们告诉我的答案是一样的“java本身要求就是这样子的”,就像之前学C的时候,一定是#include开头后跟int main(),学习一门计算机语言的一般都是这样,先模仿,再钻研。特别是在vim编辑器的使用显得手忙脚乱,刚开始估计都是这样的。后来自己查资料,在csdn上找到了好多我能看得懂的参考资料。接下来的学习中还是要多练习,要跟上老师的教学进度。同时也不能只是简简单单的满足于Java的学习,要利用大二的时间多开拓视野,尽可能多学习新东西。

 

   2.第二章

    • 简要内容

    (1) 编写简单的计算器,完成加减乘除模运算。
    (2) 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
    (3) 编写测试代码,测试验证。(https://www.cnblogs.com/rocedu/p/4472842.html)

    • 遇到的问题

    - 问题1:首先是对于构造方法过程稍微难以理解
    - 问题1解决方案:将C语言的函数和构造方法类比就好理解多了
    - 问题2:第一个计算器的输入体验不像一个计算器,所以想换一种写法
    - 问题2解决方案:多加一个循环用来定位符号,由于是两个数所以比较容易分割整个字符串但是也有缺点,就是如果想增加更多的计算种类比如科学计算器就比较麻烦。

    • 心得体会

     这次实验主要是强化了循环,对于构造方法的练习还不够。但是在想第二种方法的时候基本上Java的循环于c语言没啥区别,而且方法使得部分操作更加简单了,比如如果要将c语言中的一个字符串拆解可能十分麻烦,所以用c语言写计算器基本上就不会想到这种方法。但是第二种写的还是很麻烦,水平有限,暂时可能优化不了嘿嘿嘿。对于类与对象和构造方法的认识还不够,对于类、对象、方法之间的关系还差一些理解。之后会继续努力。

    3.第三章

    • 简要内容

 

      下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)。

      1. 初步掌握单元测试和TDD

      2. 理解并掌握面向对象三要素:封装、继承、多态

      3. 初步掌握UML建模

      4. 完成蓝墨云上 (1)-(5)实验。  

 

    • 遇到的问题

     - 问题1:junit的配置,junit3配置后仍然无法使用
     - 问题1解决方案:重新配置路径,尝试了包括junit-4.12等许多版本,最后一股脑全部放进去才搞定
     - 问题2:在(2)中test charAt时,出现预期与实际情况一样但是仍报错
     - 问题2解决方案:检查代码后发现单引号用成了双引号- 问题1:junit的配置,junit3配置后仍然无法使用

     - 问题3:对于设计模式的格式和具体方法不清楚,包括Byte等的包装类不熟悉
     - 问题3解决方案:查阅资料

    • 心得体会

      这次实验对于TDD和设计模式这些新的东西有了更深的体会,特别是对于产品代码和测试代码的理解,产品代码相当于一个类,测试代码通过调用这个类中的方法来验证这个类是否发挥了作用。其次是设计模式中的工厂方法模式,老师提供的示例中主要是使用这个模式,还有包括抽象工厂模式(AbstractFactory)等许多模式,通过代码扩充,对于设计模式的可重用性、可扩充性、可维护性和灵活性好等特点有了更进一步地理解。

    4.第四章

    • 简要内容

 

    (一)Java Socket编程

    1.学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程
    2.结对编程。结对伙伴A编写客户端SocketClient.java,结对伙伴B编写服务器端。
    3.截图加学号水印上传蓝墨云,代码push到码云,并撰写实验报告。

    (二)Java和密码学

    参考 http://www.cnblogs.com/rocedu/p/6683948.html

    以结对的方式完成Java密码学相关内容的学习(帖子中所有代码和相关知识点需要学习)。提交学习成果码云链接和代表性成果截图,要有学号水印。

    (三)编写有理数/复数计算器  

    结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。截图加水印上传蓝墨云,代码push码云。

    (四)远程有理数计算器

    结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
    客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。截图加水印上                传蓝墨云,代码push码云。

    (五)远程复数计算器  

    结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
    客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴A(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端B,B收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
    注意实验四(4)和实验四(5),一个人不能仅实现客户端,必须实现一个客户端和服务器,否则两个实验均不得分!!!

    • 遇到的问题

    - 问题1:关于有理数计算器的编写时,由于像个憨批忘记有nextToken这个方法无法从输入的算式中提取数字
    - 问题1解决方案:用for 循环定位空格,记录空格的位置,用substring提取数字和运算符
    - 问题2:对于IP地址稍做了研究因为在我尝试多次修改地址时发现并不会影响链接
    - 问题2解决方案:后来了解到从127.255.255.255到127.0.0.1都是本机地址,称为环回地址

    • 心得体会

    这次还是学到了很多的东西,特别是自己尝试去研究特定的方法,像一开始忘记了有nextToken这东西,然后研究出靠空格来定位,用数组来记录空格位置,再分割算式的方法提取数字和运算符,总的来说还是非常棒的(说不定就是nextToken的底层代码呢嘿嘿嘿),包括实现客户端和服务器的循环问答,下次继续加油。

    5.第五章、第六章

    • 简要内容

    1.链表练习,要求实现下列功能:

    通过键盘输入一些整数,建立一个链表;
    这些数是你学号中依次取出的两位数。 再加上今天的时间。  
    例如你的学号是 20172301
    今天时间是 2018/10/1, 16:23:49秒
    数字就是
    20, 17,23,1, 20, 18,10,1,16,23,49
    打印所有链表元素, 并输出元素的总数。
    在你的程序中,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。 例如你叫 张三, 那么这个变量名就是
    int nZhangSan = 0; //初始化为 0.
    做完这一步,把你的程序签入源代码控制(git push)。

    2.链表练习,要求实现下列功能:

    实现节点插入、删除、输出操作;
    继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
    从磁盘读取一个文件, 这个文件有两个数字。
    从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。
    从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
    从链表中删除刚才的数字1. 并打印所有数字和元素的总数。

    3.链表练习,要求实现下列功能:

    使用冒泡排序法或者选择排序法根据数值大小对链表进行排序;
    如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
    在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
    在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。

    • 遇到的问题

    - 问题1:一开始写的deleteElement方法有大问题,从头结点开始遍历链表的时候一直到tail都不能找到目标元素。
    - 问题1解决方案:没有解决(9#%&#),但是学到了怎么使用debug和设置断点,而且也大概发现了问题,在进入deleteElement方法的时候,头指针并不为空,而且元素在比较时可能存在内容无法比较,可能需要重写equals(人类极限了属于)。
    - 问题2:在冒泡的时候首先遇到的问题是element的比较。因为一开始的代码中链表的元素是Time类,就是上面截图中的Time类,但是两个类怎么比较。。。。直接蚌埠住了,再加上跟deleteElement死磕了好几个钟,所以放弃思考了
    - 问题2解决方案:把Time类删了,删干净了,全部换成Integer,这样冒泡的排序也很好写。

    • 心得体会

    这次还是学到了很多的东西,特别是自己尝试去研究特定的方法,还有就是关于调试bug的,发现断点和覆盖率运行还是很好用的,以下放一点debug时的截图(拿超人之前的程序做实验)。覆盖率就是这行代码完成情况,可以知道程序是怎么个走势,断点就可以显示具体每一步数据的变化,就是在这里发现的head指针不为空。学到新东西了之后加油。

     6.第七章

    • 简要内容

 

      定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。
      要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位
      提交运行结果图。

 

 

      重构你的代码
      把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301)
      把测试代码放test包中
      重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种)

 

 

      参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试
      提交运行结果截图

 

 

      实现排序方法等(至少3个)
      测试实现的算法(正常,异常,边界)
      提交运行结果截图(如果编写多个排序算法,即使其中三个排序程序有瑕疵,也可以酌情得满分)

 

 

      编写Android程序对实现各种查找与排序算法进行测试
      提交运行结果截图
      推送代码到码云(选做,额外加分)

    • 遇到的问题

    - 问题1:在使用哨兵查找时会少一个数据
    - 问题1解决方案:输入数据时a[0]里面的数据被哨兵覆盖了,修改输入起始点就好了

 

    •  心得体会
    • 排序和搜素的方法中,冒泡和选择是最好理解的,代码实现也最方便,但是牺牲的是时间复杂度,快排最优但不怎么熟练,这次的实验还比较顺利,没有出现什么大问题,包括复习的linux和还是不会的Android。。。。加油

    7.第八章

    • 简要内容

 

    参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
    用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台

 

 

    基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树  
    用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
    课下把代码推送到代码托管平台

 

 

    自己设计并实现一颗决策树
    提交测试代码运行截图,要全屏,包含自己的学号信息  
    课下把代码推送到代码托管平台

 

 

    输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)

    • 遇到的问题

    - 问题1:关于遍历树的时候子链无法找到
    - 问题1解决方案:查阅资料后知道是因为数组超容量了

    • 心得体会

    这次还是学到了很多的东西,特别是自己尝试去研究特定的方法,像一开始又忘记了有nextToken这东西,然后又想出出靠空格来定位,用数组来记录空格位置,再分割算式的方法提取数字和运算符,后来改了总的来说还是非常棒的。其他都在后面的内容中表现了。

    8.第九章

    • 简要内容

    (1) 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)(2分)
    (2) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)(4分)
    (3) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环(3分)
    (4) 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出(3分)
    (5) 完成有向图的单源最短路径求解(迪杰斯特拉算法)(3分)

    • 遇到的问题

 

    问题1:关于在递归时栈溢出和数组溢出的问题

    解决方式:特别是遍历的时候,数组溢出的问题时有发生,主要是由于用来计数的变量在遇到需要回溯的地方时计数的变量不好选择,理清楚逻辑就好了

    问题2:在遍历时由于是用的纯二维数组导致后续的递归逻辑不好控制

    解决办法:硬写。。。效果不好,下次一定用邻接表

    • 心得体会

    这次的实验比较不顺利,主要是被遍历拦住了,感觉我的代码还有很大问题和优化的地方。特别是如何回溯这一点还有待改善。加油

 

 

 

(按顺序)总结所做过的作业

 

  • 作业1:第一章和第二章测试活动2021-1896944

     

 

 

  •  作业2:第三章 类和对象 测试

 

 

  •  作业3:第4章和第5章 测试

 

 

  •  作业4:第6和第7章测试

  •  作业5:封装继承多态重写重载文件字符字节读写-测试

  • 作业6:实验四
  • 作业7:第9/10/11章 继承多态异常

 

 

  •  作业8:实现自己的ArrayList

  • 作业9:尾插法

 

 

  • 作业10:ArrayStack测试

 

 

  •  作业11:栈应用-进制转换

 

 

  •  作业12:栈/队列测试

 

 

  •  作业13:最小生成树测试

 

  •  作业14:数和图

 

  • 作业15:快速排序测试

(按顺序)实验报告链接汇总

代码托管链接:

 

 

 

  • lines:4626(单个计数,亲测有效)

 

课程收获与不足

 

  1. 自己的收获(投入,效率,效果等)

    我在本门课程上的时间投入其实还没有很多的,也因此的投入并不会让我感到厌烦,在这个过程中我收获了更严谨的思维、更强大的逻辑能力、更充足的耐心。

    我经常在调试中浪费大量时间,因此在效率方面还有待提高。

    效果还是比较显著的,对数据结构有了初步的理解,对面向对象的程序设计也有所涉猎了。

  1. 自己需要改进的地方

    敲代码还是不够,很多代码都会去借鉴网上的,还有是对于书本的了解不多。也就是啃书啃得不够,很多都是上课听老师讲完就解决当前的任务,但是少了通过书本来系统的构建知识体系的过程,导致像后期用前面学的链表的知识解决数图的问题就完成的不好。

    还有就是对于细节的知识点了解的不够,也就是书本上写的基础但必要的东西。我平时的学习更倾向于实践,导致实践和学习脱节了。

    还有就是时间的安排不合理。很多实验和作业都是后期才交上,有点拖沓。

posted @ 2022-01-02 18:39  20202317向岩杰  阅读(16)  评论(1编辑  收藏  举报