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運算符中,索引運算符“[]”有最高的優先級。
- 元素類型[] 數組名 = new 元素類型[元素個數或數組長度];
-
對象數組:
實例化對象數組只是為了保存對象引用而預留空間,對每個數組元素所代表的對象必須分別 實例化 。
- 命令行實參: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) |

上周考試錯題總結
- 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,但是這個循環在語法上並沒有錯。
結對及互評
點評過的同學博客和代碼
- 本周結對學習情況
-
值得學習的或問題:首先,段志軒同學的博客有些簡單。博客中問題的解決過程並不是很詳細。希望可以給出解決步驟和思路。其次,教材內容總結最好添加一下自己的理解。 博客的排版很好,簡潔清晰。這學期,段志軒同學在java上下了很大的功夫,因為我跟他一個宿舍的,有時候,他會敲代碼敲到夜里一點多,直到電腦沒電了才罷休。在編寫項目上他也花費了很多時間思考,和我一起探討PP8.6的思路。他確實更加勤奮。但是有時候,在代碼編寫上還是有一些不細心的小錯誤,希望他以后能夠盡量的避免。同時,保持這股學習的干勁,不斷努力!
-
值得學習的或問題:李馨雨同學的博客內容非常豐富,教材中有自己的理解。她的書上面五顏六色的,標記的都很清楚。她的成績一直在班里都是名列前茅的。她的問題解決也很詳細,有自己的總結。博客中修改字體和字體顏色,但是錯題正確答案的字體效果不是特別好。希望可以改一下。李馨雨的學習態度也很認真,每周末都泡在圖書館中學習。她對教材的理解和概念理解的非常深刻,希望能與她多交流更好地提高自己。我應該學習她的學習態度,一分耕耘一分收獲,付出了多少才能得到多少。
其他(感悟、思考等,可選)
這周在項目上糾結了很長時間,有思路卻不知道如何實現。對於例子和概念的理解深度還是不夠。下了功夫和沒有花時間還是有很大的區別的。同時,在測試上所用的時間較多,一方面是自己的基礎理解不扎實,另一方面對翻譯后的題意有很大偏差,應該加強英語的學習。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 |
