版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、2020/9/22,1,C語言程序設(shè)計(jì),第四章 程序流程控制,主講: 計(jì)算機(jī)學(xué)院 曹曉梅,2020/9/22,3,內(nèi)容提要,算法的基本概念以及表示方法,簡單介紹流程圖 C程序的3種基本流程控制結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)(也叫分支結(jié)構(gòu))、循環(huán)結(jié)構(gòu),每種結(jié)構(gòu)的控制語句: if、switch控制選擇結(jié)構(gòu) for、while、dowhile控制循環(huán)結(jié)構(gòu) break、continue、goto等語句的用法 循環(huán)嵌套程序的設(shè)計(jì)及運(yùn)行過程 一些常用算法的基本思想: 分段函數(shù)求解問題 判斷一個(gè)整數(shù)是否為質(zhì)數(shù) 求兩個(gè)正整數(shù)的最大公約數(shù) 各種求和問題,擲骰子游戲的多種解法,求階乘,打印規(guī)則的圖形,窮舉問題的多種求解
2、方法,2020/9/22,4,算法與語句,算法(Algorithm)就是為解決一個(gè)具體問題而采取的有限的操作步驟,算法通過語句來實(shí)現(xiàn) 計(jì)算機(jī)算法分兩類:數(shù)值運(yùn)算算法、非數(shù)值運(yùn)算算法 程序=數(shù)據(jù)結(jié)構(gòu)+算法 算法的正確性衡量標(biāo)準(zhǔn): 有窮性:算法包含有限步操作 確定性:每一步都應(yīng)確定無歧義 有效性:每一步都應(yīng)能有效執(zhí)行且能得到確定的結(jié)果 0或多個(gè)輸入: 程序允許無輸入 1或多個(gè)輸出:任何程序都必須有輸出,哪怕是提示信息,解決求數(shù)值解的問題,解決需要用分析推理、邏輯推理才能解決的問題,數(shù)據(jù)的描述和組織形式,對操作或行為的描述,即操作步驟,2020/9/22,5,算法與語句,常用的算法描述方法有:自然語
3、言、傳統(tǒng)流程圖、NS流程圖、偽代碼等,這里只介紹傳統(tǒng)流程圖。 例:求n!的算法思想: n!=1*2*3*n 由于計(jì)算機(jī)執(zhí)行乘法時(shí)每次只能求兩個(gè)數(shù)相乘,因此上面的公式在程序中必定需要通過反復(fù)相乘來實(shí)現(xiàn)。 第一個(gè)變量,存放求多少的階乘(int n); 第二個(gè)變量,存當(dāng)前累乘的結(jié)果(int fac); 第三個(gè)變量存當(dāng)前將要與累乘器相乘的因子,并且該因子的變化是從1到n每次增加1(int i) 流程圖如下頁所示,2020/9/22,6,3種基本結(jié)構(gòu)的 特點(diǎn):單入口, 單出口,2020/9/22,7,C語句分類,C語言的語句有五大類: (1)9種控制語句:這一類語句用于實(shí)現(xiàn)流程控制,選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)必
4、須通過控制語句實(shí)現(xiàn)。 ifelse語句:是實(shí)現(xiàn)選擇結(jié)構(gòu)最常用的語句 switch語句:用于控制某些多分支的選擇結(jié)構(gòu) for( )語句:最常用最靈活的循環(huán)控制語句,當(dāng)型循環(huán) while( )語句:循環(huán)結(jié)構(gòu)最安全的控制語句,當(dāng)型循環(huán) dowhile( )語句:控制先執(zhí)行后判斷的直到型循環(huán)結(jié)構(gòu) continue語句:表示提前結(jié)束本次循環(huán),忽略其后循環(huán)體中的其他語句 break語句:可用于switch語句(結(jié)束switch)或循環(huán)體中(結(jié)束本層循環(huán)) goto語句:流程跳轉(zhuǎn)語句,很靈活,可實(shí)現(xiàn)各種結(jié)構(gòu),建議少用或不用 return語句:專門用于函數(shù)返回,被調(diào)函數(shù)執(zhí)行到return就返回到調(diào)用點(diǎn) (2)
5、變量定義語句:用來定義變量,形如:int a,b; (3)表達(dá)式語句:C語言中任何一個(gè)表達(dá)式最后加上分號構(gòu)成表達(dá)式語句,賦值語句和函數(shù)調(diào)用語句是最常用的表達(dá)式語句 (4)復(fù)合語句:以一對大括號括起的0或多條語句,在語法上仍為一條語句 (5)空語句:只有一個(gè)分號構(gòu)成的語句,表示什么也不做,2020/9/22,8,順序結(jié)構(gòu),順序結(jié)構(gòu)的特點(diǎn):語句按順序依次執(zhí)行,不涉及到任何條件的判斷。 順序結(jié)構(gòu)所使用的語句:變量定義語句、函數(shù)調(diào)用語句、賦值語句、return語句等。無需用其他流程控制語句 優(yōu)點(diǎn):結(jié)構(gòu)簡單易懂 缺點(diǎn):對程序的健壯性、完備性往往無法兼顧 例:程序4.1 從鍵盤上輸入a,b,c的值,并以它
6、們?yōu)槿切蔚娜龡l邊,求三角形的面積。 算法思想:根據(jù)數(shù)學(xué)知識,設(shè)一個(gè)變量s用于求三角形周長的一半,即s=(a+b+c)/2,再利用一般三角形求面積的公式求解:,2020/9/22,9,程序4.1 求任意三角形的面積 #include #include /包含平方根函數(shù)sqrt的聲明 int main( ) double a,b,c,s,area; /定義5個(gè)double變量 printf(“Please input a,b,c:n”); /屏幕提示 scanf(%lf%lf%lf, ,順序結(jié)構(gòu), 輸入 3 4 5 輸出area=6.000000,編程提示:存原始數(shù)據(jù)的變量,用讀入方式使其獲得的
7、值更靈活,也可賦值,但是通用性下降,問題1:可能會輸入負(fù)數(shù) 問題2:即使輸入的都是正數(shù),未必能構(gòu)成一個(gè)三角形 順序結(jié)構(gòu)無法解決需要作出判斷的問題!,2020/9/22,10,選擇結(jié)構(gòu)的特點(diǎn):通過某一個(gè)或若干條件的約束,有選擇性地執(zhí)行特定語句-在符合一定條件時(shí),執(zhí)行特定操作;在不符合條件時(shí),不執(zhí)行操作或執(zhí)行另外的操作 選擇結(jié)構(gòu)使用的流程控制語句:if語句、switch語句 優(yōu)點(diǎn):保證程序的健壯性、完備性 ifelse語句形式: if (表達(dá)式) 語句塊1 else 語句塊2 執(zhí)行過程:先計(jì)算表達(dá)式,若非0(真) 則執(zhí)行語句塊1;如果表達(dá)式為0(假) 則執(zhí)行語句塊2,選擇結(jié)構(gòu),不平衡的ifelse
8、語句(單分支if),ifelse語句(雙分支if),表達(dá)式的值可以是任何類型,條件表達(dá)式和邏輯表達(dá)式最常用,不平衡的ifelse語句(if語句),不執(zhí)行操作,2020/9/22,11,程序4.1 求任意三角形的面積 #include #include /包含平方根函數(shù)sqrt的聲明 int main( ) double a,b,c,s,area; /定義5個(gè)double變量 printf(“Please input a,b,c:n”); /屏幕提示 scanf(“%lf%lf%lf”, ,選擇結(jié)構(gòu)(if語句),問題1:可能會輸入負(fù)數(shù) 問題2:即使輸入的都是正數(shù),未必能構(gòu)成一個(gè)三角形 順序結(jié)構(gòu)無
9、法解決需要作出判斷的問題!,程序4.2 改進(jìn)程序4.1,在構(gòu)成三角形時(shí)求面積,否則給提示信息,if (a0,此else分支不能省略,否則在不能構(gòu)成三角形時(shí)將沒有任何輸出,就不是一個(gè)正確的算法了,2020/9/22,12,程序4.3 生成50以內(nèi)的兩個(gè)隨機(jī)數(shù),比較大小,輸出較大者及兩者之差的值。若第1個(gè)數(shù)大于第2個(gè)數(shù),輸出you are lucky! #include #include /含srand和rand函數(shù)的原型 #include /含time函數(shù)的原型 int main( ) int a ,b ; /定義兩個(gè)整型變量a和b srand(time(NULL); /調(diào)用當(dāng)前系統(tǒng)時(shí)鐘產(chǎn)生隨機(jī)
10、種子 a=rand()%50; /產(chǎn)生一個(gè)50以內(nèi)的隨機(jī)數(shù)賦給a b=rand()%50; /產(chǎn)生另一個(gè)50以內(nèi)的隨機(jī)數(shù)賦給b if(ab) /如果a大于b printf(the larger number is a:%dn,a) ; /輸出較大者 printf(a-b=%dn,a-b); /輸出a與b的差值 else /如果a不大于b,即ab)printf(you are lucky!n); /if語句 return 0; ,選擇結(jié)構(gòu)(if語句),若刪除此句,則每次產(chǎn)生的隨機(jī)數(shù)都是一樣的,這是調(diào)用系統(tǒng)時(shí)鐘產(chǎn)生隨機(jī)種子,上機(jī)運(yùn)行觀察結(jié)果,上機(jī)測試觀察運(yùn)行結(jié)果并分析: (1)刪除srand(ti
11、me(NULL); (2)刪除else后的一對大括號,若刪除此一對括號,則語句printf(“b-a=%dn”,b-a);成為一條不受條件控制的語句,2020/9/22,13,ifelse語句形式: if (表達(dá)式) 語句塊1 else 語句塊2 if語句形式: if (表達(dá)式) 語句塊1 最常用的嵌套ifelse語句形式: if (表達(dá)式1) 語句塊1 else if (表達(dá)式2) 語句塊2 else 語句塊n,選擇結(jié)構(gòu)(if語句),else總是與其前面與之最靠近的并且未與其它else匹配過的if相對應(yīng); 每個(gè)else都代表了與其對應(yīng)if完全相反的條件,編程時(shí)應(yīng)充分利用else所代表的條件簡
12、化程序,整個(gè)嵌套的ifelse語句從語法上仍為一條語句,2020/9/22,14,選擇結(jié)構(gòu)(if語句),程序4.4 用嵌套if進(jìn)行符號函數(shù)求解 #include int main( ) int x,sign; printf(Please input x:); scanf(%d, ,/語句2處嵌入ifelse,此else代表的條件是x=0,此else代表的條件是x0,if (x=0) if (x0) sign=1; else sign=0; else sign=-1;,語句1處嵌入ifelse,此else代表的條件是x0,此else代表的條件是x=0,顯然左邊的方法更直觀,此題還有多種其他寫法請
13、讀者思考,2020/9/22,15,選擇結(jié)構(gòu)(if語句),程序4.5 根據(jù)輸入的百分制成績score,轉(zhuǎn)換成 相應(yīng)的五分制成績grade并打印輸出。轉(zhuǎn)換標(biāo)準(zhǔn)為: . int score; char grade; /定義兩個(gè)變量 scanf(%d, /輸出百分成績及等級 .,有效的分?jǐn)?shù)應(yīng)滿足: 0=score=100,此else代表的條件為: 0=score char grade; /定義兩個(gè)變量 scanf(%d, .,選擇結(jié)構(gòu)(switch語句),方法二:用switch語句實(shí)現(xiàn)百分制轉(zhuǎn)五級分制,此break可以省略,在VC+下運(yùn)行程序觀察結(jié)果,遺憾:每次運(yùn)行程序只能輸入一個(gè)成績,一次運(yùn)行無法
14、輸入多個(gè)百分成績進(jìn)行轉(zhuǎn)換!,9月22日8:00-9:30 教2-325上機(jī),做實(shí)驗(yàn)一 順序結(jié)構(gòu)編程練習(xí),請務(wù)必提前做好準(zhǔn)備!,#include #define PI 3.14159 int main() double r,h,s1,s2,v; printf(“請輸入圓柱地面半徑和高(用空格格隔開,輸入完請回車):); scanf(r=%lf,h=%lf,r,h); s1=2*r*PI*h; s2=s1+r*r*PI*2; v=r*r*PI*h;,1、程序糾錯,printf(側(cè)面積: s1=%dn,s1 ); printf(表面積: s2=%dn,s2 ); printf(體積: v=%dn,v
15、 ); return 0; ,課堂練習(xí),2. 分析以下程序的運(yùn)行結(jié)果: main() int x,y,z,w; z=(x=1)?(y=1,y+=x+5):(x=7,y=3); w=y*a/4; printf(“%d %d %d %dn”,x,y,z,w); ,正確答案 1 7 7 169,3. 以下程序的輸出結(jié)果是,#include main() int a=1,b=-1,c=3; if(ab) if(b0) c=0; else c+; printf(“%d”,c); ,正確答案 3,#include int main (void) double capital,deposit,rate; i
16、nt year; printf(請輸入存款期(年):n); scanf(%d, ,4、計(jì)算銀行利息,年利率=2.25% 期限1年 2.79% 期限2年 3.33% 期限3年 3.6% 期限5年,#include int main() double rate,capital,deposit; int year; printf(請輸入存款期(年):n); scanf(%d, ,問題及改進(jìn),2020/9/22,22,循環(huán)結(jié)構(gòu)的特點(diǎn):某些操作在一定條件約束下在程序中可被重復(fù)執(zhí)行,或者重復(fù)執(zhí)行到滿足一定的條件時(shí)停止 循環(huán)結(jié)構(gòu)使用的流程控制語句: for語句、while語句、dowhile語句; 輔助語句
17、:break語句、continue語句 for語句形式: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句塊 執(zhí)行過程見右邊流程圖 注意:for語句中的3個(gè)表達(dá)式可以省略 1個(gè)或多個(gè),最多3個(gè)都可省略,但是 分號不能省。,循環(huán)結(jié)構(gòu),當(dāng)型循環(huán),直到型循環(huán),用于求初值,只計(jì)算一次,用來作為控制循環(huán)的條件,非0值則執(zhí)行語句塊;若為0,則結(jié)束for語句,語句塊執(zhí)行結(jié)束后自動執(zhí)行此表達(dá)式,然后再重新計(jì)算表達(dá)式2,就是循環(huán)體,通常用復(fù)合語句,只能是一條語句,整個(gè)for語句在語法上就是一條語句,假,表達(dá)式2,真,語句塊,表達(dá)式1,表達(dá)式3,循環(huán)體內(nèi)應(yīng)有修改表達(dá)式2值的語句,避免出現(xiàn)死循環(huán)!,上題進(jìn)一步改進(jìn),20
18、20/9/22,23,循環(huán)結(jié)構(gòu)(for語句),程序4.6 從鍵盤上輸入一個(gè)非負(fù)整數(shù)n,求n! #include int main( ) int n,i; /定義兩個(gè)整型變量,i表示乘數(shù) double fac=1; printf(Please input n:n); /提示輸入數(shù)據(jù)的信息 scanf(“%d”, ,若輸入為:-5 輸出結(jié)果為:Error input! 若輸入為:4 輸出結(jié)果為:4!=2.400000e+001 若輸入為:100 輸出結(jié)果為:100!=9.332622e+157,fac的類型應(yīng)當(dāng)定義為double類型,因?yàn)殡A乘的結(jié)果很容易非常大,應(yīng)當(dāng)定義范圍最廣的數(shù)據(jù)類型作為累乘器
19、的類型,并且一定要初始化為1,對n作判斷,保證程序的健壯性,用%e以指數(shù)形式輸出一個(gè)較大的結(jié)果比較合理,執(zhí)行的操作不變,但是變量是在不斷變化的,for語句中表達(dá)式省略示例,=1;,+;, fac*=i+; if (in) break; ,循環(huán)次數(shù)確定,2020/9/22,24,程序4.7 輸入1個(gè)正整數(shù)m,判斷m是否為質(zhì)數(shù),輸出判斷結(jié)果 質(zhì)數(shù)的概念:大于1的自然數(shù)中,除了1和它自己外,不能被任何其他整數(shù)所整除 的數(shù)。 算法思路: 設(shè)一個(gè)變量prime表示結(jié)果,值為1表示是質(zhì)數(shù),值為0則不是質(zhì)數(shù) 最初可以先假定m是質(zhì)數(shù),即prime初值為1,設(shè)一個(gè)變量i作為除數(shù),從2變化到m-1,只要其中有一個(gè)
20、能被m整除(即滿足m%i=0),就說明m不是質(zhì)數(shù),立即修改prime為0,否則繼續(xù)取下一除數(shù)計(jì)算 除數(shù)終值到底取多少:除數(shù)的終值需要到m-1嗎?數(shù)學(xué)已上證明,除數(shù)最大只要到sqrt(m)就已經(jīng)保證所有可能的因子均已被判斷 循環(huán)條件的控制:本題是循環(huán)次數(shù)不可確定的循環(huán)問題,用for語句也可以解決.以上分析表明循環(huán)終止有兩種可能:(1)被某一個(gè)i整除,(2)i的值已變到終值處.因此循環(huán)條件體現(xiàn)為兩個(gè)條件共同控制,即:prime scanf(%d, ,對prime的初始化不能缺少,如果m是負(fù)數(shù),則返回不再進(jìn)行判斷,對于特殊正整數(shù)1直接給出不是質(zhì)數(shù)的結(jié)論,變量k存除數(shù)的上界,變量i是每一次參與運(yùn)算的除
21、數(shù),從2變化到k,增加步長為1,用兩個(gè)條件共同控制,循環(huán)必將因?yàn)閜rime為0或ik而終止,前者表明m不是質(zhì)數(shù),后者表明m是質(zhì)數(shù),prime保持初值1,判斷m是否能被i整除,若能則prime賦值為0,不是質(zhì)數(shù),循環(huán)終止時(shí)prime可能為1可能為0,根據(jù)其值輸出不同的結(jié)論,循環(huán)體是這一條if語句,2020/9/22,26,while語句:與for語句一樣能控制當(dāng)型循環(huán) while語句的形式: while(表達(dá)式) 語句塊 執(zhí)行過程見右邊流程圖 for語句與while語句的等價(jià)關(guān)系: (1)for中的表達(dá)式1相當(dāng)于出現(xiàn)在 while之前的對循環(huán)變量的初始化 (2)for語句的表達(dá)式2相當(dāng)于whil
22、e語句的表達(dá)式,都表示當(dāng)該表達(dá)式為真時(shí)執(zhí)行循環(huán)體 (3)for語句的語句塊和表達(dá)式3一起,相當(dāng)于while循環(huán)的語句塊,是被反復(fù)執(zhí)行的循環(huán)體,循環(huán)結(jié)構(gòu)(while語句),假,表達(dá)式,真,語句塊,循環(huán)控制條件,循環(huán)體,通常用一條復(fù)合語句,2020/9/22,27,循環(huán)結(jié)構(gòu)(while語句),程序4.6 從鍵盤上輸入一個(gè)非負(fù)整數(shù)n,求n! #include int main( ) int n,i; double fac=1; printf(Please input n:n); scanf(“%d”, ,方法二:改用while循環(huán)求階乘,i=1; while (i=n) fac*=i ; i+; ,
23、2020/9/22,28,程序2.2:三位的非負(fù)整數(shù)按位分離輸出,#include int main( ) int i,n; /定義兩個(gè)整型變量i,n,變量先定義后使用 n=578; /通過賦值語句使n獲得一個(gè)3位整數(shù)值 i=n%10; /對10取余求得個(gè)位數(shù) printf(%d,i); /輸出個(gè)位數(shù) i=n/10%10; /先整除10再對10取余求得十位數(shù) printf(%d,i); /輸出十位數(shù) i=n/100; /用整除100求得百位數(shù) printf(%dn,i); /輸出百位數(shù) return 0; ,該程序顯然不具有通用性,不能處理任意位數(shù)的整數(shù)按位分離問題,2020/9/22,29,
24、循環(huán)結(jié)構(gòu)(while語句),程序4.8 從鍵盤讀入任意位的非負(fù)整數(shù),按位分離后逆序輸出 #include int main( ) int i,n; scanf(“%d”, ,算法思想: 在被處理的數(shù)不等于0時(shí): (1)利用對10取余得到個(gè)位數(shù) (2)輸出該個(gè)位數(shù) (3)對被分離的數(shù)利用整除10 降一階,若不為0回到步驟(1) 若為0停止處理,等價(jià)于n!=0,用循環(huán)求解問題的關(guān)鍵: (1)以什么作為控制循環(huán)的條件 (2)重復(fù)不斷地執(zhí)行的是哪些 操作,即循環(huán)體是什么 (3)在循環(huán)體內(nèi)對變量如何變化 每個(gè)變量的意義要明確,2020/9/22,30,循環(huán)結(jié)構(gòu)(while語句),程序4.9 從鍵盤讀入兩
25、個(gè)正整數(shù),用輾轉(zhuǎn)相除法求最大公約數(shù) #include int main( ) int dividend,divider,remainder; . /讀入dividend,divider remainder=dividend%divider; while (remainder) dividend=divider; divider=remainder; remainder=dividend%divider ; printf (hcd: %dn,divider); return 0; ,算法思想: (1)將兩個(gè)正整數(shù)分別作為被除數(shù) (dividend)和除數(shù)(divider) (2)被除數(shù)整除除數(shù)得
26、余數(shù)(remainder) (3)若余數(shù)不為0,則除數(shù)轉(zhuǎn)為被除數(shù), 余數(shù)轉(zhuǎn)為除數(shù),繼續(xù)步驟(2) (4)若余數(shù)為0則結(jié)束循環(huán),使余數(shù) 為0的除數(shù)就是最大公約數(shù),余數(shù)不為0為循環(huán)條件,上一次的除數(shù)作為下次的被除數(shù),上一次的余數(shù)作為下次的除數(shù),求新的余數(shù),使余數(shù)為0的除數(shù)就是最大公約數(shù),第一次求余數(shù),2020/9/22,31,while語句與for語句都控制當(dāng)型循環(huán),共同特點(diǎn):先判斷循環(huán)條件,為真才執(zhí)行循環(huán)體,故循環(huán)體最少執(zhí)行0次 dowhile語句控制直到型循環(huán),其特點(diǎn)是:先執(zhí)行循環(huán)體,再判斷條件,當(dāng)條件為真時(shí)繼續(xù)執(zhí)行循環(huán)體,條件為假,循環(huán)結(jié)束。因此循環(huán)體至少執(zhí)行1次。 dowhile語句的形式
27、: do 語句塊 while(表達(dá)式); 執(zhí)行過程見右邊流程圖,循環(huán)結(jié)構(gòu)(dowhile語句),假,表達(dá)式,真,語句塊,循環(huán)控制條件,循環(huán)體,可以是多條語句,此處一定要有分號,2020/9/22,32,循環(huán)結(jié)構(gòu)(dowhile語句),程序4.10 模擬投骰子,以6點(diǎn)為目標(biāo),投中目標(biāo)兩次獲勝,最多允許投10次(方法1:用dowhile語句) #include #include #include int main( ) int count=0,y=0,dice; srand(time(0); do dice=1+rand()%6; count+; if(dice=6) y+; while(coun
28、t10 ,模擬投骰子可以通過調(diào)用隨機(jī)函數(shù)產(chǎn)生1至6之間的隨機(jī)數(shù). 在程序中必須設(shè)置一個(gè)變量用來統(tǒng)計(jì)已經(jīng)投了多少次, 再設(shè)另一個(gè)變量統(tǒng)計(jì)投中了多少次。 投骰子的動作肯定要做,且做一次還不能完成,因此適合 使用dowhile語句實(shí)現(xiàn)。 循環(huán)體應(yīng)該完成: (1)調(diào)用隨機(jī)函數(shù)產(chǎn)生一個(gè)隨機(jī)數(shù)來模擬投骰子; (2)統(tǒng)計(jì)投擲次數(shù)的變量無條件加1; (3)如果隨機(jī)數(shù)的值等于6,則統(tǒng)計(jì)投中次數(shù)的變量值加1 循環(huán)條件是:投擲次數(shù)小于10并且投中次數(shù)小于2,記錄投中的次數(shù),記錄投擲的次數(shù),記錄點(diǎn)數(shù),產(chǎn)生隨機(jī)種子,生成16隨機(jī)數(shù)模擬投骰子,投擲次數(shù)無條件加1,如果點(diǎn)數(shù)等于6,投中次數(shù)加1,投擲次數(shù)小于10且投中次數(shù)小
29、于2為循環(huán)條件,輸出投擲次數(shù)和投中次數(shù),2020/9/22,33,循環(huán)結(jié)構(gòu)(dowhile語句),程序4.10 模擬投骰子,以6點(diǎn)為目標(biāo),投中目標(biāo)兩次獲勝,最多允許投10次(方法1:用dowhile語句) #include #include #include int main( ) int count=0,y=0,dice; srand(time(0); do dice=1+rand()%6; count+; if(dice=6) y+; while(count10 ,while(count10 ,(方法2:用while語句),此處不能加分號,如果加了分號,語法上正確,表示該循環(huán)體為空語句,而
30、語句塊就成為一條無條件的語句,結(jié)果將出錯,(方法3:用for語句),for(;count10 ,2020/9/22,34,程序4.11 利用格里高利公式求的近似值 格里高利公式為:/4=1-1/3+1/5-1/7+ 兩種求解要求: 算法分析:先求/4,最后再乘以4,用一個(gè)累加器進(jìn)行求和; 分子無變化,分母可用項(xiàng)號i的表達(dá)式:2*i-1表示 每一個(gè)累加項(xiàng)正負(fù)號交替,設(shè)一個(gè)符號變量,每項(xiàng)加過以后取負(fù) 循環(huán)體內(nèi)的主要操作: (1)求當(dāng)前項(xiàng),即符號變量*1.0/(2*i-1) (2)將當(dāng)前項(xiàng)加入到累加器中 (3)改變符號變量的值,以保證累加項(xiàng)正負(fù)號交替 (4)表示第幾項(xiàng)的變量i加1 循環(huán)條件根據(jù)題目要
31、求設(shè)定,循環(huán)結(jié)構(gòu)(3種語句),項(xiàng)數(shù)確定,適合用for語句,規(guī)定求解精度,適合用whie或dowhile語句,2020/9/22,35,/要求1:求前5001項(xiàng)的 /累加和作為的近似值 #include int main(void) int sign,i; double item,pi,sum=0; sign=1; for(i=1;i=5001;i+) item=sign*1.0/(2*i-1); sum=sum+item; sign=-sign; pi=4*sum; printf(pi=%fn, pi) ; return 0; ,/要求2:求的近似值直到 /累加項(xiàng)絕對值小于1E-4 #incl
32、ude #include int main(void) int sign,i=1; double item,pi,sum=0; sign=1; do item=sign*1.0/(2*i-1); sum=sum+item; sign=-sign; i+; while (fabs(item)=1e-4); pi=4*sum; printf(pi=%fn, pi) ; return 0; ,2020/9/22,36,dowhile語句一個(gè)非常實(shí)用的用法:保證讀入的數(shù)據(jù)符合要求,也就是說,如果讀入的數(shù)不符合要求,則提示重新讀入,直到滿足要求為止 例4.7:判斷一個(gè)輸入的正整數(shù)m是否為質(zhì)數(shù) 當(dāng)時(shí)對輸入
33、的m,如果小于等于0,則簡單地返回不做任何處理?,F(xiàn)在使用dowhile可以要求讀到m大于0為止。 int main( ) int m,i,k,prime=1; scanf(%d, ,循環(huán)結(jié)構(gòu)(dowhile語句),do printf(input a data0:n); scanf(%d,讀到第一個(gè)大于0的整數(shù)就停止,本節(jié)作業(yè): P74 三 1,2,3 ,有條件的同學(xué)可以打印作業(yè)。,2020/9/22,37,循環(huán)嵌套,循環(huán)嵌套最主要的是理解其三種循環(huán)控制語句的循環(huán)體內(nèi)可以嵌入更深層次的循環(huán)控制語句,從而構(gòu)成了循環(huán)的嵌套,3種語句可以互相嵌套。,執(zhí)行過程: (1)先對外層循環(huán)控制變量取一個(gè)值,滿足
34、條件進(jìn)入循環(huán)體 (2)執(zhí)行循環(huán)體中的內(nèi)層循環(huán),內(nèi)層循環(huán)結(jié)束后,回到外層 (3)改變外層循環(huán)控制變量的值,回到步驟(1) (4)當(dāng)外層循環(huán)條件不滿足時(shí)停止整個(gè)循環(huán),例如:小時(shí),例如:分,例如:秒,2020/9/22,38,例4.12:從鍵盤上輸入1個(gè)正整數(shù)n,求1!+2!+3!+n!的結(jié)果 #include int main( ) int i,j,n; double f,sum=0; do printf(Please input n:n); scanf(%d, ,內(nèi)循環(huán),求i!,外循環(huán),求1!+2!+n!,如果讀入3,結(jié)果 sum=9.000000E+000,2020/9/22,39,循環(huán)嵌套,
35、程序4.13 打印一個(gè)由*號組成的 五 行等腰上三角形。 #include int main( ) int i ,j ; for (i=1;i= 5 ; i+) for (j=1;j=(5-i)+14;j+) /+14使圖形居中 printf(%2c, ); /打印前導(dǎo)空格 for (j=1;j=2*i-1;j+) /打印本行圖形 printf(%2c, * ); printf(n); /換行 return 0; ,外層循環(huán)控制行的變化,n,n;,scanf(“%d”,n,n-i,打印一個(gè)n行等腰上三角形,每行圖形依次為ABCD,讀入控制的完整代碼如教材所示,用dowhile保證n在一定的范圍
36、內(nèi),i+64);,算法: 一般用兩層循環(huán)打印一個(gè)形狀規(guī)則的圖形 外層循環(huán)控制行變化 外層循環(huán)體中依次完成下面3個(gè)步驟: (1)根據(jù)行數(shù)和圖形的形狀,打印每行的前導(dǎo)空格(確定 本行圖形的起始位置)。若行號為i,i從1開始計(jì),考慮 最后一行(假設(shè)為n)前不留前導(dǎo)空格,則第i行前導(dǎo)空格的 單位為: n-i,用一個(gè)內(nèi)層循環(huán)控制打印前導(dǎo)空格 (2)根據(jù)行號與當(dāng)前行圖形的個(gè)數(shù)及形狀的關(guān)系進(jìn)行控制 輸出當(dāng)前行的圖形。等腰三角形,其圖形元素個(gè)數(shù)為2*i-1, 這里i為當(dāng)前行的行號,用一個(gè)內(nèi)層循環(huán)打印圖形 (3)換行,2020/9/22,40,一個(gè)用窮舉法解決問題的典型例,注意算法設(shè)計(jì)的重要性,同一題有多種解法
37、,效率不一樣. 程序4.14 百錢百雞問題:雞翁一,值錢5;雞母一,值錢3;雞雛三,值錢1。百錢買百雞,問雞翁、母、雛各幾何? 分析:設(shè)公雞,母雞和雛雞的數(shù)量分別為x,y,z,有下列關(guān)系成立: x+y+z=100 (百雞) 5x+3y+z/3=100 (百錢) 15x+9y+z=300 (百錢) 3個(gè)變量的范圍:0=x=20,0=y=33,0=z=100,循環(huán)嵌套,2020/9/22,41,/例4.14百雞百錢問題方法1 /用3 層循環(huán)控制 #include int main(void) int x,y,z; for(x=0;x=20;x+) for(y=0;y=33;y+) for(z=0;
38、z=100;z+) if(x+y+z=100 ,滿足百雞,滿足百錢,同時(shí)滿足,2,兩, z=100-x-y;,利用百雞條件用x,y的表達(dá)式表示z,從而去掉第3層循環(huán),if(,這時(shí)只需要判斷百錢的條件就可以了,2020/9/22,42,break語句的用法1:用于switch語句中,表示結(jié)束該分支的操作,從而結(jié)束switch語句,真正實(shí)現(xiàn)了多分支控制 break語句的用法2:用于3種循環(huán)語句的循環(huán)體中,配合一定的條件,執(zhí)行到break直接退出本層循環(huán),從而增加了從循環(huán)體中結(jié)束循環(huán)的方式(此前只能因循環(huán)控制條件為假而終止循環(huán)) 程序4.10 模擬投骰子問題的第4種實(shí)現(xiàn)方法使用break語句 模擬投
39、骰子循環(huán)條件是兩個(gè):投擲次數(shù)小于10并且投中次數(shù)小于2,前3種方法都是將這兩個(gè)條件同時(shí)列在控制循環(huán)的條件表達(dá)式中,用break就可以減少一個(gè)循環(huán)條件,其他流程控制語句(break),2020/9/22,43,程序4.10 模擬投骰子問題的第4種實(shí)現(xiàn)方法循環(huán)體中使用break語句,#include #include #include int main( ) int count=0,y=0,dice; srand(time(0); while(count10 ,兩個(gè)條件同時(shí)滿足,這是原方法2的代碼,用while語句控制循環(huán),if (y=2) break;,),減少一個(gè)條件,break用于循環(huán)體中,
40、一般要配合if使用才有意義,流程圖,增加了從循環(huán)體中退出循環(huán)的出口,2020/9/22,44,continue語句的用法:只能用于循環(huán)語句的語句塊中 continue語句的功能:提前結(jié)束本次循環(huán),忽略循環(huán)體中其后的語句,直接進(jìn)入下一次條件的判斷 與break語句不同:continue不能退出循環(huán) 程序4.10 模擬投骰子問題的第5種實(shí)現(xiàn)方法使用continue語句 模擬投骰子的循環(huán)體中,變量y自增1是有條件的,必須在dice=6時(shí),換句話說,當(dāng)dice!=6時(shí),y+不執(zhí)行,這可以用continue來改寫,其他流程控制語句(continue),2020/9/22,45,程序4.10 模擬投骰子問
41、題的第5種實(shí)現(xiàn)方法循環(huán)體中使用continue語句,#include #include #include int main( ) int count=0,y=0,dice; srand(time(0); while(count10 ,兩個(gè)條件同時(shí)滿足,這是原方法2的代碼,用while語句控制循環(huán),流程圖,!,continue;,增加了一種提前結(jié)束循環(huán)體回到循環(huán)條件重新判斷的方式,1設(shè)有程序段 int k=10; while(k=0) k=k-1; 這下面描述中正確的是_. a)while循環(huán)執(zhí)行10次 b)循環(huán)是無限循環(huán) c)循環(huán)體語句一次也不執(zhí)行 d)循環(huán)體語句執(zhí)行一次,C正確,因?yàn)閗被賦值
42、為0,while中的條件為假,隨堂練習(xí),2. 下面程序段的運(yùn)行結(jié)果是_. int n=0; while(n+=2); printf(%d,n); a)2 b)3 c)4 d)有語法錯,正確答案選C,因?yàn)閚+是先取n的當(dāng)前值作為表達(dá)式的結(jié)果,之后n再自增。因此當(dāng)n+表達(dá)式的值為3時(shí)退出循環(huán),此時(shí)n的值已自增為4,隨堂練習(xí),3. 以下程序段_. x=-1; do x=x*x; while(!x); a)是死循環(huán) b)循環(huán)執(zhí)行二次 c)循環(huán)執(zhí)行一次 d)有語法錯誤,正確答案選C,隨堂練習(xí),4.下面程序的運(yùn)行結(jié)果是_. # include void main() int a,s,n,count; a=
43、2;s=0;n=1;count=1; while(count=6) n=n*a; s=s+n; +count; printf(“s=%dn,s); ,正確答案126,隨堂練習(xí),5.下面程序段的運(yùn)行結(jié)果是_ i=1;s=3; do s+=i+; if(s%7=0) continue; else +i; while(s15); printf(%d,i);,正確答案 8,隨堂練習(xí),6.下面程序段的運(yùn)行結(jié)果是_ #include main() int k; for(k=1;k5;k+) switch(k) case 1: case 2: printf(“%dn”,k); case 3: printf(
44、“%dn”,k); break; default: printf(“OK!n”); ,正確答案11223OK!,隨堂練習(xí),7.調(diào)試下面程序,并給出的運(yùn)行結(jié)果_ #include main() int i,j,k; char space= ; for(i=1;i=4;i+) for(j=1;j=i;j+) printf(“%c”,space); for(k=1;k=6;k+) printf(“*”); printf(“n”); ,平面圖形、表格的處理和輸出,常見題型!,雙重for循環(huán),隨堂練習(xí),8. 求Sn=a+aa+aaa+aaaa之值,其中a是一個(gè)數(shù)字,例如2+22+222+2222,此時(shí)n
45、=4,a,n由鍵盤輸入。,算法分析: 等式Sn=a+aa+aaa+aaaa可以寫成 Sn=T1+T2+T3+.Tn, 其中T1=a, Tn=Tn-1*10+a 在程序中用sn表示累加之和,tn表示第n項(xiàng),編程,單重循環(huán) 求解累加和問題,前后項(xiàng)之間相關(guān)的累加求和,隨堂練習(xí),用for循環(huán)語句實(shí)現(xiàn),#include main() int n,j; long int a, sn=0,tn=0; scanf(“%ld,%d”, ,前后項(xiàng)相關(guān)的累加(累乘),常見題型!,關(guān)鍵:尋找累加項(xiàng)的構(gòu)成規(guī)律 單重循環(huán) for 循環(huán)次數(shù)已知 while, do while 循環(huán)次數(shù)未知,隨堂練習(xí),9. 利用右式求pi,
46、#include main() int i; float term,pi=1; for (i=2;i=100;i+=2) term=(float)i/(i-1)*(float)i/(i+1); pi *=term; pi *=2; printf(PI is %fn, pi); ,term = i * i / (i-1) * (i+1); i = 2,4,100,前后項(xiàng)之間無關(guān)的累乘求積,隨堂練習(xí),1*2*3 + 3*4*5 + + 99*100*101 term = i * (i+1) * (i+2); i = 1,3,99 1 - 1/2 + 1/3 - 1/4 + + 1/99 - 1/100 + 直到最后一項(xiàng)的絕對值小于10
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026上半年安徽事業(yè)單位聯(lián)考合肥市巢湖市招聘22人備考題庫有答案詳解
- 宮外孕患者隱私保護(hù)護(hù)理查房
- 新型冠狀試題及答案
- 湖南省體育系列職稱評價(jià)辦法
- 腸梗阻的影像學(xué)鑒別與手術(shù)指征把握
- 衛(wèi)生院救護(hù)車輛管理制度
- 木棧道衛(wèi)生管理制度
- 衛(wèi)生院分區(qū)就診管理制度
- 衛(wèi)生院會計(jì)績效工資制度
- 人員培衛(wèi)生管理制度
- 2026屆南通市高二數(shù)學(xué)第一學(xué)期期末統(tǒng)考試題含解析
- 寫字樓保潔培訓(xùn)課件
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會成熟人才招聘備考題庫有完整答案詳解
- 計(jì)量宣貫培訓(xùn)制度
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會成熟人才招聘備考題庫有答案詳解
- 2026.05.01施行的中華人民共和國漁業(yè)法(2025修訂)課件
- 原始股認(rèn)購協(xié)議書
- 嚴(yán)肅財(cái)經(jīng)紀(jì)律培訓(xùn)班課件
- 上海市復(fù)旦大學(xué)附中2026屆數(shù)學(xué)高一上期末質(zhì)量檢測試題含解析
- 企業(yè)員工食堂營養(yǎng)搭配方案
- 2025年國家公務(wù)員國家能源局面試題及答案
評論
0/150
提交評論