C++程式設計入門
1-開發環境
2-變數與輸入、輸出
2.1 輸出
使用 cout 輸出資料 在 Code::Blocks 裡建立一個專案後,它會自動產生這樣一個程式架構。 #include <iostream> using namespace std; i...
2.2 變數與輸入
像 1, 24, 3.14 這樣的數,我們稱為 字面常數(literal constant),它的值是固定不變的。 另外像我們在數學代數中用到的 x, y, z 等,則稱為 變數 ,它的值可以改...
2.3 運算子與運算優先順序
在掌握了基本輸入、輸出之後,我們已經具備「將資料讀進電腦」,「將處理後資料送回外界」的能力,接下來重點就是中間的「處理」,也就是運算的部分。 首先我們要認識兩個名詞: 運算元(operand...
*2.4 C 語言的 printf( ) 格式化輸出函數
為什麼需要「格式化」輸出? 想像一下,如果你的程式計算出圓周率是 3.1415926,但你只想在螢幕上顯示 3.14;或者你希望輸出的成績單欄位能夠像表格一樣文字靠左對齊,數值靠右對齊。 這些都...
*2.5 C 語言的 scanf( ) 格式化輸入函數
我們已經學會如何用 printf 讓程式輸出精美的訊息。但一個真正有用的程式,不僅要會「說」,更要會「聽」。它需要接收使用者的指令、數據,才能進行下一步的處理。 scanf (scan form...
03-選擇結構
3.1 if ... else ...
每一行程式碼都會執行到? 我們寫的每一行程式碼都有用嗎?當然有用。那每一行都會被執行嗎?這要看情況。 之前我們寫的程式,會從 main() 函數的第一行開始一行一行依序執行下去,直到程式結束。但...
3.2 關於 if 敘述大括號的使用
內容只有一行時可以省略大括號 if...else if...else 的大括號內如果只有一行時,可以省略大括號。 所以前面範例練習的內容可以寫成這樣。 練習:絕對值 #include <iost...
3.3 複合條件判斷式
搭配使用邏輯運算子 底下是一個典型的帳密驗證程式片斷。 string id, password; cin >> id; cin >> password; if(id=="admin") { ...
3.4 switch ... case
另一種「多分支」選擇結構 當你遇到像這樣的多分支選擇結構時,可以用 if...else if...else來解決。 例如:一個像這樣的選單功能 #include <iostream> usi...
3.5 三元運算子 ? :
3.5.1 三元運算子? : 在 C++ 中,三元運算子(Ternary Operator)是唯一一個需要三個運算元的運算子。它的符號是 ? 和 :。 這個運算子主要用來取代簡單的 if-els...
04-重覆結構
4.1 while 迴圈
程式執行流程結構 目前為止我們學過了兩種程式執行的流程結構,(1)循序結構;(2)選擇結構。 接下來我們要學的是 重覆結構,也就是可以重覆執行一段程式。 while 練習:輸出一行,共 5 個...
4.2 do...while 迴圈
猜數字遊戲 有時候事情要先做了,看狀況才知道要不要繼續下去。例如我們小時候玩的猜數字遊戲,A 心裡選定一個 1~100 之間的整數由 B 來猜,每次 B 猜了之後,A 就要回應他 (1)再大一...
4.3 遞增、遞減與複合指定運算子
遞增與遞減運算子 我們很常在迴圈裡用到 i = i+1 這樣的遞增敘述。 int i=1; while(i<=10) ( cout << i << " "; i = i+1; ...
4.4 for 迴圈
while 和 do...while 迴圈很適合用在「你知道什麼條件下迴圈要繼讀或停止」,因為決定是否再繞一圈的就是一個條件判斷式。 但是在你很清楚一共要繞幾圈的情況下,使用接下來介紹的 for...
4.5 巢狀迴圈
多層迴圈 如同 if ... else 可以有多層結構,迴圈也可以有多層結構。多層迴圈是什麼樣子呢?我們以時鐘的時針、分針為例來說明。 分針和時針各是一個迴圈,分針 0~59,時針 0~11。 ...
05-陣列
5.1 一維陣列
陣列(Array)的結構 陣列這種資料結構是用來儲存許多相同型別的資料用的。如果我們把變數想像成是一個可以放東西的箱子,那麼陣列就是一堆箱子的集合,而且每個箱子都有一個連續編號的索引值(inde...
5.2 字串
字串是字元的陣列 字串可以被視為一個字元型別的一維陣列,例如:"Hello world!"在記憶體中是這樣一個一個字元儲存的。 #include <iostream> using namesp...
5.3 多維陣列
二維陣列 把索引值擴展為 2 維,我們就可以得到二維陣列。 一個大小為 m x n 的二維陣列,可以這樣宣告。 // 宣告一個 4 x 6 的 int 二維陣列 int A[4][6]; 和一...
06-函數
6-1 函數
隨著寫程式經驗愈來愈多,你會發現有些程式碼會不斷重複出現,就像例行性工作一樣,例如:求平方根、將資料排序、驗證帳號密碼......等等。一次又一次的輸入這些程式碼會讓人很不耐煩。對於這些經常出現...
6-2 在函數中使用函數
相同名稱的函數 原則上函數的名稱不能重覆,但是只要其參數列不同,就可以使用相同的名稱。 以下面的程式為例,我們可以觀察到叫用函數時,編譯器會檢查函數名稱和參數列數量和型別。 #include <...
6-3 傳值呼叫 與 傳參考呼叫
參數與引數 在提到函數與呼叫使用函數時,我們會用到 參數(parameter) 和 引數(argument) 這兩個名詞。 我們可以簡單的用這張圖來區分他們。 參數(parameter) 是...
6-4 將陣列傳入函數
傳址呼叫(call by address) 除了「傳值呼叫」、「傳參考呼叫」外,還有一種參數傳遞方式叫「傳址呼叫」。 為什麼叫「傳址」呢?因為這種方式是直接把變數在記憶體中的 「位址(addre...
6-5 全域變數與靜態變數
全域變數(Global variable) 一般來說,我們使用函數時會將操作到的變數限制在函數裡,也就是以區域變數的方式使用。如有需要操作到函數外面的變數,我們會用傳參考或傳址的方式來處理。 我...
07-指標
08-自訂型別 (struct)
09-STL 容器 - vector
9-1 vector
1. 為什麼需要 vector? 1.1 傳統陣列的限制 在 C++ 中,我們熟悉的傳統陣列有一個根本的問題:大小必須在編譯時決定,且無法改變。 int scores[100]; // 固定...
9-2 vector 的基礎操作
vector 基礎操作 1. 引入標頭檔與宣告 使用 vector 前,需要引入標頭檔: #include <iostream> #include <vector> using namespa...
9-3 走訪 vector
走訪 vector 1. 方法一:下標 for 迴圈 最直覺的方式,適合需要使用索引時: vector<int> v = {10, 20, 30, 40, 50}; for (int i = ...
9-4 常用成員函數
其他常用成員函數 1. front() 與 back() vector<int> v = {10, 20, 30, 40, 50}; cout << v.front(); // 10:第一個...
9-5 實作練習
練習一:成績管理系統(基礎操作) 題目敘述 請你撰寫一個程式,功能如下: 讀入 N 筆學生成績(整數,0~100) 輸出所有成績 輸出最高分、最低分、平均分數(取到小數點後兩位) 刪除最後一筆...
10-類別(class)
10-1 類別(class)與物件(object)
一、物件(object)與類別(class) 在 C++ 中物件和類別有很嚴謹的定義,我們在這裡僅使用簡單例子來做介紹。 什麼是物件(Object)?你的iPhone是個物件、你現在坐著的這張椅...
10-2 存取控制——public 與 private
一、class 裡的東西,不是誰都可以動的 先看一個銀行帳戶的例子。 #include <iostream> using namespace std; class BankAccount {...
10-3 如何建立複雜的類別
一、成員函數可以定義在 class 之外 我們可以只在 class body 中 宣告 member function,再將它 定義 在 class body 之外。 class sprite ...
10-4 Class 練習題
練習一:電影票券(Ticket) 情境說明 你正在設計一套電影院售票系統。每張票券記錄了電影名稱、座位號碼、票價,以及是否已被使用。票券一旦使用就不能再次入場;票價不能設為負數。 規格列表 成...
11-自己實作一個 vector 類別
11-1 規劃我們的 Vec 類別
一、Vec 類別需要什麼? 在這個章節裡,我們嘗試自己建立一個簡單版的 vector,一個叫做 Vec 的類別。 我們至少需要以下三項屬性: data: 指向一塊儲存資料的記憶體空間 si...
11-2 實作 Vec 的細節
一、建構與解構函數 在建構函數中,我們要初始化 Vec 的 data member。因為剛建立好的 Vec 會是一個空的容器,所以一開始 m_size 和 m_capacity 都是 0。而 m...
11-3 測試 Vec 類別
目前我們的 Vec 類別如下: [vec.h] #ifndef VEC_H_INCLUDED #define VEC_H_INCLUDED class Vec { private: i...
11-4 重載 [] 運算子
現在我們還缺一個重要的功能,那就是存取 Vec 裡的值。 試著執行這段程式看看。 [main.cpp] #include <iostream> #include "vec.h" using n...
11-5 讓 Vec 可以儲存 int 以外的資料型別
目前我們 Vec 雖然可以動態成長,但是只能存放 int 型別的資料,這讓它變得很沒用。 明明只有型別不同,難道我們要寫一個 Vec_int 給 int 用,寫一個 Vec_double 給 d...