20172305 《程序设计与数据结构》第九周学习总结

Posted sanjinge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172305 《程序设计与数据结构》第九周学习总结相关的知识,希望对你有一定的参考价值。

20172305 2017-2018-2 《程序设计与数据结构》第九周学习总结

教材学习内容总结

本周内容主要为书的11.1-11.6和12.1-12.3的内容:

  • 第十一章

  • 1.异常(try-catch语句、异常类的层次和异常的处理)

    • 异常是一个定义非正常情况下或错误的对象,错误是代表不可恢复的问题并且必须捕获处理。

      错误与异常都是在程序编译和运行时出现的错误。不同的是,异常可以被开发人员捕捉和处理;而错误一般是系统错误,一般不需要开发人员处理(也无法处理),比如内存溢出。
      Exception是java中所有异常的基类。在java中异常被分为两大类,编译时异常和运行时异常。
      Error是java中所有错误的基类。错误通常是我们无法处理的,绝大多数情况下,我们不应该试图捕获错误。

    • 异常体系具有可抛性,这个特性是Throwable体系中独有的特点。

    • throws throw
      区别1 使用在函数上 使用在函数内
      区别2 后面跟异常对象类(可以多个,逗号隔开) 后面跟异常对象
    • 如果程序不处理异常,则将非正常地终止执行,并产生关于描述在何处发生什么异常的信息。

    • try-catch语句可以捕获并处理异常,程序将继续正常执行。

    • 每一个try-catch语句都可以有一个可选的finally子句,用于定义一段无论是否有异常发生都将执行的代码。try语句块可以没有catch子句,没有catch子句时,如果需要仍然可以使用finally子句。

    • try-catch语句的finally子句的执行与如何退出try语句无关。如果没有异常产生,try语句块可以执行完后将执行finally子句,当抛出异常时,将执行相应的catch子句,然后执行finally子句。

    • 通过继承Exception类建立新的异常类,新的异常类最终是Throwable类的后代类,可以使用throw语句。

  • 2.I/O

    • 流是一个有序的字节数列

    • 标准的I/O流有三种,System类中有三种对象引用变量(in,out和err),分别代表了三种标准的I/O流。System.in为标准的输入流--键盘,System.out为标准输出流和System.err为标准错误流--显示器屏幕上的一个具体窗口。

  • 第十二章

  • 1.递归思想

    • 递归是一种编程技术,允许一个方法调用自己以达到最终目的。递归是以一种事物自身定义自身的过程。

    • 任何递归的定义都必须有结束递归选择的基本情况。 递归方法必定有一条if-else语句,其中的一支作为检测基本情况的值。

    • 直接递归:方法调用自己的递归。
    • 间接递归:如果一个方法调用其他方法,最终导致再次调用自己的递归。
  • 2.迷宫旅行和汉诺塔问题

教材学习中的问题和解决过程

  • 问题1:异常类的方法和异常类的体系
  • 问题1解决方案:在Throwable类中方法里面找到了每次出现异常的时候抛出的错误提醒和异常何处的问题。getMessage()[返回此 throwable 的详细消息字符串。]和getStackTrace()[提供编程访问由 printStackTrace() 输出的堆栈跟踪信息。]两个方法产生的。其中的Exception算是所有异常的父类,其下的所有子类都是每一个相对具体的异常。异常的规定也是按照一种编写类的方式,编写类中方法的方式进行构造的。

    • Throwable类是Error和Exception类的父类。
    • Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
    • 异常类的体系结构:
      技术分享图片
  • 问题2:可检测异常和不可检测异常--RuntimeException类
  • 问题2的解决方案:Java中唯一的不可检测异常是RuntimeException类的对象或该类的后代对象。所有其他异常都是可检测的异常。对于可检测的异常是,发生异常的方法不捕获和处理该异常,则必须在该方法定义的声明头中包含throws子句。

    • 可检测异常在方法定义的声明头中追加一条throw子句,就明确承诺了该方法在异常发生时将抛出或传递异常。
    • 不可检测异常则不需要只用throws子句。
  • 问题3:递归和循环
  • 问题3的解决方案:递归和循环的差别,我觉得最明显的就是递归的不断的调用自己的方法,而循环则是不然,通过for、while、do循环进行一次一次的往复运算。递归和循环两者完全可以互换。如果用到递归的地方可以很方便使用循环替换,而不影响程序的阅读,那么替换成递归往往是好的。像斐波那契数列、汉诺塔、阶乘等问题都可以用递归解决。

    递归算法
    • 优点:代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕)
    • 缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理(还有可能出现堆栈溢出的情况),比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。
    循环算法
    • 优点:速度快,结构简单。
    • 缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。
  • 问题4:字节流和字符流
  • 问题4的解决方案:在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。两种写入文件的方式,但字节流的使用更重要。

代码调试中的问题和解决过程

  • 问题1:PP12.1while循环转递归
  • 问题1解决方案:判断是否为回文的方法就是头尾各取一个字符进行比较是否相等,不断的循环下去。但是在刚开始想的时候,我不知道如何编写,完全没思路。是从while (another.equalsIgnoreCase("Y"))就开始写还是就单纯的判断回文处进行编写,无论是前者还是后者都不知道代码如何去写。顿觉脑洞的重要性,有一个会编程的脑袋该多好啊!我尝试了写前者的代码,但是每写一步都举步维艰,所以放弃着手写后者,但是后者在哪发生递归仍是个问题,还有非递归的位置,又该如何编写。在看过同学编写的代码,恍然大悟,对于一个和两个的字符作为非递归的位置,而较多的字符可以进行一个递归处理,这样完成了,在用递归的main函数里面进行一个是否继续继续下去的递归不就好了。

      public static boolean Palindrome(String str)
      {
          if(str.length()==1)
              return true ;
          else if(str.length()==2)
          {
              if(str.charAt(0)==str.charAt(str.length()-1))
                  return true ;
              else
                  return false ;
          }
          else if(str.charAt(0)==str.charAt(str.length()-1))
              return Palindrome(str.substring(1,str.length()-1)) ;
          else
              return  false;
      }
  • 问题2:PP11.1和PP11.2的异常处理
  • 问题2解决方案:对于此编程项目,着实费了不少功夫,尤其是PP11.1的要求,我理解处两种处理方式,一种是用户每次输入的字符串的一个处理,一种是用户一直在输入字符串直至输到DONE的时候,终止输入然后在判断整个字符串的一个处理。可能是我的理解力有问题导致,所以,我觉的前者可以先尝试尝试,所以我的PP11.1就是按照前者进行编写的,但是在编写PP11.2的时候自己不会编写了,有辄回来写第二种的代码,很简单就搞定了。可能是我之前的理解有误吧。
    • PP11.1
      技术分享图片

    • PP11.2
      技术分享图片

  • 问题3:IO操作及异常处理
  • 问题3解决方案:刚听完IO的问题就要去编写IO的代码,感觉好恐怖。听的云里雾里的,尤其还有一堆的类去理解,用哪个不用哪个的问题,对应的writer和reader什么的,一堆一堆的,好在有老师给的代码可以参考。在老师的代码中有BufferedOutputStream和BufferedInputStream两种可供理解,两种字节流可以使用,进行往文件里面写入读出。(在文件里面写出这两串数字真不容易......)

    • Buffered缓冲流::BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。
    • 技术分享图片
    • 技术分享图片
  • 问题4:PP12.杨辉三角的编写
  • 问题4的解决方案:在之前查递归的时候看到过杨辉三角的编写代码,也就有了思路可以参考,编写起来我把生成的数存放到一个二维数组里面,再从数组里面进行调用方法,这样的话就可以形成杨辉三角了。但是,在和小组成员进行交流的时候,发现自己好像把题意理解错了,要求的是输出杨辉三角的第N行,结果我是全输出了。在解决这个问题的时候,脑洞大开正好最近在学习I/O流的问题,我把杨辉三角写入文件中,然后再一行行的调取,存入一个字符串数组中,然后再读取最后一行即为要求输出的一行。方法可以实现目的,但是感觉很费事。暂时还没有想到更好的方法,所以用此方法完成作业了。
    • 杨辉三角的整体输出:
      技术分享图片
    • 按要求输出第N行:
      技术分享图片

代码托管

技术分享图片

上周考试错题总结

  • 错题1:An interface reference can refer to any object of any class that implements the interface.(接口引用可以引用实现接口的任何类的任何对象。)
    • A.true
    • B.false
  • 错误解析:这是使用类名来声明引用变量的多态函数之一。接口实现多态性,就是如问题所说的那样,感觉自己犯得错误很低级,不应该。

  • 本次考试是自己在高铁上答完的,由于网络的不稳定,导致自己答题时间特别长,好在没有崩掉。自己答题的时候,遇到不会的就是网上查找资源。所以,这次考试在网上查到了很多题,才会有很高的成绩的,其实自己水平并不高,还是像上周那样,还是好好学习才能缩短与好学生的差距。

感悟

十一章和第十二章的内容讲的是异常和递归,而且第十一章中I/O流部分内容在蓝墨云上的视频一堆,感觉自己有点忙不过来。而且马上快要检查四则运算的编程实验了,我们仨的代码,分开使用就可以,合在一起使用就一堆问题,好烦!看完第十二章的内容,感觉本书已经学完了一大半,但是感觉自己还是以有很多问题,还有很多不足需要解决。惆怅......自己还有很多很多的关于I/O流的内容没有看,所以有关I/O流的问题还没有遇到很多,写的也就少了。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 136/136 1/1 15/15
第二周 570/706 1/2 20/35
第三周 613/1319 1/3 23/58
第四周 1249/2568 1/5 30/88
第五周 904/3472 1/6 30/118
第六周 540/4012 1/7 30/118
第七周 826/4838 1/7 30/178
第八周 925/5763 2/9 45/223
第九周 253/6016 2/10 55/278

参考资料

以上是关于20172305 《程序设计与数据结构》第九周学习总结的主要内容,如果未能解决你的问题,请参考以下文章

第九周学习总结

20172326 《程序设计与数据结构》第九周学习总结

《程序设计与数据结构》第九周学习总结

20172308《程序设计与数据结构》第九周学习总结

学号20172328《程序设计与数据结构》第九周学习总结

20172333 2018-2019-1 《程序设计与数据结构》第九周学习总结