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

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

教材学习内容总结

本周内容主要为书的8.1-8.6的内容:

  • 第八章

    1.一维数组和多维数组(二维数组为主)的声明和使用

    2.命令行实参

    3.边界检查(例8.8的解决办法)

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

  • 问题1:数组的声明、使用

  • 问题1解决方案:看过书之后,自认为数组就是一个对像,一个可以容纳很多元素的对象,可以分组和管理所需数据,通过索引值来找寻对应位置上存储的内容,可以把数组理解为树状图的感觉,每一个索引值下方可以放很多数据,如果保存的是对象的话,则每个对象内还可以存在多个相关的变量,很大程度上增加对复杂数据的管控和存储。数组的声明方式,对象的声明方式类似,只不过多加"[]"表示数组。

    • int[] grades;
    • int grades[];
  • 问题2:多维数组(二维数组)

  • 通过阅读教材,发现数组可以有一维的,也可以有二维的,还可以有多维数组。如果把一维数组理解为数轴,那么二维数组就可以理解为平面坐标系,三维数组可以理解为立体坐标系。就拿例8.13为例,输出的数字完全可以看作坐标系上孤立的点。对于二维数组的声明,有三种方式:

    • int[][] grades;
    • int grades[][];
    • int[] grades[];

    但是通过蓝墨云视频中的老师讲解,说是第三种情况和前两种的效果相同,但是没有人使用,要是用过被负责人看淡,肯定会杀了你的。所以,弱弱的初学者只能默默地看过一遍,没有去用。(可能是约定俗成吧),就像我之前说过的,把数组理解为树状图,对于理解四维及四维以上的数组,有很大帮助。一个分支下面可以有多个分支,以此类推,可以存储一堆有联系的,但又有微小差别的对象。

    • 数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。
  • 问题3:命令行实叁

  • 问题3的解决办法:

    • 在命令行中给定的参数就是命令行参数。(即从输入位置角度理解)。

    很浅层的理解,命令行实参就是可以在命令行上输入内容,作为参数放到数组里面,进行使用。在看过百度上的资料以及书上的内容,仅会使用,并且对于简单的要求可以应用,会不断的查询资料进行解决的。

    • String[]参数(通常称为args)代表了命令行实参,在调用解释器时将提供给程序,即调用解释器时关于命令行的信息将存放在args数组中供使用。
    • 在命令行给定参数时,应注意什么?
      • 命令行的参数以空格隔开。但是,若命令行的参数本身包含空格时,则该参数必须用一对双引号括起来。
        如: java Test1 365 156 China "Beijing of China"

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

  • 问题1:PP8.1

  • 问题1解决方案: 这个程序,我想出四种解决方案,但是三个无用,仅有一个成功。心疼那些耗费脑细胞想出的解决方案

    - 第一种解决方案:对于记录出现次数的解决办法,我想参照例8.3的内容,它是记录大小写字母的出现次数,是基于Unicode字集符的运算,那么我是不是可以应用到数字上呢?字集符上仅有0~9几个数的编码值,想法泡汤。
    
    - 第二种解决方案:本方案是基于第一种解决方案和if语句的联合使用,如果是个位数字的话,进行一次转换,并通过自增运算符进行计数,如果是含十位数字的话,用求余的方式八十为舍掉,再转换在计数,最后两次计数差表示含十位数的是自出现次数。在进行最后的输出,不过感觉太麻烦了,止步于想法,没有去尝试。
    
    - 第三种解决方案:本方案与前两个方案有较大的不同,没有用到Unicode字符集,单纯的就是数组,我想既然索引值是数字,那为什么不用数字表示数字呢?就是索引值所代表的数字为存储的数字,那么在此基础上进行自增运算,最后再调用该数剪掉对应的索引值,不就行了么。
    
    - 第四种解决方案:本方案是在第三种方案上应用的,发现在实例化数组的时候每个索引值对应的位置都是0,那么在0的基础上进行自增,可以解决身躯很多不必要的麻烦,这样的话就可以直接调用相对索引值内的数即为索引值数字所出现的次数。
    

    最终成果在还是有一点问题,根据例5.7的内容进行应用,但是始终跳不出while循环,或是始终进不去while循环,得助于学长的帮助,想到用个if和break进行跳出循环,正好应用了一下break语句,非常成功的记录了各个数字出现的次数问题。

  • 问题2:PP8.5

  • 问题2解决方案:算是第一个自己用数组编的项目,调用了Random方法用来输出随机数和Math方法进行辅助,在平均数上的使用,很成功,但是在标准方差上就错误百出,先是自己的for循环的变量设置不对,造成都是ArrayIndexOutOfBoundsException异常,解决过后的尝试便出现一堆的零,逻辑错误超恶心,通过调试,发现是自己确定的随机范围是0~2147483647(int型的最大值),造成最后的标准方差出现了数字范围溢出int型的最大值,变为的零,仅仅修改随机数的范围就行,但是这样,不就限定了输出整数的范围么?在此基础之上,我有修饰了输出整数的格式,通过例6.3的for循环内嵌套if从句,使得每行输出6个数字,让输出结果更人性化。

  • 问题3:PP8.6

  • 问题3解决方案:针对8.6有一堆的问题,想了一天多的思路,硬是没想出来,最后翻书看到DVD的那个例题,想到利用那个进行模仿,然后针对题目中的给出的问题有又了困惑,需要写一个数组,但是写一个数组后把一个账户进行存放的话,那么针对一个账户的方法又该放到哪?通过学长的讲解,发现创建数组下的那个类进行对整体的编写,针对每一个账户的类进行对账户内的东西进行编写,就像之前所说的数组理解成为树状图的方式,这样就真正的“实例化”了一个系统管理--一个管理不超过30个银行账户的系统。但是想出来了,就是不会做,热锅上的蚂蚁着急就是不会弄,通过对于欣月的代码的理解,才初步弄懂。

    public boolean saveMoney(double a, String b, long c)
    {boolean result = false;
    for (int i = 0; i <account.length; i++){
    if (account[i] != null){
    if(account[i].getName().equals(b)&&account[i].getAcctNumber() == c){
    account[i].deposit(a);
    result = true;}
    }
    }

    其实反过来看看书中也有提示的,P257DVDCollection.java内有一句report += collection[dvd].toString() + "\n";也在暗示着,还是自己看书不够细致导致的。在做完后看自己写的代码,想想也没有那么难。想到有句俗语“会者不难,难者不会。”其实会与不会之间,就是一道能不能融会贯通的坎,过去了就是一片蓝天白云。

代码托管

上周考试错题总结

  • 错题1:The idea that program instructions execute in order (linearly) unless otherwise specified through a conditional statement is known as(程序指令按顺序执行的想法(线性),除非通过条件语句指定。)

    • A.boolean execution
    • B.conditional statements
    • C.try and catch
    • D.sequentiality
    • E.flow of control
  • 错误解析:“控制流”描述指令执行的顺序。它默认为线性的(或顺序的),但是通过使用诸如条件和循环这样的控制语句来改变。感觉当时自己很混乱,明明知道条件语句可以改变控制流的,还有选择了问题上又出现的conditional statemrnt。

  • 错题2: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?(如果x为正则加1,如果x为负则减1,如果x为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--;
      
  • 错误解析:非常简单的一道题,用到自增和自减加上if语句就可以了,看到有道神奇的翻译以为是题出错了,针对0的问题,然后没有仔细考虑就胡乱选了一个。心痛。

  • 错题3:Assume that count is 0, total is 20 and max is 1. The following statement will do which of the following?(假设count是0,total是20,max是1。下面的语句将执行下列哪项?)

    • 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)是假的。因为一个&&条件的左边是假的,条件是短路的,所以右边没有求值。因此,避免了零误差的潜在除法。因为条件是假的,所以语句max = total / count没有执行,再次避免了可能的零错误。我给理解为两个句子,独立判断,逻辑与的短路和赋值语句的零误差的问题。

  • 错题4:If a break occurs within the innermost loop of a nested loop that is three levels deep
    (如果在嵌套循环的最内层循环中发生了中断,那么这个循环就有三个层次。)

    • A.when the break is encountered just the innermost loop is "broken"(当遇到断点时,最里面的循环会被“破坏”)
    • B.when the break is encountered, all loops are "broken" and execution continues from after the while statement (in our example)
    • C.when the break is encountered, all but the outermost loops are broken, and execution continues from the next iteration of the while loop (in our example)
    • D.this is a syntax error unless there are break or continue statements at each loop level
    • E.none of the above
  • 错误解析:break会终止第二个循环内的第三次循环,然后外部的循环仍会继续下去。

    • 执行break语句时,将立即跳转到控制当前执行流程的语句之后继续执行。
  • 错题5: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(你可以控制它们是否可见)

  • 错误解析:复选框的内容是在5.8,标记星号就没看,通过通读内容大致理解了复选框。

    • 复选框是一个可以通过鼠标单击来切换开/关状态的按钮,用于设置某个布尔条件为真或假。
  • 错题6:When comparing any primitive type of variable, == should always be used to test to see if two values are equal.(在比较任何基本类型的变量时,==应该总是用来测试两个值是否相等。)

    • A.false
    • B.true
  • 错误解析:这适用于int、short、byte、long、char和boolean,而不是double或float变量。如果两个双变量x和y正在被测试,(x == y)只有当它们恰好等于最后一个小数点时才是正确的。相反,比较这两个值是很常见的,但是允许在值上有细微的差别。例如,如果= 0.000001,我们可以通过(x - y <=)来测试x和y,而不是(x == y)来得到一个更好的概念,如果它们足够接近,可以被认为是相等的。忽略了浮点数的比较和以往不同,以数学的观念思考这个问题。

  • 错题7:If a switch statement is written that contains no break statements whatsoever(如果一个switch语句没有包含任何break语句,)

    • A.they may be checked or unchecked
    • B.radio buttons are a special kind of check boxes
    • C.they are Java components
    • D.you can control whether or not they will be visible
    • E.none of the above(以上都不是)
  • 错误解析:虽然写这样的switch语句是不寻常的,但它是完全合法的。switch语句执行的正常规则适用于计算switch表达式之后执行的匹配的case子句。接下来,所有后续的子句都将按顺序执行,因为没有中断语句来终止switch/case的执行。想到了它会每一条都会执行,但是忘记了得先选择符合的条件,在从此后面继续执行每一条语句。

  • 错题8:A continue statement(contioue语句)

    • A.may be used within a while or a do-while loop, but not a for loop
    • B.is identical to a break statement within Java loops
    • 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
    • E.none of the above
  • 错误解析:尽管应该避免使用continue语句,但如果可能的话,可以在Java的三个循环中使用它们:for、while和do-while。

    • continue语句和break语句会引起控制流程从一处转移到另一处,所以在循环中使用break语句和continue与句不是个好做法。
  • 错题9:The statement if (x < 0) y = x; else y = 0; can be rewritten using a conditional operator as(语句if(x < 0) y = x;else y = 0;可以用条件算符写吗?)

    • 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;
  • 错误解析:Java测试的条件操作符在本例中为条件(x < 0),如果为真,则返回值后的值?(本例中为x),如果为false,则返回:(在本例中为0)。原始的if语句是将y赋给x (x < 0)和0。这将通过将y赋值为x或0 (x < 0)来完成。(x < 0) ? y = x : y = 0;语法有错误,这个是自己看书不细致造成的遗漏,没有细细推敲书上内容。

  • 错题10:Given the following code, where x = 0, what is the resulting value of x after the for-loop terminates?
    (给定以下代码,当x = 0时,for循环结束后x的结果值是多少?)

    for(int i=0;i<5;i++)

    x += i;

    • A.0
    • B.4
    • C.5
    • D.10
    • E.15
  • 错误解析:不知道怎么回事,硬生生的把+=看成是=,姐过酒吧for最后一次循环中的i值给了x

  • 错题11:How many times will the following loop iterate?(下面的循环会迭代多少次?)

    int x = 10;

    do {

    System.out.println(x);

    x--;

    } while (x > 0);

    • A.0 times
    • B.1 times
    • C.9 times
    • D.10 times
    • E.11 times
  • 错误解析:一直认为在跳出do循环的那次不算做循环,认为是10次,但是通过答案给出的11次,是自己的理解错误造成的,应该把出去的最后一次也要算上。

  • 错题12:Given that s is a String, what does the following loop do?(如果s是一个字符串,那么下面的循环会做什么呢?)

    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
  • 错误解析:做题时还是对for循环理解不到位,在j=0的时候就已经跳出,不再执行输出语句。会输出“s”字符串的索引值为0的字符,即s。

  • 错题13:A switch statement must have a default clause.(switch语句必须有一个default子句。)

    • A.true
    • B.false
  • 错误解析:如果没有default子句的话,switch语句仍可以执行,只不过在没有合适的语句之后会自动结束,不会输出或者执行什么。

  • 错题14:Each case in a switch statement must terminate with a break statement.(switch语句中的每个case都必须以break语句结束。)

    • A.true
    • B.false
  • 错误解析:如果break语句不存在,则控制流将继续到下一个案例中。

    • 本次考试是自己考的最差的一次,不知道为什么,从答上题开始就很混乱,错的有些事自己会的内容,当然通过此次考试,我也学到自己看书遗漏的内容,复选框的内容没有看,switch语句的case和break的问题,都是自己的食物,是自己认为这两章在高中学过循环,就忽略了细节,是自己的大意才酿成这么低的分数,已经在考完试后的第二天狠狠地又看了一遍第五章和第六章。

结对与互评

点评

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

    • 问题详细并配有问题理解
    • 截图特别详细、针对一个问题有多张照片进行解释,图文并茂
    • 博客排版相对单调,也算作一股清流吧。希望下次可以把博客写的更漂亮一点(可以加粗、高亮、斜体、引用等markdown格式和CSS码的运用)
  • 代码中值得学习的或问题:

    • commit的提交粒度很详细、并且是学长一直要求我达到的规范(可以参考学习)
    • 代码写的规范相对规范(建议应该配有对应的完整注释)
  • 基于评分标准,我给本博客打分:8分。

  • 得分情况如下:

    • 正确使用Markdown语法(加1分)
    • 模板中的要素齐全(加1分)
    • 教材学习中的问题和解决过程, 两个问题加2分
    • 代码调试中的问题和解决过程, 两个问题加2分
    • 感想,体会不假大空的加1分
    • 点评认真,能指出博客和代码中的问题的加1分

互评对象

  • 本周结对学习情况
    • 20172304方艺雯

    • 结对学习内容

      • 第八章(关于数组问题)
        • 1.一维数组和多维数组(二维数组为主)的声明和使用

        • 2.命令行实参

        • 3.边界检查(例8.8的解决办法)

感悟

第八章的学习,讲的是数组的问题,和之前学习两章相比,一次学一章,相对轻松,不过通过第八章的书后题,认识到现在的编写和之前的编写用明显的区别,各个章的内容都在用,只要有一章有欠缺,编个程序就有问题。尤其是在编写8.1和8.5的时候和第五章的内容有很大的联系,深感学习java的时候放松一会都不行。同时还要不断的动手、动手、再动手,自己发现问题,自己能解决问题。才能更好的学习java,就像学习数学一样多刷题有好处的。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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 33/151

参考资料

posted @ 2018-04-15 21:38  三金哥  阅读(358)  评论(4编辑  收藏  举报