C謝麗聰-4程序控制結(jié)構(gòu).ppt
《C謝麗聰-4程序控制結(jié)構(gòu).ppt》由會員分享,可在線閱讀,更多相關(guān)《C謝麗聰-4程序控制結(jié)構(gòu).ppt(175頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1 第四章程序控制結(jié)構(gòu) 4 1C語言的執(zhí)行語句4 2順序結(jié)構(gòu)4 3選擇結(jié)構(gòu)4 4循環(huán)結(jié)構(gòu) 2 4 1 語言的執(zhí)行語句 程序的結(jié)構(gòu) 3 C語句可分為以下五類 1 表達(dá)式語句2 函數(shù)調(diào)用語句 一般包含在表達(dá)式語句中 3 控制語句4 復(fù)合語句5 空語句 程序的執(zhí)行部分是由語句組成的 程序的功能也是由執(zhí)行語句實現(xiàn)的 4 4 1 1表達(dá)式語句 表達(dá)式語句由表達(dá)式加上分號 組成 執(zhí)行表達(dá)式語句就是計算表達(dá)式的值 其一般形式為 表達(dá)式 例如 x y z y z i x 0 y 1 賦值語句 加法運(yùn)算語句 但計算結(jié)果不能保留 無實際意義 自增1語句 i值增1 逗號表達(dá)式語句 5 1 賦值語句 由賦值表達(dá)式加上分號 構(gòu)成的表達(dá)式語 語法格式 變量 表達(dá)式 1 賦值運(yùn)算符除 外 還包含復(fù)合賦值運(yùn)算符 例如 a a a 2 賦值運(yùn)算符右側(cè)的表達(dá)式可以又是一個賦值表達(dá)式 例如 a b 5 3 等價 a a a a 等價 a b 5 3 等價 b 5 3 a b 6 3 賦值語句的功能與賦值表達(dá)式相同 但性質(zhì)不同 賦值表達(dá)式是一種表達(dá)式 它可以出現(xiàn)在任何允許表達(dá)式出現(xiàn)的地方 而賦值語句不能出現(xiàn)在表達(dá)式中 例如 if x y 5 z x 語句的功能是 若表達(dá)式x y 5大于0則z x if x y 5 0 z x 因為x y 5 是語句 不能出現(xiàn)在表達(dá)式中 合法 不合法 7 4 賦值表達(dá)式的嵌套 賦值符右邊的表達(dá)式又是一個賦值表達(dá)式 變量 變量 表達(dá)式 展開之后的一般形式為 變量 變量 表達(dá)式 例如 a b c d e 5 按照賦值運(yùn)算符的右接合性 等效于 e 5 d e c d b c a b 8 5 變量說明中給變量賦初值和賦值語句的區(qū)別 給變量賦初值是變量說明的一部分 賦初值后的變量與其后的其它同類變量之間仍必須用逗號間隔 而賦值語句則必須用分號結(jié)尾 例如 inta 5 b c 6 在變量說明中 不允許連續(xù)給多個變量賦初值 如下述說明是錯誤的 inta b c 5 而賦值語句允許連續(xù)賦值 inta b c a b c 5 9 2 函數(shù)調(diào)用語句 函數(shù)調(diào)用語句由函數(shù)名 實際參數(shù)加上分號 組成 執(zhí)行函數(shù)語句就是調(diào)用函數(shù)體 一般形式為 函數(shù)名 實際參數(shù)表 例如 printf CProgram z x sin y 調(diào)用庫函數(shù) 輸出字符串 賦值語句 表達(dá)式中包含函數(shù)調(diào)用 10 4 1 2空語句 空語句只有分號 組成的語句稱為空語句 空語句是什么也不執(zhí)行的語句 例如while getchar n 空語句 本語句的功能是 只要從鍵盤輸入的字符不是回車則重新輸入 11 4 1 3復(fù)合語句 復(fù)合語句把多個語句用括號 括起來組成的一個語句稱復(fù)合語句 在程序中應(yīng)把復(fù)合語句看成是單條語句 而不是多條語句 例如 x y z a b c printf d d x a 是一條復(fù)合語句 復(fù)合語句內(nèi)的各條語句都必須以分號 結(jié)尾 在括號 外不能加分號 12 4 1 4控制語句 控制語句用于控制程序的流程 以實現(xiàn)程序的各種結(jié)構(gòu)方式 可分成以下三類 1 條件判斷語句 ifelse語句 2 開關(guān)分支語句 switch語句 3 循環(huán)執(zhí)行語句 dowhile語句 while語句 for語句 4 中止循環(huán)語句 continue語句 break語句 5 無條件轉(zhuǎn)移語句 goto語句 6 函數(shù)返回語句 return語句 13 4 2順序結(jié)構(gòu) 按照解決問題的順序編寫相應(yīng)的語句 程序運(yùn)行時自上而下依次執(zhí)行語句 14 例1 輸入任意兩個整數(shù) 求它們的和及平均值 includevoidmain intnum1 num2 sum floataver printf Pleaseinputtwointegers n scanf d d 輸入 30000 5005 輸出 sum 35005 aver 17502 50 變量定義 輸入提示 數(shù)據(jù)輸入 求累計和 求平均值 輸出結(jié)果 sum 2 0 15 例2 給定一個三位正整數(shù) 輸出它的個位 十位和百位數(shù) 數(shù)字分離方法 百位數(shù)m2 m 100十位數(shù)m1 m m2 100 10個位數(shù)m0 m m2 100 m1 10個位數(shù)m0 m 10十位數(shù)m1 m 10 10百位數(shù)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 給定一個三位正整數(shù) 輸出它的個位 十位和百位數(shù) 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位的二進(jìn)制數(shù)a的7 6 5 4四個位 如16進(jìn)制數(shù) 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 以十六進(jìn)制形式輸入整數(shù)a 以十六進(jìn)制形式輸出a和結(jié)果d 右移4位 求低4位 19 表達(dá)式可以是任意合法表達(dá)式 后面不能加 4 3選擇結(jié)構(gòu) if語句 4 3 1if語句1 單分支if if 表達(dá)式 語句語義 如果表達(dá)式的值為真 則執(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)數(shù)的互換 功能 輸入三個數(shù) 按照從大到小順序輸出 22 例3 從鍵盤輸入一個字符 判斷它是否小寫字母 若是 將其轉(zhuǎn)換成大寫字母 否則不進(jìn)行轉(zhuǎn)換 作后輸出該字母 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 表達(dá)式 語句1 else語句2 語義 如果表達(dá)式的值為真 則執(zhí)行語句1 否則執(zhí)行語句2 后面不能加 24 voidmain inta b printf inputtwonumbers scanf d d 輸入 2346輸出 max 46 輸入兩個整數(shù) 輸出其中大數(shù) 例4 例1的改寫 25 3 多分支if elseif if 表達(dá)式1 語句1 elseif 表達(dá)式2 語句2 elseif 表達(dá)式3 語句3 elseif 表達(dá)式m 語句m else語句n 語義 依次判斷表達(dá)式的值 當(dāng)出現(xiàn)某個值為真時 則執(zhí)行其對應(yīng)的語句 然后跳到整個if語句之外繼續(xù)執(zhí)行程序 如果所有的表達(dá)式均為假 則執(zhí)行語句n 然后繼續(xù)執(zhí)行后續(xù)程序 后面不能加 26 此為真 做語句1 其它語句都不做 27 上面的語句為以下三種格式 1 空語句2 一個語句 不引起轉(zhuǎn)移 3 前后加大括號的語句 復(fù)合語句 也叫程序段 如 inta floatb a 3 b 7 0 允許在復(fù)合語句前部定義變量 只能在復(fù)合語句中使用 inta a 3 floatb b 7 0 變量要在最前面定義 28 a b t a a b b t a b t a a b b t 使用復(fù)合語句 不使用復(fù)合語句 N N Y Y 29 include stdio h voidmain 輸入 Acharc 輸出 Thisisacapitalletterc getchar if c 0 例5 30 4 在使用if語句中應(yīng)注意以下問題 1 在三種形式的if語句中 在if之后均為表達(dá)式 該表達(dá)式通常是邏輯表達(dá)式或關(guān)系表達(dá)式 但也可以是其它表達(dá)式 如賦值表達(dá)式等 甚至也可以是一個變量 例如 if a 5 語句 if b 語句 都是允許的 只要表達(dá)式的值為非0 即為 真 如在 if a 5 中表達(dá)式的值永遠(yuǎn)為非0 所以其后的語句總是要執(zhí)行的 當(dāng)然這種情況在程序中不一定會出現(xiàn) 但在語法上是合法的 31 又如 有程序段 if a b printf d a elseprintf a 0 本語句的語義是 把b值賦予a 如為非0則輸出該值 否則輸出 a 0 字符串 這種用法在程序中是經(jīng)常出現(xiàn)的 為賦值運(yùn)算符 比較運(yùn)算符為 32 2 在if語句中 條件判斷表達(dá)式必須用括號括起來 在語句之后必須加分號 3 在if語句的三種形式中 所有的語句應(yīng)為單個語句 如果要想在滿足條件時執(zhí)行一組 多個 語句 則必須把這一組語句用 括起來組成一個復(fù)合語句 但要注意的是在 之后不能再加分號 例如 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 可用條件表達(dá)式寫為 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 表達(dá)式 成立值為1 y x 3 x x 2 3 x 7 x x 35 例7 從鍵盤輸入任意的兩個實數(shù) 按從小到大順序輸出這兩個數(shù) 請編程實現(xiàn) voidmain floata b scanf f 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語句的嵌套 當(dāng)if語句中的執(zhí)行語句又是if語句時 則構(gòu)成了if語句嵌套的情形 其一般形式可表示如下 if 表達(dá)式 或if 表達(dá)式 if語句 if語句 elseif語句 在嵌套內(nèi)的if語句可能又是if else型的 這將會出現(xiàn)多個if和多個else重疊的情況 這時要特別注意if和else的配對問題 加 41 其中的else究竟是與哪一個if配對呢 是if 表達(dá)式1 還是if 表達(dá)式1 if 表達(dá)式2 if 表達(dá)式2 語句1 語句1 elseelse語句2 語句2 注意 if與else的配對關(guān)系 else總是與它前面最近的if配對 因此對上述例子應(yīng)按前一種情況理解 42 例9 寫出下面兩程序的輸出結(jié)果 1 voidmain intx 2 y 1 z 2 if x y if y 0 z 0 elsez 1 printf d n z 結(jié)果 一個語句 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 結(jié)果 2 44 為了使邏輯關(guān)系清晰 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 適當(dāng)?shù)丶哟罄ㄌ?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 結(jié)果 x 0 y 1 無結(jié)果 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 根據(jù)leap輸出結(jié)果 49 4 3 2switch語句 另一種分支語句 格式 switch 任意類型表達(dá)式 case常量表達(dá)式1 語句1 case常量表達(dá)式2 語句2 case常量表達(dá)式n 語句n default 語句n 1 注 常量表達(dá)式中運(yùn)算對象只能為常量或符號常量 整型或字符型 各個值必須互不相同 default允許出現(xiàn)在前面或中間 switch 任意類型表達(dá)式 后不帶分號 任意類型表達(dá)式的計算結(jié)果取整 不要忘記空格 不帶 50 功能 若switch后面表達(dá)式值的整數(shù) 字符常量 部分與某個case后面表達(dá)式值相等 則就執(zhí)行該case后面的語句 否則就執(zhí)行default后面的語句 51 例12 voidmain inta printf inputintegernumber scanf d 輸入 3 輸出 WednesdaThursdayFridaySaturdaySundayerror case常量表達(dá)式 相當(dāng)于一個語句標(biāo)號 表達(dá)式的值和某標(biāo)號相等則轉(zhuǎn)向該標(biāo)號執(zhí)行 但不能在執(zhí)行完該標(biāo)號的語句后自動跳出整個switch語句 所以出現(xiàn)了繼續(xù)執(zhí)行所有后面case語句的情況 52 break語句 專用于跳出switch語句 在每一case語句之后增加break語句 使每一次執(zhí)行之后均可跳出switch語句 從而避免輸出不應(yīng)有的結(jié)果 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 任意類型表達(dá)式 case整型或字符型常量表達(dá)式1 語句1 break case整型或字符型常量表達(dá)式2 語句2 break case整型或字符型常量表達(dá)式n 語句n break default 語句n 1 default后面不加break 54 注意 1 case后的各常量表達(dá)式的值不能相同 否則會出現(xiàn)錯誤 2 case后 允許有多個語句 可以不用 括起來 3 case和default子句的先后順序可以變動 而不會影響程序執(zhí)行結(jié)果 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 先接收從鍵盤輸入的一個等級制成績 然后輸出對應(yīng)的百分制成績 轉(zhuǎn)換規(guī)則如下 A 85 100B 70 84C 60 69D 60 57 voidmain chargrade scanf c 58 例15 先接收從鍵盤輸入的一個百分制成績 然后輸出對應(yīng)的五分制成績 轉(zhuǎn)換規(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 計算器程序 用戶輸入運(yùn)算數(shù)和四則運(yùn)算符 輸出計算結(jié)果 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 一定有解要認(rèn)真分析題目 達(dá)到題目要求 64 voidmain doublea b c x1 x2 disc p q scanf lf lf lf 65 例18 輸入某年某月某日 判斷這一天是這一年的第幾天 需考慮閏年的情形 注 符合以下條件之一是閏年 能被4整除 但不能被100整除 能被400整除 算法分析 以5月4日為例 先把1 4月份的天數(shù)加起來 然后再加上本月的4天即本年的第幾天 閏年情形只需當(dāng)輸入月份大于3時需要考慮 若是閏年 2月份應(yīng)是29天 66 voidmain intday month year sum 0 scanf d d d 加上3月份31天 計算某月以前月份的總天數(shù) 67 case3 判斷是否閏年 if year 4 0 68 例19 運(yùn)輸公司對用戶計算運(yùn)費 路程 skm 越遠(yuǎn) 每噸 千米運(yùn)費越低 標(biāo)準(zhǔn)如下 S 250沒有折扣250 s 5002 折扣500 s 10005 折扣1000 s 20008 折扣2000 s 300010 折扣3000 s015 折扣設(shè)每噸 千米運(yùn)費為p 貨物重量為w 距離為s 折扣為d 則總運(yùn)費為 f p w s 1 d 輸入 p w s 計算運(yùn)費 69 用公式f p w s 1 d 計算運(yùn)輸費 噸公里運(yùn)價 運(yùn)輸距離 折扣 貨重 s 250 公里 d 0250 s 500d 0 02500 s 1000d 0 051000 s 2000d 0 082000 s 3000d 0 103000 sd 0 15 要根據(jù)距離計算折扣d 關(guān)鍵是構(gòu)造switch后的表達(dá)式 選擇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的倍數(shù) 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 運(yùn)費 72 例20 判斷以下程序?qū)崿F(xiàn)的功能 includevoidmain charc printf inputacharacter c getchar if c 0 輸入一個字符 判別該字符是數(shù)字 英文大寫字母 小寫字母還是其它字符 數(shù)字 大寫字母 小寫字母 其它字符 73 例21 輸入三角形三邊長 求三角形面積 include includevoidmain floata b c s area scanf f f f 判斷條件是否滿足 74 例22 輸入a b c三個整數(shù) 輸出最大數(shù)和最小數(shù) includevoidmain inta b c max min scanf d d d 比較a b兩數(shù)的大小 大數(shù)賦給max 小數(shù)賦給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)結(jié)構(gòu)的特點 在給定條件成立時 反復(fù)執(zhí)行某程序段 直到條件不成立為止 語言提供的循環(huán)結(jié)構(gòu)類型如下 1 用goto語句和if語句構(gòu)成循環(huán) 2 用while語句 3 用do while語句 4 用for語句 循環(huán)體 76 語法格式 while 表達(dá)式 語句表達(dá)式值為零時 立即停止循環(huán) 4 4 1用while語句實現(xiàn)循環(huán) 沒有分號 77 寫出下面程序的運(yùn)行結(jié)果 1 voidmain inti 1 while i 3 printf d n i i 2 voidmain inti 1 while i 3 printf d n i i 結(jié)果123 結(jié)果死循環(huán) 循環(huán)體 空語句 若把上面 去掉也死循環(huán) 復(fù)合語句作為循環(huán)體語句 78 語法格式 do語句while 表達(dá)式 表達(dá)式值為零時 立即停止循環(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 結(jié)果 sum 10 寫出下面程序的運(yùn)行結(jié)果 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 運(yùn)行結(jié)果 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 保證達(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)計從鍵盤輸入一行字符的個數(shù) includevoidmain intn 0 printf inputastring n while getchar n n printf d n 只要從鍵盤輸入的字符不是回車就繼續(xù)循環(huán) 完成對輸入字符個數(shù)計數(shù) 輸入 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)結(jié)束條件是運(yùn)行某一個精度 最后一項的值小于10 6 fabs t 1e 6來控制循環(huán)是否結(jié)束 88 1 while語句中的表達(dá)式一般是關(guān)系表達(dá)或邏輯表達(dá)式 也可以是其它表達(dá)式 只要表達(dá)式的值為真 非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)體內(nèi)必須要有能夠改變循環(huán)條件的語句 否則將構(gòu)成死循環(huán) 4 循環(huán)條件設(shè)置要合理 否則也將構(gòu)成死循環(huán) 5 不管是while循環(huán)還是do while循環(huán) 循環(huán)體如果包含一個以上的語句 都應(yīng)以復(fù)合語句的形式出現(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)體 復(fù)合語句 執(zhí)行到i 11停止 條件不滿足 循環(huán)體語句不執(zhí)行 sum為 0 11 23 3 10 92 4 4 3用for語句實現(xiàn)循環(huán) 語法格式 for 表達(dá)式1 表達(dá)式2 表達(dá)式3 語句要正確表達(dá)循環(huán)結(jié)構(gòu)應(yīng)注意三方面要求 1 循環(huán)控制變量的初始化 2 循環(huán)的條件 3 循環(huán)控制變量的值的更新 for語句在書寫形式上集中體現(xiàn)了這三方面要求 93 功能 for語句完全可以取代while語句 for 表達(dá)式1 表達(dá)式2 表達(dá)式3 語句執(zhí)行過程 1 先求解表達(dá)式1 2 求解表達(dá)式2 若其值為真 非0 則執(zhí)行for語句中指定的內(nèi)嵌語句 然后執(zhí)行第3 步 若其值為假 0 則結(jié)束循環(huán) 轉(zhuǎn)到第5 步 3 求解表達(dá)式3 4 轉(zhuǎn)回第2 步繼續(xù)執(zhí)行 5 循環(huán)結(jié)束 執(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)控制變量賦初值 總是一個表達(dá)式 它用來判別循環(huán)是否終止 定義循環(huán)控制變量每循環(huán)一次后按什么方式變化 這三個部分之間用 分開 99 對于for循環(huán)中語句的一般形式 for 表達(dá)式1 表達(dá)式2 表達(dá)式3 語句就是如下的while循環(huán)形式 表達(dá)式1 while 表達(dá)式2 語句表達(dá)式3 100 例 寫出下面程序的輸出結(jié)果 includevoidmain charc for c getchar putchar c c為 值為0 結(jié)束 可以是任意表達(dá)式 輸入 a56 3h hj 輸出 a56 3h 101 例 統(tǒng)計從鍵盤輸入一行字符的個數(shù) 以回車結(jié)束 includevoidmain intn charc printf Inputastring n for n 0 c getchar n n printf d n 意義是 從鍵盤輸入一個字符并賦值給變量c 將c與字符 n 比較 不一樣就繼續(xù)循環(huán) 完成對輸入字符個數(shù)計數(shù) 循環(huán)體是空語句 輸入 Abg23bs 輸出 7 102 例 下面程序的輸出結(jié)果是 voidmain intx 10 y 10 i for i 0 x 8 y i printf 3d 3d x y A 10192B 9876C 101091D 10990 表達(dá)式1只做一次 9 1 8 C 2 103 注意 1 for循環(huán)中的 表達(dá)式1 表達(dá)式2 循環(huán)條件 和 表達(dá)式3 可以缺省 但 不能缺省 2 省略了 表達(dá)式1 表示不對循環(huán)控制變量賦初值 可在for循環(huán)里面或外面對其賦初值 例如 i 1 for i 20 i scanf f 104 4 省略了 表達(dá)式3 循環(huán)變量增量 則不對循環(huán)控制變量進(jìn)行操作 這時可在語句體中加入修改循環(huán)控制變量的語句 例如 for i 1 i 100 sum sum i i 105 5 省略了 表達(dá)式1 和 表達(dá)式3 例如 for i 100 sum sum i i 相當(dāng)于 while i 100 sum sum i i 106 6 3個表達(dá)式都可以省略 例如 for 語句相當(dāng)于 while 1 語句7 表達(dá)式1可以是設(shè)置循環(huán)變量的初值的賦值表達(dá)式 也可以是其他表達(dá)式 例如 for sum 0 i 100 i sum sum i 107 8 表達(dá)式1和表達(dá)式3可以是一個簡單表達(dá)式也可以是逗號表達(dá)式 for sum 0 i 1 i 100 i sum sum i 或 for i 0 j 100 i 100 i j k i j 9 表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式 但也可是數(shù)值表達(dá)式或字符表達(dá)式 只要其值非零 就執(zhí)行循環(huán)體 例如 for i 0 c getchar n i c 又如 for c getchar n printf c c 108 例 斐波那契數(shù)列 是意大利中世紀(jì)數(shù)學(xué)家列昂納多 斐波那契以兔子繁殖為例子而引入的 兔子在出生兩個月后 一對兔子每個月能生出一對小兔子來 如果所有兔子都不死 那么一年以后可以繁殖多少對兔子 經(jīng)過分析 經(jīng)過月份 0 1 2 3 4 5 6 7 兔子對數(shù) 1 1 2 3 5 8 13 21 數(shù)字1 1 2 3 5 8 13 構(gòu)成了一個數(shù)列 109 數(shù)字1 1 2 3 5 8 13 有明顯的特點 前面相鄰兩項之和 構(gòu)成了后一項 我們可以得到遞推公式如下 程序運(yùn)行結(jié)果為 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次 當(dāng)i為偶數(shù)時換行 即每四個數(shù)換行 112 4 4 4break語句和continue語句 switch結(jié)構(gòu)中的break 提前結(jié)束該結(jié)構(gòu)循環(huán)結(jié)構(gòu)中的break 提前結(jié)束該結(jié)構(gòu) while循環(huán) do while循環(huán) for循環(huán) 循環(huán)結(jié)構(gòu)中的continue 提前結(jié)束本次循環(huán) 若在多層嵌套中使用break或continue 它只影響包含它的最內(nèi)層結(jié)構(gòu) 113 114 break語句可以用終止循環(huán)結(jié)構(gòu) 也可以終止switch結(jié)構(gòu) 而continue語句只能用于循環(huán)語句中 與switch語句沒有關(guān)系 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 例 寫出以下程序的運(yùn)行結(jié)果 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 結(jié)果 12 結(jié)果 12457810 116 例 輸出100 200之間所有能夠被7或9整除的數(shù) includevoidmain intn for n 100 n 200 n if n 7 0 不能被7或9整除 則進(jìn)行下一次循環(huán) for i 100 i 200 i if i 7 0 i 9 0 printf d n i 這樣寫邏輯更清晰 117 例 將數(shù)字512表示成兩個數(shù)的和 這兩個數(shù)分別為15和13的倍數(shù) includevoidmain inti for i 1 i if 512 i 15 13 break printf d d 512 n i 15 512 i 15 結(jié)果 135 377 512 設(shè)第一個數(shù)為i 15則第二個數(shù)為512 i 15 設(shè)定一個循環(huán) 使i從1開始遞增 直到使得512 i 15能夠被13整除 118 4 4 5循環(huán)的嵌套 1 各種循環(huán)結(jié)構(gòu)的循環(huán)體中可以包含任一種完整的循環(huán)結(jié)構(gòu) 選擇結(jié)構(gòu) 2 選擇結(jié)構(gòu)的任一分支中也可以包含任一種完整的循環(huán)結(jié)構(gòu) 選擇結(jié)構(gòu) 3 且它們可多層嵌套 119 例1 while x y z for k 1 k 2 k if a 5 w 1 elseif a 5 switch結(jié)構(gòu) else for s 0 n 0 n 3 n s n 120 例 輸出所有由1 2 3組成的三位數(shù) 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)重復(fù)數(shù)字的三位數(shù)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)重復(fù)字母的由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 結(jié)果 14 125 程序舉例 126 1 窮舉 逐個推算 找出真解 三位自方冪數(shù)又稱水仙花數(shù) 如 153 13 53 33 用窮舉法求出所有水仙花數(shù) 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 設(shè)置3重循環(huán) 1 i 1時 求j 0 而k 0 9時3個數(shù)字的3次方的和 能否等于3個數(shù)字構(gòu)成的數(shù) 求j 9 而k 0 9時3個數(shù)字的3次方的和 能否等于3個數(shù)字構(gòu)成的數(shù) 2 i 2時 9 i 9時 127 3種價格之和為100 k為整數(shù) 求用100元錢買100只雞 每種雞的只數(shù) 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 保證三數(shù)加起來為100 3數(shù)都必須大于0 運(yùn)行結(jié)果 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 數(shù)字分離 有些題中經(jīng)常要求將一個數(shù)中的每一位數(shù)字或者其中的某些位數(shù)字輸出 就需要使用到數(shù)字分離技術(shù) 如在求解水仙花數(shù) 完數(shù) 同構(gòu)數(shù) 最大公約數(shù)和最小公倍數(shù)以及費波拉切數(shù)列等內(nèi)容時都需要使用到數(shù)字分離技術(shù) 130 例 輸出10 1000中所有十位數(shù)為3的數(shù)voidmain inti for i 10 i 1000 i if i 10 10 3 printf 5d i 如 i 1234i 10 123整數(shù)123 10 3 if i 10 103 continue printf 5d i 131 分離出個位數(shù) 如123 10 3 用數(shù)的分離方法求水仙花數(shù) 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 分離出百位數(shù) 如123 100 1 分離出十位數(shù) 123 10 1 10 2 132 例 輸入1 32767之間的整數(shù) 把這個整數(shù)顯示為一系列數(shù)字 每組數(shù)字都是用兩個空格分開 voidmain inti num counter 1 temp scanf d 計算位數(shù) 輸入 3167 輸出 3167 3167 10 316counter 2316 10 31counter 331 10 3counter 43 10 0結(jié)束循環(huán) 133 例 給出一個不多于4位的正整數(shù) 要求 求出它是幾位數(shù) 并且按逆序打印出各位數(shù)字 main inti j k 0 scanf d 134 迭代方法是使用某個公式反復(fù)校正根的近似值 使之逐步精確化 最后得到滿足精度要求的結(jié)果 方程求根可以利用迭代 二分法求解 3 方程求根與迭代 135 猴子吃桃 第一天吃總數(shù)的一半多一個 第二天吃剩下的一半多一個 到第十天想再吃時剩一個 求第一天共有多少個 設(shè)第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 總數(shù) d n x1 相當(dāng)于第十天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 憑經(jīng)驗給指定一個值 2 有題目給定答案范圍 從中取一個值 根據(jù)公式 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為止 不用花太多精力關(guān)心公式由來 一般直接給出 計算 x1 x0 a x0 2重復(fù)計算 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 迭代結(jié)束條件改為n次voidmain floata x0 x1 intk scanf f f d x1 x0 a x0 2 x0 x1 140 例 一球從100米高度自由落下 每次落地后又反跳回原高度的一半 在 再落下 求它在第十次落地時 共經(jīng)過多少米 第十次反彈多高 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的根 條件 函數(shù)在區(qū)間 a b 上連續(xù) f a f b 0 單調(diào)函數(shù) 算法 1 給定精確度 2 確定區(qū)間 a b 驗證f a f b 0 3 求區(qū)間 a b 的中點c 4 計算f c 若f c 0 則c就是函數(shù)的零點 若f a f c 0 則令b c 此時零點x0 a c 若f c f b 0 則令a c 此時零點x0 c b 判斷是否達(dá)到精確度 若 f a f b 則得到零點近似值a 或b 否則重復(fù)步驟 143 中點1 此兩點一定為異號才有解 與a異號 中點2在左邊 中點2 b 與b異號 中點3在左邊 中點3 144 include math h voidmain floatx y1 y2 x1 x2 do scanf f f 中點函數(shù)值 左邊函數(shù)值 兩函數(shù)值同號 中點為x1 否則為x2 做到y(tǒng)值逼近0為止 兩邊界點函數(shù)值為異號才有解 x x1 x2 y1 y2分別表示c 中點 a b f c f a 左邊函數(shù)值 145 4 多項式計算 求累加 連乘的算法 1 循環(huán)條件次數(shù)控制 加多少項n 20 100 用誤差控制 直到某一項小于或大于一個數(shù) 使用終止標(biāo)記2 循環(huán)體求和求每一項 從前一項求出后一項 單獨求每一項為下一項作準(zhǔn)備3 循環(huán)初值設(shè)為0 設(shè)為第一項注意雙重循環(huán)設(shè)初值的位置 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)正負(fù)號轉(zhuǎn)換 149 main floatsum 0 term x intn j k sign scanf d f 方法二 賦初值 每次循環(huán)重新賦初值 計算單項一個語句 累加 符號變量 150 例 輸出100 200中所有素數(shù)m是素數(shù) m不被2 3 4 m 1中任一個整除結(jié)果 101103107109113127131137139149151157163173173179181191193197199 5 數(shù)的判別 151 執(zhí)行m 11 m 15 k m 1 k m 1 for i 2 iki kk 10 i 11k 3i 3 i k 結(jié)束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 只要有一個整除 后面無需判斷 強(qiáng)迫循環(huán)結(jié)束 此時i k 循環(huán)正常結(jié)束 i k說明都不能整除 改為 判斷一個數(shù)是否為素數(shù) scanf d 153 例 用輾轉(zhuǎn)相除法求兩個數(shù)的最大公約數(shù)和最小公倍數(shù) 利用1397和2413這兩個數(shù) 算2413 1397 1 10161397 1016 1 3811016 381 2 254381 254 1 127254 127 2 0最大公約數(shù) 127 最小公倍數(shù) 1397 2413 127 6 輾轉(zhuǎn)相除法 用1397和2413中小的數(shù)去除大的 得商為1 余數(shù)為1016 將原來兩個數(shù)中大的2413扔掉 將1397作為大數(shù) 將余數(shù)1016作為新的小數(shù) 重復(fù)上面的過程 154 includevoidmain longintm n temp c d scanf ld ld 保證m存放大數(shù) n存放小數(shù) 輾轉(zhuǎn)相除 求公倍數(shù) 輸入 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 輸入十個數(shù) 求出最大數(shù) 最小數(shù)和奇數(shù) 偶數(shù)個數(shù) 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)計與查詢問題 輸入第一個數(shù) 分別賦給最大最小數(shù) 奇數(shù) 偶數(shù) 最大最小數(shù)判別和修改 156 求出10個數(shù)中最大數(shù)及其在10個數(shù)中的位置main intmax p k x scanf d 輸入第一個數(shù) 從第二個數(shù)開始循環(huán) 位置計數(shù)器 與888靠最近的數(shù)及其在10個數(shù)中的位置 near near if abs x 888 abs near 888 存放比較過的最大數(shù) 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ū)間個數(shù) 近似求出每個小的曲邊矩形面積 然后將n個小面積加起來 就近似得到總的面積 當(dāng)n愈大 即區(qū)間分的愈小 近似程度愈高 158 梯形法分析 設(shè) 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 矩形法分析 設(shè) 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 輸入等分?jǐn)?shù) h b a n 則xi a i h 小矩形面積累加- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 謝麗聰 程序控制 結(jié)構(gòu)
鏈接地址:http://weibangfood.com.cn/p-10964427.html