20172328《程序设计与数据结构》第六周学习总结
20172328李馨雨《程序设计与数据结构》第六周学习总结
教材学习内容总结 |
- 1.数组:是一种可将数据分组为数据表的编程结构,其含有多个值,并且每个值都有固定的编号,称为索引或者下标。具有N个值的数组索引为0~(N-1)。
访问每个数组的方法时:数组名[索引值]
。 - 2. ☆声明和使用数组:数组在java中是对象,所以必须声明数组引用变量,然后用new运算符实例化数组,为数组分配保存值的空间。
保存在一个数组中的所有值,具有相同的类型,至少应该是可兼容的类型。
for循环的迭代器版用于输出数组的值。在所有java运算符中,[ ](索引运算符)具有最高的优先级。
☆边界检查:在编写程序时,需要注意将数组的索引值控制在有效范围之内,否则会抛出异常。
length常量是每个数组的组成部分,因此每当需要查看数组长度时就可以直接使用而不需要定义一个常量。
☆数组声明方式:两种方式,方括号和数组元素类型相关联或者方括号和数组相关联。(实际上对计算机而言没有差别,但是第一种符合我们的惯性思维)
☆数组初始值表:初始值表可以用于实例化一个数组对象,并为数组中的每一个元素提供初始值。初始值表中的各项数据用逗号隔开,应以花括号终结。初始值表只能在数组的第一次声明时使用。
☆数组作为参数:整个数组可以作为参数传递给一个方法,使得方法的形参成为原始数组的别名。 - 3.对象数组:实例化对象数组只是为了保存对象引用而预留空间,对每个元素所代表的对象必须分别实例化。
☆扩大数组空间方法:首先创建一个大小为n倍当前的数组的新数组,然后将当前数组中的每个值复制到新数组中去,最后将集合的引用设置为新数组引用。 - 4.命令行形参:将程序编译时,解释器将调用其main方法。String[ ]参数称为命令行实参,在调用解释器时将提供给程序。其实就是调用解释器时关于命令行的信息将存放在args数组中供程序使用。
命令行实参是给程序提供输入信息的另一种方式。 - 5.可变长度参数表:方法重载可以实现参数数量输出任意可控制,但是必须知道最多参数的个数不太方便。
另一种很好的方法是定义一个接受整型数组参数的方法,每次调用方法时数组的长度可以不同,要求在调用方法中先将整型值组织成数组,然后将数组作为一个参数传给被调用方法。 - 6.二维数组与多维数组:二维数组中使用两个索引值,外循环次数由代表行数的
数组.length
控制,内循环次数由数组[行].length
。二维数组也可以使用初始值表实例化,初始值表中的每一个元素本身就是一个一维的初始值表。多于一维的数组称为多维数组。
教材学习中的问题和解决过程 |
- 问题1:看书251页时,对书上所提到的内容不理解
将一个数组作为参数的方法可以实际改变改数组元素,因为该方法引用的是原始数组的元素值。但该方法不能改变数组引用本身,因为它接受的参数是原始数据引用的副本。这个规则与管理任何对象类型的规则一致。
- 1.(〃'▽'〃)本题解答:这篇博客讲述了数组作为参数和返回值,这篇博客说了值传递和数组传递的区别。
使用值传参(pass_by_value)的方式来传递函数参数,只是值传递方式在处理原始数据类型参数与引用类型参数时候有不同,如果一个参数是原始数据类型,那么参数变量的值传递进去。如果是引用类型,是传进了引用变量的值(也就是说,只是将指向数据的引用的值给传进去了,也就是被调用的函数新建的空间放的是这个引用的值,那么也就是也指向了数组存在的内存),所以同样是值传递,引用类型的传入的当然是引用变量的值,指向了同一数组,那么函数内对数组进行的修改在函数退出后依旧是有效的。 - 问题2:在做SR8.18时不知道用什么方法输出命令行实参值。
- 2.(〃'▽'〃)本题解答:先翻看了课后答案。上面表示要用包装器类Integer的方法。
- 问题3:public static int add(int...a)与public static int add(int[] a)和public static int add(int a[])有什么不同?
- 3.(〃'▽'〃)本题解答:这个刚好找到的很切合问题。
代码调试中的问题和解决过程 |
-
问题1:在做命令行参数时无法输入。
-
1.(〃'▽'〃)本题解答:在参看同学的博客后,对此问题有了解决方案
-
问题2:8.1做的时候一直出错。原来的代码
-
2.(〃'▽'〃)本题解答:其实是因为在循环之后加的if条件语句,这样的话会造成逻辑错误。
-
问题3:在做pp8.5的时候不太懂,询问了郭恺思路,自己动手实践了 一下,发现我创建的数组其实是空的,x1~xn的值我并没有实例化,所以还是不成功的。
-
3.(〃'▽'〃)本题解答:找了编程能力很强的郭恺同学,他指出问题:是要让用户输入x1~xn的具体数值并让其保存在所创建的数组里面,使用for循环结构就能很好的解决问题。
-
问题4:在pp8.5中出现我输入n为2(让用户输入两个值)但是用户可以输出三个值,所以就困在了那里。
-
4.(〃'▽'〃)本题解答:后来发现是我的for循环中的判断语句有问题。所以应该将<换成<=。
代码托管 |
上周考试错题总结 |
- 问题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?(下面哪一个程序满足如果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--; - 问题1分析和领悟:如果x是正的,x++是在x=-x时执行的,否则,什么都不会发生,或者x不受影响。在A、C、D和E中,逻辑是不正确的。在A x中,如果x不是正的,那么如果x=0,x变成-1,这是错误的答案。在C中,如果x是正的,那么就执行x++。在任何一种情况下,下一个语句都被执行,如果x不是负数,则执行else子句设置x为0。所以如果x是正的,在这组代码之后它就变成了0。在D、x++和x中——如果x不是0,都是执行的。在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;(假设计数为0,总数为20,最大值为1。下面的语句将会执行下列哪一项?if(count!=0&&total/count max)max=total/count;)
A . The condition short circuits and the assignment statement is not executed(A。条件短路和赋值语句未执行)
B . The condition short circuits and the assignment statement is executed without problem(b。条件短路和赋值语句是无问题的执行的)
C . The condition does not short circuit causing a division by zero error(c。这种情况不存在短路引起的零误差)
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(d。条件短电路,在评估条件时没有零误差,但是赋值语句导致了零误差的除法)
E . The condition will not compile because it uses improper syntax(因为它使用了不正确的语法,所以这个条件不会被编译) - 问题2分析和领悟:因为count是0,(count!=0)是假的。因为&&条件的左边是假的,条件是短路的,所以右边没有被求值。因此,避免了一个潜在的零错误。由于条件为假,所以语句max=total/count没有执行,再次避免了零错误的潜在划分。
- 问题3:When comparing any primitive type of variable, == should always be used to test to see if two values are equal.(当比较任何原始类型的变量时,==应该总是用来测试两个值是否相等。)
A . true(真)
B . false(假) - 问题3分析和领悟:用于测试两个值是否相等这种说法适用于int、short、byte、long、char和boolean,但不能是double或float变量。如果两个double型变量x和y正在被测试,(xy)只有当它们完全等于最后一个小数点时才成立。相反,比较这两个值是很常见的,但是允许在价值上有细微的差别。例如,如果THETA=0.000001,我们可以通过(x-y<=THETA)来测试x和y,而不是(x==y),以便更好地了解它们是否足够接近,可以被认为是相等的。
- 问题4: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 (没有正确答案) - 问题4分析和领悟: 尽管写这样的switch语句是不习惯的,但是是合法的。switch语句执行的常规规则适用于在交换表达式表达式后执行匹配的case子句。在此之后,所有后续的条款都是按顺序执行的,因为没有中断语句来终止开关/案例的执行。
- 问题5: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; - 问题5分析和领悟: 在这种情况下,Java测试一个条件(x<0)的条件操作符,如果是真的,则返回x,如果为false,则返回0。原始if语句是将y赋值为x if(x<0)和0。这将通过将y赋值为x或0来完成(x<0),如A.在B中所示,x被赋值为y或0的值,这是向后的。在D中,y将被设置为真或假,取决于(x<0),而E中的语句在语法上是无效的。
- 问题6: Which of the following statements are true about Java loops?
A . all three loop statements are functionally equivalent(所有三个循环语句在功能上是等价的)
B . while loops and do loops are essentially the same; but while loops always execute at least once(循环和循环本质上是相同的;但是循环总是至少执行一次)
C . if you know the number of times that a loop is to be performed, the best loop statement to use is a while loop(如果您知道要执行环路的次数,那么使用的最佳循环语句是while循环)
D . loops may be replaced by an appropriate combination of if-else and switch statements(循环可能被一个适当的if-else和switch语句的组合所取代。)
E . none of the above(以上都不是) - 问题6分析和领悟: 答案选择A。在Java中,就像在大多数语言中一样,循环语句基本上都是等价的(几乎可以互换)。它们的主要差异是与何时评估控制条件以及是否有用于递增/更新的语法有关。
- 问题7:The following for-loop is an infinite loop.(下面这个程序是个死循环)
for (int j = 0; j < 1000; ) i++;
A . true(真)
B . false(假) - 问题7分析和领悟:这个循环初始化j到0并将其与1000进行比较,但是在每次循环迭代之后不会改变 i 的值。在现实中,一旦变得太大,无法存储在内存中,循环就会终止,但逻辑上,这是一个无限循环。
点评模板: |
- 博客中值得学习的或问题:
- (20172304)markdown格式漂亮,总结清晰明了。缺点是问题不是很深刻,输入错误有点重复。
- (20172301)markdown格式漂亮,总结很有深度。总之没有什么问题,值得我好好学习。
- 代码中值得学习的或问题:
- 两个伙伴都是one thing one commit,所以这点很需要学习,这周我也这样做了,但是不如他们做的认真仔细。
- 在编程项目中,我寻求了很多的帮助,占用了他们很多时间帮我解决问题,所以我觉得我应该养成独立思考的好习惯,虽然讨论很好,但是多度的小问题让我觉得在学习上太过于依赖伙伴,不仅拖慢他们的进度而且对学习益处不大。
- 在编程问题上,他们有很缜密的思维逻辑和很细心的结构设计,在这点上我觉得自己简直太差了,很多问题自己天马行空,想法不成体系,漏洞满满,因此在以后的学习中要养成在纸上做提纲性结构的工作。
点评过的同学博客和代码 |
其他(感悟、思考等,可选) |
这周的任务量不大,但学习的内容不是很好掌握。当我看完书后,感觉大势在握的时候,8.1卡了我两个小时,一直显示错误。终于在仇夏同学的帮助下发现8.1的循环错误,成功解决后却发现8.5嘲笑我不自量力,心态有点复杂。所以我觉得:在理解的同时还是得去往实践的路上走的,虽然走的有些蹒跚,但是要一直一直继续走;可能速度不快,但一定要一直在路上。感谢帮助我学习的好朋友们,在学习java之路上我们一起加油!Fighting!
学习进度条 |
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 100/100 | 1/1 | 15/15 |
第二周 | 377/477 | 1/2 | 20/35 |
第三周 | 280/757 | 2/4 | 22/57 |
第四周 | 973/1730 | 1/5 | 35/92 |
第五周 | 1000/2730 | 1/6 | 40/132 |
第六周 | 729 /3459 | 1/7 | 40/172 |
参考资料
1.数组作为函数参数
2.java程序设计教材(第八版)
3.蓝墨云班课