学号 2017-2018-20172309 《程序设计与数据结构》第六周学习总结
学号 2017-2018-20172309 《程序设计与数据结构》第六周学习总结
教材学习内容总结
-
学会了怎么构建一个简单的数组:
- 定义:数组是一组数据的集合,其中的每个数据称为元素。注意:Java中数组也是对象,其中的元素可以是任意类型,但是同一个数组只能放类型相同的数据。
- 步骤:
- 声明数组类型的引用变量。
//int [] list;
- 用new语句将数组实例化、为他们分配空间并且为每个元素设置默认值。一般为0。//
list=new int[长度]
- 初始化,为每个数据配上合适的值。//
list[0]=1;
list[1]=2;
- 声明数组类型的引用变量。
其实可以一句话解决啦int []list=new int[长度];
-
了解了多维数组:
- 理解:假定某个宾馆有三层,每层有三个房间。
int[][] room=new int[3][3];
只不过数组的索引从0开始- 第三层:|第一间房|第二间房|第三间房|
- 第二层:|第一间房|第二间房|第三间房|
- 第一层:|第一间房|第二间房|第三间房|
- 本质:多维数组可以理解为数组的数组。例如:
{ {1,2,3}, {4,5,6}, {7,8,9} }
- 理解:假定某个宾馆有三层,每层有三个房间。
-
粗略了解了数组的边界:
- 一个数组的索引是从0开始的。假设你设置的长度是5,你想访问最后一个元素,你可以用索引值4来访问。但是如果你用5访问,那就··
错误: ArrayIndexOutOfBountsException。
- 通过数组的
数组名.length
可以获得数组长度。length是数组的一个属性,只能读取、不能修改!
-
数组的copy:
- 书中在例子8.8中,简略的提到了数组的拷贝。书中出现的问题是使用的数组的长度不够,通过把数组的长的翻倍再把数据复制过来的方法把他解决的。
DVD[] temp=new DVD[collection.length*2];//collection是长度不够的那个数组,乘2让他的长度翻倍。 for (int dvd=0;dvd<collection.length;dvd++) temp[dvd]=collection[dvd];
教材学习中的问题和解决过程
- 问题1:对象数组是个什么鬼东西?它于二维数组有什么关系?
- 问题1解决方案:数组是个很奇妙的东西,它里面的数据更奇妙。这个元素可以仅仅就是个元素,还可以是一个对象,注:数组本身也是对象。这个对象还可以包含其他数据。例如:构造一个student类,他的属性包括name和age.
public class Student { private String username; private int age; public Student(String username, int age) { this.username = username; this.age = age; } 后面还有getUsername()、getAge()、toString()方法没写
现在咋们定义两个student对象并且构建一个Student数组。
student s1=student("小明",21); student s2=student("大明",22); String[] student=new String[2];
给数组赋值:
student[0]=s1; student[1]=s2;
用UML图表示:
他与二维数组很相似,相当于上面二维数组例子中的数组中又有数组。
- 问题2:对于这段代码如何理解的:
for(Book myBook : library) System.out.println(myBook);
- 问题2解决方案:这个东西在第六章提到过,于6.4.1中的for-each循环。在上述代码中,他是处理涉及迭代器的问题的。这段代码可以这样理解:对于图书馆中的每一本书,输出他的相关信息。变量mybook依次取得集合中的每一个Book对象的值,而循环体能够相应的处理它他也等价于:
Book myBook; while (bookList.hasNext()) { myBook=bookList.next(); System.out.println(myBook); }
- 问题3:对可变长度参数表是如何理解的?
- 问题3解决方案:
可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。
注意:可变参数必须在后面,当多于一个参数时,必须放在前面如
public static int add(int x,int ...args)
特点:
1.只能出现在参数列表的最后; 2...位于变量类型和变量名之间,前后有无空格都可以; 3.调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数。
代码调试中的问题和解决过程
- 问题1:在做pp8.1的时候,在输出每个数字前面的序号的时候也想使用的像书上的一样,(书中是通过ASCII码输出AZ。)我是想通过ASCII码表输出050,但是做了半天后来别人告诉我ASCII码里只有0~9!!!!
瞬间崩溃
这是书中通过ASCII码输入A~Z的代码。
for (int letter=0;letter<upper.length;letter++) { System.out.print((char)(letter+'A')); System.out.print(":"+upper[letter]); System.out.print("\t\t"+(char)(letter+'a')); System.out.println(": "+lower[letter]); }
输出结果:
A
B
C
...
- 问题1解决方案:最后才发现其实不需要那么麻烦,只需使用
for (int b = 0; b <date1; b++) { System.out.println(); System.out.print(b +": \t\t");
输出结果:
0
1
2
...
- 问题2:在做题pp8.5的时候,出现的麻烦也挺多的。首先题目条件是输入一组数据X1~Xn,这就让我想到了书中的可变长度参数列表,书中给出的例子也是计算一组数据的平均值:
这是代码:
public double average(int ... list)
{
double result =0.0;if (list.length !=0) { int sum =0 ; for(int sum : list) sum+=num; result=(double)sum/list.length; } return result; }
这是方法的使用:
double mean1 = average( 42 , 69 , 97 );
double mean2 = average( 35 , 43 , 45 , 25 , 12 );
但是如果使用这个可变长度参数列表 那么计算平均值的时候已经定义了一个数组,然后计算标准差的时候又得重新输入这个数组!总不可能让用户输入一个输入两次吧!然后我再想也许可以在构建类的时候在实例数据就把这个参数列表定义好,但是!这已经是一个方法,怎么能再放到初始化里呢?
- 问题2解决方案:最后因为对“可变长度参数列表”了解不够透彻,所以还是没用那个东西。
我用的方法是:
public class pp8_5 { public static void main(String[] args) { Scanner scan=new Scanner(System.in); int [] list=new int[50]; //直接构建一个长度为50的数组。 int count=0,sum1=0; //初始化计数变量count=0,总值加起来sum1=0.0 double average=0.0,variance=0.0,sum2=0.0;//初始化 平均数average 标准差variance。 String a="y";//初始化String 变量a为"y" while(a.equalsIgnoreCase("y")&&count<=50)//当用户输入的(y/n)的答案是y时,继续循环。 { System.out.println("Please enter the "+count+"'th number."); list[count]=scan.nextInt();//让用户输入要计算的元素 sum1=sum1+list[count];//把输入的元素加起来。 count++;//用户输入了count个元素 a=scan.nextLine();//消去前面scan.next()留下的回车符 System.out.println("If you want to continue,Enter 'y'! "); a=scan.nextLine();//让用户选择是否继续输入数据(y/n) }
- 问题3:pp8.6做起来也费了不少时间,首先需要编写类(这个类可以直接仿照第四章的来写,只需要把利率改成3%就好)。打多数的麻烦是出现在编写程序这一块的,题目是说有需要构建最多30个储蓄账户信息,我们不可能把这30个一个个的写,所以是运用到对象数组。首先出现的问题是怎么构建一个对象数组:在网上找到这个、被受启发!!他这个是先构建一个类然后创建对象、之后把对象放到数组。但是我们要做的的是一下可能最多构建30对象,因此需要用到循环!
- 问题3解决方案:
我的代码:
这个代码的实现是首先构建一个能够包含30个对象的数组,然后运用循环依次让用户输入账户的用户名、账号、余额。之后输入完一个账户后,让用户选择是否需要输入另一个账户(y/n)。
- 问题4:接着上面的题目,当我输入两个账户的时候,输出却只输出前面一个账户。就是输入n个账户,只输出n-1个账户。如图:
- 问题4解决方法:在上面循环的时候第二次输入账户信息没有赋值给数组,导致那样的错误。虽然是这样的一个小错误,我却用了半下午发现它,因此在以后的编程过程中,必须逻辑紧密、一丝不苟!
代码托管
上周考试错题总结
- 错题1:
正确答案:B 我的答案:C 错误原因:在C选项中,如果x=0的话,它又将给x赋值为零。而题目说的是把它放在一边。
- 错题2:
正确答案:A 我的答案:D 理解情况:break语句只会跳出所在的循环,并执行下一个循环。
-错题3:
正确答案:B 我的答案:A 理解情况:我们也可以用比较运算符比较char类型数据,String类型数据只能用compareTo()、equals()、equalsIgnoreCase()进行比较。
-错题4:
正确答案:E 尽管写这样的switch语句是不寻常的,但它是完全合法的。switch语句执行的常规规则适用于在交换表达式表达式后执行匹配的case子句。在此之后,所有后续的条款都是按顺序执行的,因为没有中断语句来终止开关/案例的执行。
-错题5:
正确答案:A 在Java中,就像在大多数语言中一样,循环语句基本上都是等价的(几乎可以互换)。它们的主要差异(s)与何时评估控制条件以及是否有用于递增/更新的语法有关。
- 错题6:
正确答案:A 我的理解:switch语句是从第一条Case开始匹配,直至停止的语句。
- 错题7:
正确答案:B 正确理解:break用法不是开发必须的。甚至许多开发商认其为不良用法。
其他(感悟、思考等,可选)
这一章看起来挺简单的,其实是有难度的。就像做题,看答案一看就会,但是实际做起来是根本做不来的。在做课后例题的过程中,发现以前的很多代码的格式、用法都有写不出来的情况,所以要抓紧复习以前的内容。
点评过的同学博客和代码
- 本周结对学习情况
- 20172310
- 结对学习内容:
- 对课本中的例子进行学习、练习、总结,并对其进行了系统的概述。
- 课后习题经过了深刻的思考,对出现的问题进行了深刻的反思。
- 对上周的错题进行了反思与总结,并对错题结合课本内容给出了详细的分析。
- 值得学习的地方:
- 概述内容认真负责,对课本有疑问的地方给出了详细的解释。
- 敲代码过程中出现了问题自己愿意尝试并给予记录。
- 在写感受的板块进行了深刻的反思且给出了解答。
- 截的图色彩充分、
可以看出来10号同学很有艺术细胞!!
- 值得改进的地方:
- 排版不够精细、给人感觉就是字多的感觉。
- 参考资料记录不够详细、敢问你只查了这么多资料?
- 代码行呈波形!
最近有点松懈啊
- 互评情况:
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 075/200 | 1/1 | 05/20 | |
第二周 | 560/500 | 1/2 | 13/38 | |
第三周 | 972/1000 | 1/4 | 21/60 | |
第四周 | 694/1666 | 1/5 | 21/90 | |
第五周 | 1544/3095 | 1/6 | 30/90 | |
第六周 | 600/3627 | 1/7 | 30/120 |