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) [第六周](http://www.cnblogs.com/hzy0628/p/8830819.html)

教材学习内容总结

1.数组(array)是一组相关变量的集合,每个变量存于数组中特定的、具有编号的位置,每个编号称为索引(index)或下标(subscript)。Java中,索引是从0开始的,访问数组中每个值的方式:数组名[索引值]。

2.数组是须实例化的对象,可使用new运算符进行实例化。这是一个数组的声明:int[] height = new int[11]。数组可以保存任何基本类型的数据或对象。

3.因为数组中每个位置编号为常量,处理数组时使用for循环会比较方便。每个Java数组都是迭代器,使用for循环的迭代版提取指定迭代器中的每个值也是很方便。

4.Java运算符中,最高优先级是索引运算符“[]”。

5.在访问某个数组的某个元素时,如果索引值不在数组有效范围内,将抛出“ArrayIndexOutOfBoundsException”异常。同时在程序中最为常见的为“差1错误”,这种错误是由索引值比0小1或比(N-1)大1引起。

6.数组的声明:这两种声明是等价的:int[] heightint height[]。数组初始值表可以用于实例化一个数组,这是一个例子:int scores = {87,98,69,45,43,27,98,100};,但注意初始值表只能在数组的第一次声明中使用。数组作为参数传递时,传递的为原始数组的副本。

7.对象数组:实例化对象数组是为保存对象引用而预留空间,对每个数组元素所代表对象必须分别实例化。举一个数组对象例子:String[] verbs = {"play","work","eat","sleep"};

8.命令行实参:在命令行中给定的参数就是命令行参数。String[]参数(通常称为args)代表了命令行实参。命令行实参是给程序提供输入信息的又一种方式。

9.可变长度参数表,我们可以考虑方法重载,但那会要求对每一种可能的参数个数定义重载方法,会非常麻烦。我们将Java方法定义参数可变的方法。注意:一个方法不能接受两组可变参数。下面是一个例子:

public double average(int ... list)
{
    double result = 0;
    
    if(list.length!=0)
    {
       int sum = 0;
       for (int sum:list)
          sum  += num;
       result = (double)sum/list.length;
     }
     return result;
}

10.接下来是二位数组与多维数组:二维数组是由行和列构成的表。二维数组必须使用两个索引值来引用,一个指定行,一个指定列。多维数组是指多于一维的数组。三维数组可以画成一个正方体,但三维以上的数组就很难用可视化的图形表达出来。

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

  • 问题1:关于书上所讲的数组的索引值的从0开始的原因。

  • 问题1解决方案:书上的讲解比较清楚,我也能理解,但总觉得有些不明白。书上的意思是这样便于高效地访问数组元素,同时还说到的意思应该是我们访问一个元素的做法是从它的地址进行访问,而地址是怎么计算的呢:数组元素索引值*每个元素所占的字节数+数组起始地址,这样计算就会更容易简单,访问每个元素都等同于访问第一个元素。这里就是不太明白,设为0怎么就简单了。我又从网上找了一个答案,见下面:

1、数组在内存中申请是,所申请的内存是一段连续的内存地址;
2、例:int[] a=new int[3];申请一段:int 数据类型的数组,a 为变量,数组长度为:[3];
3、这个数组所申请的内存地址是连续的(假设所申请的:第一个内存地址为:1008,第二个为:1009,第三个为:1010);,但我们只知道:一、变量:a,它只拿到第一个内存地址1008;二、它的数组空间为3个;
4、a[0]——把a拿到的内存地址:1008 + 0 = 1008 (指向第一个内存地址);
a[1]——把a拿到的内存地址:1008 + 1 = 1009 (指向第二个内存地址);
a[2]——把a拿到的内存地址:1008 + 2 = 1010 (指向第三个内存地址);
所以:数据下标从 [0] 开始的意义也在于此!

  • 问题2:关于【例8.8】代码中的一些问题。如刚看到这个
public void addDVD(String title,String director,int year,double cost,boolean bluray)
    {
        if (count == collection.length)
            increaseSize();
        collection[count]=new DVD(title,director,year,cost,bluray);
        totalCost+=cost;
        count++;

这个increase方法的来处?还有包括那个,为什么非要是,而不能是“>=”。

  • 问题2解决方案:increase方法是放到最后的,这个我不太理解,课本上的例题为什么要将某些方法中调用的类中的方法放到最后面,是为了让代码整洁还是什么?我觉得是看起来不舒服,也不容易理解,和之前第七章例题中的那个reduce方法一样都放到代码最后面。然后再说这个==,其实这个代码多读两遍就会很清楚到底是什么意思了,一开始认为的为什么能恰好等于这个问题也就没有了。原因在于这是一个为DVDCollection添加对象的方法,而这个方法调用一次只能添加一个,我们一个个的添加,怎么会让它出现大于等于的情况,这个代码的编写比较严谨,它设置的这个increase方法进行扩容尤为突出。

  • 问题3:书上课后练习的两道小题:SR8.16的b和SR8.19

  • 问题3解决方案:SR8.16这道小题当时做了但没有对答案,去做编程项目遇到问题不会解决,没有做下去,后来写博客时发现这题,学会了如何对一个数组中某单个元素利用其索引值进行赋值,答案为:Library[0] = new Book("Starship Troopers",208);当时做的时候的错误是没有使用new运算符;再说SR8.19,由于对于命令行参数的不理解,这里这个也是不会做,先给出答案:

public static void main(String[] args)
{
    System.out.println(Integer.parseInt(args[0])+Integer.parseInt(args[1]));
}

后来搜索了parseInt这个方法,稍微明白一些,这里应该是用parseInt将后面的字符转换为数值类型

1.基本用法(只接受一个参数,可以当做第二个参数默认是10):parseInt的返回值只有两种可能,不是一个十进制整数,就是NaN。
a.将字符串转为整数。parseInt('123') // 123
b.如果字符串头部有空格,空格会被自动去除。parseInt(' 81') // 81
c.如果parseInt的参数不是字符串,则会先转为字符串再转换。这个很重要
d.字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。
e.如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN。
f.如果字符串以0x或0X开头,parseInt会将其按照十六进制数解析。parseInt('0x10') // 16
g.如果字符串以0开头,将其按照10进制解析。parseInt('011') // 11
h.如果参数以0开头,但不是字符串,则会先将数值转成字符串,然后解析,见规则c parseInt(011) // 9
i.对于那些会自动转为科学计数法的数字,parseInt会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。
parseInt(1000000000000000000000.5) // 1
// 等同于
parseInt('1e+21') // 1
parseInt(0.0000008) // 8
// 等同于
parseInt('8e-7') // 8
2.进制转换(接收两个参数):parseInt方法还可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数。默认情况下,parseInt的第二个参数为10,即默认是十进制转十进制。
a.第一个参数解析规则参照第一条基本用法
b.如果第二个参数不是数值,会被自动转为一个整数。这个整数只有在2到36之间,才能得到有意义的结果,超出这个范围,则返回NaN。如果第二个参数是0、undefined和null,则直接忽略。

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

  • 问题1:首先就是【例8.10】的编写,运行如图,编写的时候也不懂,也不能运行,完全不懂。

  • 问题1解决方案:这道题后来才知道是在IDEA下编写不会有命令行,如书上所说没有在命令行下提供,程序对args数组的引用将抛出ArrayIndexOutOfBoundsExcepetion异常,书上的一开始没看懂,结果就是完全不会做。后面转到虚拟机上进行便可完成。在虚拟机下中运行截图,同时还试了试命令行只给一个参数,这时第一个正常打印,第二个报错:

  • 问题2:在完成编程项目PP8.1时,出现了书上所说的“差一错误”,具体见下图:

  • 问题2解决方案:value是从nums中的索引值0开始的,我对value进行了-1操作,也就是要去从索引值为-1处开始进行,这就产生书上所说的差1错误,把-1去掉就可以完成。

  • 问题3:在做PP8.5时,一路做下来还是比较顺畅的,但运行的结果那个标准差结果并不正确,1、2、3的平均值是2这个没有错误,但标准差算出来的却是2.4495,这个结果显然不正确。

  • 问题3解决方案:我先是想自己进行分析,看哪里出了问题,标准差不利于分析,我就让它同时输出了方差,方差的结果为6,这个与正常情况下应产生的2不一致。但又想不出来多出来的4是从哪里来的,于是我又在IDEA下进行Debug调试,调试过程中,看了这个方差产生的循环过程,发现了问题:

就是这里:index<=number,这个循环会运行4次,当index=number时,而这时nums[index]我并没有进行赋值,而是初始化的0,(0-2)的平方产生的4,把那个<=改为=即可得到正确结果。这种题真的做的时候务必要小心,尤其是循环,一个=号的多余,就会导致运行结果的不正确,一定要关注到每个细节,另外在编写前也应先分析,越具体越好,能有一个清晰的分析和思路会比在编写过程中出现错误再去找要省时的多。

  • 问题4:IDEA下项目git push 到码云,再从虚拟机上git pull到本地后,项目能编译,但不能运行,显示错误could not find or load main class,这个错误我以前遇到过,不过那是我在编译时遇到,原因是我在public static void main(String[] args)后多加了分号。

  • 问题4解决方案:我问了其他同学,但也没有一个准确的解释,我就自己慢慢的试,最后是把IDEA 中自动产生的报名“package src6”删除后再编译就可以运行,具体原因不清楚,下面是能运行后的截图。

代码托管

  • 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>0时,对x加1;当x<0时,对x减1;当x=0时,x保持不变,下面哪个代码能够实现。我们只能一个个进行分析,首先A项,错在当x=0时,同样对x做了减1的操作;B项是正确的,当x>1时,对x加1,当x<0时,对x减1,对x=0不做操作,也就保持了原来的0;C项:当x>0时是进行了加1,然后就是一个if-else语句,在这里存在问题,这个时候的操作是当x<0时,对x减1,对于x≠0时,都将x变为0,这就出现了问题;D项:如果x不为0,x++和x--同时执行,对于正数负数没有区分执行。E项:对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

  • 解析:这道题目中这段语句中发生条件短路,赋值语句也没有被执行。if语句中,&&运算符具有短路特性,&&左操作数的运算结果结果为false,则右边的运算将不会被执行,同时if条件下的语句也不会被执行。

  • 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
    D . you can control whether or not they will be visible
    E . all of the above

  • 解析:这道题目考查复选框,课下没有看这部分内容,导致选错。复选框是Java GUI 下的一种组件,是一个可以通过鼠标单击来切换开关状态的按钮,所以它是可以被检查也可以不被检查的,单选钮是一种特殊的复选框,它用于提供一组互斥的选项。它们也是可以设置为可见或不可见的。

  • 4.You might choose to use a switch statement instead of nested if-else statements if
    A . the variable being tested might equal one of several hundred int values
    B . the variable being tested might equal one of only a few int values
    C . there are two or more int variables being tested, each of which could be one of several hundred values
    D . there are two or more int variables being tested, each of which could be one of only a few values
    E . none of the above, you would never choose to use a switch statement in place of nested if-else statements under any circumstance

  • 解析:switch语句只有测试的是单个变量才能并且这个变量必须是Java中int或char类型,同时因为必须枚举每一个可能的值,所以switch语句只有在被测试的值的数量是一个很小的数字时才有意义。

  • 5.If a switch statement is written that contains no break statements whatsoever,
    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
    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
    E . none of the above

  • 解析:如果switch语句中不包含break语句,那么switch语句中每个case子句都会被执行,当然这也就不符合我们设置条件本身的用意了。

  • 6.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、E两项,C项是错在结果处不能进行复制,E项缺少?。然后再看与题设中等价的语句,A项是正确的,B项是做的操作有误,它等价于的是if(x<0) x=y;else x=0;D项也显然是错误的。给出书上的一个例子,没有把书看透,导致这题选错。

条件运算符只是一个运算符,而不是语句,通常我们相用其返回值来做某些事情,比如将其赋给一个变量:total=(total>Max)?total+1:total*2.

  • 7.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、9、8……2、1、0,这里一共是11个数字,故循环执行11次。

  • 8.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

  • 解析:这道题主要当时没理解,backward这个单词困扰了好久,这个单词也认识,向后的,但就是翻译不懂这个选项的含义,这个for循环做的就是将s这个字符串倒着打印出来,而选项的意思是向后打印整个字符串,这个的确是不太懂英语是怎么翻译的,但题目的意思能理解。

  • 9.In Java, it is possible to create an infinite loop out of while and do loops, but not for-loops.
    A . true
    B . false

  • 解析:这句话的意思读了好久才弄懂,意思是在Java中,while和do能做成无限循环,但for循环不可以做成无限循环,这个说法不正确,例如:for(int count = 1;count<=2,count--) System.out.println(count),这就for的一个无限循环。但是这在许多其他编程语言中是正确的,在这些编程语言中,for循环有一个固定的起点和终点,所以for不能做成无限循环。但是Java for循环比大多数其他语言的for循环要灵活得多。

结对及互评

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172308

    • 博客中值得学习的或问题: 博客中记录记录的问题每个都可以说是非常详细,包括问题的产生及解决,都是描述的比较清楚,这也是值得我学习的地方,在一些问题中加深自己的理解,可以少,但必须要精。同时教材内容总结部分和错题部分的内容相对较少,可以再充实一些,让整个博客能够每个地方兼顾,还有排版也可以再美观一些。

    • 结对学习内容
      共同学习了第八章的学习内容。

其他(感悟、思考等)

感悟

  • 本周的学习时间比较短促,但学习起来难度不是很大,这次的学习主要都放在了周末,中间几天一直忙着其他的作业。本周的测试得的分数依然不高,排名稍往前进了几名,还要继续多花时间,我还是有些觉得我的进度慢于一些同学,多的投入就会有多的收获,他们的成绩也很好。希望能够再进步点。

  • 后补:

学习起来难度不是很大,

这句话说早了,数组这里做起来很费时间,编程项目8.1、8.5还算顺利,8.6真的是看不太懂了,最后也是编了,但是越编越乱,完全不懂题目的意思了。编代码没有清晰的思路是不行的,现在没有往下编的思路。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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 这周对上周第七章的学习有了更深的理解
第六周 475/2805 1/7 14/100 学习了数组方面的相关知识

参考资料

posted @ 2018-04-15 19:01  ◕‿◕  阅读(510)  评论(5编辑  收藏  举报
© 2018 GitHub, Inc.