20172308《程序设计与数据结构》第六周学习总结
20172308 2017-2018-2 《Java程序设计》第六周学习总结
教材学习内容总结
数组
1.保存元素个数预定义,数组是必须实例化的对象,声明后大小不可变。
2.数组保存的可以是基本数据类型,对象(包括自己编写的),数组也可以作为参数
3.数组的参数可以用方法变成可变长度参数,也可以通过命令行输入。
4.二维数组:int[][]
教材学习中的问题和解决过程
-
问题1:可变长度参数表。书上的做法是把他写成一个方法,然后调用这个方法的时候,在参数里可以写任意多个参数,然后存储到数组里面。然而我觉得这个方法是挺好的。不过在做后面习题的时候觉得有点不够用了。有一题是要输入一组整数然后求平均数与方差。对于我来说,让我最困扰的是要输入多少个数字是不确定的。也就是说你要有一个办法在你想要结束输入数字的时候,结束,然后将输入过的所有数字用于计算。我一开始的想法是:做一个嵌套循环,在你每一次输入完数字后都会提醒你是否结束输入,然后判断是否继续外面的循环或跳出循环。但是没能实现(在下面的代码调试中具体说明)。于是就想到了书上的命令行实参和可变长度参数表。第二个思路就是利用这两个,在运行时的命令行后面直接加上数字。当然也没那么容易:命令行实参是程序对args数组的引用,写法为“args[索引]”。这就有个问题,你能输入多少个数字是程序里预先写好的,可以超出写好的个数(保存在数组中,但程序会忽略)。那对于这个题就没意义了。本以为可以结合可变长度参数表(真是完美的组合!),但实际上是书上把他写进方法里,在驱动程序里写参数,而不是直接使用的,也尝试了一下,不行。
-
问题1解决方案:也就是对于这个题目,上述的第二种思路是解决不了的(我的尝试是这样的)
-
问题2:为什么数组的索引值从0开始?
-
问题2解决方案:百度。书上的解释是,从计算方法上看,“访问第一百个元素与第一个元素一样简单”。不过在我看来是“访问第一个元素与第一百个一样困难”。于是百度的一篇cenalulu的MySQL博客有较详细的介绍:
最重要的是“历史原因”,再有就是0的标号写法可以节省编译时间,可以更优雅的表示数组字串(不用+1什么的,差1错误) -
问题3:书上的一道例题是要找出用户输入的字符串中的大小写字母,并计算出出现次数
-
问题3解决方案:通过分析和参考了其他同学的博客,理解这个例题的做法:
首先这个程序是通过将字符和Unicode字符集对应相对字符的位置,还有循环,从而把大小写的26字母打印出来的。然后用charAt把相应的字符拿出来,把它作为数组的索引,出现一次,就加1,从而达到计数的目的。
代码调试中的问题和解决过程
-
问题1:课后习题PP8.5。一开始的思路是如图:
首先是将输入的数字付给num1,再把num1存在数组里,当然也可以直接存在数组里,我这样做是为了测试会不会阻断循环时的输入(结果确实是的)。输入完数字之后会接着要输入y/n,这就是为了作为是否结束输入的依据,即是否结束循环。按道理来说,如果我输入的是“n”,也就是“judge==n”成立,应该接着循环,提示输入数字才对啊,然而事实是直接结束循环。 -
问题1解决方案:我也尝试了不同的语句,比如在循环里面用判断语句,或是再嵌套一个循环,结果都是只能循环一次。如图:
这里还有一个问题就是:一开始我声明的对象只有scan一个,然后用他进行了两次输入,这是不行的(会直接结束,无法输入),要两个对象,各自调用方法。
【更新】经过我不懈的努力,最终让程序的结果符合了预期:如图
所做的修改只有画横线一处,把原先的相等性运算符“==”改成了方法equals,程序是正常运行了。但还有一个疑问就是,其实这两个是等价的吧,为什么前面的那个不行呢?
这里还有一个要记录的,数组的方法.length是数组的长度,而不是已经有了多少输入保存进去的数据(害我平均数总是算不对)
还有一个不完美的地方就是:依照题目的意思输入的输入的数不能超过50,这就导致了最后输出数组中值的时候,会把没输的值全部是0输出出来。 -
问题2:课后习题8.1。首先最大的问题是,题目要求的是0~50内的任意多个整数,也就是说我要输入一万个值进去也行,然而数组容纳的元素个数是定好的,总不能真写一万吧。最后打印的话岂不是要打印一万个数字出来?而且问题是我无法做到统计每个数字出现的次数
-
问题2解决方案:这个问题想了很久没有想出来。最后参考了蒋子行同学的代码,不禁感叹蒋子行同学真的是很厉害啊。本来是想参考一下有个思路,最后发现差不多是抄下来了,因为他写的代码真的简洁,很厉害。代码如图:
一开始我的做法是,一个一个的向索引处存值,然后就没有然后了,因为真的不知道怎么去统计。
参考了蒋子行同学的代码(跟书上的例题一样,不过当时的例题没看懂,这下理解了):
把输入的值作为数组的索引,每输入一次就加一,这样就解决了统计次数的问题。
另外一点就是用的continue语句,把数组内其它没输满的数字(初始化为0),去掉。这样就达到了只打印出已输入的数值出现情况。
代码托管
上周考试错题总结
-
错题1:
-
错题1解析:最内层的循环(在示例中是for循环)被破坏,并且在for循环结束后继续执行。
-
错题2:
-
错题2解析:这适用于int、short、byte、long、char和boolean,而不是double或float变量。如果两个双变量x和y正在被测试,(x == y)只有当它们恰好等于最后一个小数点时才是正确的。相反,比较这两个值是很常见的,但是允许在值上有细微的差别。
-
错题3:
-
错题3解析:尽管应该避免使用continue语句,但如果可能的话,可以在Java的三个循环中使用它们:for、while和do-while。
-
错题4:
-
错题4解析:Java测试的条件操作符在本例中为条件(x < 0),如果为真,则返回值后的值?(本例中为x),如果为false,则返回:(在本例中为0)。原始的if语句是将y赋给x (x < 0)和0。这将通过将y赋值为x或0 (x < 0)来完成,如a在B中所示,x被赋值为y或0,这是向后的。在C中,条件操作符是语法无效的。在D中,根据(x < 0), y将被设置为true或false,而E中的语句在语法上是无效的。
-
错题5:
-
错题5解析:变量x从10开始。每个循环通过循环,x递减,循环最后退出,一旦x不再大于0,在这个例子中,当x变成0。所以循环体执行x = 10, x = 9, x = 8,下面是x = 0。这是11倍。
-
错题6:
-
错题6解析:变量j从字符串长度到1,每次打印出位置j-1的字符。长度为1的字符是第一个字符,这是字符串的最后一个字符。它一直持续到j = 1,并输出位置j - 1或第0字符的字符,以便向后打印整个字符串。
-
错题7:
-
错题7解析:这个循环初始化j到0,并将其与1000进行比较,但是在每次循环迭代之后都不会改变。在实际中,循环将会随着运行时错误而终止,最终当我变得太大时,一个值存储在内存中,但逻辑上,这是一个无限循环。
-
错题8:
-
错题8解析:诚然,while循环可以是无限循环,但Java for-loop也可以是无限循环。在许多其他编程语言中,for循环都有一个开始和结束点,但是Java for循环比大多数其他语言的for循环要灵活得多。
结对及互评
-
博客中值得学习的或问题:
- 侯泽洋同学的博客排版工整,界面很美观
- 问题总结做得很全面
- 对于书上的疑惑总会想办法解决它,这种探索的精神值得我去学习
-
代码中值得学习的或问题:
- 对于编程的编写总能找到角度去解决
-
本周结对学习情况
- 20172302
- 结对学习内容
- 第八章内容
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 309/309 | 1/1 | 20/20 | |
第二周 | 269/578 | 1/2 | 18/38 | |
第三周 | 236/776 | 1/3 | 22/60 | |
第四周 | 507/1283 | 2/5 | 30/90 | |
第五周 | 631/1914 | 1/6 | 30/120 | |
第六周 | 529/2443 | 1/7 | 25/145 |