C++ 基礎

tags: C++ 基礎語法
最後修訂:2023/09/06

前言


C++ 基礎

  • 程式框架

    • C++程式是函數的集合,其中 main() 函數是程式的起始函數
    • C++的框架
    ​​​​//引入C++所有宣告 ​​​​#include <bits/stdc++.h> ​ ​​​​//使用標準函數庫 ​​​​using namespace std; ​​​​ ​​​​/* 多行註解範例 ​​​​ * main() 是 CPP 程式的起始函數 ​​​​ * int 表示函數執行完畢會回傳一個整數 ​​​​ */ ​​​​int main() ​​​​{ ​​​​ //你的主程式碼在這裡 ​​​​ ​​​​ //一般而言,傳回0,表示程式正常執行完畢 ​​​​ return 0; ​​​​}
  • C++資料的型別

    • C++ 是強型別語言,所以,宣告變數都要標註型別。
    • 基礎型別
      • bool 布林
      • char 字元
      • int 整數
      • float 單精確度浮點數 (浮點數等同於數學中的實數)
      • double 雙精確度浮點數
    • 物件型別
      • string 字串
    • 修飾詞
      • unsigned 無正負符號,這個會增加表示最大數字的範圍
      • long long 長,這個會增加配置給變數的記憶體
        • int:整數,4 bytes,可以表示
          231
          ~
          2311
        • unsigned int:無負數整數,4 bytes,可以
          0
          ~
          2321
        • long long int:長整數,8 bytes,可以表示
          263
          ~
          2631
  • 常數與變數

    • 字元常數
      • \b 倒退字元
      • \t Tab字元
      • \n 換行字元
      • \r 歸位字元(歸位就是到每列的列首)
    • 變數
      • C/C++ 中所有變數都要宣告後才能使用。
      • 對於基礎型別而言,宣告未初始化,其值為未知。
      ​​​​​​​​int n; //宣告一個整數變數,但未初始化,其值為未知。 ​​​​​​​​int n = 0; ////宣告一個整數變數,並初始化為0。
  • C/C++ Input/Output

    • C 的 I/O 函數
      • 輸出 printf
        格式化字串可以用的符號
        • %c 字元
        • %d 10進位數字
        • %o 8進位數字
        • %x 16進位數字
        • %f 浮點數
        • %p 指標位址
        • %s C的字串
        • %e 科學記號
      • 輸入 scanf
    ​​​​#include <bits/stdc++> ​​​​ ​​​​using namespace std; ​​​​ ​​​​int main() ​​​​{ ​​​​ int year = 2023; ​​​​ double pi = 3.1415926; ​​​​ ​​​​ printf("今年是 %d 年\n", year); //2023 ​​​​ printf("今年是 %10d 年\n", year); // 2023 ​​​​ ​​​​ printf("Pi是 %.2f\n", pi); //3.14 ​​​​ printf("Pi是 %10.4f\n", pi); // 3.1416 ​​​​ ​​​​ int n = 0; ​​​​ scanf("%d", &n); ​​​​ printf("%d \n", n); ​​​​ ​​​​ return 0; ​​​​}
  • 基礎語法

    • 判斷敘述(if)
      範例:按照分數轉換成優、甲、乙、丙、丁 (範例中未檢核分數範圍)

      ​​​​​​#include <bits/stdc++.h> ​​​​​​using namespace std; ​​​​​​ ​​​​​​int main() ​​​​​​{ ​​​​​​ int n = 0; ​​​​​​ cin >> n; ​​​​​​ ​​​​​​ if (n >= 90) ​​​​​​ cout << "優" << endl; ​​​​​​ else if (n >= 80) ​​​​​​ cout << "甲" << endl; ​​​​​​ else if (n >= 70) ​​​​​​ cout << "乙" << endl; ​​​​​​ else if (n >= 60) ​​​​​​ cout << "丙" << endl; ​​​​​​ else ​​​​​​ cout << "丁" << endl; ​​​​​​ ​​​​​​ return 0; ​​​​​​}
    • 重覆敘述(for)
      範例:列出字串中每個字元的ASCII碼

      ​​​​​​​​//C++ 是強型別語言,所有變數均須指定其資料型別 ​​​​​​​​#include <bits/stdc++.h> ​​​​​​​​using namespace std; ​​​​​​​​ ​​​​​​​​int main() ​​​​​​​​{ ​​​​​​​​ string s = "Today is a good day."; ​​​​​​​​ for (int i=0; i<s.length(); i++) ​​​​​​​​ { ​​​​​​​​ cout << s[i] << " = " << (int)s[i] << endl; ​​​​​​​​ } ​​​​​​​​ return 0; ​​​​​​​​}
    • 重覆敘述(while)
      範例:利用輾轉相除法,求給定兩正整數之最大公因數

      ​​​​​​​​#include <bits/stdc++.h> ​​​​​​​​using namespace std; ​​​​​​​​ ​​​​​​​​int main() ​​​​​​​​{ ​​​​​​​​ int a = 28, b= 30; ​​​​​​​​ int r = a % b; ​​​​​​​​ while (r != 0) ​​​​​​​​ { ​​​​​​​​ a = b; ​​​​​​​​ b = r; ​​​​​​​​ r = a % b; ​​​​​​​​ } ​​​​​​​​ cout << "gcd=" << b << endl; ​​​​​​​​ ​​​​​​​​ return 0; ​​​​​​​​}
    • 重覆敘述(dowhile)

      do..while 敘述類似於 while 敘述,差別在 dowhile 敘述,迭代部分至少執行1次,while 則可能為0次。

      範例:猜猜看下面的範例是 1+2++9 或 1+2++10 ?

      ​​​​​​​​#include <bits/stdc++.h> ​​​​​​​​using namespace std; ​​​​​​​​ ​​​​​​​​int main() ​​​​​​​​{ ​​​​​​​​ int s=0, i=1; ​​​​​​​​ do ​​​​​​​​ { ​​​​​​​​ s += i; ​​​​​​​​ i++; ​​​​​​​​ } while (i < 10) ​​​​​​​​ ​​​​​​​​ cout << "s=" << s << endl; ​​​​​​​​ ​​​​​​​​ return 0; ​​​​​​​​} ​​​​​​​​
    • 陣列與重覆敘述
      範例:計算整數陣列元素的總和及平均數

      ​​​​​​​​#include <bits/stdc++.h> ​​​​​​​​#include <cstdlib> ​​​​​​​​using namespace std; ​​​​​​​​int main() ​​​​​​​​{ ​​​​​​​​ int len = 10; ​​​​​​​​ int n[len] = {15, 20, 85, 42, 87, 14, 8, 6, 17, 22}; ​​​​​​​​ int sum = 0; ​​​​​​​​ for (int i=0; i<len; i++) ​​​​​​​​ { ​​​​​​​​ sum = sum + n[i]; ​​​​​​​​ } ​​​​​​​​ cout << sum << endl; ​​​​​​​​ cout << sum*1.0/len << endl; ​​​​​​​​ ​​​​​​​​ //用 C 的 printf 顯示小數點以下2位 ​​​​​​​​ printf("%.2f", sum*1.0/len); ​​​​​​​​ return 0; ​​​​​​​​}
  • 資料型態轉換

    • 字串與數值資料互轉 C++11 開始支援
      ​​​​​​#include <bits/stdc++.h> ​​​​​​using namespace std; ​​​​​​int main(int argc, char **argv) ​​​​​​{ ​​​​​​ //字串轉整數 ​​​​​​ string s1 = "456"; ​​​​​​ int num1 = stoi(s1); ​​​​​​ cout << num1 << endl; ​​​​​​ //字串轉浮點數 ​​​​​​ string s2 = "3.14159"; ​​​​​​ double num2 = stod(s2); ​​​​​​ cout << num2 << endl; ​​​​​​ ​​​​​​ //轉換函數還有 ​​​​​​ // stol 轉換為 long int ​​​​​​ // stoul 轉換為 unsinged long int ​​​​​​ // stoll 轉換為 long long int ​​​​​​ // stoull 轉換為 unsinged long long int ​​​​​​ // stof 轉換為 float ​​​​​​ // stold 轉換為 long float ​​​​​​ ​​​​​​ //整數轉字串 ​​​​​​ int num3 = 789; ​​​​​​ string s3 = to_string(num3); ​​​​​​ cout << s3 << endl; ​​​​​​ //浮點數轉字串 ​​​​​​ double num4 = 1.618; ​​​​​​ string s4 = to_string(num4); ​​​​​​ cout << s4 << endl; ​​​​​​ ​​​​​​ return 0; ​​​​​​}
    • 字串與數值資料互轉 C的字串
      ​​​​​​#include <bits/stdc++.h> ​​​​​​using namespace std; ​​​​​​int main() { ​​​​​​ //C 的字串,是字元的集合,最後一個字元是 '\0' ​​​​​​ char str1[80] = "123"; //實際上是 4 個字元,最後一個是 '\0' ​​​​​​ // 用 strlen() 取得字串長度 ​​​​​​ cout << strlen(str1) << endl; //3 ​​​​​​ //字串相加 ​​​​​​ char str3[80] = "abc"; ​​​​​​ strcat(str3, "def"); ​​​​​​ cout << str3 << endl; //abcdef ​​​​​​ // 字串轉整數 ​​​​​​ int n = atoi(str); ​​​​​​ cout << n << endl; //123 ​​​​​​ // 字串轉浮點數 ​​​​​​ char str1[80] = "1.68"; ​​​​​​ double d = atof(str1); ​​​​​​ cout << d << endl; ​​​​​​ // 整數轉字串 ​​​​​​ int n1 = 123; ​​​​​​ char str2[80]; //字串長度要夠,否則就會溢位 ​​​​​​ sprintf(str2, "%d", n1); ​​​​​​ cout << str2 << endl; ​​​​​​ // 浮點數轉字串 ​​​​​​ double n2 = 3.14; ​​​​​​ sprintf(str2, "%f", n2); ​​​​​​ cout << str2 << endl; ​​​​​​ return 0; ​​​​​​}
    • C 與 C++ 字串互轉
      ​​​​​​#include <bits/stdc++.h> ​​​​​​using namespace std; ​​​​​​int main() ​​​​​​{ ​​​​​​ // C 的字串,是字元的集合,最後一個字元是 '\0' ​​​​​​ char str1[80] = "That is a good game."; ​​​​​​ // C++ 的字串,封裝成物件,也是字元的集合。 ​​​​​​ string str2 = "Let's play the game."; ​​​​​​ // C 字串轉換為 C++ 字串 ​​​​​​ string str3 = string(str1); ​​​​​​ // C++ 字串轉換為 C 字串 ​​​​​​ // 轉換為「指向常數字元」的指標,也就是指向的字元是不能改變的 ​​​​​​ const char *str4 = str2.c_str(); ​​​​​​ // C 和 C++ 字串相加 ​​​​​​ char str5[80] = "Today "; ​​​​​​ char str6[80] = "is "; ​​​​​​ string ss = "a good day."; ​​​​​​ // C 字串無法直接相加,因此下面的寫法是錯的 ​​​​​​ // string str8 = str5 + str6 + ss; ​​​​​​ string str8 = str5 + ss + str6; //這樣可以 ​​​​​​ string str9 = string(str5) + str6 + ss; //這樣也可以 ​​​​​​ string str10 = ss + str5 + str6; //這樣當然也可以 ​​​​​​ //這樣行不行呢? 你先猜猜看,然後再試試看,印證你的想法 ​​​​​​ string str11 = str5 + string(str6) + ss; ​​​​​​ return 0; ​​​​​​}

進階閱讀資料