歡迎來到裝配圖網! | 幫助中心 裝配圖網zhuangpeitu.com!
裝配圖網
ImageVerifierCode 換一換
首頁 裝配圖網 > 資源分類 > PPT文檔下載  

C謝麗聰-4程序控制結構.ppt

  • 資源ID:10964427       資源大小:1.47MB        全文頁數:175頁
  • 資源格式: PPT        下載積分:14.9積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要14.9積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預覽文檔經過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

C謝麗聰-4程序控制結構.ppt

1 第四章程序控制結構 4 1C語言的執(zhí)行語句4 2順序結構4 3選擇結構4 4循環(huán)結構 2 4 1 語言的執(zhí)行語句 程序的結構 3 C語句可分為以下五類 1 表達式語句2 函數調用語句 一般包含在表達式語句中 3 控制語句4 復合語句5 空語句 程序的執(zhí)行部分是由語句組成的 程序的功能也是由執(zhí)行語句實現(xiàn)的 4 4 1 1表達式語句 表達式語句由表達式加上分號 組成 執(zhí)行表達式語句就是計算表達式的值 其一般形式為 表達式 例如 x y z y z i x 0 y 1 賦值語句 加法運算語句 但計算結果不能保留 無實際意義 自增1語句 i值增1 逗號表達式語句 5 1 賦值語句 由賦值表達式加上分號 構成的表達式語 語法格式 變量 表達式 1 賦值運算符除 外 還包含復合賦值運算符 例如 a a a 2 賦值運算符右側的表達式可以又是一個賦值表達式 例如 a b 5 3 等價 a a a a 等價 a b 5 3 等價 b 5 3 a b 6 3 賦值語句的功能與賦值表達式相同 但性質不同 賦值表達式是一種表達式 它可以出現(xiàn)在任何允許表達式出現(xiàn)的地方 而賦值語句不能出現(xiàn)在表達式中 例如 if x y 5 z x 語句的功能是 若表達式x y 5大于0則z x if x y 5 0 z x 因為x y 5 是語句 不能出現(xiàn)在表達式中 合法 不合法 7 4 賦值表達式的嵌套 賦值符右邊的表達式又是一個賦值表達式 變量 變量 表達式 展開之后的一般形式為 變量 變量 表達式 例如 a b c d e 5 按照賦值運算符的右接合性 等效于 e 5 d e c d b c a b 8 5 變量說明中給變量賦初值和賦值語句的區(qū)別 給變量賦初值是變量說明的一部分 賦初值后的變量與其后的其它同類變量之間仍必須用逗號間隔 而賦值語句則必須用分號結尾 例如 inta 5 b c 6 在變量說明中 不允許連續(xù)給多個變量賦初值 如下述說明是錯誤的 inta b c 5 而賦值語句允許連續(xù)賦值 inta b c a b c 5 9 2 函數調用語句 函數調用語句由函數名 實際參數加上分號 組成 執(zhí)行函數語句就是調用函數體 一般形式為 函數名 實際參數表 例如 printf CProgram z x sin y 調用庫函數 輸出字符串 賦值語句 表達式中包含函數調用 10 4 1 2空語句 空語句只有分號 組成的語句稱為空語句 空語句是什么也不執(zhí)行的語句 例如while getchar n 空語句 本語句的功能是 只要從鍵盤輸入的字符不是回車則重新輸入 11 4 1 3復合語句 復合語句把多個語句用括號 括起來組成的一個語句稱復合語句 在程序中應把復合語句看成是單條語句 而不是多條語句 例如 x y z a b c printf d d x a 是一條復合語句 復合語句內的各條語句都必須以分號 結尾 在括號 外不能加分號 12 4 1 4控制語句 控制語句用于控制程序的流程 以實現(xiàn)程序的各種結構方式 可分成以下三類 1 條件判斷語句 ifelse語句 2 開關分支語句 switch語句 3 循環(huán)執(zhí)行語句 dowhile語句 while語句 for語句 4 中止循環(huán)語句 continue語句 break語句 5 無條件轉移語句 goto語句 6 函數返回語句 return語句 13 4 2順序結構 按照解決問題的順序編寫相應的語句 程序運行時自上而下依次執(zhí)行語句 14 例1 輸入任意兩個整數 求它們的和及平均值 includevoidmain intnum1 num2 sum floataver printf Pleaseinputtwointegers n scanf d d 輸入 30000 5005 輸出 sum 35005 aver 17502 50 變量定義 輸入提示 數據輸入 求累計和 求平均值 輸出結果 sum 2 0 15 例2 給定一個三位正整數 輸出它的個位 十位和百位數 數字分離方法 百位數m2 m 100十位數m1 m m2 100 10個位數m0 m m2 100 m1 10個位數m0 m 10十位數m1 m 10 10百位數m2 m 100 百位 123 100 1十位 123 1 100 10 2個位 123 1 100 2 10 3 個位 123 10 3十位 123 10 10 2百位 123 100 1 16 例2 給定一個三位正整數 輸出它的個位 十位和百位數 includevoidmain intm m0 m1 m2 scanf d 輸入 123 輸出 1 2 3 個位 m0 123 10 3十位 m1 123 10 10 2百位 m2 123 100 1 17 例3 取一個16位的二進制數a的7 6 5 4四個位 如16進制數 a a25d 16 1010001001011101 2 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 a 4 0 4 0000000000000000 1111111111111111 1111111111110000 0000000000001111 18 includevoidmain unsigneda b c d scanf x 輸入 a25d 輸出 a25d5 以十六進制形式輸入整數a 以十六進制形式輸出a和結果d 右移4位 求低4位 19 表達式可以是任意合法表達式 后面不能加 4 3選擇結構 if語句 4 3 1if語句1 單分支if if 表達式 語句語義 如果表達式的值為真 則執(zhí)行其后的語句 否則不執(zhí)行該語句 20 例1 voidmain inta b max printf ninputtwonumbers scanf d d 輸入 2346輸出 max 46 此語句用于提示輸入 max 23 max 46 21 例2 voidmain inta b c t printf ninputtwonumbers scanf d d d 輸入 1 6 2 輸出 621 實現(xiàn)數的互換 功能 輸入三個數 按照從大到小順序輸出 22 例3 從鍵盤輸入一個字符 判斷它是否小寫字母 若是 將其轉換成大寫字母 否則不進行轉換 作后輸出該字母 includemain charc a c getchar if c z a c if c a a c 32 printf c n a main charc c getchar if c a c 32 printf c n c 判斷非小寫字母情況 判斷小寫字母情況 只用一個單分支語句實現(xiàn) 23 2 雙分支 if elseif 表達式 語句1 else語句2 語義 如果表達式的值為真 則執(zhí)行語句1 否則執(zhí)行語句2 后面不能加 24 voidmain inta b printf inputtwonumbers scanf d d 輸入 2346輸出 max 46 輸入兩個整數 輸出其中大數 例4 例1的改寫 25 3 多分支if elseif if 表達式1 語句1 elseif 表達式2 語句2 elseif 表達式3 語句3 elseif 表達式m 語句m else語句n 語義 依次判斷表達式的值 當出現(xiàn)某個值為真時 則執(zhí)行其對應的語句 然后跳到整個if語句之外繼續(xù)執(zhí)行程序 如果所有的表達式均為假 則執(zhí)行語句n 然后繼續(xù)執(zhí)行后續(xù)程序 后面不能加 26 此為真 做語句1 其它語句都不做 27 上面的語句為以下三種格式 1 空語句2 一個語句 不引起轉移 3 前后加大括號的語句 復合語句 也叫程序段 如 inta floatb a 3 b 7 0 允許在復合語句前部定義變量 只能在復合語句中使用 inta a 3 floatb b 7 0 變量要在最前面定義 28 a b t a a b b t a b t a a b b t 使用復合語句 不使用復合語句 N N Y Y 29 include stdio h voidmain 輸入 Acharc 輸出 Thisisacapitalletterc getchar if c 0 例5 30 4 在使用if語句中應注意以下問題 1 在三種形式的if語句中 在if之后均為表達式 該表達式通常是邏輯表達式或關系表達式 但也可以是其它表達式 如賦值表達式等 甚至也可以是一個變量 例如 if a 5 語句 if b 語句 都是允許的 只要表達式的值為非0 即為 真 如在 if a 5 中表達式的值永遠為非0 所以其后的語句總是要執(zhí)行的 當然這種情況在程序中不一定會出現(xiàn) 但在語法上是合法的 31 又如 有程序段 if a b printf d a elseprintf a 0 本語句的語義是 把b值賦予a 如為非0則輸出該值 否則輸出 a 0 字符串 這種用法在程序中是經常出現(xiàn)的 為賦值運算符 比較運算符為 32 2 在if語句中 條件判斷表達式必須用括號括起來 在語句之后必須加分號 3 在if語句的三種形式中 所有的語句應為單個語句 如果要想在滿足條件時執(zhí)行一組 多個 語句 則必須把這一組語句用 括起來組成一個復合語句 但要注意的是在 之后不能再加分號 例如 if a b a b else a 0 b 10 if a b a b else a 0 b 10 不能寫成 33 例如條件語句 if a b max a elsemax b 可用條件表達式寫為 max a b a b a b max a max b a b max a max b 用條件語句實現(xiàn)分支語句功能 34 例6 計算 方法一 voidmain floatx y scanf f 表達式 成立值為1 y x 3 x x 2 3 x 7 x x 35 例7 從鍵盤輸入任意的兩個實數 按從小到大順序輸出這兩個數 請編程實現(xiàn) voidmain floata b scanf f f 代替 復合語句可以定義變量 實現(xiàn)a與b的互換 36 a a b b a b a a bt a a b b t 37 例8 計算 方法一 main floatx y scanf f 1 x 可省略嗎 可以 38 方法二 voidmain floatx y scanf f 可省略 y x 1 x x 10 2 x 1 3 x 11 可省略 39 方法三 if x 10 if x 1 y x elsey 2 x 1 elsey 3 x 11 后不能加 可省略 y x 10 x 1 x 2 x 1 3 x 11 可省略 40 4 3 4if語句的嵌套 當if語句中的執(zhí)行語句又是if語句時 則構成了if語句嵌套的情形 其一般形式可表示如下 if 表達式 或if 表達式 if語句 if語句 elseif語句 在嵌套內的if語句可能又是if else型的 這將會出現(xiàn)多個if和多個else重疊的情況 這時要特別注意if和else的配對問題 加 41 其中的else究竟是與哪一個if配對呢 是if 表達式1 還是if 表達式1 if 表達式2 if 表達式2 語句1 語句1 elseelse語句2 語句2 注意 if與else的配對關系 else總是與它前面最近的if配對 因此對上述例子應按前一種情況理解 42 例9 寫出下面兩程序的輸出結果 1 voidmain intx 2 y 1 z 2 if x y if y 0 z 0 elsez 1 printf d n z 結果 一個語句 2 43 voidmain inta 1 b 3 c 5 d 4 if a b if c d x 1 elseif a c if b d x 2 elsex 3 elsex 6 elsex 7 printf d n x 結果 2 44 為了使邏輯關系清晰 1 按下面所示書寫程序 voidmain inta 1 b 3 c 5 d 4 if a b if c d x 1 elseif a c if b d x 2 elsex 3 elsex 6 elsex 7 printf d n x 45 2 適當地加大括號 x 3 if x0 y 1 printf x 0 y d n y 把上面與下面比較x 3 if x 0 if x 0 y 1 printf x 0 y d n y else y 1 printf x 0 y d n y 結果 x 0 y 1 無結果 46 例10 voidmain inta b printf pleaseinputA B scanf d d 輸入 輸出 if a b if a b printf A B n elseprintf A B n elseprintf A B n 2346 A B 47 例11 輸入一年份 判別是否閏年 year被4整除 真 真 真 真 假 假 假 假 year被100整除 leap 0 leap 1 leap 1 leap 0 leap year被400整除 輸出閏年 輸出非閏年 48 voidmain intyear leap scanf d 根據leap輸出結果 49 4 3 2switch語句 另一種分支語句 格式 switch 任意類型表達式 case常量表達式1 語句1 case常量表達式2 語句2 case常量表達式n 語句n default 語句n 1 注 常量表達式中運算對象只能為常量或符號常量 整型或字符型 各個值必須互不相同 default允許出現(xiàn)在前面或中間 switch 任意類型表達式 后不帶分號 任意類型表達式的計算結果取整 不要忘記空格 不帶 50 功能 若switch后面表達式值的整數 字符常量 部分與某個case后面表達式值相等 則就執(zhí)行該case后面的語句 否則就執(zhí)行default后面的語句 51 例12 voidmain inta printf inputintegernumber scanf d 輸入 3 輸出 WednesdaThursdayFridaySaturdaySundayerror case常量表達式 相當于一個語句標號 表達式的值和某標號相等則轉向該標號執(zhí)行 但不能在執(zhí)行完該標號的語句后自動跳出整個switch語句 所以出現(xiàn)了繼續(xù)執(zhí)行所有后面case語句的情況 52 break語句 專用于跳出switch語句 在每一case語句之后增加break語句 使每一次執(zhí)行之后均可跳出switch語句 從而避免輸出不應有的結果 voidmain switch a case1 printf Monday n break case2 printf Tuesday n break case3 printf Wednesday n break case4 printf Thursday n break case5 printf Friday n break case6 printf Saturday n break case7 printf Sunday n break default printf error n 53 Switch語句常用形式 switch 任意類型表達式 case整型或字符型常量表達式1 語句1 break case整型或字符型常量表達式2 語句2 break case整型或字符型常量表達式n 語句n break default 語句n 1 default后面不加break 54 注意 1 case后的各常量表達式的值不能相同 否則會出現(xiàn)錯誤 2 case后 允許有多個語句 可以不用 括起來 3 case和default子句的先后順序可以變動 而不會影響程序執(zhí)行結果 4 default子句可以省略不用 55 例13 若有宏定義 definek2和定義 floatw inta 2 b 則合法的switch語句是 A switch w B switch a b case1 0 printf n case1printf n case2 0 printf n caseaprintf n C switch w 1 D switch a casek 1 printf n case1 printf n default printf n case2 printf n case1 2 printf n default printf n C 不能為實型 不能為變量 少 和 不能加分號 56 例14 先接收從鍵盤輸入的一個等級制成績 然后輸出對應的百分制成績 轉換規(guī)則如下 A 85 100B 70 84C 60 69D 60 57 voidmain chargrade scanf c 58 例15 先接收從鍵盤輸入的一個百分制成績 然后輸出對應的五分制成績 轉換規(guī)則如下 90 100A80 89B70 79C60 69D 60E 59 includevoidmain intscore printf nPleaseinputthescore 0 100 scanf d 方法一 60 voidmain intcj printf Inputaintegernumber 0 100 n scanf d 90 100A80 89B70 79C60 69D 60E 方法二 61 例16 計算器程序 用戶輸入運算數和四則運算符 輸出計算結果 voidmain floata b charc printf inputexpression a b n scanf f c f 字符常量 輸入 12 13輸出 25 000000 62 例17 求方程ax2 bx c 0的兩個實根 includevoidmain doublea b c x1 x2 disc scanf lf lf lf b b 4 a c 0 有解 63 題目改為 求二次方程ax2 bx c 0的兩個根 a 0 一定有解要認真分析題目 達到題目要求 64 voidmain doublea b c x1 x2 disc p q scanf lf lf lf 65 例18 輸入某年某月某日 判斷這一天是這一年的第幾天 需考慮閏年的情形 注 符合以下條件之一是閏年 能被4整除 但不能被100整除 能被400整除 算法分析 以5月4日為例 先把1 4月份的天數加起來 然后再加上本月的4天即本年的第幾天 閏年情形只需當輸入月份大于3時需要考慮 若是閏年 2月份應是29天 66 voidmain intday month year sum 0 scanf d d d 加上3月份31天 計算某月以前月份的總天數 67 case3 判斷是否閏年 if year 4 0 68 例19 運輸公司對用戶計算運費 路程 skm 越遠 每噸 千米運費越低 標準如下 S 250沒有折扣250 s 5002 折扣500 s 10005 折扣1000 s 20008 折扣2000 s 300010 折扣3000 s015 折扣設每噸 千米運費為p 貨物重量為w 距離為s 折扣為d 則總運費為 f p w s 1 d 輸入 p w s 計算運費 69 用公式f p w s 1 d 計算運輸費 噸公里運價 運輸距離 折扣 貨重 s 250 公里 d 0250 s 500d 0 02500 s 1000d 0 051000 s 2000d 0 082000 s 3000d 0 103000 sd 0 15 要根據距離計算折扣d 關鍵是構造switch后的表達式 選擇c s 250來求c的值 if s 3000 c 12 elsec s 250 70 voidmain intc s floatp w d f scanf f f s 折扣變化都是250的倍數 s 250則 S 250 1250 s 500 1 2 500 s 1000 2 4 1000 s 2000 4 8 2000 s 3000 8 12 3000 s0 12 71 case4 case5 case6 case7 d 8 break case8 case9 case10 case11 d 10 break case12 d 15 break f p w s 1 d 100 0 printf f f f s 250則 S 250 1250 s 500 1 2 500 s 1000 2 4 1000 s 2000 4 8 2000 s 3000 8 12 3000 s0 12 運費 72 例20 判斷以下程序實現(xiàn)的功能 includevoidmain charc printf inputacharacter c getchar if c 0 輸入一個字符 判別該字符是數字 英文大寫字母 小寫字母還是其它字符 數字 大寫字母 小寫字母 其它字符 73 例21 輸入三角形三邊長 求三角形面積 include includevoidmain floata b c s area scanf f f f 判斷條件是否滿足 74 例22 輸入a b c三個整數 輸出最大數和最小數 includevoidmain inta b c max min scanf d d d 比較a b兩數的大小 大數賦給max 小數賦給min 若c大于max 則把c賦給max 若c比min更小則把c賦給min if a b max a min b else max b min a 75 循環(huán)條件 4 4循環(huán)控制概述 循環(huán)結構的特點 在給定條件成立時 反復執(zhí)行某程序段 直到條件不成立為止 語言提供的循環(huán)結構類型如下 1 用goto語句和if語句構成循環(huán) 2 用while語句 3 用do while語句 4 用for語句 循環(huán)體 76 語法格式 while 表達式 語句表達式值為零時 立即停止循環(huán) 4 4 1用while語句實現(xiàn)循環(huán) 沒有分號 77 寫出下面程序的運行結果 1 voidmain inti 1 while i 3 printf d n i i 2 voidmain inti 1 while i 3 printf d n i i 結果123 結果死循環(huán) 循環(huán)體 空語句 若把上面 去掉也死循環(huán) 復合語句作為循環(huán)體語句 78 語法格式 do語句while 表達式 表達式值為零時 立即停止循環(huán) 至少執(zhí)行一次循環(huán)語句 4 4 2用do while語句實現(xiàn)循環(huán) 分號 79 voidmain intk 1 n 1 sum 0 do sum n n if sum 10 k 0 while k 1 printf sum d n sum 改為while k 1 死循環(huán) 0 1 1 2 3 3 6 4 10 結果 sum 10 寫出下面程序的運行結果 80 例 用while語句和do while語句求 傳統(tǒng)流程圖表示算法 81 N S圖表示算法 100 82 voidmain inti sum 0 i 1 while i 100 sum i i printf d n sum voidmain inti sum 0 i 1 do sum i i while i 100 printf d n sum i sum的初值為1 0i的終值為101 運行結果 5050 sum 0 1sum 1 2 sum 99 100 83 例 計算p 1 2 3 nvoidmain inti n longp scanf d 不用long會溢出 i p的初值為1i的終值為n 1 p 1 1p 1 2 p n 遞推算法 do p i i while i n i n等價于i n 1 84 例 計算s 1 2 3 n n 0 voidmain inti n longs t scanf d 保證達到計算n次 t 1 1 2 3 S 1 1 2 1 2 3 while i n t i s t i 85 例 統(tǒng)計從鍵盤輸入一行字符的個數 includevoidmain intn 0 printf inputastring n while getchar n n printf d n 只要從鍵盤輸入的字符不是回車就繼續(xù)循環(huán) 完成對輸入字符個數計數 輸入 ascdf 輸出 5 86 例 計算 include includevoidmain inti 1 n doublepi scanf d i 1 pi 1 0 i 2 pi 1 0 1 0 2 2 i 3 pi 1 0 1 0 2 2 1 0 3 3 i 4 i 3不滿足 停止循環(huán) 改為1 i i 出錯 為什么 輸入3 87 例 求 includevoidmain ints floatn t pi 0 t 1 pi 0 n 1 0 s 1 do pi pi t n n 2 s s t s n while fabs t 1e 6 pi pi 4 printf pi 10 6f n pi 分母每次增加2單項的符號變化單項的值t s n 循環(huán)結束條件是運行某一個精度 最后一項的值小于10 6 fabs t 1e 6來控制循環(huán)是否結束 88 1 while語句中的表達式一般是關系表達或邏輯表達式 也可以是其它表達式 只要表達式的值為真 非0 即可繼續(xù)循環(huán) 例 voidmain inta 0 n printf ninputn scanf d 執(zhí)行n次 每執(zhí)行1次 n減1 a 2 a 輸入 8 輸出 02468101214 89 2 while和do while循環(huán)比較 voidmain intsum 0 i scanf d do sum sum i i while i 10 輸入 8 輸入 11 sum 0 sum 11 90 3 不管是while循環(huán) 還是do while循環(huán) 在循環(huán)體內必須要有能夠改變循環(huán)條件的語句 否則將構成死循環(huán) 4 循環(huán)條件設置要合理 否則也將構成死循環(huán) 5 不管是while循環(huán)還是do while循環(huán) 循環(huán)體如果包含一個以上的語句 都應以復合語句的形式出現(xiàn) 91 i 1 sum 0 while i 10 sum I i 1 sum 0 while i 10 sum I i i 100 sum 0 while i 10 sum I i i為循環(huán)變量 沒有改變循環(huán)i的語句 條件一直滿足 死循環(huán) 循環(huán)體 復合語句 執(zhí)行到i 11停止 條件不滿足 循環(huán)體語句不執(zhí)行 sum為 0 11 23 3 10 92 4 4 3用for語句實現(xiàn)循環(huán) 語法格式 for 表達式1 表達式2 表達式3 語句要正確表達循環(huán)結構應注意三方面要求 1 循環(huán)控制變量的初始化 2 循環(huán)的條件 3 循環(huán)控制變量的值的更新 for語句在書寫形式上集中體現(xiàn)了這三方面要求 93 功能 for語句完全可以取代while語句 for 表達式1 表達式2 表達式3 語句執(zhí)行過程 1 先求解表達式1 2 求解表達式2 若其值為真 非0 則執(zhí)行for語句中指定的內嵌語句 然后執(zhí)行第3 步 若其值為假 0 則結束循環(huán) 轉到第5 步 3 求解表達式3 4 轉回第2 步繼續(xù)執(zhí)行 5 循環(huán)結束 執(zhí)行for語句下面的一個語句 94 95 例 求voidmain inti sum 0 i 1 do sum i i while i 100 printf d n sum voidmain inti sum 0 for i 1 i 100 i sum i printf d n sum 96 例 計算p 1 2 3 nvoidmain inti n longp scanf d for i 1 p 1 i n i P i 中間用逗號 for i 1 p 1 i n P i i 97 例 計算s 1 2 3 n n 0 voidmain inti n longs t scanf d for i 1 t 1 s 0 i n i t i s t i 1 t 1 s 0 for i n i t i s t i 1 t 1 s 0 for i n t i s t i 98 for語句形式 for 循環(huán)變量賦初值 循環(huán)條件 循環(huán)變量增量 語句 總是一個賦值語句 它用來給循環(huán)控制變量賦初值 總是一個表達式 它用來判別循環(huán)是否終止 定義循環(huán)控制變量每循環(huán)一次后按什么方式變化 這三個部分之間用 分開 99 對于for循環(huán)中語句的一般形式 for 表達式1 表達式2 表達式3 語句就是如下的while循環(huán)形式 表達式1 while 表達式2 語句表達式3 100 例 寫出下面程序的輸出結果 includevoidmain charc for c getchar putchar c c為 值為0 結束 可以是任意表達式 輸入 a56 3h hj 輸出 a56 3h 101 例 統(tǒng)計從鍵盤輸入一行字符的個數 以回車結束 includevoidmain intn charc printf Inputastring n for n 0 c getchar n n printf d n 意義是 從鍵盤輸入一個字符并賦值給變量c 將c與字符 n 比較 不一樣就繼續(xù)循環(huán) 完成對輸入字符個數計數 循環(huán)體是空語句 輸入 Abg23bs 輸出 7 102 例 下面程序的輸出結果是 voidmain intx 10 y 10 i for i 0 x 8 y i printf 3d 3d x y A 10192B 9876C 101091D 10990 表達式1只做一次 9 1 8 C 2 103 注意 1 for循環(huán)中的 表達式1 表達式2 循環(huán)條件 和 表達式3 可以缺省 但 不能缺省 2 省略了 表達式1 表示不對循環(huán)控制變量賦初值 可在for循環(huán)里面或外面對其賦初值 例如 i 1 for i 20 i scanf f 104 4 省略了 表達式3 循環(huán)變量增量 則不對循環(huán)控制變量進行操作 這時可在語句體中加入修改循環(huán)控制變量的語句 例如 for i 1 i 100 sum sum i i 105 5 省略了 表達式1 和 表達式3 例如 for i 100 sum sum i i 相當于 while i 100 sum sum i i 106 6 3個表達式都可以省略 例如 for 語句相當于 while 1 語句7 表達式1可以是設置循環(huán)變量的初值的賦值表達式 也可以是其他表達式 例如 for sum 0 i 100 i sum sum i 107 8 表達式1和表達式3可以是一個簡單表達式也可以是逗號表達式 for sum 0 i 1 i 100 i sum sum i 或 for i 0 j 100 i 100 i j k i j 9 表達式2一般是關系表達式或邏輯表達式 但也可是數值表達式或字符表達式 只要其值非零 就執(zhí)行循環(huán)體 例如 for i 0 c getchar n i c 又如 for c getchar n printf c c 108 例 斐波那契數列 是意大利中世紀數學家列昂納多 斐波那契以兔子繁殖為例子而引入的 兔子在出生兩個月后 一對兔子每個月能生出一對小兔子來 如果所有兔子都不死 那么一年以后可以繁殖多少對兔子 經過分析 經過月份 0 1 2 3 4 5 6 7 兔子對數 1 1 2 3 5 8 13 21 數字1 1 2 3 5 8 13 構成了一個數列 109 數字1 1 2 3 5 8 13 有明顯的特點 前面相鄰兩項之和 構成了后一項 我們可以得到遞推公式如下 程序運行結果為 11235813213455891442333776109871597258441816765 110 遞推過程如下 11235第一次x1 x2 x1 第二次x2 x1 x2 第三次x1 x2 x1 111 voidmain inti x1 1 x2 1 for i 1 i 10 i printf 10d 10d x1 x2 if i 2 0 printf n x1 x1 x2 x2 x2 x1 每次生成并輸出兩項 所以循環(huán)10次 當i為偶數時換行 即每四個數換行 112 4 4 4break語句和continue語句 switch結構中的break 提前結束該結構循環(huán)結構中的break 提前結束該結構 while循環(huán) do while循環(huán) for循環(huán) 循環(huán)結構中的continue 提前結束本次循環(huán) 若在多層嵌套中使用break或continue 它只影響包含它的最內層結構 113 114 break語句可以用終止循環(huán)結構 也可以終止switch結構 而continue語句只能用于循環(huán)語句中 與switch語句沒有關系 voidmain inti a 0 b 0 c 0 d 0 for i 1 i 4 i switch i case1 a 1 continue case2 b 2 case3 c 3 break case4 d 4 printf d d d d n a b c d 1 1 2 2 0 0 0 3 輸出 1230 0 3 3 輸出 1230 0 4 4 輸出 1234 1 1 2 1 2 3 115 例 寫出以下程序的運行結果 voidmain intn for n 1 n 10 n if n 3 0 break printf 4d n printf n voidmain intn for n 1 n 10 n if n 3 0 cotinue printf 4d n printf n 結果 12 結果 12457810 116 例 輸出100 200之間所有能夠被7或9整除的數 includevoidmain intn for n 100 n 200 n if n 7 0 不能被7或9整除 則進行下一次循環(huán) for i 100 i 200 i if i 7 0 i 9 0 printf d n i 這樣寫邏輯更清晰 117 例 將數字512表示成兩個數的和 這兩個數分別為15和13的倍數 includevoidmain inti for i 1 i if 512 i 15 13 break printf d d 512 n i 15 512 i 15 結果 135 377 512 設第一個數為i 15則第二個數為512 i 15 設定一個循環(huán) 使i從1開始遞增 直到使得512 i 15能夠被13整除 118 4 4 5循環(huán)的嵌套 1 各種循環(huán)結構的循環(huán)體中可以包含任一種完整的循環(huán)結構 選擇結構 2 選擇結構的任一分支中也可以包含任一種完整的循環(huán)結構 選擇結構 3 且它們可多層嵌套 119 例1 while x y z for k 1 k 2 k if a 5 w 1 elseif a 5 switch結構 else for s 0 n 0 n 3 n s n 120 例 輸出所有由1 2 3組成的三位數 111211311112212312113213313121221321122222322123223323131231331132231332133233333 121 voidmain inti j k for i 1 i 3 i for j 1 j 3 j for k 1 k 3 k printf d d d i j k d d d沒有空格和逗號 起分隔符作用 122 改為不出現(xiàn)重復數字的三位數voidmain inti j k for i 1 i 3 i for j 1 j 3 j for k 1 k 3 k if i j 123 改為不出現(xiàn)重復字母的由X Y Z組成的三個子符的字符串voidmain inti j k for i X i Z i for j X j Z j for k X k Z k if i j 等價于 i 88 i 90 124 例 voidmain intk j x 0 for k 1 k 4 k x if k 3 0 break for j k j 5 j x x printf d n x 結果 14 125 程序舉例 126 1 窮舉 逐個推算 找出真解 三位自方冪數又稱水仙花數 如 153 13 53 33 用窮舉法求出所有水仙花數 voidmain inti j k m1 m2 for i 1 i 9 i for j 0 j 9 j for k 0 k 9 k m1 i 100 j 10 k m2 i i i j j j k k k if m1 m2 printf 4d m1 printf n 設置3重循環(huán) 1 i 1時 求j 0 而k 0 9時3個數字的3次方的和 能否等于3個數字構成的數 求j 9 而k 0 9時3個數字的3次方的和 能否等于3個數字構成的數 2 i 2時 9 i 9時 127 3種價格之和為100 k為整數 求用100元錢買100只雞 每種雞的只數 1 的所有買法 其中 1只公雞5元 1只母雞3元 3只小雞1元 main inti j k for i 1 i 20 i for j 1 j 33 j k 100 i j if k 3 0 5 20 100 3 33 99 保證三數加起來為100 3數都必須大于0 運行結果 418788118112484 128 百錢買百雞解法二 main intx y z printf n for x 1 x 100 x for y 1 y 100 y for z 1 z 100 z if x y z 100 129 2 數字分離 有些題中經常要求將一個數中的每一位數字或者其中的某些位數字輸出 就需要使用到數字分離技術 如在求解水仙花數 完數 同構數 最大公約數和最小公倍數以及費波拉切數列等內容時都需要使用到數字分離技術 130 例 輸出10 1000中所有十位數為3的數voidmain inti for i 10 i 1000 i if i 10 10 3 printf 5d i 如 i 1234i 10 123整數123 10 3 if i 10 103 continue printf 5d i 131 分離出個位數 如123 10 3 用數的分離方法求水仙花數 voidmain inti j k num for num 100 num 999 num i num 100 j num 10 i 10 k num 10 if num i i i j j j k k k printf 4d num printf n 分離出百位數 如123 100 1 分離出十位數 123 10 1 10 2 132 例 輸入1 32767之間的整數 把這個整數顯示為一系列數字 每組數字都是用兩個空格分開 voidmain inti num counter 1 temp scanf d 計算位數 輸入 3167 輸出 3167 3167 10 316counter 2316 10 31counter 331 10 3counter 43 10 0結束循環(huán) 133 例 給出一個不多于4位的正整數 要求 求出它是幾位數 并且按逆序打印出各位數字 main inti j k 0 scanf d 134 迭代方法是使用某個公式反復校正根的近似值 使之逐步精確化 最后得到滿足精度要求的結果 方程求根可以利用迭代 二分法求解 3 方程求根與迭代 135 猴子吃桃 第一天吃總數的一半多一個 第二天吃剩下的一半多一個 到第十天想再吃時剩一個 求第一天共有多少個 設第i天未吃前有xi個 由題意得 x1 2 1 x2x2 2 1 x3 x9 2 1 x10已知x10 1所以x10 1x9 x10 1 2x8 x9 1 2 x1 x2 1 2 136 main intk x1 x2 x2 1 for k 1 k 9 k x1 x2 1 2 x2 x1 printf 總數 d n x1 相當于第十天x10 1 x10 1x9 x10 1 2x8 x9 1 2 x1 x2 1 2 k 1時 x1為第九天k 2時 x1為第8天 迭帶方法在計算幾何中非常實用 137 例 用迭代法求x 求平方根的迭代公式為 xn 1 xn a xn 2 要求前后二次求出的x的差的絕對值小于10 5 x0的值 1 憑經驗給指定一個值 2 有題目給定答案范圍 從中取一個值 根據公式 x1 x0 a x0 2x2 x1 a x1 2x3 x2 a x2 2 xn xn 1 a xn 1 2xn 1 xn a xn 2直到 xn xn 1 10 5為止 不用花太多精力關心公式由來 一般直接給出 計算 x1 x0 a x0 2重復計算 x0 x1 x1 x0 a x0 2每次計算后判斷 x1 x0 10 5是否成立 138 includemain floata x0 x1 scanf f f x0 x1 x1 x0 a x0 2 每次算完馬上判斷 否則x1被覆蓋掉 139 迭代結束條件改為n次voidmain floata x0 x1 intk scanf f f d x1 x0 a x0 2 x0 x1 140 例 一球從100米高度自由落下 每次落地后又反跳回原高度的一半 在 再落下 求它在第十次落地時 共經過多少米 第十次反彈多高 h2 h1 2hn hn 1 2S h1 2 h2 2 hn 141 main inti floath 100 s 100 for i 2 i 10 i h h 2 s s h 2 h h 2 printf nTotal fmetres n s printf lastheight fmetres n h 第一次降落100米 第二次做到第十次 第十次反彈 142 用二分法求方程f x x3 1 1x2 0 9x 1 4 0的根 條件 函數在區(qū)間 a b 上連續(xù) f a f b 0 單調函數 算法 1 給定精確度 2 確定區(qū)間 a b 驗證f a f b 0 3 求區(qū)間 a b 的中點c 4 計算f c 若f c 0 則c就是函數的零點 若f a f c 0 則令b c 此時零點x0 a c 若f c f b 0 則令a c 此時零點x0 c b 判斷是否達到精確度 若 f a f b 則得到零點近似值a 或b 否則重復步驟 143 中點1 此兩點一定為異號才有解 與a異號 中點2在左邊 中點2 b 與b異號 中點3在左邊 中點3 144 include math h voidmain floatx y1 y2 x1 x2 do scanf f f 中點函數值 左邊函數值 兩函數值同號 中點為x1 否則為x2 做到y(tǒng)值逼近0為止 兩邊界點函數值為異號才有解 x x1 x2 y1 y2分別表示c 中點 a b f c f a 左邊函數值 145 4 多項式計算 求累加 連乘的算法 1 循環(huán)條件次數控制 加多少項n 20 100 用誤差控制 直到某一項小于或大于一個數 使用終止標記2 循環(huán)體求和求每一項 從前一項求出后一項 單獨求每一項為下一項作準備3 循環(huán)初值設為0 設為第一項注意雙重循環(huán)設初值的位置 146 main inti n a unsignedlongs 0 t 0 printf pleaseinputa n n scanf d d 例 求s a aa aaa 輸入 2 3 輸出 s a aa aaa 246 147 main inti t floata 2 b 1 sum 0 for i 1 i 20 i sum sum a b t a a a b b t printf sum f n sum 例 求2 1 3 2 5 3 13 8 a表示分子 b表示分母 將前一項分子 分母之和作為下一項的分子 將前一項的分子作為下一項的分母 148 計算 main floatsum term x intn k sign scanf d f 方法一 第一項直接賦值 計算單項 累加 符號變量 實現(xiàn)正負號轉換 149 main floatsum 0 term x intn j k sign scanf d f 方法二 賦初值 每次循環(huán)重新賦初值 計算單項一個語句 累加 符號變量 150 例 輸出100 200中所有素數m是素數 m不被2 3 4 m 1中任一個整除結果 101103107109113127131137139149151157163173173179181191193197199 5 數的判別 151 執(zhí)行m 11 m 15 k m 1 k m 1 for i 2 iki kk 10 i 11k 3i 3 i k 結束for循環(huán) m i 0 break 152 voidmain intm i k for m 100 m 200 m k m 2 for i 2 i k i if m i 0 break if i k printf disnotaprimenumber n m elseprintf disaprimenumber n m 只要有一個整除 后面無需判斷 強迫循環(huán)結束 此時i k 循環(huán)正常結束 i k說明都不能整除 改為 判斷一個數是否為素數 scanf d 153 例 用輾轉相除法求兩個數的最大公約數和最小公倍數 利用1397和2413這兩個數 算2413 1397 1 10161397 1016 1 3811016 381 2 254381 254 1 127254 127 2 0最大公約數 127 最小公倍數 1397 2413 127 6 輾轉相除法 用1397和2413中小的數去除大的 得商為1 余數為1016 將原來兩個數中大的2413扔掉 將1397作為大數 將余數1016作為新的小數 重復上面的過程 154 includevoidmain longintm n temp c d scanf ld ld 保證m存放大數 n存放小數 輾轉相除 求公倍數 輸入 6 46 m 46 n 6 temp 4 m 6 n 4 temp 2 m 4 n 2 temp 0 m 2 n 0c 46 6 2 138 155 輸入十個數 求出最大數 最小數和奇數 偶數個數 includevoidmain inti max min oldn 0 even 0 x for i 1 imax max x if x min min x printf max d mix d n max min printf Thereare devennumbers n evenn printf Thereare doldnumbers n oldn 7 統(tǒng)計與查詢問題 輸入第一個數 分別賦給最大最小數 奇數 偶數 最大最小數判別和修改 156 求出10個數中最大數及其在10個數中的位置main intmax p k x scanf d 輸入第一個數 從第二個數開始循環(huán) 位置計數器 與888靠最近的數及其在10個數中的位置 near near if abs x 888 abs near 888 存放比較過的最大數 near near near 157 8 用矩形法求定積分 梯形法見P117例4 39 解題思路 本題的幾何意義是求x2 sinx曲線和直線x 2 5 y 0 x 8 4所圍成的曲邊矩形面積 從微積分知識可以知道 將 2 5 8 4 區(qū)間分成若各個小區(qū)間 每個區(qū)間的寬度為 b a n n為區(qū)間個數 近似求出每個小的曲邊矩形面積 然后將n個小面積加起來 就近似得到總的面積 當n愈大 即區(qū)間分的愈小 近似程度愈高 158 梯形法分析 設 h b a n 則xi a i h第一個小梯形的面積為 f a f x1 h 2第i個小梯形的面積為 f xi f xi 1 h 2而總面積為 area f a f x1 h 2 f x1 f x2 2 f xn 1 f xn h 2 化簡后 得 area h f a f b 2 h f x1 f x2 f xn 1 159 矩形法分析 設 h b a n 則xi a i h第一個小梯形的面積為 h a a sin a 第i個小梯形的面積為 h xi xi sin xi 而總面積為 h a a sin a h x1 x1 sin x1 h xn 1 xn 1 sin xn 1 160 includevoidmain intn k floata b h area x a 2 5 b 8 4 printf inputn scanf d 輸入等分數 h b a n 則xi a i h 小矩形面積累加

注意事項

本文(C謝麗聰-4程序控制結構.ppt)為本站會員(max****ui)主動上傳,裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對上載內容本身不做任何修改或編輯。 若此文所含內容侵犯了您的版權或隱私,請立即通知裝配圖網(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網速或其他原因下載失敗請重新下載,重復下載不扣分。




關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對上載內容本身不做任何修改或編輯。若文檔所含內容侵犯了您的版權或隱私,請立即通知裝配圖網,我們立即給予刪除!