阿群的CS50上課全記錄week1(1)-Compile、C語言、型別

Week1上課的內容除了延續上周使用的scratch基本概念之外,開始進入正式的程式語言語法與撰寫,不過一樣上課內容主要還是概念性的去提到從各種程式語言轉入機器語言當中的知識以及介紹各種型別。有趣的部分還是集中在作業上面。

這週重點我會放在溢位(overflow)、浮點數不精確性(floating-point imprecision)等兩個名詞的解釋上,以及作業的解釋、條列出幾種我想到和朋友助攻的作業解答。

一樣,課後重點整理其中一個重要的部分就是替上課內容下標題,再依序理順上課當中的重點以及自己的想法。儘管有些死板但是維持了基本的條理。

  1. C語言
  2. 編譯
  3. Function
  4. Overflow、Floating-point imprecision

    C語言

    在稍稍提到上周的scratch後開始介紹C語言。由最初始的Hellow world逐步寫出程式的架構和功能。這邊我一直很猶豫要怎麼整理比較好,本來是想跟程式教學書籍一樣,但是這樣會介紹太多和課程內容不相關的東西,而且會很冗長,所以最後還是決定就照課程內容去整理就好。許多的語法像是括號我就不做太多著墨,主要放在常用的語法像是if、for上。

    • if-else

      了解程式最簡單的方式就跟學外文一樣用例句來記憶更直接,所以直接上一個sample code :

      if(i < 50) {
          printf('i < 50');
      } else if(i > 50) {
          printf('i > 50')
      } else {
          printf('i = 50');
      }
      1. if括號的內容稱之為條件式,意思為當括號內容成立時,執行下列動作
      2. else if表示若前述條件不成立但以下條件成立時,執行下列動作
      3. else表示若上述條件皆不成立時,則執行下列動作
    • while loop

      while(value)                        //當條件為true時進行框內動作
      {
          printf("hello, world!\n");      //於terminal中印出hello, world!並換行
      }

      話說註解程式碼其實是一個挺重要的習慣,除了命名規則統一之外,註解能打就盡量打,因為當程式架構越來越大時,忘記一些之前寫過的小功能是非常正常的事情...。

      while迴圈顧名思義,即是“當...就...”的意思,由一個條件來決定是否要進行框內的動作。範例中的value代表了一個布林值(boolean value)*,當布林值為真則進行動作,反之則跳過此一迴圈。

    • do-while loop

      do
      {
          printf('Hello, world!!\n');
      } while(value)

      和while類似,差別在於條件判斷的先後,while是先判斷,條件符合再持續進行某個行為直到條件不被滿足。do-while則是先進行某個動作,再判斷是否繼續或跳出迴圈。

    • for loop

      for (int i = 0; i < 50; i++)
      {
          printf("Hello, world!")
      }

      for迴圈是從n開始,每做一次n就加1直到指定數字為止。從sample code來逐步翻譯就是:

      1. 宣告一個int型別的i並定義其值為0 int i = 0
      2. 判斷i是否不小於50,若i為50後跳出for迴圈,從0~49總計50次 i<50
      3. 每做一次i就加1 i++

      當然其中做的事情有很多,包含判斷是否繼續執行的判斷式以及累加等等。

    Compile

    編譯器是一個將人類可以理解的語言,轉為機器可以執行的動作。反過來說機器執行所呈現的0和1人類無法閱讀,同樣的for、if、while等等機器也同樣無法理解。因此可以把編譯器想像為一個翻譯器,讓電腦能夠理解指令並且執行。 要注意的一個地方在於高階語言當中會有所謂編譯器蜜糖(Compiler sugar)的問題存在,有興趣了解的可以看這篇對於編譯器蜜糖的詳細解釋。這是很有名的學習網站良葛格的學習筆記。網站內容豐富有很多學習資源可以利用。

    Function

    直接照翻就好:功能。 簡單來說剛剛用到的printf 就是一個功能。根據不同的輸入進行不同或是相同的動作。function可以有回傳值也可以沒有。

    int plus(int a, int b) {        //輸入兩數
        return a + b;               //相加後回傳
    }
    
    int square(int a) {             //輸入數值
        return a * a;               //平方後回傳
    }
    
    void sayHello(int x) {          //void代表此function沒有回傳值,僅執行動作
    
        for (int i = 0; i < x; i++) {
            printf("hello");
        }
    }
    

    在主程式前進行宣告後可以直接運用到main當中。

    int plus(int a, int b);
    int square(int a);
    main(void){
        int x = 10;
        int y = 15;
    
        int plusAnswer = plus(x, y);
        int squareAnswer = sqare(x);
    
        printf('x= %i  y= %i\n', x, y);
        printf('x + y = %i', plusAnswer);
        printf('x^2 = %i', squareAnswer);
    }
    

    以上,plus和square以及sayHello就是function。

留言

這個網誌中的熱門文章

[Android][功能] 倒數計時