20172305 2017-2018-2 《程序设计与数据结构》第五周学习总结
教材学习内容总结
本周内容主要为书的5.1-5.6以及6.1-6.4的内容
第五章
1.逻辑运算符和关系运算符
2.if语句(if的嵌套、if-else的运用、语句块)
3.浮点数的比较和字符的比较
4.while语句(嵌套if语句或while语句)
5.迭代器以及ArrayList类的使用
第六章
1.switch语句
2.do语句(嵌套)
3.for语句(嵌套for语句、if语句)
教材学习中的问题和解决过程
- 问题1:逻辑运算符和关系运算符
问题1解决方案:在看第五章之前,通过老师在蓝墨云班课上发布的是视频中,对逻辑运算符和关系运算符有一定的认识,加之数学上也学过“或且非”(且即与之意)三者,一个是取对立的,一个则“一真则真”,一个则“一假则假”,而且在班课上还学习到运算符异或“^”、左移右移等运算符,而且通过异或运算符,可以进行简单的加密,是数据变化。极大的降低了运算符学习的困难。
- 在三种逻辑运算符中,逻辑非具有最高的优先级,其次是逻辑与,最后是逻辑或。
- 相等性运算符和关系运算符的优先级比算术运算符的优先级低
- 问题2: if语句的运用
问题2解决方案:if语句在以往的数学课上学过,对于if条件句,在没有看过本章的内容前,认为if语句是对承接上来的内容进行判断,对了通过一条语句,不对再通过一条语句,就是一种“分叉”的感觉,之前的学习是停留在纸上,现在的学习是用在电脑上,所以和之前的还有一定的不同,就比如说缩进格式,对于理解if里面的条件和语句有很大帮助,还有用到语句块的时候,应用到“{”、“}”是避免错误理解的有效方法,if-else的运用在代码调试中进行分析。
- 缩进格式只对程序阅读者有意义,没有正确的分块缩进书写的语句,会是程序阅读者对代码的执行逻辑产生误解。
- 问题3:浮点数的比较和字符的比较
- 问题3的解决办法:
(1)浮点数的比较,我认为可以通过除法后与1进行比较,或者减法后与0比较,而书上所说的浮点数的比较,实在给定误差标准的情况下进行比较两者是否相等。
- 计算两个数差的绝对值并将差和某个误差标准相比较
(2)字符的比较,可以理解为Unicode字符集内各个字符的排列顺序,如果字符a在字符b前面,那么字符a小于字符b。
- 问题4: do、while、for语句
问题4的解决办法:while语句是先判断,true则执行语句运算,false则跳过。do语句是先执行一次语句运算,再进行判断,true则返回执行语句,false则跳过。for语句是一种适用于循环执行前知道循环次数的情况。三者的嵌套和运用在代码调试中进行分析。
- 问题5: 迭代器和ArrayList类
问题5的解决方法: 迭代器的问题早在第七章就有所遇到,而第五章的系统性的学习,对迭代器有了更多的认识。对于迭代器的理解还不是很明白,有些问题在上网找过之后,仍有较大疑惑。
代码调试中的问题和解决过程
- 问题1:PP5.1
问题1解决方案: 对于问题中“年份能够被4整除且不能被100整除,或者同时能够被100和400整除”的理解,我在最初用逻辑运算符
((years%4= =0&&years%100!=0)||(years%100= = years%400))
来表示,结果就是特别神奇的逻辑错误,后来换了一种思路,用if的嵌套问题解决了。- 问题2:PP5.3
问题2解决方案:在解决这个问题之前,我通过提前看第六章的示例代码,通过运用例6.2的运用,利用求余的办法不断从后面一位一位的判断数字,利用while中嵌套if语句解决的,也第一次真正运用到自增运算符,全程自主研发的代码,适用于正数和负数,但是通过后来给别人讲解过程中,他人提出“0”的问题,在我的1.0版上却是无作用的,但是“0”作为偶数,也是要算在内的,所以有自主研发出2.0版,通过加if语句进行判断来解决的。
- 问题3:PP5.7
问题3解决方案:刚接触到问题的时候感觉蒙蒙的,什么石头剪刀布啊,还要机器随机产生,还得比较并记录结果。这个时候,突然感觉自己有一个爱因斯坦的脑袋就好了,可惜自己只能通过写伪代码的方式进行,不过** 通过写伪代码,可以很清楚的知道自己这步要做什么,下步要干什么的问题,能过写伪代码的方式把问题划分为几个部分去解决,就像第七章的软件活动开发要先确定软件需求一样,明确了方向。**对于石头剪子布的随机,我的想法是通过随机数产生,一个数对应一个,就确保了随机性。其次,我就想通过if条件句进行数字和字符串的对应,但通过看同学的代码,发现可以用ArrayList类,把石头剪刀布装进去,再通过每一个的索引值来取,算是完成了。接下来就是规则的编写,石头赢剪子,剪子赢布,布赢石头,感觉就像一个乌比莫斯环一样,环环相扣,想用if语句,就嵌套一个并列式的if,结果就是找不到else,转而换为一大长串的逻辑符,进行表述
((s1.equals("stone")&&s2.equals("scissors")||(s1.equals("scissors")&&s2.equals("cloth"))||(s1.equals("cloth"))&&s2.equals("stone"))。
结果以为和PP5.1一样,然而却成功了。没有逻辑错误。- 问题4:PP6.3和PP6.7
问题4解决方案:两个代码的编写,使PPP6.3的阶梯式12×12的乘法表,弄成一行一个的乘法表,结果校对了好几遍的代码,最后发现是自己的print打成了println导致一行一个的问题。PP6.7的尝试是自己陷入到无限循环里面,每一次的java后就是满屏的*,快绝望了。对照了几遍自己的for语句,没有问题,结果高手的帮助,发现自己的“}”加错地方导致的。
代码托管
上周考试错题总结
- 错题1 The behavior of an object is defined by the object's(对象的行为是由对象定义的。)methods(方法)
- 错误解析: 方法指示对象在传递消息时如何反应。每个消息都作为一个方法实现,而方法是在传递消息时执行的代码。构造函数是这些方法中的一种,但是所有的方法组合都决定了行为。可见性修饰符会间接地影响对象的性能。错误的把构造方法定义对象的行为,忽略了构造方法只不过是众多方法中的一个。
- 错题2 In order to preserve encapsulation of an object, we would do all of the following except for which one?(为了保存一个对象的封装,除了哪一个以外,我们会做以下所有操作?)Make the class final
错误解析:封装意味着类包含操作数据所需的数据和方法。为了正确地保存封装,实例数据不应该从类外部直接访问,所以实例数据是私有的,方法被定义为访问和操作实例数据。此外,访问和操作实例数据的方法被公开,以便其他类可以使用该对象。保留字“final”用于控制继承,与封装无关。public变量是违反封装性,final修饰符用于定义常量的。
封装这个解释,可以用CPU作为例子:
CPU把所有的电阻电容门电路等都封装起来,只留出一些管脚(接口)让用户使用,CPU能暴露什么,不能暴露什么,是生产商设计决定的,用户不能直接操作CPU的电阻电容等等,但可以通过给管脚适当的电压来控制电阻电容等,也就是说用户不能直接访问CPU的属性,但是可以通过方法修改CPU的属性的值- 错题3 If a method does not have a return statement, then(如果一个方法没有返回语句,那么)it must be a void method(它一定是一种无效的方法。)
- 错误解析: 所有的方法都隐含返回某个东西,因此必须有一个返回语句。但是,如果程序员希望编写一个不返回任何内容的方法,因此不需要返回语句,那么它就必须是void方法(该方法的头有“void”作为返回类型).任何语句都要有返回值的,这个是我忽略了,没有考虑到是无效的方法,自以为是会有语法错误的。
- 错题4 Consider a sequence of method invocations as follows: main calls m1, m1 calls m2, m2 calls m3 and then m2 calls m4, m3 calls m5. If m4 has just terminated, what method will resume execution?(考虑一系列方法调用:主要调用m1, m1调用m2, m2调用m3,然后m2调用m4, m3调用m5。如果m4刚刚终止,什么方法将继续执行?)m2
- 错误解析: 一旦方法终止,用调用该方法的方法控制简历。在这种情况下,m2调用m4,因此当m4终止时,m2恢复。本道题理解,感觉很蒙,完全的一头雾水。在看过答案后也不是很懂,随着答案的解释可以理解,但完全不知道原因为何。
- 错题5 Instance data for a Java class(Java类的实例数据。)may be primitive types or objects(可能是原始类型或对象)
- 错题解析: 实例数据是组成类的实体,可能是任何类型的实体,无论是原始的还是对象的,并且可能是公共的或私有的。通过使用对象作为实例数据,它允许在其他类上构建类。类具有其他类的实例数据的关系称为has-a关系。就像RationalNumber类中的减法方法一样。
- 错题6 Consider a Rational class designed to represent rational numbers as a pair of int's, along with methods reduce (to reduce the rational to simplest form), gcd (to find the greatest common divisor of two int's), as well as methods for addition, subtraction, multiplication, and division. Why should the reduce and gcd methods be declared to be private.(考虑一个Rational类,它的目的是将Rational的数字表示为一对int,以及方法减少(将Rational简化为最简单的形式),gcd(找到两个整数的最大公约数),以及加法、减法、乘法和除法的方法。为什么要将reduce和gcd方法声明为私有的。)Because they will only be called from methods inside of Rational(因为它们只能从理性内部的方法中调用。)
- 错题解析: 所有被声明为私有的类的所有项只能访问该类中的实体,不管它们是实例数据还是方法。在这种情况下,由于这两种方法只从Rational的其他方法(包括构造函数)调用,因此它们被声明为私有,以提高信息隐藏的程度。注意,答案C不是一个正确的答案,因为reduce方法调用了gcd方法,所以其中一个方法是从构造函数以外的方法调用的。忽略了reduced方法是调用gcd方法的。
- 错题7 Java methods can return more than one item if they are modified with the reserved word continue, as in public continue int foo( ) { ... }
(如果使用保留字进行修改,Java方法可以返回多个项,如在public continue int foo(){…})false - 错题解析: 所有的Java方法都返回一个单独的项,不管它是一个原始数据类型的对象,还是void。保留字continue用于退出循环的其余部分并再次测试该条件。做的时候很混乱,仔细想想每一个方法都只能返回单独的项,书上的例子就是最好的证明,每用一个方法都只能改变一个变量什么的。
- 错题8 A method defined in a class can access the class' instance data without needing to pass them as parameters or declare them as local variables.(在类中定义的方法可以访问类的实例数据,而无需将它们作为参数传递或声明为局部变量。)true
- 错误解析: 实例数据在全局上可用于所有类的方法,因此方法不需要作为参数接收它们,或者在本地声明它们。如果在方法中声明了与实例数据相同名称的变量,那么该方法中的实例数据将被“隐藏”,因为引用将是本地变量。
- 错题9 During program development, software requirements specify(在程序开发期间,软件需求指定)what the task is that the program must perform(该程序必须执行的任务是什么?)
- 错误解析: 规范阶段是理解手头的问题,这样程序员就可以确定需要做什么来解决问题。上面列出的其他工作是设计阶段(A程序如何完成任务?, C如何将任务划分为子任务?)和测试阶段(D如何在程序完成后进行测试?)的一部分。我的想法是明确该程序是做什么的,就错误的选择A,是自己想表达的意思不够准确,没有准确理解题意。
- 错题10 Static methods cannot(静态方法不能)reference non-static instance data(引用非静态实例数据)
- 错误解析: 静态方法是类本身的一部分,而不是实例化的对象,因此静态方法在类的所有实例化对象中共享。由于静态方法是共享的,因此不能访问非静态实例数据,因为所有非静态实例数据都是特定于实例化对象的。静态方法可以访问静态实例数据,因为与方法一样,实例数据在类的所有对象中共享。静态方法也可以访问传递给它的参数。
- 错题11 Java does not support multiple inheritance, but some of the abilities of multiple inheritance are available by(Java不支持多重继承,但是有一些多重继承的能力。)implementing interfaces(实现接口)
错误解析:由于类可以实现任意数量的接口,所以该类本质上是使用接口类,就像在这个类中定义了这些接口一样。因此,这个类继承了接口的方法和常量。此外,该类可以扩展另一个类,从而直接和间接地从多个类继承。这与多重继承不完全相同,但它与Java的概念一样接近。对于继承的概念,没有好好理解
- 继承是面向对象语言的一个重要机制,
通过继承可以在一个一般类的基础上建立新类,被继承的类称为基类,
在基类上建立的新类称为派生类。
继承和派生其实都是一回事,只是说法不同.
- 继承是面向对象语言的一个重要机制,
- 错题12 In which phase of program development would you expect the programmer(s) to create the pseudocode?(在程序开发的哪个阶段,您希望程序员(s)创建伪代码?)Software design(软件设计)
错误解析:伪代码是用类似英语的方式编写的算法的描述,而不是用特定的编程语言编写的。这是程序设计的一部分。在实现阶段,程序员将伪代码转换为正在使用的编程语言。一直错误的理解为要在确定软件需求上进行写伪代码,实则要在软件设计上进行。
- 软件需求用一个称为功能说明的文档来描述。
- 错题13 Interface classes cannot be extended but classes that implement interfaces can be extended.(接口类不能被扩展,但是实现接口的类可以被扩展。)false
- 错误解析:任何类都可以扩展,无论是接口、实现接口,还是两者都没有。唯一的例外是,如果类被显式地修改为“final”,在这种情况下它不能被扩展。
- 错题14 All objects implement Comparable.(所有对象实现可比性。)false
错误解析:可比较的是一个接口,该类必须定义compareTo方法,并显式地声明它实现可与之相比较的实现。大多数类都没有实现可比较的。这道题纠正了我对比较的认识,一直以为所有类,只要是相同的进行比较就可以的错误观念。
本周的考试题数较多,而且自己期间还不小心把界面关了,导致自己做过的题又从重新做一遍,尽管这样,还是有很多是不会的,甚至是“无从下手”去点击选项。感觉自己对书本的内容已经有所了解,但是还是本考试所打败。
无奈
感悟
第五章和第六章的内容几乎都要是逻辑思考,逻辑运算,靠着以前的直接在脑里进行编译的方式,已经不行了。写一个代码,开始动用笔写写草稿了,感觉这种方法不错,很适合对于这些刚开始感觉蒙的项目。两章的内容和第四章、第七章相比,相对轻松,但是感觉时间较短,学起来有点吃不消,还要应对其他事情。而且本周进行的5.7的编写虽然有部分是借鉴的,但是感觉自己和电脑进行人机对抗,(想设计一个bug可以让人一直赢的方式)玩了好几把,几乎是平局和机器赢,仅有少数几局是人赢得,感觉自己造出的东西快要打败我了,有点像*复仇者联盟*里的奥创,快要把钢铁侠打垮了一样。哈哈,就像白岩松的一部书名《痛并快乐着》,最枯燥的字符之间,也会有最快乐的因子;最无趣的代码面前,也会创造出鲜活的生命(就像那个石头剪刀布一样)。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 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 |
参考资料
蓝墨云班课
静态方法