2016年6月2日 星期四

給新手的C++教學 (上冊) - 13. 額外語法 (Extra syntax)

回到「給新手的C++教學 (上冊)」



上一章

(本章為計劃外熱情追加,預計在資訊奧林匹亞國際賽結束後 (8/26) 開始撰寫 (但仍不確定當天是否立即有空),但仍然隨時接受讀者的任何建議)
本章將補足前面的教學為了簡化觀念而省略的知識和用法
雖然不一定必要,但是在某些情況下對寫程式的我們來說會帶來驚人的便利性!
基本上,如果前面的章節都看完了,相信對於本章的學習會有很大的加速效果!
公告:上大學後突然變得很忙,不得已將暫緩教學撰寫 (還是會寫的,只是進度會很慢很慢......),請有意學習某語法 (有標星號的篇章為主) 的讀者在本文下方留言,小莫將優先撰寫該篇教學
另外,有任何問題或建議也要提出哦,這個小莫就有空處理了XD


1. 「註解」的使用
2. 編譯參數的建議設定
3. 進階型別的介紹
4. 指定輸出格式
5. 陣列就是指標,指標就是陣列
6. 更彈性的取得和釋放記憶體
7. 中文字元字串的處理
8. 簡易的檔案處理
9. 進階的檔案處理
10. 轉型
*. 內建常數和自訂常數 (防止某些bug不小心產生)
*. 全域變數 (壞習慣(?))
*. 靜態變數 (使用static記憶體的變數)
*. 進階運算子 (++、--、三元運算子、位元運算子、......之類的)
*. 用逗號代替煩煩的大括號 (覺得大括號很煩的時候特別好用(?))
16. 函式的遞迴
*. 「switch」的用法 (覺得if很煩的時候特別好用(?))
*. 「continue」的用法 (好像絕大部份都可以用if來取代continue(?))
*. 建構子和解構子 (某種出生和死亡的概念)
*. 結構的方法 (就是「結構裡面的函式」啦)
*. 「class」的用法 (指標化的升級版struct)
*. 當指標碰上結構 (就是「->」啦)
*. 函式引數的「&」用法 (參照)
*. 「namespace」的用法 (如果你的struct或class只需要使用一次的話......)
25. 「新版C++」--「C++11」的好用功能

下一章 (這是最後一章)

感謝:
(版權所有 All copyright reserved)

25 則留言:

  1. 回覆
    1. 哈囉~
      請問您的意思是想要學習struct嗎?還是想要更深入學習相關的進階語法呢?(建構解構子、方法、class、...)
      關於struct的基本概念在這裡有提到哦~

      刪除
  2. 函式的遞迴
    「switch」 「continue」的用法

    回覆刪除
    回覆
    1. 好的 ^_^
      但小莫最近很忙,可能要等一下哦~

      刪除
  3. 想要學C++的資料結構
    像包裝class等等的

    回覆刪除
    回覆
    1. 好的 ^_^
      但這真的需要時間,請耐心等候哦~

      刪除
  4. 請問小莫會其他程式像java或python嗎?
    不知道可不可以寫教學呢XD

    回覆刪除
    回覆
    1. 其實原本有考慮耶
      但小莫實在有太多其他的事想要做了
      而撰寫這種教學......其實說真的頗花時間的,每一篇可能都是2~4個小時以上的功夫XD
      現實面來講,小莫的生活、課業等等也是要顧一下的哈哈,繼續把時間耗在這裡就完蛋啦XDD
      而小莫撰寫這系列教學的動機呢主要就是看到身邊的學弟妹讀著許多號稱「入門」的教學書,因為看不懂而苦惱著,而書上寫的內容許多重要的觀念都是隨便帶過,甚至書上附的code都沒有測試過,很多都有錯誤而無法編譯,實在無法接受,憤而撰寫「給新手的C++教學」XD
      所以本教學的目的主要是帶領新手輕鬆入門哦~
      其他程式語言的觀念也是類似
      C++的基本觀念懂了,相信學習其他程式語言也會很快的,加油!;)

      刪除
  5. 想問一下
    要求字串或陣列長度時
    strlen(str)跟str.length()有甚麼差別呢
    不太懂這兩個的用法
    能否舉例一下呢

    回覆刪除
    回覆
    1. 這裡先假設您的str的型別為string(而非char*)
      回傳的數值一樣,但建議用str.length()
      因為strlen(str)的時間複雜度為O(N)(N為字串長度)
      而str.length()只需要O(1)

      刪除
    2. 那若char型別的話是不是就只能用strlen(str)呢?

      刪除
  6. 我想寫一個乘法的程式
    但是似乎一直有錯誤
    不知道哪裡錯了呢

    void Product(char a[], char b[], char c[])
    {
        int i, j;
         for (i = 0; i < MAX/2 && a[i] != 0; i++)
        {
            for (j = 0; j < MAX/2 && b[j] != 0; j++)
            {
                c[i+j] += (a[i] - '0') * (b[j] - '0');
            }
        }
        
        for (i = 0; i < MAX; i++)
        {
            if (c[i] > 9)
            {
                c[i] += c[i] / 10;
                 c[i] = c[i] % 10;
            }
            c[i] += 48;
        }
    }

    回覆刪除
    回覆
    1. 哈哈小莫沒這麼多時間幫別人Debug啦抱歉XD
      另一方面,Debug也是身為一個程式設計師必備的能力
      加油!^_^

      刪除
  7. 不知道小莫有沒有推薦好讀的網站或書是介紹class跟operator overloading的呢

    回覆刪除
    回覆
    1. 小莫主要是寫競賽題目,想不出來,去查題解或程式碼,在大神的程式碼中看到以往沒用過的語法,仿效學會的哦~
      所以,這方面還無法給神麼建議啦抱歉XD

      刪除
  8. 如果想要用fscanf讀測資的話
    要輸入哪些code呢
    不會fscanf的用法QQ

    回覆刪除
    回覆
    1. 可以參考進階檔案處理這篇哦~
      然後把fscanf當scanf來用XD

      刪除
  9. 不好意思我想請問一下
    gets(非getchar)是只能用在陣列嗎?
    字串或字元不能用嗎?
    如果用string形態要怎麼用gets跟puts呢?
    能否舉例一下
    謝謝~~

    回覆刪除
    回覆
    1. #include <iostream>
      #include <cstring>
      using namespace std;
      int main(int argc, char **argv)
      {
          string str;
          puts(gets());
          return 0;
      }


      #include <iostream>
      #include <cstring>
      using namespace std;
      int main(int argc, char **argv)
      {
          string str;
          gets(str);
          puts(str);
          return 0;
      }

      試了兩種都不對QQ

      刪除
    2. 是的,gets和puts只能用在char陣列哦~
      string可以用getline(s)和puts(s.c_str()),或者使用C++提供的cin/cout

      刪除
  10. 請問一下sizeof()跟strlen()有什麼差別呢?
    如果未指定陣列長度
    sizeof()是會讀到最後的\0嗎?

    我寫了一個
    string a = "ABC";
    cout << a;
    結果輸出8
    請問是為什麼呢?!

    回覆刪除
    回覆
    1. 1) string::size()是回傳string的長度喔
      2) 我們合理相信原始code是這樣:
      int a = 8;
      {string a = "ABC";}
      cout << a;

      刪除
    2. 沒有欸
      我沒有寫int a = 8

      而且好像不論string字串長度
      sizeof(string)都是8

      刪除
    3. 因為string本身紀錄的是指標資訊,所以sizeof會取到「飛鏢」的大小,而不是「箭靶」的大小哦~(指標和箭靶的類比請參考這篇)

      刪除

歡迎留言或問問題~
若您的留言中包含程式碼,請參考這篇
如果留言不見了請別慌,那是因為被google誤判成垃圾留言,小莫會盡快將其手動還原