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


2018年学习总结博客总目录:[第一周](http://www.cnblogs.com/hzy0628/p/8539037.html) [第二周](http://www.cnblogs.com/hzy0628/p/8584976.html) [第三周](http://www.cnblogs.com/hzy0628/p/8642935.html) [第四周](http://www.cnblogs.com/hzy0628/p/8671888.html) [第五周](http://www.cnblogs.com/hzy0628/p/8746606.html)

教材学习内容总结

  • 第五章&第六章

1.控制程序执行流程的语句分为:条件语句(if、if-else、switch)及循环语句(while、do、for)。

2.相等性运算符(==和!=)和关系运算符(>、<、>=、<=)及逻辑运算符(!、&&、||)的使用,其中&&和||具有“短路”特性。

3.if语句的编写、if-else语句的编写、语句块的使用及最后的if语句的嵌套。

4.数据的比较:浮点数比较慎用==,最好使用两数绝对值之差小于某一精度,还有字符还有对象的比较。

5.while语句的编写及嵌套循环的使用,还有较为特殊的无限循环的几个例子以及break(用于跳出当前执行流程的循环)和continue(对循环进行再计算)语句。

6.迭代器:迭代器的基本使用方法(下面有说),读取文本文件的方法。ArrayList类的使用方法。

7.switch语句的编写及注意点:没有case语句的值和表达式的值相匹配,程序可选default指定的默认执行语句,break语句在switch语句中的使用。

8.条件运算符属于三元运算符,通常写为?:,举一个条件运算符的例子:
total = (total>MAX)?total+1:total*2;

9.do语句的使用,循环条件while子句放到了循环体的尾部(do语句是先运行循环体,再对控制条件进行控制),循环条件使用的为。

10.for语句和for-each的循环,(for语句适用于明确知道具体循环次数)。for-each循环是for循环的增强版,有助于处理涉及迭代器的问题。

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

  • 问题1:对于书上【例5.10】并不是很理解,首先是import声明的类是第一次见,再后就是文本文件的调用,还有这一节都不是太明白迭代器的具体的使用作用。

  • 问题1解决方案:这个声明的包中的类查了查,其实好像很复杂,是被叫做Java的IO流,看了下面的这张图,也只是粗略的看了下,参考资料中放了链接,应该以后会具体接触到的吧,现在看了还不是很懂。

接着说那个迭代器的问题,从网上也找了部分资料,能够稍微明白一些。

迭代器在其实就是指针,读取集合或者数组中的一个值,读完以后又指向下一条数据。迭代器是很好用的一个东西,以java为例,在遍历list或者map等对象的时候,效率比较高,而且能实现一些for循环不能实现的功能。例如remove.

迭代器基本的使用方法是懂了一些,但具体的或者说深入的还是不理解。

  • 问题2:对书上例题【例5.4】中的构造函数这里不是很理解,下面是那个的构造函数。
public class Coin
{
   private final int HEADS =0;
   private final int TAILS =1;

   private int face;

   public Coin()
   {
      flip();
   }

   public void flip()
   {
     face = (int)(Math.random()*2);
   }

   public boolean isHeads()
   {
      return(face == HEADS);
   }

   public String toString()
   {
      String faceName;
      if (face == HEADS)
         faceName = "Heads";
      else 
         faceName = "Tails";

       return faceName;
    }
}
  • 问题2解决方案:主要就是纠结那个flip();的()到底是什么意思,后来是问了我们班的课代表,他解释之后,我开始明白了一些。书上的例子中的构造函数是在调用下面的flip()方法,然后本质上就是在对这个face变量进行初始化,对face赋值,其实我个人认为的就是这个直接给face赋值可能会更容易理解一点。然后还查阅了一下构造函数的作用:

开始的时候我也不理解为什么要构造函数。因为那时候的设计思想还停留在面向过程编程。即我要干什么事,这件事有几个步骤,然后我决定怎么干。面向对象不是这么直接简单,它的设计思想就是要代码重用。即我以前干过类似的事,那么我找出以前可以用到的代码,完成一部分。以前没有的我重新写。这样就有了类。回到你提的问题。有了类,就是有了可以重用的代码,但是我怎么产生这个对象呢。必须要实例化这个类(当然这不是唯一产生对象的途径,比如单例模式,但本质上说所有途径都是一样的)。那么就要用到构造函数。即告诉程序我现在要实例化一个对象了,你给我马上分配内存。将内存的首地址赋给我指定的类对象。而且有时候你需要传递参数到函数里面,有了构造函数就方便了,构造函数可以有无数个。当然,传递参数到到对象里面也可以其它方法,比如直接赋一个值给成员变量,举例:

  • 问题3:为什么要说for语句适用于已经明确知道具体循环次数,我觉得while和do也是可以的啊,是只是因为for的循环都写在了控制头里,容易看出?

  • 问题3解决方案:这个我也不太明白,也找到了部分说法,但感觉还是不太有说服力。可能他的说法也是对的,就是从代码易读性考虑,我们从这是可以轻易的看到,而不用去方法的内部去查找。

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

  • 问题1:代码调试中编程项目PP5.1,这个项目编程时遇到了一个小错误,编译时出错,代码如图所示:

  • 问题1解决方案:这里遇到的编译错误是由于那个if语句所产生的,我的编写是if ((num1=0&&num2!=0)||(num2=0&&num3=0)),这里也就是犯了那个""和“=”的混淆错误,“=”很明确的是在做赋值操作,这样显然逻辑运算符两边的操作就是不同,这里想做的是判断是否相等操作,应该使用的是“”。

  • 问题2:做项目PP5.3时同时也遇到了一些问题,这个是两个错误,一开始的是三个数值未进行初始化,然后做操作后要求输出它们,这里犯了一个错误,最主要的错误是下面的这个,这里也是遇到编译错误,如下图:

我的源代码见下(这里只列出出错的部分):

while (left<=number)
     {
       character = figure.charAt(left);
       String str = String.valueOf(character);
       int num = Integer.valueOf(str);
       
       if (num == 0)
          count1++;
       else 
         if (num%2==0)
           count2++;
         else
          count3++;
	
	left++;
     }
  • 问题2解决方案:这里我列的number是等于所输入字符串的长度,这就是这道题我出错的原因,编译的错误原因我翻译了一下,就是我的String的索引超出范围(可能并不准确),这就说明在编译这道题前没有想清楚到底应该如何编写,出错的原因现在也明白了,比如说我输入的一个10位数的String型的数字,我使用String类的方法返回指定索引处的那个字符,我最后循环的要求是要返回索引值为10的字符再进行操作,可是String型字符串的第一个字符索引值为0,也就是这个10位数的最后一个数字索引值为9,这就产生了错误,最后是将while (left<=number)中的“=”去掉,就解决了这个问题。

  • 问题3:还有PP5.7的项目编写,我的一开始的设计是可以使用,但存在下面的缺陷(如图),这里的问题是当我按“0”表示想要结束这个游戏时,这里会给我默认给出我的选择为剪刀,然后才结束这个游戏,统计最后的结果时也是计入了最后这并不应该进行的一局。

  • 问题3解决方案:后来是跟李馨雨同学交流时,她的那个方法是让它结束时采用的【例5.9】中的方法,但她说这里也存在的问题时,并不会让我们进行输入y/n进行判断,这个游戏只能进行一局,并不能循环,我也试了试她的这种方法,的确是这样,后面我自己是把那个判断的原来的String型改为了一个int型的数据,这样整个再运行也就没有问题了。这里放一下李馨雨同学的那个截图(我自己没有截下来图就给试着改了),这个问题她后来问了蒋子行,告诉的是这个可以创建两个Scanner对象,也就是再重写一次Scanner scan = new Scanner(System.in),这个就解决了。

  • 后补:之后我向郭恺也问了这个问题,他告诉我的是先是那个nextInt()输入后会产生回车符,而在之后的nextLine()会是使用了这个回车符,而跳过了让我们进行输入的环节,所以最后的办法是把那个nextInt()这条语句重写一遍就可以了,这个问题也是在蓝墨云班课中被学长回答过,这次又一次出现。

  • 问题4:最后的一个小问题就是PP6.3的12x12的乘法表,我完成的输出只有结果,没有乘法的那个表达式,还有就是完成后是个矩形,而不是像9x9那样的下三角形,这就说明我的编码有问题。

  • 问题4解决方案:这个问题比较简单,对之前的代码进行了调整,就完成了这个问题,下面是改完以后的代码:

public class PP63
{
   public static void main(String[] args)
   {
       int MAX=12;
       int number,count=0;

       for(int num1=1;num1<=MAX;num1++)
       {
         for (int num2=1;num2<=num1;num2++)
	 {
              number = num1*num2;
              
	      System.out.print(num1+"*"+num2+"="+number+"\t");
         }
	      System.out.println();
         
       }
   }
}

代码托管

上周考试错题总结

  • 1.The behavior of an object is defined by the object's
    A.instance data
    B.constructor
    C.visibility modifiers
    D.methods测试
    E.all of the above

  • 解析:对象的行为由对象的可执行的操作确定,而对象的操作则是由类中声明的方法定义。故答案选择D项,实例数据也就是类中的属性,对象的状态是由对象的属性所决定的,构造函数是方法中的一种,所有的方法的组合都决定了对象的行为,可见性修饰符会间接影响对象的性能。

  • 2.The relationship between a class and an object is best described as
    A.classes are instances of objects
    B.objects are instances of classes
    C.objects and classes are the same thing
    D.classes are programs while objects are variables
    E.objects are the instance data of classes

  • 解析:对象是类的实例,类是相同结构的对象的抽象。对象是程序的基本元素,对象是由类定义的,类是建立对象的模型或蓝图。

  • 3.Which of the following reserved words in Java is used to create an instance of a class?
    A.class
    B.public
    C.public or private, either could be used
    D.import
    E.new

  • 解析:使用new运算符创建对象的行为,称为实例化,一个对象是一个类的实例,要实例化对象,可以使用new运算符返回新对象的地址。

  • 4.If a method does not have a return statement, then
    A.it will produce a syntax error when compiled
    B.it must be a void method
    C.it can not be called from outside the class that defined the method
    D.it must be defined to be a public method
    E.it must be an int, double, float or String method

  • 解析:这道题也不知道当时怎么选的了,很明显是b项,一个方法如果不需要返回任何值,则需要在方法头处有“void”作为返回类型,void代表空返回值类型。

  • 5.Consider a sequence of method invocations as follows: main calls m1, m1 calls m2, m2 calls m3 and then m2 calls m4, m3 calls m5. If m4 has just terminated, what method will resume execution?
    A.m1
    B.m2
    C.m3
    D.m5
    E.main

  • 解析:一旦一个方法终止,控制就会使用调用该方法的方法恢复,在这种情况下,m2调用m4,当m4倍终止时,m2会恢复。

  • 6.Having multiple class methods of the same name where each method has a different number of or type of parameters is known as
    A.encapsulation
    B.information hiding
    C.tokenizing
    D.importing
    E.method overloading

  • 解析:这道题也是,都不知道老是选错,做题的时候老是迷糊。可以使用具有不同参数表的相同方法名调用多个方法,这种技术就叫做方法重载。

  • 7.Instance data for a Java class
    A.are limited to primitive types (e.g., int, float, char)
    B.are limited to Strings
    C.are limited to objects(e.g., Strings, classes defined by other programmers)
    D.may be primitive types or objects, but objects must be defined to be private
    E.may be primitive types or objects

  • 解析:Java的实例数据就是类的属性,它既是原始类型,也可以是对象。既可以是公有的,也可以是私有的。

  • 8.Java methods can return more than one item if they are modified with the reserved word continue, as in public continue int foo( ) { ... }
    A.true
    B.false

  • 解析:所有的Java方法都返回一个单项,它可以是原始数据类型,也可以是对象的组合,还可以是空返回值,但是只能有一个条目,也就是说一个方法中只能有一个return语句或者就是void型没有返回值。

  • 9.Every class definition must include a constructor.
    A.true
    B.false

  • 解析:每个类定义都会包含自身的构造函数,当我们编写类时,往往会写出构造函数,但其实不写也是正常的,它会调用自身的构造函数。

  • 10.Static methods cannot
    A.reference instance data
    B.reference non-static instance data
    C.reference other objects
    D.invoke other static methods
    E.invoke non-static methods

  • 解析:静态方法是不能调用非静态实例数据的,静态方法只能访问静态变量或局部变量。静态方法是一种方法,它是类本身的一部分,而不是实例化的对象,因此静态方法是在类的所有实例化对象之间共享的。由于静态方法是共享的,所以它不能访问非静态实例数据,因为所有非静态实例数据都是特定于实例化的对象。静态方法可以访问静态实例数据,因为像该方法一样,实例数据在类的所有对象中共享。静态方法也可以访问传递给它的参数。

  • 11.Inheritance through an extended (derived) class supports which of the following concepts?
    A.interfaces
    B.modulary
    C.information hiding
    D.code reuse
    E.correctness

  • 解析:通过延长一个类并继承它,新类不必重新实现任何继承的方法或实例数据,从而为程序员节省了一项工作。因此,代码重用是通过将其扩展为您的需要而重用其他人的代码的能力。下面是从网上找的一段解释:

代码重用,我们通常称为代码复用, 就是说,你把一个功能写成一个模块, 以便当再次需要相同功能的时候,可以直接使用,而不用重新开发。举个例子, 假如你的网站需要验证码, 你就可以把验证码这个功能单独提取出来以便复用。通常代码复用是通过类与对象来实现的, 这也是面向对象编程与面向过程编程最主要的区别之一。

  • 12.The goal of testing is to
    A.ensure that the software has no errors
    B.find syntax errors
    C.find logical and run-time errors
    D.evaluate how well the software meets the original requirements
    E.give out-of-work programmers something to do

  • 解析:测试的主要目的就是去发现错误,具体是发现逻辑错误和运行中的错误,语法错误在前面的实施编译中已经被发现和解决,测试是为了让这个软件运行正常,进行的结果确保是我们预期想要的。

  • 13.Interface classes cannot be extended but classes that implement interfaces can be extended.
    A.true
    B.false

  • 解析:这个确实是当时没有读懂这个的意思,以为的是接口不能拓展,就选错了,其实是说的接口类不能被拓展,实际上任何类都是可以进行拓展的,唯一的特殊情况是当类由“final”进行显式的修饰时,类就不能被拓展了。

  • 14.Defining formal parameters requires including each parameters type.
    A.true
    B.false

  • 解析:为了让编译器检查方法调用是否正确,编译器需要知道传递的参数的类型。因此,所有正式的参数(在方法头中定义的参数)必须包括它们的类型。这是使Java成为强类型语言的一个因素。当时主要是没有理解什么是正式参数,导致这一题选错。

  • 15.In black-box testing, the tester should already know something about how the program is implemented so that he/she can more carefully identify what portion(s) of the software are leading to errors.
    A.true
    B.false

  • 解析:在黑盒测试中,测试人员不应该知道软件是如何实现的。从本质上说,软件是一个黑盒,它有输入和输出,程序的机制是不透明的。如果测试人员确实知道程序是如何工作的,那么测试人员的测试用例可能是有偏见的。如果测试人员知道程序是如何工作的,那么测试就是所谓的“玻璃盒测试”。

其他(感悟、思考等)

感悟

  • 这周赶上清明节放假,出去了三天,回来之后在做这些时间有点紧,这次的任务量相比上周的确是轻松了不少,对上周第七章的内容也能更加的明白一些。但其实这周由于时间原因也是没有去做更多的编程项目的练习,上一次是因为难,看不懂,下次的学习中会像前面所学时多去进行那些项目练习。

  • 这次的编程中在做那个PP5.7(也就是石头剪刀布)的时候有一点想法就是,计算机随机产生的选择我将他打印出来,这样我就可以每局都能赢,但这是不是我们在平常网上抽奖时那些程序就是这么做的,先提供给它我们的选择,它做出判断之后给出它的中奖的那项,绝大多数情况不会是我们所选的,这大概就是抽奖不中的原因吧(猜的,不知道是不是这样,但应该有类似这样的操作,不然中奖概率不会那么小)。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 157/157 1/1 15/15
第二周 382/539 1/2 16/31
第三周 317/856 2/4 15/46
第四周 996/1852 1/5 24/70
第五周 578/2330 1/6 16/86 这周对上周第七章的学习有了更深的理解

参考资料

20172302 侯泽洋
原文地址:https://www.cnblogs.com/hzy0628/p/8746606.html