20172301 2017-2018-2 《程序设计与数据结构》第5周学习总结
教材学习内容总结
第五章
- 运算符
- 相等性运算符,包括
==
、!=
(==
和=
的区别) - 关系运算符,算术运算符的优先级更高。
- 逻辑运算符,优先级 ! > && >||
- 相等性运算符,包括
- if语句、if-else语句、if语句嵌套。当输出两句话的时候运用语句块。
- 数据比较
- 浮点数比较:绝对值和0.0001比较,接近就是相等。
- 字符比较:比较的是Unicode中的值。谁的值大,谁就在后
- 字符串比较:compareTo 本质就是比较字符。 若是正值,就后于被比较的值
- 比较对象:通过接口来实现。
- while语句 ( 先判断,后执行。)
- 迭代器
(完全看不懂) - ArrayList类
(和枚举型有什么区别吗.. ?)
第六章
- switch语句 。 (有关switch语句)
- 条件运算符 ---?:(类似条件语句,并且两个符号总是分开的。)
- do语句 ( 先执行,后判断,至少被执行一次。)
- for语句 (知道执行的次数)
形式: for(初始语句; 语句表达式; 增量代码; ) - for-each循环
教材学习中的问题和解决过程
- 问题1:
=
和==
的区别。
==
和equals
的区别。 - 问题1解决方案:
- 首先,我们知道
=
是在第二章数据与表达式中的内容;equals
方法在String类那里提过;==
就是刚学的相等性运算符。
=
和==
是便于区分的,因为=
是赋值运算符;==
则是判断,输出的是结果——true、false。 这里就不详细举例。
参考资料:在java中=和==的区别 ==
和equals
有什么区别呢?==
是一个操作符,equals
就是一种方法。
在书P148 给出了一个例子:
- 首先,我们知道
String str = "software";
if (str == "software")
System.out.println("References are the same");
if (str.equals("software"))
System.out.println("Characters are the same");
因为,java在需要时只会为多次使用的一个字符串常量创建一个对象。
- 那我们看几个例子:
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
判断一下输出的是什么? true、false
- 下一个:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
判断一下输出的是什么? true、true
为什么同样都是创建一个字符串对象,确实不一样的结果。
简单说下我的理解,==
根据书上的解释:
判断这些对象是否彼此互为别名(它们是否含有相同的地址)。
这和`equals`方法判断含有相同的字符确实是完全不同的。而第二个例子也就是所说的**多次使用的一个字符串常量创建一个对象**,它们就是同一个地址。第一个例子则是创建了两个对象,地址不同了,那么判断就是错喽。
<table><tr><td bgcolor=#D1EEEE>参考资料: </td></tr></table>
Java中==号与equals()方法的区别
如何“记住” equals 和 == 的区别?
equals和==的区别
-
问题2:ArrayList类和枚举型的区别。 怎么说呢?这两个里面都可以放字符串,然后对其进行操作。所以我觉的两个应该是差不多?
-
问题2解决方案:这种问题只能百度了吧。从书上只能简单了解到ArrayList类是数组。
这里我们参考下:枚举 跟 数组的区别?
通俗说:枚举对象在任一时刻只能有一个常量值,数组对象在任一时刻可以有多个值.
看下例子: Public Enum Enum1 First = 1 Second = 2 Three = 3 End Enum Dim e As Enum1, e_Array As Enum1(2) e = Enum1.Second e_Array(0) = Enum1.First e_Array(1) = Enum1.Second e_Array(2) = Enum1.Three 我们可以看出枚举确实只有一个常量值,而数组有多个。 大致能明白吧,因为我们马上就学习数组,所以在这里我先不咬文嚼字,把疑问带下去,等以后更深学习了数组再来理解。
-
问题3:switch语句的适用范围。
-
问题3的解决方案:这个问题是第一遍看书疑惑的,然而,第二遍再看的时候直接就解决了,因为书上白纸黑字写着呢。感觉这个问题问的没有什么含金量吧。这里写出来也是为了督促自己看书认真一点。
附上有关switch语句的一些理解。- switch的break语句是可选的,有时我们会利用这种特性(如上面的代码),但是一般情况下break是不能少的。否则可能会出现意料之外的错误。——没有break,程序会继续执行后面的代码。
- default语句也是可选的。相当于对应if-else语句最后的else。
- java语言用于匹配的选择因子必须是整形或字符型常量。这很重要。
- switch语句的比较是从上往下,所以把匹配概率大的选择因子放在前面可以提高效率。
- 选择因子具有唯一性,即不能有2个相同的因子存在。
参考资料:
- 问题4:Java中几种循环语句的系统比较。
- 问题4解决方案:
语句 | 特征 | 备注 |
---|---|---|
while语句 | 先判断,后执行 | 不知道执行次数 |
do...while语句 | 先执行,后判断 | 至少被执行一次 |
for语句 | 循环变量和循环条件在一起 | 分号不可省略 知道执行次数 |
switch语句 | 表达式必为整型或字符型 | 可读性强 |
代码调试中的问题和解决过程
-
问题1:什么时候需要== 初始化== ?
-
问题1解决方案:
成员变量在类存在的时候就已经初始化了,局部变量只有该方法被调用的时候才初始化。局部变量一定要赋初值,否则报错,成员变量如果不赋初值,系统默认给。
**最好尽量都把变量初始化。 ** 书上的例子大致都是如此。
-
问题2:在做PP5.7的时候,用户输入的应该是“石头剪刀布”,但是,如果用户随便胡乱输入,
我有什么办法难道判定他赢吗?所以,我们需要排除用户输入其他的可能。
看一下我编写的代码(完成后的):
我开始想用户不输入“剪刀石头布”,那么计算机就会输出
Be serious!
;所以呢,我该怎么判断不是石头剪刀布呢? -
问题2解决方案:
首先,我想比较字符串相等用的是equals方法,那么不相等是不是有notequals方法,或者unequals方法?我也不知道我为什么当时脑洞这么大。所以,我就去API查查有没有这种方法?!
可惜,没有。 怎么办?!那我只好把if和else对调。
结果,我昨天晚上灵光一现,不是有逻辑运算符吗?
!(str.equals("剪刀") || str.equals("石头") || str.equals("布"))
Good job!
-
问题3:nextInt和nextLine?
-
问题3的解决方案:
-
编写程序项目PP5.1的时候,我突发奇想给程序加上一个类似例5.9的
while (another.equalsIgnoreCase("y"))
会怎么样?然后我就正常的输入,结果,它竟然跳过了我的询问?!
我明明和书上的例子打的差不多能错在哪里?仔细一看,就发现了nextInt和nextLine。恍然大悟。老师曾经讲过nextInt和nextLine的用法,我也在前面总结过,这里算是尝到了错误的教训。对其理解的也更加深刻。于是乎,再输入了一遍another = scan.nextLine
。 -
偶然了解到了第二种方法,分享一下。我们实例化了两个Scanner对象,一个scan和scan1,这样nextInt和nextLine谁都不会相互影响。同样可以编译成功。
-
代码托管
这一周,代码行数远没有上一周多,但是花在代码编写上的时间并不少。一方面,我这星期在研究博客园博客的格式和CSS码设计,希望能把博客写的更加美观,与众不同。当然,求分也是一定的 另一方面,这一周的学习主要是条件判断和循环,需要对其有一定的理解才能更好的编写程序,所以也花了不少的时间琢磨。
上周考试错题总结
- 为了保存一个对象的封装,除了哪一个以外,我们会做以下操作? D
A。使实例数据为私有。
B。定义类中的方法来访问和操作实例数据。
C。让类的方法公开。
D。使类变成final。
E。以上都是保存封装。
理解:封装的定义在书P108:
封装意味着类外的代码难于甚至无法访问和修改该类内部声明的变量。
为了正确地保存封装,实例数据不应该从类外部直接访问。而保留字final,封装对于常量基本是无意义的,final和封装应该无关。
-
如果一个方法没有返回语句,那么。 B
A。它将在编译时产生语法错误。
B。它一定是一种void的方法。
C。不能从定义该方法的类之外调用它。
D。它必须被定义为一种公共方法。
E。它必须是一个int, double, float或String方法。
理解:好吧,题意理解的不对,一个方法是必须有返回语句的,除非是没有返回值的void方法。 -
访问器和修改器提供了对被封装的类进行受控访问的机制。 A
A。真
B。假
理解:书P109,访问器方法名的形式为getX,同样,修改器的方法名的形式是setX。可以对实例数据进行访问和修改。 -
在程序开发期间,软件需求指定。 B
A。程序如何完成任务?
B。该程序必须执行的任务是什么?
C。如何将任务划分为子任务?
D。如何在程序完成后进行测试?
E。上面所有的
理解:在程序开发阶段,我们应该明确这个程序需要干什么?即必须执行的任务是什么?书P193:
软件需求指定了程序必须完成的功能,指明了程序应当执行的任务,而不是描述如何执行所规定的任务。
上面列出的其他工作是设计阶段和测试阶段的一部分。应该分清软件设计的阶段。书上的原话,看书不仔细
-
All objects implement Comparable. B
A . true
B . false
理解:这个完全是理解错了,有道翻译成了“所有对象实现可比性。”我当时看的一脸懵,然后也蒙了一个。其实,Comparable是一个接口,我们必须定义compareTo方法,然后声明实现接口,才可以。 -
如果您声明一个类构造函数有一个void返回类型会发生什么? D
A。您可能会收到语法错误。
B。该程序将通过一个警告进行编译,但是您将得到一个运行时错误。
C。声明一个构造函数为void并没有什么错。
D。类的默认构造函数将被使用而不是您声明的那个。
E。以上都不是
理解:一个构造函数如果有一个void返回类型并且编写没有错误,是不会收到语法错误的。书上P116:
编译时,具有返回类型的构造方法(即使返回类型为void)将被转换为常规方法(方法名恰与类名相同) ,从而不能作为构造方法调用。同样是书上的原话,却没有更深的理解。惭愧。
-
静态方法不能: B
A。引用实例数据
B。引用非静态实例数据
C。引用其他对象
D。调用其他静态方法
E。调用非静态方法
理解:静态方法不能访问非静态实例数据, 必须在其实例化, 也就是new之后才可以调用。 -
在黑盒测试中,测试人员应该已经知道程序是如何实现的,这样他/她就可以更仔细地识别出软件的哪个部分导致了错误。 B
A。真
B。假
理解:黑盒测试,当然是摸黑测试了,什么都知道的话那叫glass-box testing
玻璃盒测试了。黑盒测试: 在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。
白盒测试: 白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。
其他(感悟、思考等,可选)
有时候,对很多概念理解不清晰不全面,在看到书146页的时候,哎呦,别名是啥?! 又开始往前面翻,无形之中就降低了自己的效率。或许,有时候就是不求甚解,往往只理解了表面的意思。这样的学习是没有丝毫效果的。我们的学习应该基于课本,发散于课本,我看有的同学书都快翻烂了。我也就是每次通读几遍。这样的学习,就好像一座千年大堤基础在慢慢的在崩坏。我们仅仅把例子输入上去够吗?能够合理的运用while,do...while,for,switch语句吗?能够清晰理解循环体吗?
所以,有时候,我们稍微多花点时间,却能够收货成倍的效益。
越往后学就越需要系统的思维,我们在编写的项目的时候,它会有很多很多的要求,你需要用到很多的方法和变量,那怎么才能合理有效的编写出来,还需要我们慢慢地摸索,一直向前努力。
同样,眼光也不能仅仅局限于课本,课本的几个例子当中。不过总是说的时候精气满满,做的时候累死累活。看过这样的一句话,尽管可能有些刻薄:
累吗?累就对了!舒服是留给死人的。
共勉!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 122/122 | 1/1 | 20/20 | |
第二周 | 487/609 | 1/2 | 18/38 | |
第三周 | 482/1091 | 1/3 | 22/60 | |
第四周 | 1357/2448 | 1/4 | 20/80 | |
第五周 | 628/3106 | 1/5 | 20/100 |