Advanced Search
Search Results
59 total results found
4.1 while 迴圈
程式執行流程結構 目前為止我們學過了兩種程式執行的流程結構,(1)循序結構;(2)選擇結構。 接下來我們要學的是 重覆結構,也就是可以重覆執行一段程式。 while 練習:輸出一行,共 5 個 '*' 這個很簡單,只要一行 cout 就能搞定。 cout << "*****" << endl; 那如果是這題呢? 練習:輸出一行,共 375 個 '*' 我們不太可能傻傻的在字串裡一邊打字一邊數 375 個吧?我們想要的是重覆 cout << '*'; 375 次。而且要簡單明瞭,不是複製後貼上 375 次。 在這...
08-自訂型別 (struct)
4.2 do...while 迴圈
猜數字遊戲 有時候事情要先做了,看狀況才知道要不要繼續下去。例如我們小時候玩的猜數字遊戲,A 心裡選定一個 1~100 之間的整數由 B 來猜,每次 B 猜了之後,A 就要回應他 (1)再大一點;(2)再小一點;(3)答對了。直到 B 猜中那個數字為止。目標是在最少的猜測次數中,命中正確答案。 把它寫成程式,大致如下。主要問題在於,B 要先猜一個數字,你才知道他猜的對不對,要不要繼續讓他猜下去。我們按下面程式這樣設計,while 迴圈的第一次條件判斷會遇到問題 - 「yourguess 的值還沒確定」,因為 B ...
09-STL 容器 - vector
4.4 for 迴圈
while 和 do...while 迴圈很適合用在「你知道什麼條件下迴圈要繼讀或停止」,因為決定是否再繞一圈的就是一個條件判斷式。 但是在你很清楚一共要繞幾圈的情況下,使用接下來介紹的 for 迴圈,會輕鬆很多。 for 迴圈 使用 while 迴圈來繞指定圈數,我們多採用這樣的架構,其中變數 i 擔任計數器,我們會: 指定計數器的初始值 每圈檢查計數器的值是否仍符合條件 每圈遞增計數器的值 for 迴圈可以一次搞定這三者。 for 的基本語法 以輸出 1~10 為例,程式看起來比較簡潔,而且還是很清晰。...
10-類別(class)
4.5 巢狀迴圈
多層迴圈 如同 if ... else 可以有多層結構,迴圈也可以有多層結構。多層迴圈是什麼樣子呢?我們以時鐘的時針、分針為例來說明。 分針和時針各是一個迴圈,分針 0~59,時針 0~11。 分針會由 0 分 轉到 59 分,接下來轉到 60 分時,時針會前進一格,分針則歸零重新開始新的一圈。 for(int hour=0; hour<12; hour++) // 外圈是時針 { for(int minute=0; minute<60; minute++) // 內圈是分針 { ...
11-自己實作一個 vector 類別
12-迭代器(Iterator)
4.3 遞增、遞減與複合指定運算子
遞增與遞減運算子 我們很常在迴圈裡用到 i = i+1 這樣的遞增敘述。 int i=1; while(i<=10) ( cout << i << " "; i = i+1; // 遞增 1 } cout << endl; 1 2 3 4 5 6 7 8 9 10 這種情況可以使用 遞增(increment)運算子 ++ 來處理。 int i=1; while(i<10) ( cout << i << " "; i++; // 遞增 1 } cout << endl; ...
5.1 一維陣列
陣列(Array)的結構 陣列這種資料結構是用來儲存許多相同型別的資料用的。如果我們把變數想像成是一個可以放東西的箱子,那麼陣列就是一堆箱子的集合,而且每個箱子都有一個連續編號的索引值(index)。 例如:我們要儲存 10 個學生的成績(都是整數),我們可以使用這樣一個內含 10 個元素(element)/項目(item)的陣列。 宣告陣列 在程式中我們可以這樣宣告這個陣列 score。 int score[10]; 其語法為 型別 陣列名稱[元素數量]; 其中陣列名稱的命名規則與一般變數的命名規則相...
5.2 字串
字串是字元的陣列 字串可以被視為一個字元型別的一維陣列,例如:"Hello world!"在記憶體中是這樣一個一個字元儲存的。 #include <iostream> using namespace std; int main() { char greeting[13] = "Hello world!"; cout << greeting; return 0; } 在上圖中最後一個字元 '\0'是什麼呢?這個是所謂的 null字元。 因為每個字串的長度是不一定的,cou...
5.3 多維陣列
二維陣列 把索引值擴展為 2 維,我們就可以得到二維陣列。 一個大小為 m x n 的二維陣列,可以這樣宣告。 // 宣告一個 4 x 6 的 int 二維陣列 int A[4][6]; 和一維陣列一樣,可以在宣告時給定初值。 int A[4][6] = { {1, 2, 3, 4, 5, 6}, {5, 12, 7, 11, 9, 8}, {10, 21, 13, 22, 23, 16}, {4, 78, 13, 45, 51, 11} }; 搭配雙層迴圈遍歷其值 我們可以使用雙層迴圈,把前...
6-1 函數
隨著寫程式經驗愈來愈多,你會發現有些程式碼會不斷重複出現,就像例行性工作一樣,例如:求平方根、將資料排序、驗證帳號密碼......等等。一次又一次的輸入這些程式碼會讓人很不耐煩。對於這些經常出現的程式碼片段,我們可以使用函數來把它們包裝起來。C/C++裡面的函數就像數學裡面的函數,例如: $f(x)=2x^2+3x+4$ 它有一個輸入:x,有一個輸出:f(x)。你給它一個輸入 3,它在運算後會給你一個輸出31;你給它另一個輸入 2,它會給你另一個相應的輸出18。不管你給的輸入是什麼,它都會很忠實的去完成該做的事 $...
6-2 在函數中使用函數
相同名稱的函數 原則上函數的名稱不能重覆,但是只要其參數列不同,就可以使用相同的名稱。 以下面的程式為例,我們可以觀察到叫用函數時,編譯器會檢查函數名稱和參數列數量和型別。 #include <iostream> using namespace std; // 回傳 2 整數中的最小值 int MIN(int a, int b) { cout << "回傳 2 整數中的最小值" << endl; if(a<=b) return a; else return...
6-3 傳值呼叫 與 傳參考呼叫
參數與引數 在提到函數與呼叫使用函數時,我們會用到 參數(parameter) 和 引數(argument) 這兩個名詞。 我們可以簡單的用這張圖來區分他們。 參數(parameter) 是在定義函數時,用來承接傳入資料的變數。 引數(argument) 是在呼叫使用函數時,傳入的資料。 然而在大多數的情況下,大家並不會區分的那麼清楚,很多時候我們都會用 參數 來意指兩者。在後續的內容裡除非特別需要指出其不同,否則我們會使用 參數 這個詞。 傳值呼叫(call by value) 在叫用函數時,我們通常都...
6-4 將陣列傳入函數
傳址呼叫(call by address) 除了「傳值呼叫」、「傳參考呼叫」外,還有一種參數傳遞方式叫「傳址呼叫」。 為什麼叫「傳址」呢?因為這種方式是直接把變數在記憶體中的 「位址(address)」 傳進去給函數,在函數裡我們直接到記憶體中的相應位置去操作這個變數的值。所以傳址呼叫和傳參考呼叫一樣可以動到外面變數的值。 關於傳址呼叫,因為會接涉到記憶體位置和指標(pointer),比較複雜,我們會稍後再來看這個主題。 不過由於大家可能會有需要把一個陣列傳入函數裡,所以我們先來看要如何做到。 一個陣列裡面的元素可...
6-5 全域變數與靜態變數
全域變數(Global variable) 一般來說,我們使用函數時會將操作到的變數限制在函數裡,也就是以區域變數的方式使用。如有需要操作到函數外面的變數,我們會用傳參考或傳址的方式來處理。 我們以一個抽號碼牌的程式來示範。 練習:抽號碼牌(1) #include <iostream> using namespace std; int getTicket(int &num) // 以傳參考方式遞增外面的 num 變數值 { num++; return num; } int main() { ...