C程序設計華中科技大學課件第二章.ppt
《C程序設計華中科技大學課件第二章.ppt》由會員分享,可在線閱讀,更多相關《C程序設計華中科技大學課件第二章.ppt(106頁珍藏版)》請在裝配圖網(wǎng)上搜索。
C 程序設計 授課教師 李戰(zhàn)春18995621070lizhanchunwh 第二章基本控制結構程序設計 結構化程序設計的特點是任何程序都可由三種基本結構及其組合來描述 本章將介紹C 分支結構和循環(huán)結構的設計方法 教學目標 編寫選擇和循環(huán)結構的程序考核方式 要求基本 1 獨立編寫并運行2 2 2 3 2 獨立編寫并運行2 8 2 9 2 10 2 7 2 12較高要求 獨立編寫并運行2 5 2 6 2 13 2 15 2 16 利用海倫公式計算三角形面積 輸入a 3 b 4 c 5后 結果是多少 輸入a 1 b 1 c 3呢 為什么 怎么辦 2 1算法的概念與表示方法 2 1 1算法的概念 2 1 3算法描述的三種基本結構 2 1 2算法的表示 2 1 1算法的概念 2 1 3算法描述的三種基本結構 3循環(huán)結構 1順序結構 2分支結構 算法的基本結構 對算法的理論研究和實踐表明 任何算法的描述都可以分解為三種基本結構或它們的組合 這三種基本結構是順序結構 分支結構和循環(huán)結構 num1 15 2 1 3算法描述的三種基本結構 1 順序結構 例2 1 求兩數(shù)之和 顯示結果 35 num2 20 sum num1 num2 演示算法執(zhí)行過程 輸出sum 活動圖 2 1 3算法描述的三種基本結構 2 分支結構 例2 2 輸入三個數(shù) 輸出其中的最大數(shù) x 7 y 12 z 10 if x y max x elsemax y if z max max z 輸出max 顯示結果 12 演示算法執(zhí)行過程 2 2 1if語句 if語句基本格式 1 if 表達式 語句1 2 if 表達式 語句1 else 語句2 例2 4 輸入一個年份 判斷是否閏年 例2 5 從鍵盤上輸入三個整數(shù) 輸出其中的最大數(shù) 2 2分支結構程序設計 if語句 例2 4 例2 4 輸入一個年份 判斷是否閏年 算法分析 假定年份為year 閏年的條件是 year 4 0 分析 讀入三個數(shù) 先求出兩個數(shù)中較大者 再將該大數(shù)與第三個數(shù)比較 求出最大數(shù) intmain inta b c max cout a b c cout b max a else max b if c max max c cout 最大數(shù)為 max endl return0 if語句 例2 5 例2 5 從鍵盤上輸入三個整數(shù) 輸出其中的最大數(shù) 邏輯運算 邏輯表達式 邏輯運算 用于判斷分析 運算符包括關系和邏輯運算符 關系運算符 包括 大于 大于等于 小于 小于等于 等于 和 不等于 關系運算符完成兩個操作數(shù)大小的比較 結果為邏輯值true 真 或false 假 邏輯值與整數(shù)的對應關系是什么 邏輯值能參與運算嗎 關系表達式 例如 a b c d 等同于 a b c d y a b 計算a b的值0或1賦給y a b c 等同于 a b c 先求a b的值 再將結果0或1與c比較大小 由關系運算符連接的表達式 是一種簡單的邏輯表達式 值為true或false 數(shù)學式a b c 對應的關系表達式為什么 設有定義floata 3 2 intb 5 則 3 a b 結果是 其運算過程如下 a 5 b 3 2 3 T 即1 T即1 邏輯運算符 包括 和 語義見下表 由邏輯運算符連接的表達式 其操作數(shù)和運算結果均為邏輯量 操作數(shù)可以是表達式 只要其值是邏輯量 如關系表達式 由于邏輯值和整數(shù)之間的對應關系 也允許整型和字符型操作數(shù)進行邏輯運算 21 0 邏輯與 21與0 結果 21 0 邏輯或 21或0 結果 21 邏輯非 21的非 結果 運算結果同樣可以作為一個整數(shù)參與其他運算 邏輯表達式 邏輯表達式計算時 邏輯非優(yōu)先級最高 關系運算其次 邏輯與和邏輯或最低 已知 inta 10 b 20 c 30 floatx 1 8 y 2 4 ay ay a b c t1 1 t2 0 t4 0 t3 0 t5 b t6 1 得整個表達式的值為 1 嵌套if語句 if語句中 如果內(nèi)嵌語句又是if語句 嵌套有兩種形式 2 2 2if語句的嵌套 例2 6 用嵌套if語句完成 例2 5 的任務 方法1 采用if中嵌套形式intmain inta b c max cout a b c coutb if a c max a a b且a celse max c a b且ac max b acelse max c a b且b ccout 最大數(shù)max max return0 if語句 例2 6 例2 6 用嵌套if語句完成 例2 5 的任務 方法2 采用else中嵌套形式intmain inta b c max cout a b c cout b if語句 例2 6 例2 7 某商場購物優(yōu)惠活動 例2 8 求一元二次方程的根 配對關系實例 例2 7 某商場優(yōu)惠活動規(guī)定 某種商品單價為80元 一次購買5件以上 包含5件 10件以下 不包含10件 打9折 一次購買10件以上 包含10件 打8折 設計程序根據(jù)客戶的購買量計算總價 算法1 輸入購買件數(shù)count 設置單價price 80 元 2 根據(jù)count值確定折扣率discount 3 實際售價amount price count discount 4 輸出amount的值 算法細化 2 1 if count 5 count 10 discount 0 8 if語句 例2 7 intmain floatprice discount amount 單價 折扣 總價intcount 購買件數(shù)cout price cout count if count 5 discount 1 elseif count 10 discount 0 9 else discount 0 8 amount price count discount cout 單價 price endl cout 購買件數(shù) count t 折扣 discount endl cout 總價 amount endl return0 if語句 例2 7 例2 8 求一元二次方程ax2 bx c 0的根 其中系數(shù)a a 0 b c的值由鍵盤輸入 分析 輸入系數(shù)a a 0 b c后 令delta b2 4ac 結果有三種情況 若delta 0 方程有兩個相同實根 若delta 0 方程有兩個不同實根 若delta 0 方程無實根 if語句 例2 8 include includeusingnamespacestd intmain floata b c floatdelta x1 x2 cout a b c cout a a t b b t c c endl delta b b 4 a c if語句 例2 8 if delta 0 cout0 delta sqrt delta x1 b delta 2 a x2 b delta 2 a cout 方程有兩個不同實根 cout x1 x1 t x2 x2 endl elsecout 方程無實根 endl delta 0return0 if語句 例2 8 2 2 3條件運算符 三元運算符條件運算符 可以用來簡化if語句表達 其構成的表達式格式為 表達式1 表達式2 表達式3例如 inta 6 b 7 min a b a b min 6 includeusingnamespacestd intmain charch cout ch if ch A 改寫為條件表達式ch ch A 把輸入字符轉(zhuǎn)換為小寫字母 對輸入字符進行判斷 如果是大寫字母 則轉(zhuǎn)換為小寫字母 否則 不轉(zhuǎn)換 2 2 4switch語句 開關語句 switch語句 用來實現(xiàn)多選一 switch 表達式 case常量表達式 語句序列 break case常量表達式n 語句序列n break default 語句序列 條件表達式 整型字符型布爾型枚舉型 取值為常量的表達式 switch 表達式 case常量表達式1 語句1case常量表達式2 語句2 case常量表達式n 語句ndefault 語句n 1 注 表達式類型為非浮點型 各常量表達式類型要與之匹配 各常量表達式要求各不相等 語句標號 2 2 4switch語句 根據(jù)一個整型表達式的值決定程序分支 執(zhí)行流程 2 2 4switch語句 includeusingnamespacestd intmain chargrade cout grade switch grade case a cout 85 100 n case b cout 70 84 n case c cout 60 69 n case d cout 60 n default cout error n return0 觀察不同輸入時的輸出結果 switch語句 例題根據(jù)考試成績的等級打印出百分制分數(shù)段 includeusingnamespacestd intmain chargrade cout grade switch grade case a cout 85 100 n case b cout 70 84 n case c cout 60 69 n case d cout 60 n default cout error n return0 2 1 2switch語句 例題根據(jù)考試成績的等級打印出百分制分數(shù)段 switch語句 includeusingnamespacestd intmain chargrade cout grade switch grade case a cout 85 100 n case b cout 70 84 n case c cout 60 69 n case d cout 60 n default cout error n return0 2 1 2switch語句 例題根據(jù)考試成績的等級打印出百分制分數(shù)段 switch語句 例題根據(jù)考試成績的等級打印出百分制分數(shù)段 includeusingnamespacestd intmain chargrade cout grade switch grade case a cout 85 100 n case b cout 70 84 n case c cout 60 69 n case d cout 60 n default cout error n return0 switch語句 includeintmain chargrade cout grade switch grade case a cout 85 100 n break case b cout 70 84 n break case c cout 60 69 n break case d cout 60 n break default cout error n return0 跳出switch語句 switch語句 例題根據(jù)考試成績的等級打印出百分制分數(shù)段 例題根據(jù)考試成績的等級打印出百分制分數(shù)段 includeintmain chargrade cout grade switch grade case a cout 85 100 n break case b cout 70 84 n break case c cout 60 69 n break case d cout 60 n break default cout error n return0 switch語句 討論 1 csae和default僅起語句標號作用 不能控制程序流程2 一旦選中一個case分支后 將繼續(xù)往下順序執(zhí)行語句序列3 添加break語句可以跳出switch語句體 達到控制流程作用 根據(jù)以上特點 可以寫出多個case共執(zhí)行一個語句的形式 2 1 2switch語句 2 2 4switch語句 例根據(jù)考試成績的等級打印出百分制分數(shù) 允許輸入大寫或小寫字母 includeintmain chargrade cout grade switch grade case a case A cout 85 100 n break case b case B cout 70 84 n break case c case C cout 60 69 n break case d case D cout 60 n break default cout error n retrun0 a 或 A 共同執(zhí)行一個語句 switch語句 if語句switch語句 形成分支控制流程 不形成程序控制流程 用于復雜條件判斷 表達式的值為數(shù)值集合時作多分支控制 可讀性較好 與if語句比較 2 2 4switch語句 例2 10 設計一個計算器程序 實現(xiàn)加 減 乘 除運算 分析 讀入兩個操作數(shù)和運算符 根據(jù)運算符完成相應運算 includeusingnamespacestd intmain floatnum1 num2 charop cout num1 op num2 switch op case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break default cout op 是無效運算符 return0 循環(huán)結構 例2 3 求4個整數(shù)的和 顯示結果 60 演示算法執(zhí)行過程 12 3 14 26 2 16 42 1 18 60 0 count 4 整數(shù)個數(shù)sum 0 累加和的初值while count 0 x 輸入一個整數(shù) sum sum x count count 1 輸出sum 循環(huán)控制語句是基本流程控制語句之一 C 提供三種循環(huán)語句 2 3 1while語句 2 3 4循環(huán)的嵌套 2 3 3for語句 2 3 2do while語句 2 3循環(huán)結構程序設計 注意 1 循環(huán)開始前對循環(huán)條件進行初始化 2 在循環(huán)體語句中要包含修改循環(huán)條件的語句 否則循環(huán)將不能終止而陷入死循環(huán) 2 3 1while語句 while語句也稱為當循環(huán) 語句格式為 while 表達式 循環(huán)體語句 2 3 2do while語句 do while語句稱為直到循環(huán) 格式為 do 循環(huán)體語句 while 表達式 2 3 3for語句 for循環(huán)語句的格式for 表達式1 表達式2 表達式3 循環(huán)體語句 關鍵字 初始表達式 循環(huán)控制邏輯表達式 循環(huán)后置表達式 for語句 while語句 do while語句比較 inti 1 sum 0 循環(huán)初始條件while i 4 sum i i 修改循環(huán)條件 inti 1 sum 0 循環(huán)初始條件do sum i i 修改循環(huán)條件 while i 4 inti sum 0 for i 1 i 4 i sum i 習慣上 表達式1 循環(huán)初始條件 表達式2 循環(huán)終止條件 表達式3 修改循環(huán)條件 includeusingnamespacestd intmain inti 1 sum 0 while i 100 sum sum i i cout sum sum endl return0 想一想 循環(huán)條件是什么 循環(huán)結束條件是什么 哪一個語句修改循環(huán)條件 一個簡單的循環(huán)跟蹤 求 while語句 例如 用for語句的求和式的程序 includeusingnamespacestd intmain inti sum 0 for i 1 i 100 i sum i cout sum sum endl return0 includeusingnamespacestd intmain inti 1 sum 0 while i 100 sum sum i i cout sum sum endl return0 for循環(huán)語句 例2 14 運行結果 01123581321345589144233377610987159725844181 例2 14 設計程序輸出Fibonacii數(shù)列的前20項 要求每行輸出5個數(shù)據(jù) 2 3 3for語句 Fibonacii數(shù)列定義如下 算法分析 除了第0項和第1項外 每一項都是由類似方法產(chǎn)生 即前兩項之和 所以求當前項時 只需要記住前兩項 程序不需要為每一項設置專用變量 屬遞推算法 For循環(huán)語句 1 7數(shù)組與字符數(shù)組 數(shù)組定義 數(shù)組是有限個同類型元素的有序集合 這些元素有一個共同的名字 每個元素以其在數(shù)組中的位置區(qū)分 位置用下標表示 數(shù)組下標的個數(shù)稱作維數(shù) intm 5 定義數(shù)組m 其中有5個整數(shù) floatx 3 數(shù)組x中有3個實數(shù) 一維數(shù)組 一維數(shù)組的定義格式 存儲類型 數(shù)據(jù)類型數(shù)組名 常量 一維數(shù)組初始化 includeusingnamespacestd intmain intint arr 4 int arr 0 1 int arr 1 1 int arr 2 2 int arr 3 int arr 1 int arr 2 cout int arr 3 n return0 例1 2 使用數(shù)組的簡單例子 Fibonacii數(shù)列定義如下 For循環(huán)語句 1 定義數(shù)組 2 使用數(shù)組元素循環(huán)求解 程序如下 intmain intfib 20 0 1 n for n 2 n 20 n fib n fib n 2 fib n 1 for n 0 n 20 n cout setw 5 fib n if n 5 4 cout endl return0 For循環(huán)語句 例2 22 輸入一個小于1的數(shù)x 求sinx的近似值 要求誤差小于0 0001 近似計算公式如下 應用實例 item item x x 2 n 2 n 1 intmain constdoubleepsilon 0 0001 用epsilon保存誤差doublex sinx item intn 2 sign 1 sign保存符號cout x sinx x item x x x 6 第一項作為初值 第二項為誤差項while item epsilon sinx sinx item sign 將當前項累加進結果 注意符號作為因子item item x x 2 n 2 n 1 推算新的誤差項sign sign 注意符號的變換n cout sin x sinx endl return0 例2 15 輸入一個不超過9位的整數(shù) 將其反向后輸出 例如輸入247 變成742輸出 算法分析 1 將整數(shù)的各個數(shù)位逐個分開 用一個數(shù)組保存各位的值 然后反向組成新的整數(shù) 2 將整數(shù)各位數(shù)字分開的方法是 通過求余得到個位數(shù) 然后將整數(shù)縮小十倍 再求余 并重復上述過程 分別得到十位 百位 直到整數(shù)的值變成0為止 2 3 3for語句 數(shù)據(jù)處理 1 設置變量num表示輸入的整數(shù) 整型數(shù)組digit 9 用來存放num的各個位 變量i用來表示數(shù)組的當前下標 算法 1 輸入num 變量初始化 i 0 2 while num 0 num對10取余 得num的當前個位數(shù)放入digit i num整除10 即去掉個位數(shù) 十位變個位 百位變十位 i 數(shù)組digit準備記錄下一位 3 將數(shù)組元素按下標從低到高的順序反向組合 For循環(huán)語句 程序如下 intmain inti num subscript intdigit 9 cout num cout0 digit subscript num 10 num num 10 subscript 修改下標 for i 0 i subscript i 整數(shù)的反向組合num num 10 digit i cout 反向后整數(shù)為 num endl return0 For循環(huán)語句 2 3 4循環(huán)的嵌套 嵌套循環(huán) 當循環(huán)語句中的循環(huán)體中又有循環(huán)語句時 就構成了嵌套循環(huán) 嵌套層次一般不超過3層 以保證可讀性 例2 16 打印九九表 打印格式為 123456789112243369 991827364554637281 2 3 4循環(huán)的嵌套 算法 1 輸出表頭 用一個循環(huán)語句即可 2 輸出表體 for i 1 i 10 i cout i 輸出行號輸出第i行數(shù)據(jù) Acout endl 準備輸出下一行 3 A行細化 for j 1 j i j cout setw 4 i j 2 3 4循環(huán)的嵌套 intmain inti j cout setw 3 setw 4 for i 1 i 10 i cout setw 4 i 輸出表頭 乘數(shù) cout endl endl for i 1 i 10 i cout setw 3 i setw 4 輸出行號 被乘數(shù) for j 1 j i j cout setw 4 i j 輸出表中數(shù)據(jù) 乘積 cout endl 準備輸出下一行 return0 循環(huán)嵌套 例2 16 打印九九表 循環(huán)嵌套 2 4轉(zhuǎn)向語句 break continuegotoreturn break continue break語句無條件地結束switch語句 或循環(huán)語句 轉(zhuǎn)向執(zhí)行語句塊的后續(xù)語句continue語句用于循環(huán)體中 終止當前一次循環(huán) while E1 語句1if E2 break 語句2 while E1 語句1if E2 continue 語句2 break continue break與continue語句比較 break continue for I 1 I 100 I if I 3 0 continue I不是3的倍數(shù) 不輸出 繼續(xù)下一個I 輸出I的值 I是3的倍數(shù)才輸出 if I 3 0 輸出I的值 例 輸出1 100內(nèi)3的倍數(shù) 分析 設置整型變量I從1變化到100 依次測試I是否3的倍數(shù) 算法屬于窮舉法 本章重點例題或算法 分段函數(shù)用switch求分數(shù)段1 2 n或1 2 n或X X N個數(shù)求最大值 最小值 平均值求素數(shù)大小寫字母轉(zhuǎn)換求最大公約數(shù)或最小公倍數(shù) break continue 例2 18 給定正整數(shù)m 判定其是否為素數(shù) 分析 如果m 2 m是素數(shù)的條件是不能被2 3 m的平方根取整 整除 因此可以用2 3 k k為m的平方根取整 逐個去除m 如果被其中某個數(shù)整除了 則m不是素數(shù) 否則是素數(shù) 算法屬于窮舉法 intmain intm i k cout m if m 2 coutk cout m 是素數(shù) endl 循環(huán)提前終止表示是非素數(shù)elsecout m 不是素數(shù) endl return0 break continue 2 6常用算法的應用實例 例2 20 中國古代數(shù)學史上著名的 百雞問題 例2 21 用歐基里德算法 也稱輾轉(zhuǎn)法 求兩個整數(shù)的最大公約數(shù) 例2 23 輸入一個8位二進制數(shù) 將其轉(zhuǎn)換為十進制數(shù)輸出 例2 22 輸入一個小于1的數(shù)x 求sinx的近似值 枚舉 文件 例2 19 求100之內(nèi)的所有素數(shù) 并將這些素數(shù)輸出 每行輸出2個數(shù)據(jù) 2 6常用算法的應用實例 例2 19 直接法直接法是根據(jù)問題給出的條件直接求解 例2 19 求100之內(nèi)的所有素數(shù) 并將這些素數(shù)輸出 每行輸出2個數(shù)據(jù) 分析算法一窮舉法 1 判斷一個數(shù)是否素數(shù) 方法窮舉法 2 100之內(nèi)的所有素數(shù) 方法 一個個試 綜上所述 得到一個循環(huán)嵌套的算法 for m 2 m 100 m 窮舉法if m是素數(shù) 按要求的格式輸出m k sqrt m for i 2 ik m是素數(shù) 剛才的for不是由break結束的 2 枚舉法枚舉法也稱窮舉法 基本思想是 在有限范圍內(nèi)列舉所有可能的結果 找出其中符合要求的解 枚舉法適合求解的問題是 可能的答案是有限個且答案是可知的 但又難以用解析法描述 這種算法通常用循環(huán)結構來完成 例2 20 中國古代數(shù)學史上著名的 百雞問題 雞翁一 值錢五 雞母一 值錢三 雞雛三 值錢一 百錢買百雞 問雞翁 母 雛各幾何 分析 設雞翁 母 雛分別為i j k 根據(jù)題意可得 i 5 j 3 k 3 100 i j k 100 兩個方程無法解出三個變量 只能將各種可能的取值代入 其中能滿足兩個方程的就是所需的解 因此這是枚舉算法 也叫窮舉法 的應用 i j k可能的取值有哪些 分析可知 百錢最多可買雞翁20 雞母33 雞雛300 算法 for i 0 i 20 i for j 0 j 33 j for k 0 k 300 k if i j k 100 這個算法使用三重循環(huán) 執(zhí)行時間函數(shù)是立方階 循環(huán)體將執(zhí)行20 33 300 198000次 我們希望在算法上改進一下 如能減少一重循環(huán) 將大大縮短運行時間 2 6常用算法的應用實例 例2 20 實際上 當i j確定時 k就可由題目要求確定為100 i j 因此實際上只要用i j去測試 用錢數(shù)檢測就可以了 循環(huán)體將執(zhí)行 20 33 660次 算法改進為 for i 0 i 20 for j 0 j 33 if 5 i 3 j 100 i j 3 100 cout i j k 2 6常用算法的應用實例 例2 20 include includeusingnamespacestd intmain inti j k cout 公雞母雞小雞 endl for i 0 i 20 i for j 0 j 33 j k 100 i j if 5 i 3 j k 3 100 2 6常用算法的應用實例 例2 20 注意 窮舉法采用循環(huán) 須剔除的情況 應在循環(huán)體內(nèi)用用條件語句實現(xiàn) 不可放在循環(huán)條件中 請考慮為什么 本例是選合條件的 如去除不合條件用continue語句 改改看 程序運行結果 公雞母雞小雞02575418788118112484 2 6常用算法的應用實例 例2 20 2 6常用算法的應用實例 例2 21 3 遞推法 遞推算法是通過問題的一個或多個已知解 用同樣的方法逐個推算出其他解 如數(shù)列問題 近似計算問題等 通常也要借助于循環(huán)結構完成 例2 21 用歐基里德算法 也稱輾轉(zhuǎn)法 求兩個整數(shù)的最大公約數(shù) 分析 假定兩個整數(shù)分別為num1和num2 最大公約數(shù)應當是不超過其中較小數(shù)的一個整數(shù) 輾轉(zhuǎn)法 用num1除以num2 求出余數(shù)resd 如果resd 0 則當前num2就是最大公約數(shù) 如果resd 0 令num1 num2 num2 resd 重復以上過程 直到resd 0為止 1 設置兩個整型變量num1和num2代表兩個數(shù) 輸入num1 num2 2 輾轉(zhuǎn)法 2 1 使num1 num2 2 2 2 2 1 設置變量resd num1 num2 包含了步驟2 12 2 2 if resd 0 當前num2就是最大公約數(shù) else num1 num2 num2 resd 重復2 2 1和2 2 2 直到resd 0為止 步驟2輾轉(zhuǎn)法可用以下程序段表示 do resd num1 num2 if resd 0 當前num2就是最大公約數(shù) else num1 num2 num2 resd while resd 0 3 輸出當前的num2 intmain intnum1 num2 resd cout num1 num2 cout num1 和 num2 的最大公約數(shù)為 do resd num1 num2 if resd 0 break num1 num2 num2 resd while resd 0 cout num2 endl return0 例2 22 輸入一個小于1的數(shù)x 求sinx的近似值 要求誤差小于0 0001 近似計算公式如下 分析 這個近似計算可以看作一個累加過程 關鍵在于累加項數(shù)的確定 該求近似值的奇次多項式各項順序改變符號 若取前n項累加和作為sin x 的近似值 則第n 1項的絕對值就是誤差限 因此可以這樣考慮 若公式中第一項作為累加和的初值 則第二項就是誤差 如果誤差不滿足要求 則將該項累加到累加和上 進而用該項推出第三項 第三項又是新的累加和的誤差 經(jīng)過這樣累加 遞推 直至滿足要求為止 如果用item保存第n項 則推出第n 1項的方法為 item item x x 2 n 2 n 1 2 6常用算法的應用實例 例2 22 intmain constdoubleepsilon 0 0001 用epsilon保存誤差doublex sinx item intn 2 sign 1 sign保存符號cout x sinx x item x x x 6 第一項作為初值 第二項為誤差項while item epsilon sinx sinx item sign 將當前項累加進結果 注意符號作為因子item item x x 2 n 2 n 1 推算新的誤差項sign sign 注意符號的變換n cout sin x sinx endl return0 2 6常用算法的應用實例 例2 23 例2 23 輸入一個8位二進制數(shù) 將其轉(zhuǎn)換為十進制數(shù)輸出 分析 二進制轉(zhuǎn)換為十進制只要將每位二進制數(shù)乘以該位的權然后相加 實際上屬于多項式求和問題 對于本例 x 2 多項式的系數(shù)ai即為二進制數(shù)的各個位 可以用數(shù)組保存 如果直接求冪再求和 需要做 n n 1 2 次乘法 現(xiàn)將多項式作如下變形 就變成一個十分簡單的計算 僅做了n次乘法 算法 1 用數(shù)字串存二進制數(shù) 數(shù)組bin 8 用來放各個二進制位 考慮為什么 2 整型變量dec 0 x 2 初始化2 for i 7 i 0 i 系數(shù)從an到a0依次投入運算dec dec x bin i 0 bin i 0 數(shù)字字符轉(zhuǎn)換為數(shù)字 2 6常用算法的應用實例 例2 23 程序 constintn 8 intmain charbin n intx 2 a dec i cout 0 i cin bin i 先輸入的是高位dec 0 for i n 1 i 0 i a bin i 0 數(shù)字字符轉(zhuǎn)換為數(shù)字dec dec x a cout 0 i cout bin i cout 的值為 dec endl return0 2 7枚舉類型 2 7 1枚舉類型的定義 2 7 2枚舉變量的使用 枚舉類型 enumerate 是c 中的一種派生數(shù)據(jù)類型 它是用戶定義的若干枚舉常量的集合 枚舉類型的變量 只能取枚舉常量表中所列的值 定義枚舉類型的主要目的是增加程序的可讀性 2 7 1枚舉類型的定義 枚舉類型定義 enum 關鍵字enum指明其后的標識符是一個類型的名字 枚舉常量表中列出該類型的所有取值 各枚舉常量之間以 間隔 例 enumcolor set1 RED BLUE WHITE BLACK enumweek Sun Mon Tue Wed Thu Fri Sat 枚舉常量 或稱枚舉成員 是以標識符形式表示的整型量 非法定義實例 enumletter set a d F s T 枚舉常量只能是標識符enumyear set 2000 2001 2002 2003 2004 2005 改為y2000等則正確 2 7 1枚舉類型的定義 枚舉常量 枚舉常量代表該枚舉類型的變量可能取的值 編譯系統(tǒng)為每個枚舉常量指定一個整數(shù)值 缺省狀態(tài)下 這個整數(shù)就是所列舉元素的序號 序號從0開始 如上例中RED BLUE WHITE BLACK的值分別為0 1 2 3 用戶也可以在類型定義時為部分或全部枚舉常量指定整數(shù)值 在第一個指定值之前的枚舉常量仍按缺省方式取值 而指定值之后的枚舉常量按依次加1的原則取值 各枚舉常量的值可以重復 但各枚舉常量標識符必須不同 例 enumfruit set apple orange banana 1 peach grape enumweek Sun 7 Mon 1 Tue Wed Thu Fri Sat 枚舉常量apple orange banana peach grape的值分別為0 1 1 2 3 枚舉常量Sun Mon Tue Wed Thu Fri Sat的值分別為7 1 2 3 4 5 6 2 7 1枚舉類型的定義 枚舉型變量定義 定義枚舉類型之后 就可以定義枚舉類型的變量 亦可類型與變量同時定義 甚至類型名可省 color set1color1 color2 enum Sun Mon Tue Wed Thu Fri Sat weekday1 weekday2 枚舉變量的取值范圍就是整型數(shù)的一個子集 枚舉變量占用內(nèi)存的大小與整型數(shù)相同 2 7 2枚舉類型的變量的使用 枚舉類型應用要點 1 賦值包括將枚舉常量值賦給枚舉變量和兩個同類型變量之間賦值 不能直接將整型量賦給枚舉變量 兩個不同類型的枚舉變量之間也不能相互賦值 例如 enumcolor set2 GREEN RED YELLOW WHITE color set2color3 color4 color3 RED 合法color4 color3 合法 color4的值為REDcolor1 1 非法 不能直接將整性常量賦給枚舉變量color2 color3 非法 color2類型是color set1 color3類型是color set2 不能相互賦值 2 7 2枚舉類型的變量的使用 枚舉類型應用要點 2 由于枚舉常量本身是一個整數(shù)值 因此也允許將一個枚舉量賦給整型變量 但不允許將一個整型變量賦給枚舉量 即使整型變量取值合適 也必須將整型變量強制轉(zhuǎn)換為枚舉型 例如 inti j i color3 合法 i的值為1j GREEN 合法 j的值為0color3 i 非法3 關系運算可以是同一枚舉類型的兩個枚舉變量之間或一個枚舉變量和一個枚舉常量之間 用它們所取的值 序號 比較 例如 if color3 color4 cout 相等 if color3 WHITE cout notwhite 4 枚舉變量不能直接輸入 可以直接輸出 但輸出的是變量的整數(shù)值 例如 cin color1 非法cout color3 合法 輸出的是2從程序的合法性和可讀性出發(fā) 枚舉變量的輸入輸出一般都采用switch語句將其轉(zhuǎn)換為字符或字符串 同時 枚舉類型數(shù)據(jù)的其他處理也往往應用switch語句 2 7 2枚舉類型的變量的使用 例2 24 口袋中有紅 黃 藍 白 黑五種顏色的球若干個 每次從口袋中取三個不同顏色的球 統(tǒng)計并輸出所有的取法 2 8輸入輸出文件簡介 如果希望程序的運行結果能夠永久保留下來 供隨時查閱或取用 則需要將其保存在文件中 文件包括文本文件和二進制文件 本小節(jié)只討論文本文件的基本操作和簡單應用 文本文件由字符序列組成 也稱ASCII碼文件 在文本文件中存取的最小信息單位為字符 character 兩個概念 內(nèi)部文件和外部文件 通常所謂的文件是指磁盤文件 就是在 我的電腦 的目錄中見到的文件 這里稱為外部文件 而在程序中運行的文件 稱為內(nèi)部文件 文件流對象 程序中操作的是內(nèi)部文件 最后保存的是外部文件 算法 枚舉 文件 2 8輸入輸出文件簡介 使用文件的步驟如下 說明一個文件流對象 內(nèi)部文件 文件流類型ifstream支持從輸入文件提取數(shù)據(jù)的操作 而文件流類型ofstream完成數(shù)據(jù)寫入輸出文件的各種操作 ifstreamifile 定義輸入文件 ifile為文件名 可用任意標識符ofstreamofile 定義輸出文件 ofile為文件名 可用任意標識符 2 打開文件 ifile open d my in file txt ofile open d my out file txt 引號中的 d my in file txt 和 d my out file txt 為磁盤文件路徑名 這樣在文件流對象和磁盤文件名之間建立了聯(lián)系 3 對文件進行讀寫操作 最常見的文件讀寫是順序的 所謂 順序 指的是從文件頭開始進行讀寫 順序讀寫可用C 的提取運算符 和插入運算符 進行 也可以用讀字符的get 和讀字符串的getling 等函數(shù) 讀寫是在文件緩沖區(qū)中進行 4 關閉文件 當打開一個文件進行讀寫后 應該顯式地關閉該文件 與打開文件相對應 ifile close ofile close 關閉文件時 系統(tǒng)把與該文件相關聯(lián)的文件緩沖區(qū)中的數(shù)據(jù)寫到磁盤文件中 保證文件的完整 同時把磁盤文件名與文件流對象之間的關聯(lián)斷開 可防止誤操作修改了磁盤文件 例2 25 將百雞問題計算結果存入文件 例2 26 讀出存放百雞問題計算結果的文件 例2 24 口袋中有紅 黃 藍 白 黑五種顏色的球若干個 每次從口袋中取三個不同顏色的球 統(tǒng)計并輸出所有的取法 分析 每個球的顏色都是這五種顏色之一 因此可以使用枚舉類型來定義球的顏色 假設所取三個球的顏色分別為i j k 每個量都有5種取值 其中i j k就是滿足要求的取法 因此用枚舉算法 窮舉法 可以解決 2 7 2枚舉類型的變量的使用 例2 24 算法 1 定義枚舉類型及相應變量 enumcolor red yellow blue white black colori j k col 2 for i red i black i for j red j black j if i j 前兩個球顏色不同for k red k black k if k i k j 第三個球不同于前兩個 滿足要求 找到一種取法3 輸出該取法 注意枚舉量的輸出方法 2 7 2枚舉類型的變量的使用 例2 24 intmain enumcolor set red yellow blue white black color setcolor inti j k counter 0 loop for i red i black i for j red j black j if i j 前兩個球顏色不同for k red k black k if k i 下面輸出每種取法 一行為一種取法的三個顏色for loop 1 loop 3 loop switch loop case1 color color set i break 第一個是icase2 color color set j break 第二個是jcase3 color color set k break 第三個是k 注意類型轉(zhuǎn)換不可少switch color casered cout setw 15 red break caseyellow cout setw 15 yellow break caseblue cout setw 15 blue break casewhite cout setw 15 white break caseblack cout setw 15 black break for loopcout endl 輸出一種取法后換行 for k for jcout 共有 counter 種取法 endl return0 運行結果 redyellowblueredyellowwhiteredyellowblackredblueyellow 共有60種取法 intmain inti j k ofstreamofile 定義輸出文件ofile open d myfile txt 作為輸出文件打開ofile 公雞母雞小雞 endl for i 0 i 20 i for j 0 j 33 j k 100 i j if 5 i 3 j k 3 100 例2 25 將百雞問題計算結果存入文件 intmain chara 28 ifstreamifile 定義輸入文件ifile open d myfile txt 作為輸入文件打開inti 0 j k ifile getline a 28 讀標題 不可用 它不能讀白字符cout i j k 由文件讀入數(shù)據(jù)if ifile eof 0 break 當讀到文件結束時 ifile eof 為真cout setw 6 i setw 10 j setw 10 k endl ifile close 關閉文件return0 例2 26 讀出存放百雞問題計算結果的文件 本章重點例題或算法 分段函數(shù)用switch求分數(shù)段1 2 n或1 2 n或X X N個數(shù)求最大值 最小值 平均值求素數(shù)大小寫字母轉(zhuǎn)換求最大公約數(shù)或最小公倍數(shù)- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 程序設計 華中科技大學 課件 第二
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.appdesigncorp.com/p-6330628.html