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

教材学习内容总结

本周主要学习了第八章8.1至8.2的内容,同时开始尝试使用IDEA

  • 数组是一种可将数据分组为数据表的编程结构。
  • 数组元素
  1. 具有N个值的数组索引为0~(N - 1)。
  2. 访问数组每个值的方式为:数组名[索引值]
  • 声明和使用数组
  1. 在Java中,数组是必须实例化的对象。
  2. 保存在一个数组中的所有值,具有相同的类型。
  3. 数组可以保存任何基本类型的数据或对象。一旦将数组声明为确定的大小后,该数组能够保存的值的个数就不可再改变。
  4. for语句可用于处理数组中的所有元素。
  5. 在所有的Java运算符中,索引运算符[]有最高的优先级。
  • 边界检查
  1. 数组边界检查保证引用一个数组元素的索引值在有效范围内。
  2. 数组的长度是它可保存元素的个数,数组的最大索引值是(length - 1)。
  • 初始值表可用于实例化一个数组对象,这时不再需要用new运算符创建数组对象。
  • 整个数组可以作为一个参数传递给方法,使得方法的形参成为原始数组的别名。
  • 对象数组:实例化对象数组只是为保存对象引用而预留空间,对每个数组元素所代表的对象必须分别实例化。
  • 命令行实参:命令行实参存储在String对象的数组中,并将传递给main方法。
  • 可变长度参数表:在形参的定义形式中,省略号表示该方法接收的参数个数是可变的。可变参数必须写在形参表的最后,并且一个方法不能接收两组可变参数。
  • 二维数组与多维数组:保存整型数的二维数组形式为int[][]。多维数组是作为数组对象的数组来实现的。外层数组中的元素本身也是数组,这种嵌套过程可以根据需要一直嵌套下去。

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

  • 问题1:当用无效索引值引用Java数组时会发生什么?
  • 问题1解决方案:当索引值无效时,将抛出ArrayIndexOutOfBoundsException异常。
  • 问题2:什么是“差1错误”?它与数组有什么关系?
  • 问题2解决方案:“差1错误”是程序逻辑上的错误,当引用超过数组边界的第一个元素时将发生这种错误。数组的处理容易出现“差1错误”,因为数组索引值的范围是从0至数组长度少1.

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

  • 问题1:在使用IDEA运行之前编辑的Java文件时出现如图所示的错误。
  • 问题1解决方案:IDEA编辑代码与命令行有所区别,需要在文件的最前端加上包名,譬如某Java文件在chap08目录下,应在此文件最前端加上package chap08,不过在IDEA中,可以点击红色的小灯泡自动添加。
  • 问题2:在编写PP81的过程中,编写代码如图

    最开始定义的求和语句的循环条件为while ( index <= list.length;),但是在编译运行之后发现程序的运行条件必须满足输入50个值。这与题目的意思有冲突。
  • 问题2解决方案:在此程序的定义中,list.length的值是已经提前设定好的int[] list = new list[50],所以在这里代码的含义等价于while (index <= 50);所以会出现错误。应该如上图修改,定义一个整型变量`length = index' ,实际输入了多少个值,最之后的求值的范围就给到多大。
  • 问题3:
    使用IDEA好像不能上传的问题

代码托管

上周考试错题总结


  • 问题1:Which of the sets of statements below will add 1 to x if x is positive and subtract 1 from x if x is negative but leave x alone if x is 0?
    A.if (x > 0)
    x++;
    else x--;
    B.if (x > 0)
    x++;
    else
    if (x < 0)
    x--;
    C.if (x > 0)
    x++;
    if (x < 0)
    x--;
    else x = 0;
    D.if (x == 0)
    x = 0;
    else x++;
    x--;
    E.x++;
    x--;
  • 解析:当x为正数时执行加一,当x为负数时执行减一,当x为0时不执行任何操作,因此答案选择B,虽然C选项输出的结果和B一致,但当x=0时,其实是执行了为x赋值的操作的。

  • 问题2:Assume that count is 0, total is 20 and max is 1. The following statement will do which of the following?
    if (count != 0 && total / count > max)
    max = total / count;
    A.The condition short circuits and the assignment statement is not executed
    B.The condition short circuits and the assignment statement is executed without problem
    C.The condition does not short circuit causing a division by zero error
    D.The condition short circuits so that there is no division by zero error when evaluating the condition, but the assignment statement causes a division by zero error
    E.The condition will not compile because it uses improper syntax
  • 解析:因为count = 0,所以(count != 0)不成立,根据运算符“&&”的“短路性”,所以右操作数total / count > max将不会参与运算,所以答案选择A。

  • 问题3:Which of the following are true statements about check boxes? (下面哪个关于复选框的声明是正确的?)
    A.they may be checked or unchecked (他们可能会被检查或检查)
    B.radio buttons are a special kind of check boxes(单选按钮是一种特殊的复选框)
    C.they are Java components (它们是Java组件)
    D.you can control whether or not they will be visible(你可以控制它们是否可见)
    E.all of the above(以上所有)
  • 解析:这个可以不用解析了吧。答案选择E。

  • 问题4:In Java, selection statements consist of the if and if-else statements.
    A.true
    B.false
  • 解析:选择语句包括了if语句、if-else语句和switch语句。

  • 问题5:When comparing any primitive type of variable, == should always be used to test to see if two values are equal.
    A.true
    B.false
  • 解析:“==”对int, short, byte, long, char 和 boolean是适用的,但对于两个浮点数,只有当两个浮点数的二进制数位都相等时,这两个浮点数的值才相等。所以判断两个浮点数相等时,可以计算两个数差的绝对值并将该值与某个误差标准相比,如果该数差与标准误差还小,则可以认定它们相等。

  • 问题6:In order to compare int, float and double variables, you can use <, >, ==, !=, <=, >=, but to compare char and String variables, you must use compareTo( ), equals( ) and equalsIgnoreCase( ).
    A.true
    B.false
  • 解析:对于char变量,同样可以<,?,==,!=,<=, >=。

  • 问题7:If a switch statement is written that contains no break statements whatsoever, (如果一个switch语句没有包含任何break语句)
    A.this is a syntax error and an appropriate error message will be generated (这是一个语法错误,将生成一个错误消息)
    B.each of the case clauses will be executed every time the switch statement is encountered(每当遇到switch语句时,都会执行每个case子句)
    C.this is equivalent to having the switch statement always take the default clause, if one is present(等价于交换语句总是取默认的子句)
    D.this is not an error, but nothing within the switch statement ever will be executed(这不是一个错误,但是switch语句中的任何东西都不会被执行)
    E.none of the above(以上都不是)
  • 解析:switch语句没有包含break语句是不常见的,但它依然是合法的。switch语句执行的常规规则适用于在交换表达式后执行匹配的case子句。在此之后,所有后续的程序都是按顺序执行的,因为没有中断语句来终止程序的执行。

  • 问题8:A continue statement
    A.may be used within a while or a do-while loop, but not a for loop(可以在while、do-while语句内执行但不能在for语句内执行。)
    B.is identical to a break statement within Java loops(与Java循环语句内的break语句相同
    C.may be used within any Java loop statement(可以运用到任何Java循环语句内)
    D.may be used within a for loop, but not within a while or a do-while loop(只能在for语句内执行)
    E.none of the above
  • 解析:尽管应该避免使用continue语句,但如果可能的话,它们可能会在Java的三个循环中使用:for、while和do-while循环。continue语句与break语句类似,但不同的是循环控制条件将再次被计算,如果其值仍然为true,则再次执行循环体。

  • 问题9:The statement if (x < 0) y = x;else y = 0; can be rewritten using a conditional operator as
    A.y = (x < 0) ? x : 0;
    B.x = (x < 0) ? y : 0;
    C.(x < 0) ? y = x : y = 0;
    D.y = (x < 0);
    E.y = if (x < 0) x : 0;
  • 解析:C选项使用的条件运算符在语法上是无效的,所以答案应选择A。

  • 问题10:Given the following code, where x = 0, what is the resulting value of x after the for-loop terminates?
    for (int i=0;i<5;i++)
    x += i;
    A.0
    B.4
    C.5
    D.10
    E.15
  • 解析:

  • 问题11:Given that s is a String, what does the following loop do?
    for (int j = s.length( ); j > 0; j--)
    System.out.print(s.charAt(j-1));
    A.it prints s out backwards
    B.it prints s out forwards
    C.it prints s out backwards after skipping the last character
    D.it prints s out backwards but does not print the 0th character
    E.it yields a run-time error because there is no character at s.charAt(j-1) for j = 0
  • 解析:变量j从字符串的长度到1,每次打印出位置j-1的字符。长度为1的字符是第一个字符,这是字符串的最后一个字符。它一直持续到j=1,并打印出位置j-1或第0字符的字符,因此它会向后打印整个字符串。

结对及互评

点评

  • 博客中值得学习的或问题:

    • 图文结合得很好,文章格式看来简洁易懂。
    • 提出的问题的关键解决步骤应该标注出来,能使人一目了然。
  • 代码中值得学习的或问题:

    • 代码调试过程记录的很详细,能够很清楚的了解作者编写代码的目的。
    • 能不能试着再多记录一点过程,我能够学习。
  • 基于评分标准,我给本博客打分:10分。得分情况如下:
    1.正确使用Markdown语法(加1分)
    2.模板中的要素齐全(加1分)
    3.教材学习中的问题和解决过程加1分
    4.代码调试中的问题和解决过程加1分
    5.本周有效代码超过300分行的(加2分)
    6.其他加分:

    • 感想,体会不假大空的加1分
    • 排版精美的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分

互评对象

  • 本周结评对象
  • 20172305谭鑫
  • 结对学习内容
  • 第八章(关于数组问题)

其他

令人绝望的数组,可能我比较笨吧,给定的学习时间实在无法理解这么高深的东西。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 117/117 1/1 19/19
第二周 289/406 1/2 21/40
第三周 403/809 2/4 22/62
第四周 1783/2592 1/5 35/97
第五周 770/3362 1/6 25/122
第六周 734/4096 1/7 25/147
  • 计划学习时间:20小时

  • 实际学习时间:25小时

参考资料

posted @ 2018-04-15 21:38  二许  阅读(328)  评论(1编辑  收藏  举报