奧林匹亞資訊班
6/21
講師:吳崇維(wayne)
一年的課程結束了!
來回顧我們學了什麼東西~
並針對你們常常犯的錯誤檢討!
變數 (variable)
回想剛剛遇到的, 各種類別
- 整數 (int)
- 字元 (char)
我們可以以一種類別『宣告』一個變數, 例如:
int x;
意思就是:跟電腦說我設定了一個叫做『 x 』的整數
宣告完變數後就可以開始利用這個變數了!

變數 (variable)
常見錯誤:
將不同的變數類別混用
函式的回傳值類別: void , int , char ... 都要想清楚!

for (char i = 0; i < n; i++) {
...
}
if - else if - else
if - else if - else
這樣的語法可以再延伸!
語法:

if (condition) {
statement;
} else if (condition2) {
statement;
} else if (condition3) {
statement;
} else {
statement;
}
多個敘述由上往下判斷
一定只會執行一個!
if - else if - else

常見錯誤:
if (x >= 10) {
x += 10;
break;
} else {
continue;
}
問題在哪裡呢?
if - else if - else

常見錯誤:
if (x >= 10) {
x += 10;
break;
} else {
continue;
}
我們邏輯上可以理解這段程式碼,不過!
break 以及 continue,基本上只能用在迴圈
while
語法:
condition 是真偽的邏輯判斷
大括號裡頭想做什麼都可以!
這個迴圈會持續到condition為假

while (不懂迴圈) {
好好複習;
}
for
更為精準,高級的迴圈!
語法 :
initialization: 初始化 (第一次進入會跑)
condition : 條件( 類似while ) (每次都會檢查)
adjustment : 每次迴圈的調整 (第二次之後會跑)
基本的 () {} 架構不變。
for ( initialization ; condition ; adjustment) {
statement;
}

while
- 寫法較為簡潔
- 主體僅包含一個判斷式
- 迴圈每次的調整需要另外寫(迴圈每輪應該都需要一點點的不一樣)
for
- 寫法較為複雜
- 主體包含: 初始式、判斷式、調整式
- 基本上可以取代while (while 特別情況才很難取代)
你是設計師,可以自行決定怎麼寫!
迴圈常見錯誤
考慮長度為n的陣列 arr(有n個數字)
那麼陣列的內容應該從 arr[0] ... arr[n-1]
因此迴圈應該寫
或是更常寫
for (int i = 0; i <= n-1; i++) {
...
}
for (int i = 0; i < n; i++) {
...
}
陣列
一個陣列把相同類別
的變數串在一起 :
Ex : int a[10]; 串起10個整數
觀念釐清:
int a[10]; // 陣列宣告
a[1] = 3; // 這時候a[1]是一個整數變數

陣列重點
發現多維陣列較難理解
所以寫程式時要盡量在腦袋圖像化!


int a[2][3][4];
1) 我們一共宣告了2*3*4 = 24個整數
2) a[1][2][2] 就是裡面其中一個整數
3) a[1][2] 是一個一維陣列 !
4) a[1] 是一個二維陣列
5) a 就是個三維陣列啦~
* 符號
*(變數) // 變數需為一個位址
Ex: *(0x7ffee2b159bc)
取用一個位址所指到的變數值
& 符號
&(變數)
Ex : &b
上面這東西代表一個
變數的位址
兩個互為反運算
很困難的指標TnT
函式 function

一個函式負責處理單一目的事情,接受(吃進)一個參數,並回傳(吐出)一個結果!
常見問題:沒有好好的定義函式的參數類別,回傳值類別
字元 (char)
這邊介紹新的變數型態 char
一般的可見字元(0~9, a~z, +-*/)
都是字元的一種。
電腦使用一個位元組儲存字元
使得一個字元會對應到一個數字!
Ex : 'a' <=> 97
'b' <=> 98
'A' <=> 65

字串的宣告與指定
不多說,上圖
注意cin >> a的部分
程式需要知道a字串的頭的指標
並以此為出發點輸入。

strlen
函式原型:
int strlen(char* s1)
功能:輸入一個字串
回傳字串的長度

遞迴 recursion
遞迴最基礎的定義就是在
自己的函式裡面呼叫 (call)自己
這樣可以造成同一個函式裡面
不斷去呼叫相同函式的效果。
像是看著兩面在前與後的鏡子,會看到無窮多個人,一樣的道理


理解函式:
void func(int x);
----------
此函式接收一個整數參數
將整數參數的值印出來
若此值為0 => 回傳 (終止條件)
否則處理func(x-1);
回傳
演算法
對於一個固定形式的問題,
產生一套流程->
對於任何的輸入組合
皆能產生預期的答案!
簡單的帶過 brute force
資料結構
使用特殊的陣列或是指標結構,達到可以維護某些特定需求的結構。最終目的是達成更好的算法效率!
也簡單的帶過了 stack
以上!
掌握了這些技巧,就可以寫出90%的程式了
Part not mentioned
- struct (結構)
- pointer operation(指標操作)
- bit operation (位元運算)
若未來還有深入的接觸程式,可以先補齊這些地方!
運用所有技巧!
寫一個對談程式,細節如下!
程式詢問你要註冊還是登入
註冊
輸入帳號密碼,並由程式記住,重複命名的問題都不用考慮
註冊成功
登入
輸入帳號密碼,嘗試登入!
登入
失敗
登入成功
程式結束
寫出一個簡易的帳號頁面
往程式設計師又進了一大步 :)
感謝各位一年的配合!不過暑假還有課程XD
FeedBack!
一起努力快樂寫程式吧!
6/21 期末回顧
By Wayne Wu
6/21 期末回顧
- 61