




已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章 循環(huán)結(jié)構(gòu)程序設(shè)計 學(xué)習(xí)的意義 許多實際問題中往往需要有規(guī)律地重復(fù)某些操作 如菜譜中可以有 打雞蛋直到泡沫狀 這樣的步驟 也就是說 在雞蛋沒有打成泡沫狀時要反復(fù)地打 相應(yīng)的操作在計算機程序中就體現(xiàn)為某些語句的重復(fù)執(zhí)行 這就時所謂的循環(huán) 下面來思考一個問題 如何編程來計算1 2 3 100 程序如下 ints 0 s s 1 s s 2 s s 3 s s 100 printf s d s 重復(fù)100次 暈 有沒有更好的方法來計算呢 有 就是用循環(huán)來編程 While do while for語句循環(huán)嵌套Break continue goto語句exit 函數(shù)循環(huán)結(jié)構(gòu)類型的選擇及轉(zhuǎn)換循環(huán)結(jié)構(gòu)程序設(shè)計舉例本章小結(jié) 學(xué)習(xí)目標 理解循環(huán)結(jié)構(gòu)的含義 掌握C語言三種循環(huán)結(jié)構(gòu)的特點 掌握while do while for goto break continue語句的使用方法 掌握不同循環(huán)結(jié)構(gòu)的選擇及其轉(zhuǎn)換方法 掌握混合控制結(jié)構(gòu)程序設(shè)計的方法 學(xué)習(xí)內(nèi)容 6 1循環(huán)結(jié)構(gòu)的程序設(shè)計 1 while語句 一般形式 while 表達式 循環(huán)體語句 執(zhí)行流程 其中 while后面的括號 不能省 while后面的表達式可以是任意類型的表達式 但一般是條件表達式或邏輯表達式 表達式的值是是循環(huán)的控制條件 語句部分稱為循環(huán)體 當(dāng)需要執(zhí)行多條語句時 應(yīng)使用復(fù)合語句 特點 先判斷表達式 再執(zhí)行循環(huán)體 例 用while語句求1 100的累計和 includevoidmain inti 1 sum 0 while i 100 sum i i printf sum d n sum 循環(huán)初值 循環(huán)終值 循環(huán)條件 循環(huán)體 循環(huán)變量增值 運行結(jié)果 sum 5050 例 顯示1 10的平方 includevoidmain inti 1 while i 10 printf d d d n i i i i i 運行結(jié)果 1 1 12 2 43 3 94 4 165 5 256 6 367 7 498 8 649 9 8110 10 100 1 如果while后的表達式的值一開始就為假 循環(huán)體將一次也不執(zhí)行 2 循環(huán)體中的語句可為任意類型的C語句 3 遇到下列情況 退出while循環(huán) 表達式為假 為0 循環(huán)體內(nèi)遇到break return或goto語句 break和goto語句將在隨后介紹 while語句注意事項 inta 0 b 0 while a 0 a 0為假 b 不可能執(zhí)行b intnum 0 字符計數(shù)while 1 if getche n 如果輸入的字符是回車符 則返回return num 4 在執(zhí)行while語句之前 循環(huán)控制變量必須初始化 否則執(zhí)行的結(jié)果將是不可預(yù)知的 5 要在while語句的某處 表達式或循環(huán)體內(nèi) 改變循環(huán)控制變量 否則極易構(gòu)成死循環(huán) 6 允許while語句的循環(huán)體又是while語句 從而形成雙重循環(huán) while語句注意事項 例 計算10 includevoidmain inti i應(yīng)賦初始值10longs 1 while i 1 s i printf 10 ld n s i 1 while i 100 死循環(huán) 因為i的值沒變化 永遠小于100sum i printf sum d n sum i 1 while i 9 j 1 while j 9 printf d d d n i j i j j i 例 求兩個正整數(shù)的最大公因子 我們采用Euclid 歐幾里德 算法來求最大公因子 其算法是 1 輸入兩個正整數(shù)m和n 2 用m除以n 余數(shù)為r 如果r等于0 則n是最大公因子 算法結(jié)束 否則 3 3 把n賦給m 把r賦給n 轉(zhuǎn) 2 includevoidmain intm n r printf Pleaseinputtwopositiveinteger scanf d d 運行結(jié)果 Pleaseinputtwopositiveinteger 2456 Theirgreatestcommondivisoris8 2 do while語句 一般形式 do循環(huán)體語句 while 表達式 執(zhí)行流程 其中 while后面的括號 不能省 while最后面的分號 不能省 while后面的表達式可以是任意類型的表達式 但一般是條件表達式或邏輯表達式 表達式的值是是循環(huán)的控制條件 語句部分稱為循環(huán)體 當(dāng)需要執(zhí)行多條語句時 應(yīng)使用復(fù)合語句 特點 先執(zhí)行循環(huán)體 再判斷表達式 例 用do while語句求1 100的累計和 includevoidmain inti 1 sum 0 do sum i i while i 100 printf sum d n sum 運行結(jié)果 sum 5050 do while語句注意事項 inta 0 b 0 dob while a 0 1 如果do while后的表達式的值一開始就為假 循環(huán)體還是要執(zhí)行一次 2 在if語句 while語句中 表達式后面都不能加分號 而在do while語句的表達式后面則必須加分號 否則將產(chǎn)生語法錯誤 3 循環(huán)體中的語句可為任意類型的C語句 4 和while語句一樣 在使用do while語句時 不要忘記初始化循環(huán)控制變量 否則執(zhí)行的結(jié)果將是不可預(yù)知的 5 要在do while語句的某處 表達式或循環(huán)體內(nèi) 改變循環(huán)控制變量的值 否則極易構(gòu)成死循環(huán) 6 do while語句也可以組成多重循環(huán) 而且也可以和while語句相互嵌套 3 for語句 一般形式 for 表達式1 表達式2 表達式3 循環(huán)體語句 執(zhí)行流程 其中 for后面的括號 不能省 表達式1 一般為賦值表達式 給控制變量賦初值 表達式2 關(guān)系表達式或邏輯表達式 循環(huán)控制條件 表達式3 一般為賦值表達式 給控制變量增量或減量 表達式之間用分號分隔 語句部分稱為循環(huán)體 當(dāng)需要執(zhí)行多條語句時 應(yīng)使用復(fù)合語句 for語句很好地體現(xiàn)了正確表達循環(huán)結(jié)構(gòu)應(yīng)注意的三個問題 控制變量的初始化 循環(huán)的條件 循環(huán)控制變量的更新 例 用for語句求1 100的累計和 includevoidmain inti sum 0 for i 1 i 100 i sum i printf sum d n sum 運行結(jié)果 sum 5050 for語句注意事項 例 計算1 2 3 4 5 6 99 100 inti j longsum 0 for i 1 j 2 i 99 i i 2 j j 2 sum i j printf sum ld n sum 1 表達式1 表達式2 和表達式3可以是任何類型的表達式 比方說 這三個表達式都可以是逗號表達式 即每個表達式都可由多個表達式組成 逗號表達式 逗號表達式 includevoidmain inti sum 0 i 1 for i 100 i sum i printf sum d n sum includevoidmain inti sum 0 i 1 for i 100 sum i printf sum d n sum for語句注意事項 省掉表達式1 3 省掉表達式1 2 表達式1 表達式2 和表達式3都是任選項 可以省掉其中的一個 兩個或全部 但其用于間隔的分號是一個也不能省的 includevoidmain inti sum 0 i 1 for if i 100 break sum i printf sum d n sum 省掉表達式1 2 3 for語句注意事項 for a 1 a printf 3 表達式2如果為空則相當(dāng)于表達式2的值是真 死循環(huán) 4 循環(huán)體中的語句可為任意類型的C語句 5 for語句也可以組成多重循環(huán) 而且也可以和while語句和do while語句相互嵌套 6 循環(huán)體可以是空語句 例 計算用戶輸入的字符數(shù) 當(dāng)輸入是回車符時統(tǒng)計結(jié)束 includevoidmain intn 0 printf inputastring n for getchar n n printf d n 表示循環(huán)體為空語句 并非表示for語句結(jié)束 三種循環(huán)可互相嵌套 層數(shù)不限外層循環(huán)可包含兩個以上內(nèi)循環(huán) 但不能相互交叉嵌套循環(huán)的執(zhí)行流程 1 while while 2 do do while while 3 while do while 嵌套循環(huán)的跳轉(zhuǎn)禁止 從外層跳入內(nèi)層跳入同層的另一循環(huán)向上跳轉(zhuǎn) 4 循環(huán)嵌套 例 循環(huán)嵌套 輸出九九表 includevoidmain inti j for i 1 i 10 i printf 4d i printf n n for i 1 i 10 i for j 1 j 10 j printf j 9 4d n 4d i j for i 1 i 10 i for j 1 j 10 j printf j 9 4d n 4d i j 5 break與continue語句 break語句功能 在循環(huán)語句和switch語句中 終止并跳出循環(huán)體或開關(guān)體說明 1 break不能用于循環(huán)語句和switch語句之外的任何其它語句之中 2 break只能終止并跳出最近一層的結(jié)構(gòu) while 表達式1 if 表達式2 break 語句 do if 表達式2 break while 表達式1 語句 for 表達式1 if 表達式2 break 語句 例 將用戶輸入的小寫字母轉(zhuǎn)換成大寫字母 直到輸入非小寫字母字符 includevoidmain charc while 1 c getchar 讀取一個字符if c a 循環(huán)退出 運行結(jié)果 howareyou HOWAREYOU 方法 通過設(shè)置一標志變量tag 然后在每層循環(huán)后加上一條語句 if tag break 其值為1表示跳出循環(huán)體 為0則不跳出 for while if break while循環(huán)后的第一條語句 inttag 0 for while if tag 1 break if tag break for循環(huán)后的第一條語句 多重循環(huán)中 break的使用 問 在嵌套循環(huán)的情況下 如何讓break語句跳出最外層的的循環(huán)體 continue語句功能 結(jié)束本次循環(huán) 跳過循環(huán)體中尚未執(zhí)行的語句 進行下一次是否執(zhí)行循環(huán)體的判斷 說明 1 僅用于循環(huán)語句中 2 在嵌套循環(huán)的情況下 continue語句只對包含它的最內(nèi)層的循環(huán)體語句起作用 for while if continue while循環(huán)后的第一條語句 例 求輸入的十個整數(shù)中正數(shù)的個數(shù)及其平均值 includevoidmain inti a num 0 floatsum 0 for i 0 i 10 i scanf d 運行結(jié)果 8plusinteger ssum 45averagevalue 5 63 假設(shè)輸入的10個整數(shù)為 23 45 678910 5 goto語句 一般形式 goto語句標號 語句標號 語句標號 goto語句標號 或 說明 語句標號是按標識符規(guī)定書寫的符號 放在某一語句行的前面 標號后加冒號 語句標號起標識語句的作用 與goto語句配合使用 作用 goto語句的作用是在不需要任何條件的情況下直接使程序跳轉(zhuǎn)到該語句標號所標識的語句去執(zhí)行 goto語句的應(yīng)用 例 求1 100的累計和 includevoidmain inti 1 sum 0 loop sum i if i 100 如果i小于或等于100gotoloop 轉(zhuǎn)到標號為loop的語句去執(zhí)行printf sum d n sum 1 goto語句可與條件語句配合使用來實現(xiàn)條件轉(zhuǎn)移 構(gòu)成循環(huán) 2 在嵌套循環(huán)的情況下 利用goto語句可以直接從最內(nèi)層的循環(huán)體跳出最外層的循環(huán)體 inttag 0 for while if gotostop stop for循環(huán)后的第一條語句 注意 在結(jié)構(gòu)化程序設(shè)計中一般不主張使用goto語句 以免造成程序流程的混亂 使理解和調(diào)試程序都產(chǎn)生困難 6 exit 函數(shù) 功能 說明 參數(shù)status為int型 status的值傳給調(diào)用進程 一般為操作系統(tǒng) 按照慣例 當(dāng)status的值為0或為宏常量EXIT SUCCESS時 表示程序正常退出 當(dāng)status的值為非0或為宏常量EXIT FAILURE時 表示程序出現(xiàn)某種錯誤后退出 終止整個程序的執(zhí)行 強制返回操作系統(tǒng) 調(diào)用形式 voidexit intstatus 頭文件 程序設(shè)計分析 由數(shù)學(xué)知識可知 求三角形面積的公式是 其中 a b c是三角形的三個邊長 s a b c 2 因此 程序中應(yīng)該有三個float型變量用來存放a b c的值 為了方便起見 還應(yīng)有一個變量存放s 最后有必要設(shè)置一個變量來存放三角形的面積值 公式中存在求平方根的操作 這要用到C語言數(shù)學(xué)庫函數(shù)sqrt sqrt函數(shù)帶有一個參數(shù) 它的功能是返回參數(shù)的平方根 程序在開始接受用戶輸入的三角形的三個邊長后 首先要對這三邊作合法性檢查 如三邊中有某一邊長度小于或等于0 則終止程序的執(zhí)行 同樣如果s s a s b s c 為負 也要終止程序的執(zhí)行 例 輸入三角形的邊長 求三角形面積 include include includevoidmain floata b c floats area printf inputthelengthofthreeedgesoftriangle scanf f f f s a b c 2 s s s a s b s c if s 0 printf thelengthofthreeedgesoftriangleiserror n exit 1 area float sqrt s printf area 2f n area 運行結(jié)果 inputthelengthofthreeedgesoftriangle 345 area 6 00inputthelengthofthreeedgesoftriangle 3 45 thelengthofthreeedgesoftriangleiserror 6 2循環(huán)結(jié)構(gòu)類型的選擇及轉(zhuǎn)換 1 循環(huán)結(jié)構(gòu)類型的選擇原則 如果循環(huán)次數(shù)在執(zhí)行循環(huán)體之前就已確定 一般用for循環(huán) 如果循環(huán)次數(shù)是由循環(huán)體的執(zhí)行情況確定的 一般用while循環(huán)或者do while循環(huán) 當(dāng)循環(huán)體至少執(zhí)行一次時 用do while循環(huán) 反之 如果循環(huán)體可能一次也不執(zhí)行 選用while循環(huán) 2 循環(huán)結(jié)構(gòu)類型之間的相互轉(zhuǎn)換 盡管上面對于循環(huán)結(jié)構(gòu)的選擇給出了原則性指導(dǎo)意見 但是我們應(yīng)注意到其實這三種循環(huán)結(jié)構(gòu)彼此之間可以相互轉(zhuǎn)換 象前面我們分別用while循環(huán) do while循環(huán) for循環(huán)來求1 100的累計和的例子就說明了這一點 例 求1 100之間的所有素數(shù) 問題分析 素數(shù)是指除了能被1和它本身整除外 不能被其它任何整數(shù)整除的數(shù) 例如 17就是一個素數(shù) 除了1和17之外 它不能被2 16之間的任何整數(shù)整除 根據(jù)素數(shù)的這個定義 可得到判斷素數(shù)的方法 把m作為被除數(shù) 把i 2 m 1 依次作為除數(shù) 判斷被除數(shù)m與除數(shù)i相除的結(jié)果 若都除不盡 即余數(shù)都不為0 則說明m是素數(shù) 反之 只要有一次能除盡 余數(shù)為0 則說明m存在一個1和它本身以外的另一個因子 它不是素數(shù) 事實上 根本用不著除那么多次 用數(shù)學(xué)的方法可以證明 只需用2 之間 取整數(shù) 數(shù)去除m 即可得到正確的判定結(jié)果 這一思路的算法如下 從鍵盤輸入一正整數(shù)m 計算k i從2變化到k 依次檢查m i是否為0 若m i為0 則判定m不是素數(shù) 并終止對其余i值的檢驗 否則 令i i 1 并繼續(xù)對其余i值進行檢驗 直到全部檢驗完畢為止 這時判定m是素數(shù) 6 3循環(huán)結(jié)構(gòu)程序設(shè)計舉例 例1 驗證哥德巴赫猜想 任一充分大的偶數(shù) 可以用兩個素數(shù)之和表示 例如 4 2 2 6 3 3 98 19 79 這一思路的算法如下 讀入大于3的偶數(shù)n p 1do p p 1 q n p p是素數(shù)嗎 q是素數(shù)嗎 whilep q有一個不是素數(shù) 輸出n p q 問題分析 讀入一個偶數(shù)n 將它分成p和q 使n p q 怎樣分呢 可以令p從2開始 每次加1 而令q n p 如果p q均為素數(shù) 則正為所求 否則令p p 1再試 flagp 1 for j 2 j int sqrt p j if p除以j的余數(shù) 0 flagp 0 break flagq 1 for j 2 j int sqrt q j if q除以j的余數(shù) 0 flagq 0 break 設(shè)置兩個標志量flagp和flagq 0 是素數(shù) 1 不是素數(shù) while flagp flagq 0 include include includevoidmain inti n p q flagp flagq printf pleaseinputn scanf d 程序結(jié)束 p 1 do p q n p flagp 1 for i 2 i int sqrt p i if p i 0 flagp 0 break flagq 1 for i 2 i int sqrt q i if q i 0 flagq 0 break while flagp flagq 0 printf d d d n n p q 判斷p是否為素數(shù) 判斷q是否為素數(shù) 運行結(jié)果 pleaseinputn 98 98 19 79pleaseinputn 9 inputdataerror 例 利用下面的公式求 的近似值 要求累加到最后一項小于10 6為止 問題分析 這是一個累加求和的問題 但這里的循環(huán)次數(shù)是預(yù)先未知的 而且累加項以正負交替的規(guī)律出現(xiàn) 如何解決這類問題呢 在本例中 累加項的構(gòu)成規(guī)律可用尋找累加項通式的方法得到 具體表示為t s n 即累加項由分子和分母兩部分組成 分子s按 1 1 1 1 交替變化 可用賦值語句s s 實現(xiàn) s的初始值取為1 分母n按1 3 5 7 變化 用n n 2 語句實現(xiàn)即可 n的初始值取為1 0 include includevoidmain ints 1 floatn 1 0 t 1 pi 0 while fabs t 1e 6 pi t n 2 s s t s n pi 4 printf pi 6f n pi 運行結(jié)果 pi 3 141594 例 打印大小可變的菱形圖案 下面菱形的大小是7 問題分析 菱形的大小size其實就是中間行中 號的個數(shù) 也是整個菱形的行數(shù) 其值必須是奇數(shù) 問題的關(guān)鍵之一是如何確定每行中 號的個數(shù) 經(jīng)過分析得知 當(dāng)行數(shù)i 假設(shè)最上面的一行為第1行 size 1 2時 該行上的 號個數(shù)為n 2 i 1 否則n 2 size i 1 1 問題的關(guān)鍵之二是如何確定每行顯示的第一個 號的位置 也就是顯示第一個 號之前應(yīng)顯示多少個空格 經(jīng)過分析得知 每行應(yīng)顯示的空格數(shù)為m size n 2個 include includevoidmain inti j k m n size printf inputsize 輸入大小提示scanf d 程序結(jié)束 for i 1 i size i 控制行數(shù) n i size 1 2 i size i 1 每行中 號的個數(shù)n 2 n 1 m size n 2 15 每行打印 之前應(yīng)打印的空格數(shù)for k 1 k m k 打印每行前面的空格printf for j 1 j n j 打印每行的 printf printf n 打印一行后 回車換行 例 計算用戶輸入的兩正整數(shù)之間的所有整數(shù)中0 1 2 9數(shù)碼的個數(shù) 例如 101 104之間總共包含四個整數(shù)101 102 103 104 其中0的個數(shù)為4 1的個數(shù)為5 2 3 4的個數(shù)都為1 其余數(shù)碼沒出現(xiàn)都為0 問題分析 問題的關(guān)鍵是要計算某整數(shù)中包含的各個數(shù)碼的個數(shù) 必須對該整數(shù)進行分解 求得所包含的各個數(shù)碼 其方法可以通過每次除以10取余數(shù)得到 然后再對商進行同樣的處理 直到商為0時為止 對所得到的數(shù)碼進行計數(shù) 可采用switch語句來實現(xiàn) include includevoidmain intnum1 num2 intn s r intcount0 0 count1 0 count2 0 count3 0 count4 0 intcount5 0 count6 0 count7 0 count8 0 count9 0 printf inputtwointeger scanf d d for n num1 n num2 n s n do r s 10 switch r case0 count0 break case1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全知識試題在線學(xué)習(xí)考試題及答案
- 課題開題報告:當(dāng)前英語課堂教學(xué)存在的問題及對策研究
- 課題開題報告:大數(shù)據(jù)背景下高校思政工作新模式探析
- 金屬制氫燃料動力船舶企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略研究報告
- 書籍類單色印刷品企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報告
- 2025年度電子競技業(yè)務(wù)提成管理合同
- 二零二五年度職業(yè)技能提升師帶徒實施監(jiān)督協(xié)議
- 抗凍瘡手套企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報告
- 二零二五年度銷售業(yè)績提升聘用協(xié)議
- 2025年度新能源儲能技術(shù)合作入股協(xié)議書
- 從入門到精通:2025年化妝基本步驟
- 教學(xué)課件:《公共關(guān)系學(xué)》(本科)
- 劉聰版在燦爛陽光下鋼琴伴奏譜簡譜版
- 2025年春新人教PEP版英語三年級下冊全冊教學(xué)課件
- 建筑工程項目精益建造實施計劃書
- 化學(xué)-江蘇省蘇州市2024-2025學(xué)年2025屆高三第一學(xué)期學(xué)業(yè)期末質(zhì)量陽光指標調(diào)研卷試題和答案
- 游戲開發(fā)公司游戲產(chǎn)品設(shè)計與用戶體驗優(yōu)化計劃
- 浙江省金華市義烏市2024年中考語文二模試卷含答案
- 2024年湖南省安全員-B證考試題庫附答案
- 綠化養(yǎng)護項目管理服務(wù)機構(gòu)設(shè)置方案、運作流程、管理方式及計劃
- 2025-2025學(xué)年度第二學(xué)期仁愛版七年級英語下冊教學(xué)計劃
評論
0/150
提交評論