1. 程式人生 > >20172317 2017-2018-2 《程序設計與數據結構》第二周學習總結

20172317 2017-2018-2 《程序設計與數據結構》第二周學習總結

intern tchar error second efi 中比 demo ins 新建

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?我不是在前面聲明了變量了?正當躊躇時突然有了一個主意,把代碼改成了下面這樣:

    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);
       }
    }
    問題便解決了。這裏在最開始代碼是先執行c=a+b,後給a和b賦值,我估計由於沒有先給a,b賦值就直接進行運算會導致c不能正常被算出來;而後面是先給a,b賦值再運算c=a+b,這時候因為a,b已經有了一個具體的值,所以才能算出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解決方案:當時代碼大致是寫成了這樣:

    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);
       }
    }
    唔...然後就輸出了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,實在是搞不懂了....
  • 問題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小時

  • 改進情況:因為其他七八百節課的原因,所以感覺學習時間比上周少了不少,然而任務還是基本完成了,看來效率有所提升,可喜可賀

參考資料

  • 《Java程序設計與數據結構教程(第二版)》

  • 《Java程序設計與數據結構教程(第二版)》學習指導
  • 維基百科上關於第四代語言
  • 實驗樓的java課程

20172317 2017-2018-2 《程序設計與數據結構》第二周學習總結