講師: 李根逸 (Ken-Yi Lee), E-mail: feis.tw@gmail.com
C/C++ 程式設計基礎課程簡介
【第⼀一講】
!9
課程⼤大綱
!10
課程簡介
[P.11]課程使⽤用的軟體: Dev C++ [P.12]
課程網⾴頁: http://g.csie.org/~kez/c期數 [P.13]
課程講義 [P.14]
參考書籍: C 程式設計藝術 [P.15]
成績評量 [P.16]
其他資訊 [P.17]
程式語⾔言簡介
[P.19]快速上⼿手
[P.24]啟動 Dev C++ [P.25]
編譯與執⾏行程式 [P.28]
Hello world [P.29]
記憶體的概念 [P.34]
C / C++ 的運算 [P.35]
課程簡介
本課程教導 C / C++ 程式語⾔言的基礎,適合稍微或 沒有程式設計經驗但有興趣的學員。
但是修習本課程需要有基本的英⽂文打字能⼒力
本課程內容包含 C 與 C++ 語⾔言的基礎,在前半段 介紹 C 語⾔言與 C++ 共通的部份,後半段補充 C++
語⾔言與 C 語⾔言的差異 (主要是介紹物件導向程式設計 的概念 )。
雖然這麼說不盡精確,但可以先把 C++ 算是 C 的⼀一種 擴充加強版
【思考】那為什麼我們需要兩個語⾔言⽽而不是發明 C 語⾔言 2.0 ?
!11
課程使⽤用的軟體
撰寫程式需要安裝具有編譯 C/C++ 程式能⼒力的整 合性開發環境或編譯軟體 :
編譯軟體 (Compiler):
Microsoft Visual C++ (MSVC++) The GNU Compiler Collection (GCC)
整合開發環境 (IDE: 包含某套編譯軟體):
Microsoft Visual Studio (MSVC++) Dev C++ (GCC)
其他: Code::blocks, Qt Creator, 等等.
教室電腦內裝有 Microsoft Visual Studio 、 Code::Blocks 與 Dev C++
上課⽰示範將以 Dev C++ 為主。
!12
課程網⾴頁
課程網⾴頁的網址: http://g.csie.org/~kez/c 期數 課程網⾴頁上會放置課程預定進度、每次上課使⽤用的投 影⽚片、範例檔和補充教材供學員下載閱讀與練習。如 果課程臨時有什麼變動,我們會更新網⾴頁通知。
因天氣因素停⽌止上課的標準以⼈人事⾏行政局為準
因為課程進度將隨著上課情形與同學反應⽽而有所變動,
所以我們的課程網⾴頁將會動態更新。
網⾴頁內容如果有任何缺失或資料遺漏還⿇麻煩⼤大家提醒!
Facebook 討論區:http://goo.gl/6GpVf
提供訊息發佈、問題發問或資訊交流的管道
!13
課程講義
上課⽤用的投影⽚片紙本會作為上課⽤用的講義
講義為講師個⼈人學習、實務與教學經驗的集成,雖然已經不停的更新 補充,但是編寫時錯誤缺漏或不盡如⼈人意的地⽅方難免,有任何問題或 建議請跟講師反應。
講義內容主要包含四個部分:觀念、範例、補充與習 題
範例 :
我們上課會細講某些選過的範例,⽽而未講述的範例請回家⾃自⾏行練習。
範例解答在課程網⾴頁會提供,請盡量做到能夠不參考解答下完全獨⼒力 寫出範例。初學者請每隔⼀一段時間重複練習範例到熟練。
補充:
上課不會細講的內容,通常是已經學過要複習時看。
習題:
我們不提供完整的習題解答也不建議每個⼈人都要寫習題,尤其初學者 請以範例為主。對於習題有任何問題請直接詢問講師,講師會依照學
⽣生的反應給予適當提⽰示或⽰示範。
!14
參考書籍
本課程主要參考書籍:
C : How to Program 《C 程式設計藝術》
其他課程相關 C 參考書籍有:
The C Programming Language
C Programming: A Modern Approach Headfirst C
其他課程相關 C++ 參考書籍有:
C++ How to Program
The C++ Programming Language 其他中⽂文參考書籍:
C 語⾔言教學⼿手冊 〈旗標〉
C/C++ 無痛學習教本〈旗標〉
建議初學程式語⾔言者還是需要⼀一本⼊入⾨門參考書籍
!15
成績評量
出席率與隨堂練習 (40%) 期中與期末測驗 (各 30%)
時
19:00
隨堂練習19:20
批改與講解19:30
休息與 Q&A19:40
上課20:40
休息20:40
上課21:30
下課第 2-4, 6-8, 10-12 堂課
時
19:00
上課20:00
休息20:10
上課21:00
隨堂練習休息 Q&A21:30
下課第 1 堂課
時
19:00
測驗開始20:50
測驗結束21:00
檢討與Q & A21:30
下課第 5, 9 堂課
!16
70 分及格
其他資訊
⾨門禁系統:
假⽇日整天或平⽇日的晚上⼤大⾨門會上鎖,我們會發放感應式的⾨門禁 卡讓學員使⽤用 (需100元押⾦金)。於最後⼀一次上課結束時需要繳回 卡並拿回押⾦金。請注意⾨門禁卡只能使⽤用在系館正⾨門。
垃圾處理:
請千萬不要將垃圾丟棄⾄至廁所內垃圾桶!
請拿⾄至⼀一樓中庭 (電梯旁⼩小⾨門外) 垃圾分類區丟棄 在校內停⾞車費⽤用:
可以使⽤用學員證或請講師在停⾞車單據上加蓋本班班章會有等同 校內學⽣生停⾞車的折扣
學員證與收據
學員證約在第⼀一次上課發放 收據約在第⼆二次上課發放
錯過的同學請記得在上課期間跟⽼老師索取
!17
程式語言簡介
!18
程式語⾔言
程式語⾔言 (Programming Language) :
!
!
!
!
程式語⾔言 (programming language) 是⽤用來控制 (control) 機器 (machine) ⾏行為 (behavior) 的形式 (formal) 語⾔言
“A programming language is a formal language
designed to communicate instructions to a
machine, particularly a computer.
Programming languages can be used to create programs that control the behavior of a
machine and/or to express algorithms
precisely.” - from Wikipedia
!19
什麼是機器 /電腦 ?
from Wikipedia
!20
電腦的組成
抽象來說,電腦內包含了:
輸⼊入單元 (Input): 例如鍵盤和滑⿏鼠 (感官)
輸出單元 (Output): 例如螢幕和印表機 (嘴巴、肢體) 輔助儲存單元 (Storage) : 例如硬碟和光碟
記憶單元 (Memory): 例如記憶體 中央處理單元 (CPU)
程式設計核⼼心 (記憶與計算)
!21
程式語⾔言的分階
程式語⾔言⼀一般來說可分為三個階層 :
機器語⾔言 :
01001101011111010001010000010110 01010011011110110101110000001011 01000111100010101011101001101011
組合語⾔言 :
LOAD A ADD B
STORE SUM
⾼高階語⾔言 :
SUM = A + B
指令集: 硬體⽀支援的指令 (x86, ARM, ...)
!22
常⾒見的⾼高階語⾔言有 C, C++, Java, Pascal, Python, ...
C / C++ 語⾔言的歷史
C 語⾔言是⼀一種⾼高階語⾔言
⻄西元 1972 年由 Dennis Ritchie 所開發。
⻄西元 1989 年,美國國家標準局通過 ANSI X3.159-1989 (俗稱 C89) [⺫⽬目前常⽤用]
⻄西元 1990 年,國際標準組織 (ISO) 通過 ISO/IEC 9899:1990 (俗稱 C90) [內容與 C89 雷同]
⻄西元 1999 年,國際標準組織 (ISO) 通過 ISO/IEC 9899:1999 (俗稱 C99)
C++ 語⾔言原則上包含了 C 語⾔言
⻄西元 1998 年,國際標準組織 (ISO) 通過 ISO/IEC 14882:1998 (俗稱 C++98) [⺫⽬目前常⽤用]
C++ 加⼊入了⼀一些傳統 C 語⾔言沒有的『語⾔言特性』,最為⼈人 所知的就是『物件導向程式設計 (OOP)』的相關語法
!23
快速上手
!24
「
開始 > 所有程式 > Bloodshed Dev C++ > Dev C++」
啟動 Dev C++
!25
執⾏行檔 (*.exe) 程式碼編輯器 (*.cpp) 編譯器
整合開發環境 (IDE)
Dev C++ 的縮排設定
⼀一般像是 Dev C++ 和 Microsoft Visual Studio 這 類的整合開發環境 (IDE),可以⾃自動判斷程式內容幫助 你縮排。因此在程式碼的撰寫過程中,軟體會⾃自動加⼊入 Tab 或空⽩白。以 Dev C++ 為例,可以到這裡修改縮排 設定 :
「Tools (⼯工具) > Editor Options (編輯器選項) > General (⼀一般)」
此外,Dev C++ 預設會⾃自動在輸⼊入左括號後加上右括 號,不喜歡的話可以到下⾯面的設定修改 :
「Tools (⼯工具) > Editor Options (編輯器選項) > Code Insertion (插⼊入程式碼) > Symbol Completion (符號完
成)」把 「Enable symbol completion (啟⽤用符號完成)」關 閉
基本操作
開新檔案 :
「File (檔案) > New (開新檔案) > Source file (原始碼)」
儲存檔案 :
「File (檔案) > Save [As] (儲存)」
檔名請勿含有空⽩白並避免含有特殊符號 (例如中⽂文) 使⽤用 cpp 作為副檔名
開啟⼀一個已經存在的檔案 :
「File (檔案) > Open (開啟)」
!27
編譯與執⾏行程式
程式檔 (.c, .cpp) 需要經由編譯 (Compile) 的動作 才能成為執⾏行檔 (.exe) 讓電腦執⾏行 (Run)
「Execute (執⾏行) > Compile (編譯)」《F9》
編譯成功後會產⽣生執⾏行檔
!
!
!
「Execute (執⾏行) > Run (執⾏行)」《F10》
要先編譯成功才會有執⾏行檔可以執⾏行
常⽤用的指令:編譯並執⾏行《F11》
「Execute (執⾏行) > Compile&Run(編譯並執⾏行)《F11》
『Done 』表⽰示編譯成功 可以⽤用《F11》進⾏行編譯後直接執⾏行
!28
【範例】 Hello world [1]
請開啟⼀一個新檔案並輸⼊入下列程式碼後編譯並執⾏行
《 F11》:
/* My first program */
#include <stdio.h>
int main() {
printf(“Hello world !\n”);
return 0;
}
printf(“字串”) 是⼀一個可以⽤用來印出字串在螢幕上的函式
!29
【範例】 helloworld_1.cpp 試著在電腦裡找到你的程式碼檔案跟執⾏行檔後點擊執⾏行看看
【範例】 Hello world [2]
請寫⼀一程式,輸⼊入下列程式碼後編譯並執⾏行《 F11》
:
/* My first program */
#include <stdio.h>
#include <stdlib.h>
int main() {
printf(“Hello world !\n”);
system(“pause”);
return 0;
}
!30
system(“指令”) 是⼀一個在作業系統上執⾏行指令的函式 pause 是 MS-DOS 作業系統中⽤用來暫停並等待輸⼊入的指令
【範例】 helloworld_2.cpp
【範例】 Hello world [3]
請寫⼀一程式,輸⼊入下列程式碼後編譯並執⾏行《 F11》
:
/* My first program */
#include <stdio.h>
#include <stdlib.h>
int main() {
printf(“Hello “);
printf(“world !\n”);
system(“pause”);;
return 0;
}
!31
【範例】 helloworld_3.cpp
【範例】顯⽰示⽂文字
請寫⼀一個程式顯⽰示下⾯面的⽂文字圖案給使⽤用者看
!
!
!
!
【思考】我們需要使⽤用幾次 printf(...)?
H H A H H A A HHHHHH A A H H AAAAAAA H H A A
!32
【範例】 print.cpp
在 printf 的格式字串中,我們需要使⽤用跳脫串列 來讓電腦顯⽰示⼀一些無法或不易直接輸⼊入的符號或⽂文字
:
【補充】跳脫串列
跳脫串列 說明
\n Newline (換⾏行)
\t Tab (跳位)
\\ 反斜線
\” 雙引號
\b 發出逼逼聲
!33
【範例】計算兩數相加
試寫⼀一程式如下:
/* Addition program */
#include <stdio.h>
#include <stdlib.h>
int main(){
int integer1;
int integer2;
int sum;
printf("Please enter the first integer: ");
scanf("%d", &integer1);
printf("Please enter the second integer: ");
scanf("%d", &integer2);
sum = integer1 + integer2;
printf("Sum is %d\n", sum);
system("pause");
return 0;
}
!34
【範例】 add.cpp
/* Addition program */
#include <stdio.h>
#include <stdlib.h>
int main() {
int integer1;
int integer2;
int sum;
printf("Please enter the first integer: ");
scanf("%d", &integer1);
printf("Please enter the second integer: ");
scanf("%d", &integer2);
sum = integer1 + integer2;
printf("Sum is %d\n", sum);
system("pause");
return 0;
}
記憶體的概念
integer1
integer2
sum
(int)
?
2293616
(int)
?
2293620
(int)
?
2293612
!35
int 表⽰示整數型別
printf 内 %d 表⽰示印出⼀一個整數
【思考】 printf(“Sum is sum\n”); 不⾏行嗎?
scanf 函式會從鍵盤讀⼊入資料後存放在 指定的變數 (%d 表⽰示讀⼊入⼀一個整數 )
&integer1
&integer2
&sum
C / C++ 的運算
運算 運算⼦子
加法 + 減法 - 乘法 * 除法 / 餘數 % 賦值 = 3 + 4 * 5 是多少 ?
運算時請注意運算⼦子優先順 序 !
先乘除後加減
可以適當加上括號 ( ) 來調 整優先順序!
賦值運算⼦子 (=)
『賦值』是指將等號左邊的 變數賦予等號右邊的值
⼀一般情況下只有賦值運算⼦子可以 改變變數的值
!36
【範例】計算乘積
請寫⼀一個程式讓使⽤用者依序輸⼊入兩個整數後算出兩個 整數的乘積顯⽰示給使⽤用者看
提⽰示 : 請由 add.cpp 開始改起
請寫⼀一個程式讓使⽤用者依序輸⼊入三個整數後算出三個 整數的乘積顯⽰示給使⽤用者看
提⽰示 : 請由 multi2.cpp 開始改起
Please enter the first integer: 3 Please enter the second integer: 4 Please enter the third integer: 5 Product is 60
Please enter the first integer: 3 Please enter the second integer: 4 Product is 12
!37
【範例】 multi3.cpp
【範例】 multi2.cpp
【範例】更多計算
請寫⼀一個程式讓使⽤用者分別輸⼊入三個整數後,算出三 個整數的和、平均值、乘積並顯⽰示給使⽤用者看
!
!
!
請寫⼀一個程式讓使⽤用者輸⼊入⼀一個整數後顯⽰示該數的平
⽅方數值
Please enter the first integer: 3 Please enter the second integer: 4 Please enter the third integer: 5 Sum is 12
Average is 4 Product is 60
Please enter the integer: 3 9
!38
【範例】 squared.cpp
【範例】 calc.cpp
printf 與 scanf 函式
printf 可以連續輸出多個變數 :
可連在⼀一起寫成 :
!
scanf 可以連續讀取多個變數 :
printf 可以在 % 後加上最少顯⽰示位數:
printf(“Sum is %d\n”, sum);
printf(“Average is %d\n”, average);
printf(“Product is %d\n”, product);
printf(“Sum is %d\nAverage is %d\nProduct is %d\n”, sum, average, product);
scanf(“%d%d%d”, &integer1, &integer2, &integer3);
printf(“Sum is %5d\n, sum);
printf(“Sum is %05d\n, sum);
留五格
留五格,不⾜足補零
!39
【範例】位數解析
試寫⼀一程式讓使⽤用者輸⼊入⼀一整數後,顯⽰示其個位數字
提⽰示:% 運算⼦子可以⽤用來求餘數
!
!
試寫⼀一程式讓使⽤用者輸⼊入⼀一整數後,顯⽰示其百位數字
!40
範例輸⼊入: 12345 範例輸出: 5
範例輸⼊入: 12345 範例輸出: 3
範例輸⼊入: 54321 範例輸出: 1
範例輸⼊入: 54321 範例輸出: 3
【範例】 digit3.cpp
【範例】 digit1.cpp
初學 C / C++ 程式設計流程
步驟⼀一 [空殼]:
寫出 main
步驟⼆二 [流程]:
依照執⾏行順序寫出輸⼊入與輸出的程式碼,對於未知或未 定的數值給予⼀一個變數名稱。
步驟三 [資料]:
檢查所有的變數在程式碼中是否在正確的時候給予正確 的值
!41
初學寫程式碼時在乎的是?
正確性
程式碼是否正確的產⽣生想要的結果
可讀性
程式碼是否容易閱讀與理解
效率
CPU 使⽤用效率 (時間效率)
是否使⽤用最少的指令
記憶體使⽤用效率 (空間效率)
是否配置了最少的記憶體空間
彈性
是否容易依照需求的變更改變程式碼
!42
習題 [1]
[E0101] 試寫⼀一程式印出下列⽂文字:
!
[E0102] 試寫⼀一程式輸出下列⽂文字
!
提⽰示 : 利⽤用輸⼊入 \” 來顯⽰示雙引號
[E0103] 試寫⼀一程式,輸⼊入⼀一個整數後,印出該整 數加 7 後的值
[E0104] 試寫⼀一程式印出 129263 + 54628 的結 果
Welcome to “C” world !
Hope you have a nice day ! Alice: How are you ?
Bob: Fine. Thank you.
!43
習題 [2]
[E0105] 試寫⼀一程式讓使⽤用者輸⼊入⼀一個⻑⾧長⽅方形的⻑⾧長 跟寬後,顯⽰示該⻑⾧長⽅方形的周⻑⾧長與⾯面積
[E0106] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一個整數 x 後,計算出 3x
2+4x-1 的值
[E0107] 試將 helloworld_2.cpp 改寫成程式碼 內容只有三⾏行但執⾏行結果也⼀一樣的程式碼
[E0108] 試寫⼀一程式,輸⼊入⻄西元年份後,印出⺠民國 年份
⺠民國年份 = ⻄西元年份 - 1911
!44
習題 [3]
[E0109] 試寫⼀一程式,輸⼊入華⽒氏溫度後,印出攝⽒氏 溫度的值
攝⽒氏溫度 = 5×(華⽒氏溫度-32)/9
[E0110] 試寫⼀一程式,讓使⽤用者輸⼊入⾃自⼰己的⾝身⾼高與 體重後,顯⽰示使⽤用者的⾝身體質量指數 (BMI) 無條件 捨去⾄至⼩小數點後第⼆二位:
BMI = 體重 (kg) / ⾝身⾼高平⽅方 (m2)