Advanced Search
Search Results
53 total results found
內壢高中程式小隊集訓
內壢高中程式小隊集訓(進階)
C++程式設計入門
C++程式設計進階
1-開發環境
2-變數與輸入、輸出
03-選擇結構
1-遞迴
04-重覆結構
2-枚舉
3-排序和搜尋
4-STL
5-貪心
6-動態規劃
7-圖
8-樹
05-陣列
06-函數
1.1 安裝 Code::Blocks
下載 至 https://www.codeblocks.org/ ,依序點選 [Downloads] →[Download the binary release]。 下載 [codeblocks-16.01mingw-setup.exe] (16.01 是版本,請找當時最新版的) 安裝 基本上都接受預設值,按 [Next] →[I Agree] →[Next]→[Install] 即可。 等待安裝結束。 選 [是] 啟動 Code::Blocks。 把安裝程式結束 [Next]→[Finish]。 ...
1.2 可在線上撰寫程式的 OnlineGDB
如果你只是在練解題,只會寫些小程式,OnlineGDB 是一個不錯的選擇,你不用安裝開發環境,只要連上 OnlineGDB 網站,就可以直接使用。 按下上面綠色的 [Run],執行結果就會顯示在下面。 當手邊沒有電腦,只有手機和平板時,這種線上開發平台就很方便。
2.1 輸出
使用 cout 輸出資料 在 Code::Blocks 裡建立一個專案後,它會自動產生這樣一個程式架構。 #include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; return 0; } main function 其中的 main() 稱為主函數(main function),它是程式的起點。程式在啟動後,會由 main 裡的第一行開始依序執行下去。 return 0; 表示帶著...
2.2 變數與輸入
像 1, 24, 3.14 這樣的數,我們稱為 字面常數(literal constant),它的值是固定不變的。 另外像我們在數學代數中用到的 x, y, z 等,則稱為 變數 ,它的值可以改變。 在電腦程式中,變數是很重要的。它可以用來儲存輸入的資料,計算中的數值,表示某個狀態等。 使用 cin 輸入資料 下面這段程式在執行之後,會先詢問你的年齡,在你輸入年齡並按下 [Enter] 後,輸出 "You are xx years old."。這個 xx 會是你輸入的值。 int age; cout << "Ho...
3.1 if ... else ...
每一行程式碼都會執行到? 我們寫的每一行程式碼都有用嗎?當然有用。那每一行都會被執行嗎?這要看情況。 之前我們寫的程式,會從 main() 函數的第一行開始一行一行依序執行下去,直到程式結束。但在真實世界運作的程式是要有彈性的,例如:指紋鎖必須要在使用者指紋與內部設定吻合時,才會開鎖,否則什麼都不做。也就是這樣一個結構: 接下來我們我們以「計算絕對值」為例,來看看這種結構。 if 敘述 練習:絕對值 讀入使用者輸入的整數 $a$,計算並輸出其絕對值 $|a|$。 絕對值表示數線上原點到該數值的距離,所以若 $a\...
3.3 複合條件判斷式
搭配使用邏輯運算子 底下是一個典型的帳密驗證程式片斷。 string id, password; cin >> id; cin >> password; if(id=="admin") { if(password=="123456") { cout << "登入成功" << endl; } else { cout << "登入失敗" << endl; } } else { cout << "登入失敗" << endl; } ...
2.3 運算子與運算優先順序
在掌握了基本輸入、輸出之後,我們已經具備「將資料讀進電腦」,「將處理後資料送回外界」的能力,接下來重點就是中間的「處理」,也就是運算的部分。 首先我們要認識兩個名詞: 運算元(operands) 運算子(operator) 以 2+3 為例,2 和 3 都是運算元,+ 是運算子。 我們可以把運算子想成是「運算符號」,運算元則是「運算的對象」。 指定(assign)運算子 在 C++ 中,= 不是 等於(equal) 而是 指定(assign) a = 3 是「把 3 指定 給 a 這個變數」,而非表示「...
3.4 switch ... case
另一種「多分支」選擇結構 當你遇到像這樣的多分支選擇結構時,可以用 if...else if...else來解決。 例如:一個像這樣的選單功能 #include <iostream> using namespace std; int main() { cout << "(1) 提款" << endl; cout << "(2) 存款" << endl; cout << "(3) 查詢帳上餘額" << endl; cout << "(0) 結束" << endl; cou...
1.1 數學中的遞迴 vs 程式中的遞迴
數學中的遞迴 在高一數學課時,學習到使用遞迴解決數學上的問題,以下幾個是簡單的範例 小朋友上樓梯:有一位小朋友要走樓梯上樓,他一次可以往上走一階或一次走兩階,問你若要走 $n$ 階,共有幾種走法? 在此我們可以藉由上一階、上兩階的特性,將問題轉換成,若我要走到第 $i$ 階,則他必是從 $i - 1$ 和 $i - 2$ 階走過來的,下一步,就可以列成遞迴關係式 \[F(x)= \begin {cases} F(x-1)+F(x-2) & \text{if }x>1 \\ 1 & \text{if } x ...
1.2 遞迴應用
輾轉相除法 輾轉相除法在求兩數的最大公因數(GCD),是一種非常有效率的方法,我們不需要分別找出每個質因數,就可以找到其最大公因數,以下以求330, 210兩數的最大公因數為例 步驟 圖片 解釋 1 將330,210兩數併排寫下,並用3條直線做分隔 2 用 330 除以 210,得到商為 1,餘數為 120。(重點是那個餘數) 3 用前一次的除數(210)除以前一次的餘數(120),得到商為1,餘數為 90。 4 用前一次的除數(120)除以前一次的餘數(90),得到商為 1,餘數...
3.2 關於 if 敘述大括號的使用
內容只有一行時可以省略大括號 if...else if...else 的大括號內如果只有一行時,可以省略大括號。 所以前面範例練習的內容可以寫成這樣。 練習:絕對值 #include <iostream> using namespace std; int main() { int a; cin >> a; if(a<0) a = -1*a; cout << "|a|=" << a << endl; return 0; } ...
4.1 while 迴圈
程式執行流程結構 目前為止我們學過了兩種程式執行的流程結構,(1)循序結構;(2)選擇結構。 接下來我們要學的是 重覆結構,也就是可以重覆執行一段程式。 while 練習:輸出一行,共 5 個 '*' 這個很簡單,只要一行 cout 就能搞定。 cout << "*****" << endl; 那如果是這題呢? 練習:輸出一行,共 375 個 '*' 我們不太可能傻傻的在字串裡一邊打字一邊數 375 個吧?我們想要的是重覆 cout << '*'; 375 次。而且要簡單明瞭,不是複製後貼上 375 次。 在這...
4.2 do...while 迴圈
猜數字遊戲 有時候事情要先做了,看狀況才知道要不要繼續下去。例如我們小時候玩的猜數字遊戲,A 心裡選定一個 1~100 之間的整數由 B 來猜,每次 B 猜了之後,A 就要回應他 (1)再大一點;(2)再小一點;(3)答對了。直到 B 猜中那個數字為止。目標是在最少的猜測次數中,命中正確答案。 把它寫成程式,大致如下。主要問題在於,B 要先猜一個數字,你才知道他猜的對不對,要不要繼續讓他猜下去。我們按下面程式這樣設計,while 迴圈的第一次條件判斷會遇到問題 - 「yourguess 的值還沒確定」,因為 B ...
4.4 for 迴圈
while 和 do...while 迴圈很適合用在「你知道什麼條件下迴圈要繼讀或停止」,因為決定是否再繞一圈的就是一個條件判斷式。 但是在你很清楚一共要繞幾圈的情況下,使用接下來介紹的 for 迴圈,會輕鬆很多。 for 迴圈 使用 while 迴圈來繞指定圈數,我們多採用這樣的架構,其中變數 i 擔任計數器,我們會: 指定計數器的初始值 每圈檢查計數器的值是否仍符合條件 每圈遞增計數器的值 for 迴圈可以一次搞定這三者。 for 的基本語法 以輸出 1~10 為例,程式看起來比較簡潔,而且還是很清晰。...
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++) // 內圈是分針 { ...
2.1 枚舉介紹和全排列枚舉
枚舉就是將所有答案的可能都跑過一次 若有時候答案的可能樹太多,會導致超時,在這個單元中,就要學習如何以合理的時間複雜度找到答案 枚舉簡單題目 給定一個數字$n(1\leq n\leq 10^3)$問可以湊成幾對$a, b$買足$a\times b = n$? 很直觀的做法,可以直接用$O(n^2)$的時間複雜度來完成 #include<iostream> using namespace std; int main() { int n; cin >> n; int ans = 0; ...
2.2 位元枚舉和遞迴枚舉
位元枚舉介紹 位元枚舉是一種通過遍歷所有的二進制數字來列舉所有可能的狀態的方法。通過對二進制數字中的每一位進行遍歷,可生成所有可能的狀態。 位元枚舉的優勢和定義: 用二進位的方式來簡單維護枚舉的技巧,程式碼量小 通常使用在枚舉部分只有要或不要(1/0)兩種可能,符合二進位原理 例如:10011代表在第1、2、5項要選擇3、4則不選擇 如何使用位元枚舉 進行位元枚舉的基本概念是通過遍歷所有的二進制數字來產生所有可能的狀態。可以通過以下步驟來實作位元枚舉: 定義好總共有幾項需要枚舉,在此設訂為$n$項 枚舉所有狀...
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; ...