c/c++程式設計基礎班 - cmlab graphicskez/c236/handout1.pdf · 課程簡介 本課程教導 c...
TRANSCRIPT
課程⼤大綱 (1)
章 主 相關保留字、運算⼦子或符號
【第⼀一章】 C / C++ 基礎班課程簡介
【第⼆二章】 資料型態、運算⼦子與表⽰示式 int, char, float, double ‘’ +, -, *, /, % = <, >, ==, !=, <=, >= &&, ||, ! &, |, ^, ~, <<, >>
【第三章】 程式流程控制 (上) if, else, while ++, -- +=, -=, *=, /=, %=
!2
課程⼤大綱 (2)
章 主 相關保留字、運算⼦子或符號
【第四章】 程式流程控制 (下) for, switch, case, default continue, break
【第五章】 函式 return
【第六章】 陣列與字串 [ ], ““
【第七章】【第⼋八章】
指標進階指標
*, & const
!3
課程⼤大綱 (3)!4
章 主 相關保留字、運算⼦子或符號
【第九章】 結構 struct, enum
【第⼗十章】 檔案輸⼊入輸出 FILE, #include, #define
【第⼗十⼀一章】 物件與類別 class, private, public,
【第⼗十⼆二章】 多型與繼承 protected, virtual
!5
!6
!7
!8
課程⼤大綱!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&A
19:40 上課
20:40 休息
20:40 上課
21:30 下課
第 2-4, 6-8, 10-12 堂課
時
19:00 上課20:00 休息20:10 上課
21:00隨堂練習休息 Q&A
21:30 下課
第 1 堂課
時
19:00 測驗開始
20:50 測驗結束
21:00 檢討與Q & A
21: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 後,計算出 3x2+4x-1 的值
[E0107] 試將 helloworld_2.cpp 改寫成程式碼內容只有三⾏行但執⾏行結果也⼀一樣的程式碼
[E0108] 試寫⼀一程式,輸⼊入⻄西元年份後,印出⺠民國年份 ⺠民國年份 = ⻄西元年份 - 1911
!44
習題 [3]
[E0109] 試寫⼀一程式,輸⼊入華⽒氏溫度後,印出攝⽒氏溫度的值 攝⽒氏溫度 = 5×(華⽒氏溫度-32)/9
[E0110] 試寫⼀一程式,讓使⽤用者輸⼊入⾃自⼰己的⾝身⾼高與體重後,顯⽰示使⽤用者的⾝身體質量指數 (BMI) 無條件捨去⾄至⼩小數點後第⼆二位: BMI = 體重 (kg) / ⾝身⾼高平⽅方 (m2)
[E0111]* 試寫⼀一程式印出 129263 * 54628 的結果
[E0112] 試寫⼀一個程式,讓使⽤用者輸⼊入兩個整數後,計算出兩個整數的平均值⾄至⼩小數點後⼆二位
!45
!46
!47
!48
課程⼤大綱!50
資料型態 [P.51] C/C++ 內建的常⾒見資料型態 [P.52] 使⽤用 sizeof 看⼤大⼩小 [P.53] 變數宣告 [P.54] 不同資料型態間的差異 [P.55] 整數 (short int, int, long int) 的可表⽰示範圍 [P.56] 浮點數 (float/double) 的表⽰示法 [P.58] printf 與 scanf 的格式字串 [P.59] 字⾯面常數的型態 [P.61] 不同型態間的轉換 (隱性/顯性轉型) [P.62] 字元 (char) 的表⽰示法 [P.65] 各種常⾒見運算⼦子: 算數運算⼦子: +-*/% [P.69], 指定運算⼦子: = [P.70] 關係與等號運算⼦子: <, >, <=, >=, ==, != [P.72] 邏輯運算⼦子 [P.73] 運算⼦子優先順序 [P.74]
資料型態 (Data type)在⾼高階語⾔言中,為了能夠⽅方便有效 (省時省空間) 的撰寫程式碼並做出各種複雜的運算,我們需要使⽤用多種資料型態 例如 : 整數, ⼩小數和⽂文字處理等 ...
電腦內部是使⽤用位元 (Bit) 這個基本單位來表⽰示資料並儲存於記憶單元 (記憶體) 或輔助記憶單元 (硬碟)中。 每個位元只可以表⽰示 0 或 1 兩種值
任何資料型態的資料都可以轉換成由⼀一串位元來表⽰示 換句話說,資料型態就是要告訴電腦要怎麼去解釋某⼀一串位元資料,我們可以規定如何對不同的型態做運算
!51
C 常⾒見的內建資料型態資料型態 名稱 ⼤大⼩小
(bytes)範例
短整數 (Short Integer) short int 2 32整數 (Integer) int 4 32⻑⾧長整數 (Long Integer) long int 4 32字元 (Character) char 1 ‘3’單精度浮點數 (Single Precision Floating Point) float 4 3.2
雙精度浮點數 (Double Precision Floating Point) double 8 3.2
無 void (無) (無)
!52
⼤大⼩小是《實作相依》《實作相依》:意指語⾔言標準內容並沒有強制的規定,在使⽤用不同編譯器或設定的情況下,可能會不⼀一樣
使⽤用 sizeof 看⼤大⼩小語⾔言標準內對資料型態沒有嚴格定義⼤大⼩小,隨著編譯器與設定的不同⽽而可能不同。我們只知道在同樣的編譯器與設定中,同樣資料型態的⼤大⼩小是固定的。 例如 int 不⼀一定要是 4 個位元組⼤大,只是我們現在⼀一般的電腦架構與作業系統通常是。⽽而在 32-bit 編譯器 內, long int 的⼤大⼩小可能是 4 個位元組, 但在 64-bit 編譯器中, long int 的⼤大⼩小可能是 8 個位元組
sizeof 是⼀一個特殊的運算⼦子,會得到某變數或資料型態在該平台編譯後佔有記憶體的⼤大⼩小。我們表⽰示記憶體⼤大⼩小所使⽤用的單位是位元組 (byte) ,⽽而⼀一個位元組 (byte) 通常等於⼋八個位元 (bit)
開啟範例檔 sizeof.cpp 並執⾏行看看
!53
變數宣告
變數名稱在使⽤用前,需要先進⾏行宣告讓編譯器知道: 資料型態 變數名稱;
資料型態 變數名稱 = 初始值;
保留字 (keywords):
C 語⾔言中下列名稱 (保留字) 無法作為變數名稱 auto,break,case,char,const,continue,default, do,double,else,enum,extern,float,for,goto,if, int,long,register,return,short,signed,sizeof, static,struct,switch,typedef,union,unsigned, void,volatile,while
int num;
int num = 0;
名稱通常為英⽂文字⺟母⼤大⼩小寫、數字和底線構成,數字不能開頭,⼤大⼩小寫不同也代表不同的名稱
num
(int) ?
2293620 (記憶體位址)
!54
在宣告時給予初始值這動作我們稱為初始化
表⽰示的資料意涵不同: 整數 (int) 與字元 (char)
表⽰示的原理不同: 整數 (int) 與浮點數 (float)
可表⽰示的範圍⼤大⼩小不同: 短整數 (short int) 與⻑⾧長整數 (long int)
可表⽰示的精確度⼤大⼩小不同: 單精度浮點數 (float) 與倍精度浮點數 (double)
有無正負數 (有號與無號)
有號整數 (int) 與無號整數 (unsigned int)
不同資料型態間的差異
與⼤大⼩小有關
!55
整數型態的可表⽰示範圍
資料型態可表⽰示的範圍與他佔記憶體的『⼤大⼩小』有關 每個位元可以表⽰示兩種值 (0 或 1)
每個位元組如果有 8 個位元 :
每個位元組可以表⽰示 28 = 256 種值 在可表⽰示正負數 (即有號 [signed]) 的情況下,可表⽰示的整數範圍會是從 -128 到 127 (共 256 個數字) 當無號 [unsigned] 時,可表⽰示的整數範圍是從 0 到 255
如果⼀一個資料型態有 4 個位元組,則可以表⽰示 :
28x4 = 232 = 4,294,967,296 種值
4 個位元組⼤大的 int 可表⽰示範圍是從 −2,147,483,648 到 2,147,483,647 (約九位數有效數字) 4 個位元組⼤大的 unsigned int 的可表⽰示範圍就是從 0 到 4,294,967,295 (約九位數有效數字)
!56
運算結果超出可表⽰示範圍稱為『溢位』,在溢位的情況下,值會變多少⼤大部分情況是《未定義⾏行為》
不要因為範圍可以⼤大⼀一點就⽤用無號數
【補充】int 的位元表⽰示法!57
⼗十進位表⽰示法 ⼆二進位表⽰示法
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 1
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 1 0
5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 1 0 1
255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 1 1 1 1 1 1 1 1
256 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0
2147483647 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1
-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1
-2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 0
-255 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 0 0 0 0 0 0 0 1
-2147483648 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0
負數⽤用 2 的補數表⽰示法: 將正數表⽰示法的 0 和 1 互換後再加 1
32 bits (4 bytes)
如何表⽰示整數是《實作相依》⾏行為,這裡只是列出⼀一般的作法作為參考
浮點數表⽰示法
浮點數 (floating point) 是⽤用來將實數數位化表⽰示的⼀一種表⽰示法 我們現在所⽤用的是由 IEEE 制定的浮點數表⽰示標準
簡單來看,浮點數的表⽰示法將位元分成三個區塊 符號位元 (1 Bit), 指數部分, ⼩小數部分
0 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1
0 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1
+ 3 1563+ 0.1563 ✕ 103
(指數)(符號) (有效數字) [影響精確度]
(實際上格式⽐比較複雜,這裡只是個概念的說明。細節可參考 http://goo.gl/imXGf)
7707
!58
float 有效數字約6位,double 約15位
printf 與 scanf 的格式字串資料型態 名稱 格式符
短整數 (Short Integer) short int %hd
整數 (Integer) int %d
⻑⾧長整數 (Long Integer) long int %ld
字元 (Character) char %c
單精度浮點數 (Single Precision Floating Point)
float %f
雙精度浮點數 (Double Precision Floating Point) double %f, %lf
!59
printf scanf
【範例】使⽤用浮點數
請修改程式讓使⽤用者分別輸⼊入三個整數後,算出三個整數的和、平均值、乘積並顯⽰示給使⽤用者看 (四捨五⼊入到⼩小數點後三位)
注意: 平均值可能具有⼩小數⽽而且使⽤用者可能輸⼊入的數值帶有⼩小數
變數宣告時須改為⽤用 float 宣告
scanf 和 printf 須使⽤用 %f 來讀⼊入或輸出 float
printf 的格式字串可以加上數字表⽰示位數 %.3f 表⽰示印出浮點數並四捨五⼊入到⼩小數點後第三位
!60
【範例】 calc.cpp
字⾯面常數的型態
字⾯面 資料型態 名稱
3 整數 (Integer)int
long int
3u 無號整數 (Unsigned Integer) unsigned int
3l ⻑⾧長整數 (Long Integer) long int
3. 雙精度浮點數 (Double Precision Floating Point) double
3.f 單精度浮點數 (Single Precision Floating point) float
‘3’ 字元 (Character) char
!61
【補充】在能表⽰示的情況下整數選前者
【範例】 constant.cpp
不同型態間的轉換
編譯器為了讓你的運算式合理,可能會試著幫你做型態的⾃自動轉換 (隱性轉型)。
不同基本資料型態間的⾃自動轉換 (隱性轉型) 通常以『可表⽰示範圍⼤大』的為準 例如 :
4 / 3 時,計算結果的資料型態會是 int 4 / 3. 時,4 是 int ⽽而 3. 是 double。計算時會先將 4 轉換成 double 後再除以 3.,計算結果資料型態是 double。
你也可以⽤用強制的⽅方式進⾏行型態轉換 (顯性轉型): 例如:
4 會先被強制轉換為 double 型態 (即 4. ),再試著去除以 3,此時 3 也被動的隱性轉型成 double 型態 (即 3.)。計算結果的資料型態會是 double
4 / 3 與 4 / 3.
(double) 4 / 3
!62
【範例】隱性轉型與格式
請開啟範例檔,並猜測執⾏行結果
提⽰示與解釋: A = B 是指將 B 的值給 A,此時如果 B 的型態與 A 不同則可能會造成無法編譯或發⽣生隱性轉型將 B 轉為 A 的型態 轉型時,浮點數轉為整數是無條件捨去,通常值會變得不精確
要⼩小⼼心的是,使⽤用 printf 或 scanf 時,輸⼊入的引數並不會⾃自動的轉型 例如: printf(“%d”, 3.); 會因為 3. 是 double 卻當成 int 印⽽而失敗,產⽣生不易預期的結果
printf 跟 scanf 這算是特例中的特例,但是我們常常使⽤用到。
!63
【範例】 casting.cpp
【範例】⼤大數計算
試寫⼀一程式輸⼊入兩個五位數整數後輸出他們的乘積 int 的資料型態⼀一般情況下約可表⽰示 log(231) ~ 9 位有效整數
【補充】使⽤用範圍更⼤大的整數型態
C++99 (新版 C++ 標準) 和 C99 (新版 C 標準) 中有⼀一個 long long int 的資料型態⾄至少可表⽰示約 log(263) ~ 19 位有效整數
在 Dev C++ 中,請在 printf 內使⽤用 %I64d 來列印 long long int 型態數值 在 GCC 編譯器中,long long int 是⼀一個語⾔言擴充功能
!64
【範例】 bignum.cpp
‘A’+1=?
(char) (int)
‘A’-1=?
(char) (int)
‘A’+’1’=?
(char)(char)
(???)
(???)
(???)
在輸⼊入、儲存和運算時,char 都是使⽤用整數(ASCII值)格式,只有在輸出 (顯⽰示或列印) 的時候會依照該 ASCII 值所對應的⽂文字套⽤用字型後輸出
【範例】 char.cpp
字元 (char) 是⼀一種整數型態
【範例】⼤大⼩小寫轉換
試寫⼀一程式輸⼊入⼀一⼤大寫英⽂文字元,顯⽰示相對應的⼩小寫英⽂文字元 提⽰示:
!66
範例輸⼊入⼀一 : A
範例輸出⼀一 : a
範例輸⼊入⼆二 : B
範例輸出⼆二 : b
範例輸⼊入三 : Z
範例輸出三 : z
char input = ?; char output = input - ‘A’ + ‘a’;
【範例】 tolower.cpp
【補充】關於字元
就前⾯面的解釋我們了解字元的處理⽅方式是利⽤用建表編號的⽅方法來達成。但在 C/C++ 語⾔言標準中並沒有強制規定字元所使⽤用的編號表格 (只規定要能表⽰示其中 95 個字元),像是⼀一般電腦⽤用的是 ASCII 或是 ISO/IEC 646 的編碼標準都是可能的。
⼀一個字元 (char) 原則上由⼀一個位元組構成,但是⼀一個位元組並不⼀一定是有 8 位元 (某些古⽼老或特別的電腦結構)
⽽而也因為未嚴格規定編碼表格,char 資料型態不⼀一定等價於 signed char 或 unsigned char,此為《實作相依⾏行為》。
!67
使⽤用型態的選擇
那麼我們到底應該選擇怎樣的資料型態呢?
!
!
!
!
!
對於初學者只要熟悉使⽤用這些資料型態就夠了
其他型態的⽤用途? 最佳化記憶體的使⽤用或效率
⽤用途 資料類型 格式符
整數 (⼀一般情況) int %d
浮點數 (有⼩小數或位數過⼤大) double %f %lf
字元 char %c
printf scanf
!68
算術運算⼦子: +-*/%算術運算⼦子運算的結果與運算元的值跟型態有關 運算⼦子是有優先順序的 (*/% 優先於 +- ) 算術運算⼦子優先順序相同時,在左邊的先 每次執⾏行⼀一個運算⼦子時就會產⽣生⼀一個中間結果,我們稱為『暫時變數』,我們要了解這暫時變數的『值』與『型態』:
A = 3 * ( 2 + 1 ) + 7 / 2 + 9 * 3.;A = 3 * 3 + 7 / 2 + 9 * 3.;A = 9 + 7 / 2 + 9 * 3.;A = 9 + 3 + 9 * 3.;A = 9 + 3 + 27. ;A = 12 + 27. ;A = 39. ;
!69
【範例】賦值運算⼦子 : == 為賦值運算⼦子 賦值運算⼦子會將右⽅方的值給左⽅方的變數 賦值運算⼦子的左⽅方⼀一定要放置某個變數。
賦值運算⼦子的運算結果就是左⽅方變數最後的值跟型態
運算優先順序 賦值運算⼦子 (=) 的運算優先順序是全部裡⾯面最低的⽽而且運算順序是由右⾄至左 (特別!)
int A,C; double B, D; A = 3; 3 = A; A = C = 3; A = B = C = D = 3 + 7 / 2.;
!70
【範例】 assign.cpp
這結果會是什麼?
!!!!!
在⼀一般 C 語⾔言標準 (C89/C90) 中,我們使⽤用 int 型態來儲存是⾮非真假對錯: 0 表⽰示假的、錯誤和不成⽴立的意思
1 表⽰示真的、正確和成⽴立的意思
2 表⽰示真的、正確和成⽴立的意思
-1 表⽰示真的、正確和成⽴立的意思
是⾮非真假!71
運算結果 意不是 0 真的 正確 成⽴立
0 假的 錯誤 不成⽴立
【補充】在 C++ 中,也可以⽤用 bool 資料類型來表⽰示
在 C 語⾔言標準中,關係與等號運算⼦子的運算結果有不是 0 (成⽴立) 和 0 (不成⽴立) 兩種可能:
關係與等號運算⼦子
運算意義 運算符號
⼤大於 >
⼩小於 <
⼤大於等於 (不⼩小於) >=
⼩小於等於 (不⼤大於) <=
等於 ==
不等於 !=
!72
4 > 3
4 < 3
4 == 3
4 != 3
4 > 3 > 2
【補充】在 C++ 中,運算結果是 true 與 false 兩種可能
邏輯運算⼦子
在 C 語⾔言標準中,邏輯運算⼦子的運算結果有不是 0 (成⽴立) 與是 0 (不成⽴立) 兩種可能:
運算意義 運算符號iso646.h
C++
⽽而且 (and) && and
或者 (or) || or
⾮非 (not) ! not
!73
4 > 3 && 4 < 3
4 > 3 || 4 < 3
3 > 2 && 1 > 2
1 || 0
4 > 3 && 3 > 2
!(3 > 2)
!3
運算⼦子優先順序表
運算符號 平⼿手時運算順序
( ) 由左⾄至右! 由左⾄至右
* / % 由左⾄至右+ - 由左⾄至右
< > <= >= 由左⾄至右== != 由左⾄至右
= 由右⾄至左&& 由左⾄至右|| 由左⾄至右
優先
不優先
!74
【補充】邏輯運算⼦子的特殊性
|| 與 && 運算⼦子都保證左邊運算元被算出後,才會開始算右邊運算元的值。 其他運算⼦子不是喔!之前我們只保證運算⼦子的運算順序
|| 左邊運算元算出為⾮非 0 時,就不會去算右邊運算元的值。反之當 && 左邊運算元算出為 0 時,就不會去算右邊運算元的值。 為什麼可以這樣?
!75
if 關鍵字if(表⽰示式) { ... }
如果 表⽰示式 為真就 ...
什麼是真或假? ⾮非0 或 0、成⽴立或不成⽴立
if (80 >= 60) { printf(“PASSED !\n”); } if (80 < 60) { printf(“FAILED !\n”); }
int grade = 80; if (grade >= 60) { printf(“PASSED !\n”); } if (grade < 60) { printf(“FAILED !\n”); }
!76
【範例】⽐比較兩數⼤大⼩小
試寫⼀一程式讓使⽤用者輸⼊入兩個數字後顯⽰示其中⽐比較⼤大的給使⽤用者看 :
提⽰示 : (程式⽚片段)
請輸⼊入第⼀一個整數 : 3 請輸⼊入第⼆二個整數 : 4 ⽐比較⼤大的整數是 : 4
int max; if (num1 >= num2) { max = num1; } if (num1 < num2) { max = num2; } printf(“⽐比較⼤大的整數是 %d\n”, max);
!77
【範例】 cmp.cpp
【練習】簡易版猜數字
試寫⼀一個程式,在程式內部預設⼀一個整數作為猜數字遊戲的答案。當使⽤用者執⾏行程式後,需要輸⼊入⼀一個整數,如果該整數與程式預設的答案不同,請顯⽰示是⽐比較⼤大或者⽐比較⼩小;如果該整數與程式預設的答案相同,請恭喜使⽤用者:
!
!
!
!
【思考】要如何讓使⽤用者可以⼀一直猜到答案正確?
請輸⼊入你的猜測 : 4 答對了!
!78
請輸⼊入你的猜測 : 5 太⼤大了!
請輸⼊入你的猜測 : 3 太⼩小了!
【補充】逐位元運算⼦子!79
運算意義 運算符號
逐位元 AND &
逐位元 OR |
逐位元 XOR ^
逐位元 NOT ~
逐位元左移 <<
逐位元右移 >>
習題 [1]
[E0201] 試寫⼀一程式,印出下⾯面這個變數值 :
double x = 3000000000000000.5;
[E0202]* 試寫⼀一程式,印出下⾯面式⼦子的計算結果 :
3000000000000000.5+0.05
[E0203] 試寫⼀一程式,輸⼊入英哩換算後印出公⾥里 (四捨五⼊入⾄至⼩小數點後⼀一位) [公⾥里 = 英哩 * 1.6]
[E0204] 試寫⼀一程式印出 129263*54628 的結果
與 [E0110] 相同
[E0205]* 試寫⼀一程式算出 1292635428 三次⽅方的值 (2159872744519190546127922752)
!80
習題 [2]
[E0206] 試寫⼀一程式,輸⼊入⼀一有號整數,顯⽰示該整數是正整數 (>=0) 或負整數 (< 0)
[E0207] 試寫⼀一程式,輸⼊入⼀一字元,顯⽰示該字元是數⼦子 (0-9)、英⽂文字元 (a-zA-Z) 或其他符號
字元 (char) 請在 scanf 內⽤用 %c 讀⼊入,在 printf 內⽤用 %c 印出
[E0208] 試寫⼀一程式,輸⼊入⼀一個英⽂文⼩小寫字元,將字元轉換為⼤大寫印出
[E0209] 試寫⼀一程式,輸⼊入⼀一個英⽂文字元,將字元的⼤大寫印出 (不限制輸⼊入的字元為⼤大寫或⼩小寫)
!81
習題 [3]
[E0210] 試寫⼀一程式,輸⼊入兩個整數,將兩個整數由⼩小到⼤大印出。
!
[E0211] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一⼋八位整數然後將數字直排顯⽰示。
範例輸⼊入⼀一: 3 6 範例輸出⼀一: 3 6
範例輸⼊入⼆二: 6 3 範例輸出⼆二: 3 6
!82
請輸⼊入⼀一個⼋八位數整數: 38603456 3 8 6 0 3 4 5 6
習題 [4]
[E0213] 試寫⼀一程式,讓使⽤用者輸⼊入⾝身分證字號的前九碼後顯⽰示該⾝身分證字號的第⼗十碼 (驗證碼)
我們的檢查碼計算⽅方式 : (A: 10, B:11, C:12, ..., Z:36)
!
!
!
!
總和 = 1x1 + 0x9 + 1x8 + 2x7 + 3x6 + 4x5 + 5x4 + 6x3 + 7x2 + 8x1 = 121
121%10 = 1, (10-1)%10 = 9
A 1 2 3 4 5 6 7 8
1 0 1 2 3 4 5 6 7 8
x1 x9 x8 x7 x6 x5 x4 x3 x2 x1
%c%d
!83
!84
!85
!86
!87
!88
課程⼤大綱
條件判斷 :
if ( 表⽰示式 ) { ... } [P.91] 如果表⽰示式成⽴立就 ...
if ( 表⽰示式 ) { ... } else { ... } [P.93] 如果表⽰示式成⽴立就 ... 否則就 ..
C / C++ 的複合指定與遞增遞減運算⼦子 [P.96]
重複執⾏行 (迴圈) :
while ( 表⽰示式 ) { ... } [P.99] 當表⽰示式成⽴立就⼀一直執⾏行 ...
!90
if ( ) { }
int main() { return 0; }
#include <stdio.h> #include <stdlib.h> int grade; scanf(“%d”, &grade); system(“pause”);
if ( [?] ) { ... }
如果 [?] 成⽴立 (為真 / 值⾮非零) 就 ...
printf(“PASSED !\n”);
if 關鍵字
成⽴立
不成⽴立
...
[?]
成⽴立
不成⽴立
printf(“PASSED !\n”);
grade >= 60grade >= 60
!91
【範例】簡單計算
試寫⼀一程式讓使⽤用者輸⼊入⾥里程數 (公尺),計算後顯⽰示應付的計程⾞車資 計程⾞車資計算公式
1.25 公⾥里內是 70 元 (起跳 70 元) 超過 1.25 公⾥里後,每 250 公尺多 5 元 [不⾜足者以 250 公尺計)
1.25 公⾥里要付 70 元, 1.26 公⾥里要付 75 元, 2.00 公⾥里要付 85 元
試寫⼀一程式讓使⽤用者做簡單的兩整數計算 [+, - , *, /] (精確到⼩小數點後兩位) [%.2f]
3+5 ANS: 8.00
3-5 ANS: -2.00
3*5 ANS: 15.00
3/5 ANS: 0.60
!92
【範例】 calc.cpp
【範例】 taxi.cpp
if ... else ... [1]
if ( [?] ) { ... } else { ... }
如果 [?] 成⽴立就 ... 否則就 ...
!
巢狀 if-else 敘述 :
成⽴立
不成⽴立
...
...[?]
if (a > b) { printf(“a > b”); } else { if (a < b) { printf(“a < b”); } else { printf(“a == b”); } }
if (a > b) { printf(“a > b”); } if (a < b) { printf(“a < b”); } if (a == b) { printf(“a == b”); }
!93
if ... else ... [2]
if ( [?] ) { ... } else { ... }
如果 [?] 成⽴立就 ... 否則就 ...
!
多層 if-else 敘述 :
成⽴立
不成⽴立
...
...[?]
if (a > b) { printf(“a > b”); } else if (a < b) { printf(“a < b”); } else { printf(“a == b”); }
if (a > b) { printf(“a > b”); } if (a < b) { printf(“a < b”); } if (a == b) { printf(“a == b”); }
!94
⼀一種較精簡省略的寫法
【範例】⽐比較⼤大⼩小與排序 試寫⼀一個程式讓使⽤用者輸⼊入三個數字後顯⽰示最⼤大的值給使⽤用者看 :
!
!
!
試寫⼀一個程式讓使⽤用者輸⼊入三個數字後將數字由⼩小⾄至⼤大依序印出
Please enter the first integer : 3 Please enter the second integer : 4 Please enter the third integer : 2 The largest integer is 4.
!95
【範例】 sort3.cpp
【範例】 max3.cpp
複合指定與遞增遞減運算⼦子
複合指定運算⼦子
加等於 +=
減等於 -=
乘等於 *=
除等於 /=
求餘等於 %=
遞增遞減運算⼦子
遞增 ++
遞減 --
複合指定運算⼦子: a+=2 相等於 a=a+2
a*=2 相等於 a=a*2
遞增與遞減運算⼦子: ++a 會將 a 的值加⼀一並回傳新值
--a 會將 a 的值減⼀一並回傳新值
a++ 會回傳 a 原有的值後再將 a 值加⼀一
a-- 會回傳 a 原有的值後再將 a 值減⼀一
!96
【範例】++i 與 i++判斷下⾯面程式執⾏行過程中 a 與 b 的值:
int a = 1; int b = 2; a = a+1; a += 1; a++; a+1; b = ++a; b = a++; a = a++; /* 未定義⾏行為:同⼀一句內多次指定同個變數的值 */
!97
【範例】 inc.cpp
『未定義⾏行為』: 具有未定義⾏行為的程式碼之執⾏行結果是不可以預期的
【範例】⽐比較數字
試寫⼀一程式讓使⽤用者輸⼊入⼀一個六位正整數,並判斷這整數內含有多少個數字 7 後顯⽰示給使⽤用者看:
!
!
提⽰示 :
a = a + 1 會將 a 的值加⼀一後存回 a
Please enter a 6-digit number : 378717 The count of 7s is 3.
/ 100000 == ? / 10000 % 10 == ? / 1000 % 10 == ? / 100 % 10 == ? / 10 % 10 == ? % 10 == ?
!98
【範例】 lucky7.cpp
while ( [?] ) { ... }
當 [?] 成⽴立時就 ...
!
!
!
!
while 語法會⼀一直重複執⾏行內容直到 [?] 不成⽴立時才結束 請謹慎使⽤用,確保迴圈會正常結束
while 關鍵字
while (a < 100) { a = a + 1; }
START: if (a < 100) { a = a + 1; goto START; }
成⽴立
不成⽴立[?]
...
成⽴立
不成⽴立
a=a+1
a < 100
if (a < 100) { a = a + 1; }
!99
【範例】猜數字
試寫⼀一個程式,在程式內部預設⼀一個整數作為猜數字遊戲的答案。當使⽤用者執⾏行程式後,需要輸⼊入⼀一個整數,如果該整數與程式預設的答案不同,請顯⽰示是⽐比較⼤大或者⽐比較⼩小;如果該整數與程式預設的答案相同,請恭喜使⽤用者。⽽而遊戲重複進⾏行問答直到使⽤用者猜到答案後才結束。
請猜⼀一個整數: 5 太⼤大了喔.
請猜⼀一個整數: 3 太⼩小了喔.
請猜⼀一個整數: 4 你真是天才!
!100
【範例】 guess.cpp
【範例】統計資料
試寫⼀一程式,讓使⽤用者可以輸⼊入任意多筆的正整數後,顯⽰示這些數字的個數、和、平均值與最⼤大值 當使⽤用者輸⼊入負數時表⽰示資料輸⼊入完畢
請輸⼊入⼀一個正整數 [負數則結束]: 3 請輸⼊入⼀一個正整數 [負數則結束]: 4 請輸⼊入⼀一個正整數 [負數則結束]: 5 請輸⼊入⼀一個正整數 [負數則結束]: -1 共輸⼊入 3 個數字. 總和是 12 平均是 4.000000 最⼤大值是 5
!101
【範例】 sts.cpp
【範例】迴圈的基本
試寫⼀一程式,印出由 1 ⾄至 100 間的整數
!
!
!
!
!
試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,印出 1 ⾄至該正整數 N 間的整數
1 2 3 4 5 6 ... 100
!102
【範例】 int.cpp
【範例】 int100.cpp
習題 [1]
[E0301] 試寫⼀一程式,輸⼊入⼀一個 0 ~ 100 分的成績,輸出成績的等第:(A: 80~100, B: 70~79, C: 60~69), F (0 ~ 59)
!
!
[E0302] 試寫⼀一個程式,讓使⽤用者輸⼊入四個數字後印出最⼤大與最⼩小值
[E0303] 試寫⼀一個程式,讓使⽤用者輸⼊入四個數字後將數字由⼩小⾄至⼤大排列顯⽰示
範例輸⼊入⼀一: 90 範例輸出⼀一: A範例輸⼊入⼆二: 40 範例輸出⼆二: F範例輸⼊入三: 70 範例輸出三: B
!103
習題 [2]
[E0304] 試寫⼀一程式,輸⼊入⽉月份,顯⽰示該⽉月份的季節 (春[3.4.5⽉月]、夏[6.7.8⽉月]、秋[9.10.11⽉月]或冬 [12.1.2]⽉月)
[E0305] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一⻄西元年份 (<5000),輸出該年是否是閏年 每四年⼀一閏、每百年不閏、每四百年⼀一閏、每四千年不閏
[E0306] 試寫⼀一程式,輸⼊入平⾯面上某點的 x 座標值與 y 座標值,顯⽰示該點是位於原點、第幾象限或者位於哪個座標軸上
!104
習題 [3]
[E0307] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,顯⽰示 1 ⾄至 N 之間的所有偶數
[E0308] 試寫⼀一程式,計算某⼈人跑 100 公尺,每秒鐘會跑剩下距離的⼀一半,要過幾秒鐘才會跑到接近終點⼩小於 1 公尺
[E0309] 試寫⼀一程式,印出所有 1 ~ 100 間所有 3 的倍數
[E0310] 試寫⼀一程式,輸⼊入⼀一個整數,印出所有該整數的因數 (因數表⽰示所有可以整除該整數的數字)
範例輸⼊入: 10 範例輸出: 1 2 5 10
!105
習題 [4]
[E0311] 試寫⼀一程式,讓使⽤用者依序輸⼊入賣出商品編號後,顯⽰示商品賣出的總⾦金額。(商品可以重複) (輸⼊入編號 0 的商品代表輸⼊入完畢)
商品編號 商品⾦金額
1 90
2 75
3 83
4 89
5 71
範例輸⼊入: 1 5 5 4 1 0
範例輸出: 共 411 元
!106
習題 [5]
[E0312] 試寫⼀一程式,印出所有 1 ~ 100 間所有 3 的倍數且不是 5 的倍數的整數
[E0313] (韓信點兵) 韓信要算操場上的兵,三個⼀一數發現剩下⼀一個,五個⼀一數發現剩下三個,七個⼀一數發現剩下兩個。試寫⼀一程式去找出到底操場上有多少兵 ?(輸出最⼩小值)
[E0314] 試寫⼀一程式,計算個位數為 6 且可被 3 整除的五位正整數有幾個
[E0315]* 試寫⼀一程式,找出⼀一個四位正整數,他的反序數正好是這個四位正整數的 9 倍
反序數: 1325 的反序數是 5231
!107
習題 [6]
[E0316] [質數檢驗] 試寫⼀一程式,輸⼊入某個正整數 N,判斷 N 是不是質數
質數表⽰示除了 1 跟本⾝身以為沒有其他的因數
[E0317] [列出質數] 試寫⼀一程式,顯⽰示 1 到 1000 間所有的質數
!108
習題 [7]
[E0318] 試寫⼀一程式,輸⼊入⼗十個 0 ~ 100 分的成績,輸出各等第的統計⼈人數:(A: 80~100, B: 70~79, C: 60~69), F (0 ~ 59)
[E0319*] 試寫⼀一程式,讓使⽤用者輸⼊入⼗十個成績 (0~100) 後,印出將最⼤大與最⼩小值去掉後的其他⼋八個成績的總和與平均值
[E0320] 試寫⼀一程式,印出所有英⽂文字⺟母
[E0321] 輸⼊入⼀一整數,顯⽰示其為幾位數
[E0322]* 試寫⼀一程式,讓使⽤用者輸⼊入⼀一整數後將順序顛倒顯⽰示。
範例輸⼊入: 39861
範例輸出: 16893
!109
習題 [8]
[E0323] 試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,顯⽰示最⼤大的數字
[E0324] 試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,依序顯⽰示最⼤大的兩個數字
[E0325] 試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,依序顯⽰示最⼤大的三個數字
!110
習題 [9]
[E0326] 試寫⼀一程式,讓使⽤用者輸⼊入五位整數後,判斷該整數是否是回⽂文 回⽂文指的是該數字由左⾄至右或由右⾄至左的數字是⼀一樣的 例如 : 12321,11911,39893 等...
!
!
!
[E0327]* 試寫⼀一程式,讓使⽤用者輸⼊入任意位整數後,判斷該整數是否為回⽂文
Please enter an integer: 86312 No. Please enter an integer: 12321 Yes.
!111
習題 [10]
[E0328] 試寫⼀一程式,讓使⽤用者分別輸⼊入每個學⽣生的成績,輸⼊入負數則代表結束。輸⼊入完後,顯⽰示學⽣生成績的統計圖: 級距為 (0~59, 60~69, 70~79, 80~89, 90~100)請輸⼊入 1 號成績: 80 請輸⼊入 2 號成績: 85 請輸⼊入 3 號成績: 90 請輸⼊入 4 號成績: 95 請輸⼊入 5 號成績: 75 請輸⼊入 6 號成績: -1
0~ 59 : 60~ 69 : 70~ 79 : * 80~ 89 : ** 90~100 : **
!112
習題 [11]
[E0329] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一整數後將每位數分開顯⽰示
!
!
!
[E0330*] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一個整數後,將該整數⽤用⼆二進位表⽰示
範例輸⼊入: 49556
範例輸出: 4 9 5 5 6
範例輸⼊入⼀一: 5
範例輸出⼀一: 101
範例輸⼊入⼆二: 3
範例輸出⼆二: 11
!113
習題 [12]
[E0331] 試寫⼀一程式,讓使⽤用者輸⼊入⻑⾧長⽅方形的⻑⾧長與寬後,⽤用⽂文字⽅方式畫出實⼼心與空⼼心的⽅方塊:
********** * * * * **********
範例輸出:********** ********** ********** **********
範例輸⼊入:請輸⼊入寬度 : 10 請輸⼊入⾼高度 : 4
!114
習題 [13]
[E0332] 試寫⼀一程式,印出下列結果:
!
!
!
[E0333] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下列結果:
* ** *** **** *****
範例輸⼊入⼀一: 5
範例輸出⼀一: * ** *** **** *****
範例輸⼊入⼆二: 3
範例輸出⼆二: * ** ***
!115
[E0334*] 試寫⼀一程式,讓使⽤用者輸⼊入某個⽉月份後,顯⽰示⻄西元 2011 該⽉月份的⽇日曆
2012 年 1 ⽉月 1 ⽇日是星期⽇日,2 ⽉月有 29 天Please enter the month: 3 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
習題 [14]!116
習題 [15]
[E0335] 試寫⼀一猜數字遊戲,輸⼊入四個 1 ⾄至 9 各不相同的數字後,如果某個數字的位置與號碼都正確則算⼀一個 A,如果號碼正確但是位置不正確則算⼀一個 B,將 A 與 B 的次數顯⽰示給使⽤用者看後,讓使⽤用者猜到猜對為⽌止!
!117
請輸⼊入答案: 1234 請輸⼊入你的猜測: 4321 0A4B 請輸⼊入你的猜測: 1324 2A2B 請輸⼊入你的猜測: 6789 0A0B 請輸⼊入你的猜測: 1234 4A 恭喜你答對了!
!118
!119
!120
課程⼤大綱
條件判斷 : if ( 表⽰示式 ) { ... } [P.91] if ( 表⽰示式 ) { ... } else { ... } [P.93] switch (整數值) { case 固定整數值: ... default: ... } [P.135] 重複執⾏行 (迴圈) :
while ( 表⽰示式 ) { ... } [P.99]
for (初始式; 表⽰示式; 迭代式) { ... } [P.123] do { ... } while(表⽰示式); [P.131]
警⽰示型迴圈與計數型迴圈 迴圈控制:
break 與 continue 關鍵字 [P.133]
!122
for 關鍵字for (初始式; 表⽰示式; 迭代式) { ... }
相當於 :
!
!
!
範例 : 印出 1 ⾄至 10
{ 初始式; while (表⽰示式) { ... 迭代式; } }
for (int i = 1; i <= 10; ++i) { printf(“%d\n”, i); }
{ int i = 1; while (i <= 10) { printf(“%d\n”, i); ++i; } }
!123
成⽴立
不成⽴立表⽰示式
...
初始式
迭代式
【範例】迴圈的基本
試寫⼀一程式,印出由 1 ⾄至 100 間的整數
!
!
!
!
!
試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,印出 1 ⾄至該正整數 N 間的整數
1 2 3 4 5 6 ... 100
!124
【範例】 int.cpp
【範例】 int100.cpp
【範例】迴圈列印
試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,顯⽰示 1 ⾄至 N 之間的所有奇數
試寫⼀一程式,印出由 100 ⾄至 1 間的整數
試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,顯⽰示 1 ⾄至 N 的整數和
試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 N 後,印出 N 個星號 (*)範例輸⼊入⼀一: 5 範例輸出⼀一: *****
範例輸⼊入⼀一: 8 範例輸出⼆二: ********
!125
【範例】 odd.cpp
【範例】 reverse.cpp
【範例】 sum.cpp
【範例】 print_star.cpp
警⽰示型迴圈與計數型迴圈
在選擇要使⽤用 while 或 for 時,通常以該迴圈的特性來決定: 警⽰示型迴圈:該迴圈的結束條件是在某不明確事件 (例如當使⽤用者輸⼊入 -1 ) 發⽣生時,請使⽤用 while 範例:猜數字 !!
!
!計數型迴圈:該迴圈在執⾏行明確次數後會結束的話,請使⽤用 for 範例:算 1 ⾄至 N 的數字和 ⼀一般情況下,先考慮使⽤用 for,不合適時再考慮 while
讀⼊入資料; while (資料不是警⽰示值) { 執⾏行動作; 讀⼊入資料; }
!126
【範例】複利計算
試寫⼀一程式,計算某⼈人在銀⾏行中的定額存款在⼗十年間的結算⾦金額 (每年無條件捨去⾄至整數位結算⼀一次)
計算公式 : 每年結算⾦金額 = 累計⾦金額 * (1 + 年利率)
請輸⼊入本⾦金: 1000 請輸⼊入年利率: 0.05 Year Amount 1 1050 2 1102 3 1157 4 1214 5 1274 6 1337 7 1403 8 1473 9 1546 10 1623
!127
【範例】 interest.cpp
【範例】⽐比較⼤大⼩小
擂台賽! 利⽤用⼀一組變數去記錄現在擂台盟主,再⼀一⼀一上台⽐比劃,每輪留下勝利者!
!
!
試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,顯⽰示其中最⼤大的數字
試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,依序顯⽰示最⼤大的兩個數字
試寫⼀一程式,讓使⽤用者輸⼊入⼗十個數字後,依序顯⽰示最⼤大的三個數字
預設第⼀一個⼈人或拿個沙包為擂台主; for (每⼀一個⼈人) { if (與擂台主 PK 獲勝) { 換擂台主; } }
!128
【範例】 big3.cpp
【範例】 max10.cpp
【範例】 big2.cpp
【範例】暴⼒力的美
⽤用迴圈把所有可能的候選⼈人都⼀一⼀一列出來,再試著留下我們想要的
!
!
試寫⼀一程式,輸⼊入某個正整數 N,判斷 N 是不是質數 質數表⽰示除了 1 跟本⾝身以為沒有其他的因數
試寫⼀一程式,顯⽰示 1 到 1000 間所有的質數
for (每⼀一個可能的候選⼈人) { if (符合要求) { 做想做的事情; } }
!129
【範例】 prime.cpp
【範例】 is_prime.cpp
【範例】巢狀迴圈
試寫⼀一程式,印出下列結果:
!
!
!
試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下列結果:
* ** *** **** *****
範例輸⼊入⼀一: 5
範例輸出⼀一: * ** *** **** *****
範例輸⼊入⼆二: 3
範例輸出⼆二: * ** ***
!130
【範例】 triangleN.cpp
【範例】 triangle.cpp
do 關鍵字do { ... } while (表⽰示式);
⾄至少會執⾏行 {...} 的內容⼀一次的 while 語法
int grade; do { scanf(“%d”, &grade); } while (grade < 0 || grade > 100);
成⽴立
不成⽴立
表⽰示式
...
!131
有兩種⽅方式可以產⽣生無窮迴圈:
使⽤用條件永遠為真的 while 迴圈:
!
!
使⽤用沒有條件的 for 迴圈 (預設為真):
【補充】無窮迴圈!132
while (1) { // 執⾏行內容}
for(;;) { // 執⾏行內容}
break 和 continue 關鍵字break: 強制結束 while, for 或 switch
!
!
!
!
!
continue: 跳⾄至 while 或 for 的下⼀一次迴圈開始
for (int i = 1; i <= 10; ++i) { if (i == 5) { break; } printf(“%d”, i); }
for (int i = 1; i <= 10; ++i) { if (i == 5) { continue; } printf(“%d”, i); }
!133
while (1) { 讀⼊入資料; if (資料是警⽰示值) { break; } 執⾏行動作; } 參考 [P.126]
【範例】迴圈控制
試寫⼀一程式 ,印出 1 ⾄至 10 間除了 5 之外的整數
!
!
試寫⼀一程式,印出 1 ⾄至 100 間除了 5 的倍數之外各個整數
!
試寫⼀一程式,讓使⽤用者輸⼊入⼀一個整數後,顯⽰示該整數的平⽅方值。反覆執⾏行,直到使⽤用者輸⼊入負數時才結束。
1 2 3 4 6 7 8 9 10
!134
【範例】 squared.cpp
【範例】 no5.cpp
【範例】 no5t.cpp
switch (整數值) { case 固定整數值: ... ; default: ...; }
switch、case 與 default
char grade = ?; switch (grade) { case ‘A’: case ‘a’: countA++; break; case ‘B’: case ‘b’: countB++; break; case ‘C’: case ‘c’: countC++; break; default: countErr++; break; }
當 grade 是 ‘A’ 或 ‘a’ 時, 會執⾏行此⾏行
當 grade 是 ‘B’ 或 ‘b’ 時, 會執⾏行此⾏行
當 grade 是 ‘C’ 或 ‘c’ 時, 會執⾏行此⾏行
當 grade 不符合上⾯面所列時,會執⾏行此⾏行
!135
【範例】 grade.cpp
【範例】統計⾦金額
試寫⼀一程式,讓使⽤用者先輸⼊入賣出商品的總數後,分別輸⼊入每個賣出商品的編號。輸⼊入完後,顯⽰示賣出的總⾦金額
商品編號 商品⾦金額
1 90
2 75
3 83
4 89
5 71
Please enter the number of goods: 5 1 5 5 4 1
The amount is 411.
!136
【範例】 coin.cpp
習題 [1]
以下題⺫⽬目⽤用 for 改寫:
[E0401] E0307, [E0402] E0309
[E0403] E0310, [E0404] E0312
[E0405] E0314, [E0406] E0315
[E0407] E0316, [E0408] E0318
[E0409] E0319, [E0410] E0320
[0E411] E0331, [E0412] E0334
以下題⺫⽬目⽤用 switch 改寫:
[E0413] E0311, [E0414] E0334
!137
習題 [2]
[E0415] 試寫⼀一程式,印出下列結果:
!
!
!
[E0416] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下列結果:
* ** *** **** *****
範例輸⼊入⼀一: 5
範例輸出⼀一: * ** *** **** *****
範例輸⼊入⼆二: 3
範例輸出⼆二: * ** ***
!138
習題 [3]
[E0417] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下列結果:
!
!
!
[E0418] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下列結果:
範例輸⼊入⼀一: 5
範例輸出⼀一: ***** **** *** ** *
範例輸⼊入⼆二: 3
範例輸出⼆二: *** ** *
範例輸⼊入⼀一: 5
範例輸出⼀一: ***** **** *** ** *
範例輸⼊入⼆二: 3
範例輸出⼆二: *** ** *
!139
習題 [4]
[E0419] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下列結果:
!
!
!
[E0420] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下列結果:
範例輸⼊入⼀一: 5
範例輸出⼀一: 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
範例輸⼊入⼆二: 3
範例輸出⼆二: 1 2 2 3 3 3
範例輸⼊入⼀一: 5
範例輸出⼀一: 5 5 5 5 5 4 4 4 4 3 3 3 2 2 1
範例輸⼊入⼆二: 3
範例輸出⼆二: 3 3 3 2 2 1
!140
習題 [5]
[E0421] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下列結果:
!
!
!
[E0422] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下列結果:
範例輸⼊入⼀一: 5
範例輸出⼀一: 5 4 4 3 3 3 2 2 2 2 1 1 1 1 1
範例輸⼊入⼆二: 3
範例輸出⼆二: 3 2 2 1 1 1
範例輸⼊入⼀一: 5
範例輸出⼀一: 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5
範例輸⼊入⼆二: 3
範例輸出⼆二: 1 1 2 1 2 3
!141
習題 [6]
[E0423] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數 ,印出下列結果:
!
!
!
[E0424] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數,印出下列結果:
範例輸⼊入⼀一: 5
範例輸出⼀一 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5
範例輸⼊入⼆二: 3
範例輸出⼆二: 1 1 2 1 2 3
範例輸⼊入⼀一: 5
範例輸出⼀一: 1 2 1 3 2 1 4 3 2 1 5 4 3 2 1
範例輸⼊入⼆二: 3
範例輸出⼆二: 1 2 1 3 2 1
!142
習題 [7]
[E0425] 試寫⼀一程式,輸⼊入⼀一個在 1 跟 9 間的整數 ,印出下列結果:
!
!
!
[E0426] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一整數後,繪製相對應⾼高度的三⾓角形
範例輸⼊入⼀一: 5
範例輸出⼀一: 1 2 1 3 2 1 4 3 2 1 5 4 3 2 1
範例輸⼊入⼆二: 3
範例輸出⼆二: 1 2 1 3 2 1
範例輸⼊入⼀一: 3
範例輸出⼀一: * *** *****
範例輸⼊入⼆二: 5
範例輸出⼆二: * *** ***** ******* *********
!143
習題 [8]
[E0427] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一正奇數後,繪製相對應⾼高度的菱形
Please enter an odd integer: 3 * *** *
Please enter an odd integer: 5 * *** ***** *** *
!144
習題 [9]
[E0428*] 試寫⼀一程式,讓使⽤用者輸⼊入⼀一正整數 K 表⽰示三⾓角波的波⻑⾧長,另⼀一正整數 M 表⽰示三⾓角波的個數後,繪製出三⾓角波圖
Please enter an integer (K): 3 Please enter an integer (M): 2
* ** *** * ** ***
!145
!146
!147
!148
!149
!150
!151
!152