20172301 2017-2018-2 《程序设计与数据结构》第六周学习总结

20172301 2017-2018-2 《程序设计与数据结构》第六周学习总结

教材学习内容总结

  • 第八章是数组。那么我们就要清楚数组的概念

    同一类型数据的集合,就是一个容器。

  • 声明数组有两种格式

    • 元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
      eg: int[] arr = new int[5];
    • 元素类型[] 数组名 = new 元素类型[] {元素,....};
      eg: int[] arr = new int[]{1,3,5,7};
      int[] arr = {1,3,5,7};
         注意:区别初始化和实例化。初始化列表时不用new,也不用指定数组的长度。

       注意:在所有的java运算符中,索引运算符“[]”有最高的优先级。

  • 对象数组:

实例化对象数组只是为了保存对象引用而预留空间,对每个数组元素所代表的对象必须分别 实例化

  • 命令行实参:String[]参数(通常称为args)代表了命令行实参。

命令行实参存储在String对象的数组中,并将传递给main方法。

  • 可变长度参数表:
    注意几点:
    • 多个参数的类型 可以是基本类型或对象类型。
      eg:public void printGrades(Grade ... grades)
    • 接受可变参数的方法也可以接收其他的参数。
      eg: public void test(int count, String name, double ... nums)
      可变参数必须写在形参表的最后,并且一个方法不能接收两组可变参数。
  • 二维数组:可以表示为数组的数组。一个二维整型数组实际上是由一维数组引用构成的一堆数组。 所以我们可以把二维数组拆成两个部分进行分析,我觉得会相对简单。

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

  • 问题1:书P246 例8.1 第一次看的时候for (int value : list)不太明白这个for循环的意思,实际上,这其实是对上一周学习不够透彻的原因。

  • 问题1解决方案:这个语句的本质就是for-each语句。在第六章的时候for-each循环引用的是Iterable对象中的ArrayList对象举例。依次输出数组中的值,从索引0开始。所以,在学习数组的时候,要注意应用这种循环。

    参考资料:[java中for循环的几种方式](https://www.cnblogs.com/K-artorias/p/6842059.html)
  • 问题2:书P247 边界检查中,"差1错误"

  • 问题2解决方案:书上说:

    这种错误由索引值比0小1或比(N-1)大1引起。

       简单来说,就是因为索引值和长度值的关系不清造成的错误。我们都知道,索引是从0开始的,而长度肯定从1开始。
    那我们看一下错误结果:

  • 问题3:书P248 例8.3 相信大多数人一开始看到这个例子真的很迷茫。确实很复杂。

  • 问题3解决方案:其实这个例子用到是ASCII码中对应的数字。

System.out.print((char)(letter + 'A'))

这个是一个数字和一个字符相加,那么就是数字和字符在其ASCII码中的数字相加,并且强行转换为char类型的。 不得不感慨这个方法的构思的精巧。

  • 问题4:书P256 例8.8
if(count == collection.length)
  increaseSize();

这个是什么意思?

  • 问题4解决方案:结合例子后的方法increaseSize()和分析,我才懂得这个是检查当前容量是否达到了容量限制。这样就可以不用担心数组空间不足的问题。

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

  • 问题1:命令行实参例子NameTag不能运行。

  • 问题1解决方案:首先我在IDEA中编译了程序,却输出了异常,原因就是数组中没有元素。 我们需要在命令行下输入参数。
    所以,我切换到虚拟机。但是却发生了找不到类的问题。 这个后来却自己就好了,一直找不到原因。

  • 问题2:虚拟机登录后蓝屏。

  • 问题2解决方案:写博客的时候准备去虚拟机上对代码截图。登入后发现,虚拟机屏幕变蓝。无法进行任何操作。
    尝试了卸载重装(据说重装是神技),结果也不行。
    我一开始在百度上查找虚拟机蓝屏的问题,都是说的在windows下蓝屏的问题。
    然后,我也觉得是无力回天了。突然想到我应该查一下Ubuntu系统下登录后蓝屏的问题。果然有!

    • 首先, 按下Ctrl + Alt + F4 进入一个界面。输入用户名和密码,进入root模式。
    • 然后,需要安装相应的服务然后重置。

sudo apt-get install xserver-xorg-lts-utopic
sudo dpkg-reconfigure xserver-xorg-lts-utopic
reboot

- 如果前面第一个操作有问题,需要重置 dpkg 后再试  `sudo dpkg --configure -a`
- 最后,终于可以了。  
- 这次问题,让我有些理解。**遇到问题,首先应该冷静分析,然后针对问题给出自己的方案,而不是乱用药,这样不过是浪费时间干着急而已。**
参考资料:[Ubuntu 登录后图形化界面蓝屏问题](https://blog.csdn.net/seekn/article/details/78573996)
## [代码托管](https://gitee.com/CS-IMIS-23/GK20172301_JavaProgramming)

上周考试错题总结

  • 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? B
    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--;
    理解:首先验证错误正确与否的最直观的方法就是编程验证一下。
    代码及代码结果如图:

   我错选了C,因为C直观上看上去就是两个if语句并列,然后一个else语句。很符合题意的样子。但是要清楚计算机的语句顺序。计算机不是人,不是你想啥,它也能想啥。它只会死板的认为, else语句是和第二个if配套的,那么题意就完全不同了。无论你输入的正数是多少,最后输出的都是0。
所以,我们做题编程的时候一定要小心谨慎。不要把计算机想象成一个人。要注意计算机语言的格式。就比如:我们用计算机做乘法的时候,数学中是不是可以省略符号,计算机中就不可以,他不可能认为5(4-3)是正确的。所以,我们就应该注意是5*(4-3)

  • 下面哪个选项是关于复选框的正确语句? E
    A。它们可能会被检查或检查。
    B。单选按钮是一种特殊的复选框。
    C。它们是Java组件
    D。你可以控制它们是否可见。
    E。上面所有的
    理解:这道题应该是超纲了吧。不过既然有提到,那我可以看书了解下。
    没怎么看懂吧,只能大致先理解下好了。

  • 如果一个switch语句没有包含任何break语句, E
    A。这是一个语法错误,将生成适当的错误消息。
    B。每次遇到switch语句时,都将执行每个case子句。
    C。这等价于有switch语句总是使用默认子句,如果有的话。
    D。这不是一个错误,但是switch语句中的任何内容都不会被执行。
    E。以上都不是
    理解:switch语句通常情况下应该应用break语句和default语句的,但是也有不加上以上两个语句的情况。所以这个是没有语法错误的。如果没有break语句,接下来,所有后续的子句都将按顺序执行,因为没有中断语句来终止switch/case的执行。
    错选了B,其实B乍一看是好像是没有错误的,但是没有告诉你break语句的位置,应该是执行其余的case语句。

  • The statement if (x < 0) y = x; else y = 0; can be rewritten using a conditional operator as A
    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;
    理解:条件运算符可以作为if-else的缩写语句的缩写形式。
    我们观察选项A和选项C意思是一样的,我错选了C,注意观察,C其实只是一个包含条件运算符的表达式。是不能等同于if-else语句的。

  • 如果s是一个字符串,那么下面的循环会做什么呢?
    for (int j = s.length;j > 0;j——)
    System.out.print(s.charAt(j - 1));
    A。它是向后打印的。
    B。它向前打印。
    C。跳过最后一个字符后,它会向后打印出来。
    D。它是向后打印的,但不打印第0个字符。
    E。它产生一个运行时错误,因为在j=0的时候,s.charAt(j-1)没有字符。
    理解:变量j从字符串长度到1,每次打印出位置j-1的字符。长度为1的字符是第一个字符,这是字符串的最后一个字符。它一直持续到j = 1,并输出位置j - 1或第0字符的字符,以便向后打印整个字符串。

  • The following loop is syntactically valid.
    for (int j = 0; j < 1000; j++) j--; A
    A . true
    B . false
    理解:从逻辑上讲,这个循环没有意义,因为j将不断地递增和递减,这样它就不会达到1000,但是这个循环在语法上并没有错。

结对及互评

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172304

    • 值得学习的或问题:首先,段志轩同学的博客有些简单。博客中问题的解决过程并不是很详细。希望可以给出解决步骤和思路。其次,教材内容总结最好添加一下自己的理解。 博客的排版很好,简洁清晰。这学期,段志轩同学在java上下了很大的功夫,因为我跟他一个宿舍的,有时候,他会敲代码敲到夜里一点多,直到电脑没电了才罢休。在编写项目上他也花费了很多时间思考,和我一起探讨PP8.6的思路。他确实更加勤奋。但是有时候,在代码编写上还是有一些不细心的小错误,希望他以后能够尽量的避免。同时,保持这股学习的干劲,不断努力!

    • 20172328

    • 值得学习的或问题:李馨雨同学的博客内容非常丰富,教材中有自己的理解。她的书上面五颜六色的,标记的都很清楚。她的成绩一直在班里都是名列前茅的。她的问题解决也很详细,有自己的总结博客中修改字体和字体颜色,但是错题正确答案的字体效果不是特别好。希望可以改一下。李馨雨的学习态度也很认真,每周末都泡在图书馆中学习。她对教材的理解和概念理解的非常深刻,希望能与她多交流更好地提高自己。我应该学习她的学习态度,一分耕耘一分收获,付出了多少才能得到多少。

其他(感悟、思考等,可选)

这周在项目上纠结了很长时间,有思路却不知道如何实现。对于例子和概念的理解深度还是不够。下了功夫和没有花时间还是有很大的区别的。同时,在测试上所用的时间较多,一方面是自己的基础理解不扎实,另一方面对翻译后的题意有很大偏差,应该加强英语的学习。commit方面正在逐步改进,总之先要注意往后的格式,之前的再慢慢的进行修改。要保持良好的心态,调整自己的压力,分配好自己的时间。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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
第六周 566/3672 2/7 20/120

参考资料

posted @ 2018-04-15 22:25  奈何明月ઇଓ  阅读(415)  评论(10编辑  收藏  举报
页尾