20172317 2017-2018-2 《程序设计与数据结构》第2周学习总结
教材学习内容总结
- 了解了
+
在字符串拼接的作用 - 了解了各个转义序列
- 认识了变量并学会了用赋值语句赋予变量与常量值
- 认识了几大基本数据类型和它们的区别
- Scanner类是个可以深入研究的地方
教材学习中的问题和解决过程
- 问题1:那么,如果在空的一行输入
\\n
会发生什么 问题1解决方案:看到教材例2.2时突发奇想,比如说这样一段代码:
System.out.println("FART"); System.out.println(); System.out.println("TURD");
这段代码会输出三行,其中第二行是空的,效果和没有中间行但在第一句的末尾加了一个
\\n
的效果是一样的;但是如果中间那一行里面有\\n
会怎样?于是去试一试
这就是输出结果,中间空出了两行,和想象中一样。虽然这个问题是显而易见能知道结果的,但是总得试试。
- 问题2:
+
?一定要用吗? 问题2解决方案:问题在于我个人对
+
的用法(这里专门指拼接两字符串的用法)有些不解,因为写代码中我从来没有在println方法里打回车键过;我以为是因为如果在Vim编辑器里字符串太长了自动换行到了下一行导致的出错,然后我最大化了窗口...而且即使是在最大化的窗口内字符串写到了下一行还是没有问题。所以对我来说唯一的解释就是使代码排版美观了。这里顺便说个非常有意思的现象:你在System.out.println()
的括号里若输入很长很长很长很长的一段字符串,即使这段字符有好几行,在vim编辑器里它还是认定为一行。
- 问题3:\\n?\\r?
问题3解决方案:我知道我知道...上课讲了,但是我还是没有弄懂,只好靠自己了,于是自己稍微试验了一下:
public class b { public static void main(String[] args) { System.out.println("Fart1 \\rtralala1"); System.out.println("Fart2 \\ntralala2"); System.out.println("Fart3 \\n\\rtralala3"); System.out.println("Fart4 \\r\\ntralala4"); } }
输出结果是这样的
呃,上网查了之后得到了以下的解释
\\r与\\n合起来就是回车换行的意思,回车是将光标移到当前行的行首;换行是将光标移到当前行的下一行,但还是同一列,不会回到行首。它们合起来可以将光标移到下一行的行首,也就是回车并换行。但在不同的系统中它们的功能也不太相同。比如在windows里,\\r\\n表示回车换行;但在linux中\\n就代表回车换行。这也是为什么在linux下用vim打开windows编辑的文件会发现在每一行尾都有个^M字符的原因
.....算了还是不太懂,反正以后只用\\n好了。
代码调试中的问题和解决过程
- 问题1:error: variable a might not have been initialized
问题1解决方案:问题出现在PP2.12中,对代码稍加分析后发现了一个有趣的问题,当时我的代码类似这里所显示的:
import java.util.Scanner; public class c { public static void main(String[] args) { Scanner scan=new Scanner(System.in); int a, b, c; c=a+b; a=scan.nextInt(); b=scan.nextInt(); System.out.println("c= "+ c); } }
当时其实是一头雾水的,没有initialized?我不是在前面声明了变量了?正当踌躇时突然有了一个主意,把代码改成了下面这样:
问题便解决了。这里在最开始代码是先执行c=a+b,后给a和b赋值,我估计由于没有先给a,b赋值就直接进行运算会导致c不能正常被算出来;而后面是先给a,b赋值再运算c=a+b,这时候因为a,b已经有了一个具体的值,所以才能算出c的值。import java.util.Scanner; public class c { public static void main(String[] args) { Scanner scan=new Scanner(System.in); int a, b, c; a=scan.nextInt(); b=scan.nextInt(); c=a+b; System.out.println("c= "+ c); } }
- 问题2:PP2.4的问题
问题2解决方案:(由于问题早已解决,所以截图都是新写的代码来模拟当时的情况)最开始写的时候大概是写成了这样
当时的思路大概是看到其他的示例代码里的诸如xxx= scan.nextInt();
这类方法,于是照葫芦画瓢写了xx=scan.nextChar();
这样的代码,然后就出错了...
嗯?仔细检查了一遍代码,找不出问题,想不通啊,莫非......java的scanner类中根本就没有nextChar()方法?震惊!Scanner类竟然缺少一个理所应当的方法!反正这个方法行不通还可以用其他方法,看书上那些输出Char类型数值的示例代码其中是这样的:scan.nextLine();
那就先试吧....
error: incompatible types: String cannot be converted to char这段错误信息不能理解,但是即使是修改过后我的代码确实和书本上的示例有区别,书本上使用了String
类而我没有,我的代码中还是用char,于是最终将代码改成了这个样子:
import java.util.Scanner;
public class d
{
public static void main(String[] args)
{
Scanner scan=new Scanner(System.in);
String playstation, dualscreen;
System.out.print("Acronym of Playstation: ");
playstation=scan.nextLine();
System.out.print("Acronym of Nintendo Dual Screen: ");
dualscreen=scan.nextLine();
System.out.println(playstation+" is awesome,"+dualscreen+" is awesome too!");
}
}
问题就解决了,输出结果是这样的:
那么String究竟是什么东西呢?反正下一章会讲,那么把问题留到下一周吧偷懒了
- 问题3:PP2.6:error:incompatible types:possible lossy conversion from double to float
问题3解决方案:当时代码大致是写成了这样:
唔...然后就输出了error:incompatible types:possible lossy conversion from double to float的错误,最开始由于不知道哪里出错了,由于错误信息指着1.60935那里,所以又新建了一个float变量FACTOR,令FACTOR=1.60935,再让a和FACTOR相乘,在满怀的期待下,它再次输出了error:incompatible types:possible lossy conversion from double to float。此时一个大胆的想法在我脑中浮现:莫不是1.60935已经超出了float型的范围?的确,当你把a和b都以double型定义时,这个问题就解决了,但书本明明写了float型有7位有效数字,事实上即使把这个1.60935改成1.1,还是会输出一样的错误,除非你给a,b定义位double,实在是搞不懂了....import java.util.Scanner; public class e { public static void main(String[] args) { Scanner scan=new Scanner(System.in); float a, b; System.out.print("A= "); a=scan.nextFloat(); b=a*1.60935; System.out.println("A*1.60935= "+b); } }
- 问题4:PP2.9的计算问题
问题4解决方案:PP2.8是个非常休闲的编程练习题,你可以嘻嘻哈哈的谈笑风生中完成这个实用性相当高的小程序,完全不会被卡住。而在另一边PP2.9则是一片地狱般的场景,痛哭、哀嚎声接连不断,不断有失去理智的人因为这道题而开始如同疯子般大笑。那么你写出来的程序输入9999秒结果是怎样的?2小时118分钟-4281秒?2小时166分钟-7161秒?
哈哈哈哈哈哈哈哈哈哈,你必须承认数学——MATHMental Abuse To Human在编程里也占了极大的一部分,但是你又能怎么办?唯一能解决它的办法就是“去解决它”,反正数学就是数学,它永远的安详的躺在那里,逼疯一切接近它的人。
代码托管
(statistics.sh脚本的运行结果截图)
那些随随便便写了500行的大佬们是怎么做到的...斗宗强者,恐怖如斯,我的肝没那么好
上周考试错题总结
- When executing a program, the processor reads each program instruction from (当执行一个程序时,处理器从___读取每个程序指令)
A . secondary memory (storage) (辅助存储器(存储))
B . the Internet (互联网)
C . registers stored in the processor (储存在处理器中的寄存器)
D . main memory (主存储器)
E . could be any of these (可以是以上这些中的任何一个)
答案是D,而我选了A,主要是因为把硬盘之类的当做了主存储器...
- It is important to dissect a problem into manageable pieces before trying to solve the problem because (试图解决问题之前,把一个问题分解成可控制的几部分是很重要的,因为)
A . most problems are too complex to be solved as a single, large activity (大多数问题太复杂,以至于不能作为一个单独大型的活动来解决)
B . most problems are solved by multiple people and it is easy to assign each piece to a separate person (大多数问题都是由很多人解决的而且把每一部分分配给不同的人是很容易的)
C . it is easier to integrate small pieces of a program into one program than it is to integrate one big chunk of code into one program (将程序的小部分整合到一个程序中比将一大块代码整合到一个程序中更容易)
D . our first solution may not solve the problem correctly (我们的第一个方案可能无法正确解决问题)
E . all of the above (以上皆是)
答案是A,我选了C,我很好奇A和C究竟哪里有区别,还是不懂,这是为什么我学理的原因。
- Java is an example of a(n) (Java是一个___的例子)
A . machine language (机器语言)
B . assembly language (汇编语言)
C . high-level language (高级语言)
D . fourth generation language (第四代语言)
E . both C and D (C和D都是)
有意思,我查了各种关于第四代语言的资料,就拿算是有点可信度的维基百科来说吧,java只在第三代语言中出现了,第四代语言举的例子里面完全没有java的影子,异议あり!!,这个题绝对有问题!
- The main method for a Java program is defined by (Java程序中的主方法是由___定义的)
A . public static main( )
B . public static main(String[ ] args);
C . public static main(String[ ] args)
D . private static main(String[ ] args)
E . the main method could be defined as in A, C or D but not B (主方法可以定义为A,C或者D,但不是B)
不能有分号啊.....在没有一丝戒备的情况下就跳进陷阱了
- The instruction: System.out.println("Hello World"); might best be commented as (这个指令最好被注释为)
A . // prints "Hello World" to the screen (将"Hello World"打印到屏幕上)
B . // prints a message (打印一条信息)
C . // used to demonstrate an output message (用来演示输出信息)
D . //
E . // meaningless instruction (没有意义的指令)
按照书本:注释不要解释本行语句表示的已经很明显的目的,也不要仅从字面解释浅显的代码,不要做无意义的注释。这样看的话,的确只有C比较靠谱了。
- Java byte codes are directly executable whereas Java source code is not. (Java字节码是可以直接执行的,而Java源代码则不是。)
A . true
B . false
java字节码和java源代码都不能直接执行
其他(感悟、思考等,可选)
1.我现在有多的把课表基本填满的课程,现在真是活在猝死的边缘啊...但是!一想到这些课都是我选的!而且其他系很多人都没有选择的权利!我就立刻充满了继续走下去的决心!但是明显感觉到难度的提升,还好自己能够驾驭,但是这敲响了警钟,必须更加努力才行
2.啃英文教材这块生肉还是相当令人困扰的
3.如果打字速度再快一点就更好了
4.下一周似乎会非常的“充实”,先把精神状态准备成紧急状态先
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 91/91 | 1/1 | 20/20 | *你充满了学习JAVA的决心 |
第二周 | 284/375 | 1/2 | 15/35 | *你突然感受到了JAVA的困难 |
计划学习时间:20小时
实际学习时间:15小时
改进情况:因为其他七八百节课的原因,所以感觉学习时间比上周少了不少,然而任务还是基本完成了,看来效率有所提升,可喜可贺