




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C C語言程序設(shè)計語言程序設(shè)計 1 第第5章章 1 第第5 5章章 循環(huán)結(jié)構(gòu)程序設(shè)計循環(huán)結(jié)構(gòu)程序設(shè)計 5.1 循環(huán)結(jié)構(gòu)程序的引入循環(huán)結(jié)構(gòu)程序的引入 5.2 當(dāng)型當(dāng)型循環(huán)循環(huán) 5.3 直到型直到型循環(huán)循環(huán) 5.4 計數(shù)型計數(shù)型循環(huán)循環(huán) 5.5 循環(huán)嵌套與輔助控制循環(huán)嵌套與輔助控制 5.6 循環(huán)結(jié)構(gòu)程序設(shè)計及實例循環(huán)結(jié)構(gòu)程序設(shè)計及實例 1 【引例】已知某班級引例】已知某班級35個學(xué)生的個學(xué)生的C語言程序設(shè)計課語言程序設(shè)計課 程的考試成績,求該課程的平均成績,并輸出不程的考試成績,求該課程的平均成績,并輸出不 及格學(xué)生的信息及格學(xué)生的信息(含學(xué)號和成績含學(xué)號和成績)。 5.1.1 問題與引例問題與引
2、例 1 部分程序代碼如下:部分程序代碼如下: #include void main( ) int num, score,sum,aver,n; sum=0; /總分變量置為總分變量置為0 n=0; /學(xué)生人數(shù)變量置為學(xué)生人數(shù)變量置為0 printf(請輸入學(xué)生的學(xué)號和成績請輸入學(xué)生的學(xué)號和成績:); scanf(%d,%d, /輸入學(xué)生的學(xué)號和成績輸入學(xué)生的學(xué)號和成績 /成績小于成績小于60時輸出時輸出 if(score60) printf(%d,%dn,num,score); sum=sum+score; /成績求和成績求和 n=n+1; /人數(shù)加人數(shù)加1 1 printf(請輸入學(xué)生的學(xué)號
3、和成績請輸入學(xué)生的學(xué)號和成績:); scanf(%d,%d, if(score60) printf(%d,%dn,num,score); sum=sum+score; n=n+1; /上述程序段還要重復(fù)上述程序段還要重復(fù)33次次 aver=sum/n; printf(平均成績?yōu)槠骄煽優(yōu)?%dn,aver); 1 循環(huán):循環(huán):程序中某一程序段反復(fù)多次執(zhí)行的過程。程序中某一程序段反復(fù)多次執(zhí)行的過程。 循環(huán)結(jié)構(gòu):循環(huán)結(jié)構(gòu):實現(xiàn)程序循環(huán)操作時所使用的結(jié)構(gòu)。實現(xiàn)程序循環(huán)操作時所使用的結(jié)構(gòu)。 結(jié)構(gòu)化程序設(shè)計三種的基本結(jié)構(gòu):結(jié)構(gòu)化程序設(shè)計三種的基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)順序結(jié)構(gòu)、選擇結(jié) 構(gòu)、循環(huán)結(jié)構(gòu)構(gòu)、循
4、環(huán)結(jié)構(gòu),共同作為各種復(fù)雜程序的基本構(gòu)造單共同作為各種復(fù)雜程序的基本構(gòu)造單 元。元。 循環(huán)結(jié)構(gòu)的特點(diǎn):循環(huán)結(jié)構(gòu)的特點(diǎn):當(dāng)條件成立時,反復(fù)執(zhí)行某個程序當(dāng)條件成立時,反復(fù)執(zhí)行某個程序 段,直到條件不成立為止。段,直到條件不成立為止。 給定的條件稱為給定的條件稱為循環(huán)條件循環(huán)條件,控制循環(huán)執(zhí)行的變量稱為,控制循環(huán)執(zhí)行的變量稱為 循環(huán)變量循環(huán)變量,反復(fù)執(zhí)行的程序段稱為,反復(fù)執(zhí)行的程序段稱為循環(huán)體循環(huán)體。 5.1.2 循環(huán)的基本概念循環(huán)的基本概念 1 C語言中的三種基本循環(huán):語言中的三種基本循環(huán): 當(dāng)型循環(huán)當(dāng)型循環(huán)(while循環(huán)循環(huán)) 直到型循環(huán)直到型循環(huán)(do-while循環(huán)循環(huán)) 計數(shù)型計數(shù)型(fo
5、r循環(huán)循環(huán)) 5.1.2 循環(huán)的基本概念循環(huán)的基本概念 1 5.2 當(dāng)型循環(huán)當(dāng)型循環(huán) 5.2.1 當(dāng)型循環(huán)的一般形式當(dāng)型循環(huán)的一般形式 while(表達(dá)式表達(dá)式) 語句;語句; 循環(huán)條件循環(huán)條件 循環(huán)體循環(huán)體 1 首先計算表達(dá)式的值,然后判斷表達(dá)式的首先計算表達(dá)式的值,然后判斷表達(dá)式的 值是否為真?值是否為真? 當(dāng)值為真當(dāng)值為真(非非0)時,執(zhí)行循環(huán)體中的語句,時,執(zhí)行循環(huán)體中的語句, 當(dāng)值為假當(dāng)值為假(0)時,執(zhí)行循環(huán)的后繼語句。時,執(zhí)行循環(huán)的后繼語句。 1 【例【例5.1】 用用while 循環(huán)求循環(huán)求sum= n 算法分析算法分析: (1)用用sum存放累加和,初值為存放累加和,初值為0
6、;i形成被加的自然數(shù),形成被加的自然數(shù), 初值為初值為1; (2)累加用累加用sum=sum+i,形成下一個自然數(shù)用,形成下一個自然數(shù)用i=i+1; (3)如果如果i=100,則重復(fù),則重復(fù)(2),否則轉(zhuǎn),否則轉(zhuǎn)(4); (4)輸出輸出sum中的值。中的值。 100 1n n 1 1 #include void main() int i=1,sum=0; /i表示被加的數(shù),表示被加的數(shù),sum表示和表示和 while (i=100) /i小于或等于小于或等于100時進(jìn)行循環(huán)時進(jìn)行循環(huán) sum=sum+i; /將將i加到加到sum中中 i+; /i加加1形成下一個數(shù)形成下一個數(shù) printf(s
7、um=%dn,sum); 初始化不能少初始化不能少 復(fù)合語句復(fù)合語句,用花括用花括 號括起來號括起來 1 #include void main() int i=1,sum=0; while (i=100) sum=sum+i; i+; printf( sum=%dn ,sum); 不能丟,否則不能丟,否則循環(huán)永不結(jié)束循環(huán)永不結(jié)束 如何求如何求6! 1 【例例5.2】 從鍵盤輸入一行字符,并統(tǒng)計其中的字符個從鍵盤輸入一行字符,并統(tǒng)計其中的字符個 數(shù)。數(shù)。 n算法分析:算法分析: 利用利用getchar()函數(shù)從鍵盤輸入字符。函數(shù)從鍵盤輸入字符。 當(dāng)當(dāng)getchar()中的字符不是回車(即為中的字
8、符不是回車(即為n)時就進(jìn)行循)時就進(jìn)行循 環(huán)環(huán),在循環(huán)體中通過在循環(huán)體中通過n+完成對輸入字符個數(shù)統(tǒng)計完成對輸入字符個數(shù)統(tǒng)計; 當(dāng)當(dāng)getchar()中的字符是回車時中的字符是回車時,就結(jié)束循環(huán)。就結(jié)束循環(huán)。 1 #include void main() int n=0; /n表示字符個數(shù),初值置為表示字符個數(shù),初值置為0 printf( 請輸入一行字符請輸入一行字符: ); while(getchar()!=n) /當(dāng)輸入的字符不為回車當(dāng)輸入的字符不為回車 n+; printf( 輸入的字符個數(shù)為輸入的字符個數(shù)為:%dn ,n); 1 1. while語句中的表達(dá)式一般是關(guān)系表達(dá)式或邏輯表
9、達(dá)式,只語句中的表達(dá)式一般是關(guān)系表達(dá)式或邏輯表達(dá)式,只 要表達(dá)式的值為真要表達(dá)式的值為真(非非0)就繼續(xù)循環(huán)。就繼續(xù)循環(huán)。例如:例如: #include void main() int a=0,n; printf( 請請輸入輸入n: ); scanf(%d, while (n-) printf( %d ,a+*2); printf( n ); 5.2.4 使用當(dāng)型循環(huán)注意點(diǎn)使用當(dāng)型循環(huán)注意點(diǎn) 程序?qū)?zhí)行程序?qū)?zhí)行n次循環(huán),每執(zhí)行次循環(huán),每執(zhí)行 一次,一次,n值減值減1,循環(huán)體輸出表,循環(huán)體輸出表 達(dá)式達(dá)式a+*2的值,該表達(dá)式等的值,該表達(dá)式等 效于效于(a*2;a+) 2. 如果循環(huán)體包括如
10、果循環(huán)體包括多條語句多條語句,則必須用,則必須用“、”括起來組成復(fù)括起來組成復(fù) 合語句。合語句。 1 5.3 直到型循環(huán)直到型循環(huán) 5.3.1 直到型循環(huán)直到型循環(huán)的一般形式的一般形式 do 語句語句; while (表達(dá)式表達(dá)式); 1 首先執(zhí)行循環(huán)體中的語句,然后再判斷首先執(zhí)行循環(huán)體中的語句,然后再判斷 表達(dá)式是否為真,如果為真,則繼續(xù)循環(huán);表達(dá)式是否為真,如果為真,則繼續(xù)循環(huán); 否則為假,則終止循環(huán)。否則為假,則終止循環(huán)。 1 【例例5.3】用用do while型循環(huán)求型循環(huán)求 i=1; sum=0; do sum=sum+i; i+; while(i=100); 100 1i i 1
11、#include void main() int i=1,sum=0; do sum=sum+i; i+; while(i=100); printf(sum=%dn,sum); 思考:思考:若將此句去若將此句去 掉,結(jié)果怎樣?掉,結(jié)果怎樣? 1 int i,sum=0; printf(i=?); scanf(%d, while(i=10) sum=sum+i; i+; printf(sum=%dn,sum); int i,sum=0; printf(i=?); scanf(%d, do sum=sum+i; i+; while(i=10); printf(sum=%dn,sum); 當(dāng)當(dāng)whi
12、le后面的表達(dá)式的第一次的值為后面的表達(dá)式的第一次的值為“真真”時,兩種時,兩種 循環(huán)得到的結(jié)果相同;否則不相同循環(huán)得到的結(jié)果相同;否則不相同。 結(jié)論:結(jié)論: 當(dāng)型循環(huán)當(dāng)型循環(huán)是是先判斷先判斷條件條件后執(zhí)行后執(zhí)行循環(huán)體,循環(huán)體可能一循環(huán)體,循環(huán)體可能一 次也不被執(zhí)行,而次也不被執(zhí)行,而直到型循環(huán)直到型循環(huán)是是先執(zhí)行先執(zhí)行循環(huán)體循環(huán)體后判斷后判斷 條件,循環(huán)體條件,循環(huán)體至少至少被執(zhí)行被執(zhí)行一次一次。 1 思考與引申思考與引申 (1) 求求1+3+5+49的和的和 (2) 求求10+20+30+90的和的和 (3) 求求1+1/2+1/3+1/80的和的和 (4) 1-1/3+1/5-1/7+最
13、后一項絕對值小于最后一項絕對值小于10-6 (5) 求求1*2*3*4*5的積的積 (6) 求求10*9*8*7*6的積的積 1 for(表達(dá)式表達(dá)式1;表達(dá)式;表達(dá)式2;表達(dá)式;表達(dá)式3) 語句語句; 1 (1) 先求解表達(dá)式先求解表達(dá)式1 (2) 求解表達(dá)式求解表達(dá)式2,若,若其其值為真,值為真, 執(zhí)行循環(huán)體,然后執(zhí)行下面第執(zhí)行循環(huán)體,然后執(zhí)行下面第(3) 步。若為假,則結(jié)束循環(huán),轉(zhuǎn)到步。若為假,則結(jié)束循環(huán),轉(zhuǎn)到 第第(5)步步 (3) 求解表達(dá)式求解表達(dá)式3 (4) 轉(zhuǎn)回上面步驟轉(zhuǎn)回上面步驟(2)繼續(xù)執(zhí)行繼續(xù)執(zhí)行 (5) 循環(huán)結(jié)束,執(zhí)行循環(huán)結(jié)束,執(zhí)行for語句下面語句下面 的一個語句的一
14、個語句 1 分析求分析求1100之和程序的執(zhí)行過程:之和程序的執(zhí)行過程: #include void main() int i,sum; sum=0; for(i=1;i=100;i+) sum=sum+i; printf( 1+2+3+100=%dn ,sum); 1 1. for循環(huán)中的循環(huán)中的“表達(dá)式表達(dá)式1”、“表達(dá)式表達(dá)式2”和和“表表 達(dá)式達(dá)式3”都是選擇項都是選擇項, 即可以缺省即可以缺省,但但“;”不能不能 缺省。缺省。 (1) 省略省略“表達(dá)式表達(dá)式1(循環(huán)變量賦初值)(循環(huán)變量賦初值)”, 表示表示 不對循環(huán)控制變量賦初值,但可以在循環(huán)開始不對循環(huán)控制變量賦初值,但可以在循
15、環(huán)開始 之前賦值。之前賦值。 1 #include void main() int i,sum; sum=0; i=1; for(;i=100;i+) /此語句中省略了表達(dá)式此語句中省略了表達(dá)式1 sum=sum+i; printf( 1+2+3+100=%dn ,sum); 1 (2) 省略省略“表達(dá)式表達(dá)式2(循環(huán)條件循環(huán)條件)”,則表示不做循環(huán)則表示不做循環(huán) 判斷,因此就成了判斷,因此就成了“死循環(huán)死循環(huán)”。 例如例如: for(i=1;i+) sum=sum+i; 相當(dāng)于:相當(dāng)于: i=1; while(1) sum=sum+i; i+; 1 (3) 省略省略“表達(dá)式表達(dá)式3(循環(huán)變量
16、增量循環(huán)變量增量)”, 則表示不對循環(huán)控制變量則表示不對循環(huán)控制變量 進(jìn)行操作進(jìn)行操作,這時可在語句體中加入修改循環(huán)控制變量的語句。這時可在語句體中加入修改循環(huán)控制變量的語句。 例如,前述例例如,前述例5.1省略了省略了“表達(dá)式表達(dá)式3”,用,用for循環(huán)實現(xiàn)如下:循環(huán)實現(xiàn)如下: #include void main() int i,sum; sum=0; for(i=1;i=100; ) /此語句中省略了表達(dá)式此語句中省略了表達(dá)式3 sum=sum+i; i+; printf( 1+2+3+100=%dn ,sum); 1 (4) 省略省略“表達(dá)式表達(dá)式1(循環(huán)變量賦初值)(循環(huán)變量賦初值)
17、”和和“表達(dá)表達(dá) 式式3(循環(huán)變量增量循環(huán)變量增量)”,則表示既不對循環(huán)控制變,則表示既不對循環(huán)控制變 量賦初值,也不對循環(huán)控制變量進(jìn)行操作。量賦初值,也不對循環(huán)控制變量進(jìn)行操作。 例如例如: for(;i=100;) sum=sum+i; i+; 相當(dāng)于:相當(dāng)于: while(i=100) sum=sum+i; i+; 1 (5) 表達(dá)式表達(dá)式1、表達(dá)式、表達(dá)式2、表達(dá)式、表達(dá)式3三個表達(dá)式都可以三個表達(dá)式都可以 省略,則表示既不對循環(huán)控制變量賦初值,也不省略,則表示既不對循環(huán)控制變量賦初值,也不 對循環(huán)條件進(jìn)行判斷,也不對循環(huán)控制變量進(jìn)行對循環(huán)條件進(jìn)行判斷,也不對循環(huán)控制變量進(jìn)行 操作。操
18、作。 例如:例如: for( ; ; ) 語句;語句; 相當(dāng)于:相當(dāng)于: while(1) 語句;語句; /永遠(yuǎn)滿足條件永遠(yuǎn)滿足條件 1 2. 表達(dá)式表達(dá)式1可以是設(shè)置循環(huán)變量的初值的賦值表達(dá)式,可以是設(shè)置循環(huán)變量的初值的賦值表達(dá)式, 也可以是與循環(huán)變量初值無關(guān)的其它表達(dá)式。也可以是與循環(huán)變量初值無關(guān)的其它表達(dá)式。 例如:例如: for(sum=0;i=100;i+) sum=sum+i; /表達(dá)式表達(dá)式1與循環(huán)變量初值無關(guān)與循環(huán)變量初值無關(guān) 1 3. 表達(dá)式表達(dá)式1和表達(dá)式和表達(dá)式3可以是一個簡單表達(dá)式也可以可以是一個簡單表達(dá)式也可以 是逗號表達(dá)式。是逗號表達(dá)式。 for(sum=0,i=1
19、;i=100;i+) sum=sum+i; /表達(dá)式表達(dá)式1是逗號表達(dá)式是逗號表達(dá)式 或:或: for(i=0,j=100;i=100;i+,j-) k=i+j; /表達(dá)式表達(dá)式1、表達(dá)式、表達(dá)式3是逗號表達(dá)式是逗號表達(dá)式 1 4. 表達(dá)式表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可 以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非零,以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非零, 就執(zhí)行循環(huán)體。就執(zhí)行循環(huán)體。 例如例如: for(i=0;(c=getchar()!=n;i+=c); /表達(dá)式表達(dá)式2是一個關(guān)系表達(dá)式是一個關(guān)系表達(dá)式 for(a=1;b+c;c+); /表
20、達(dá)式表達(dá)式2是一個算術(shù)表達(dá)式是一個算術(shù)表達(dá)式 1 執(zhí)行步驟:執(zhí)行步驟: (1 1)計算初始表達(dá)式)計算初始表達(dá)式E1E1; (2 2)計算判別表達(dá)式)計算判別表達(dá)式E2E2; (3 3)若)若E2E2為真,則執(zhí)行一次循環(huán)為真,則執(zhí)行一次循環(huán) 體;若體;若E2E2值為假,則終止循環(huán)。值為假,則終止循環(huán)。 (4 4)計算后置表達(dá)式)計算后置表達(dá)式E3E3;然后轉(zhuǎn);然后轉(zhuǎn) 步驟(步驟(2 2)繼續(xù)執(zhí)行。)繼續(xù)執(zhí)行。 語法格式:語法格式: forfor ( (E1E1; ; E2E2; ; E3E3) ) 語句語句S S; ; 初始表達(dá)式初始表達(dá)式E1E1 語句語句S S 后置表達(dá)式后置表達(dá)式E3E3
21、 判別表達(dá)式判別表達(dá)式E2E2 假假 真真 循環(huán)體,通常是復(fù)合語句循環(huán)體,通常是復(fù)合語句 關(guān)鍵字關(guān)鍵字 用分號隔開的三個任意表達(dá)式用分號隔開的三個任意表達(dá)式 1 n=1; sum=sum+1.0/n; sum=sum+1.0/n; n=100n=100 開始開始 結(jié)束結(jié)束 輸出輸出sumsum 真真 假假 sum=0; sum=0; n=n+1;n=n+1; 初始表達(dá)式初始表達(dá)式E1E1 判別表達(dá)式判別表達(dá)式E2E2 循環(huán)體循環(huán)體 后置表達(dá)式后置表達(dá)式E3E3 例:編程求例:編程求1到到100之間所有整數(shù)倒數(shù)之和之間所有整數(shù)倒數(shù)之和 1 for語句與語句與while語句語句“互譯互譯” for
22、 (E1;E2;E3) 語句S; 翻譯成while E1E1; while (E2) while (E2) 語句語句S S; E3E3; E1E1,E3 E3 皆為空,皆為空, 但分號不能少但分號不能少 while (E) while (E) 語句語句S S; 翻譯成翻譯成forfor for (;E;) for (;E;) 語句語句S S; 1 5.5 循環(huán)嵌套與輔助控制循環(huán)嵌套與輔助控制 一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),稱為一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),稱為 循環(huán)的嵌套循環(huán)的嵌套 外面的嵌套稱外嵌套,里面的嵌套稱為內(nèi)嵌套,內(nèi)外面的嵌套稱外嵌套,里面的嵌套稱為內(nèi)嵌套,內(nèi) 嵌
23、套必須被完整的包含在外嵌套中。嵌套必須被完整的包含在外嵌套中。 內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán) 3種循環(huán)種循環(huán)(while循環(huán)、循環(huán)、dowhile循環(huán)和循環(huán)和for循環(huán)循環(huán))可以可以 互相嵌套互相嵌套 1 【例例5.4】計算計算1!+2!+3!+n!。!。 #include void main() int i,j,n; float t,s; /提高階乘以及求和的范圍提高階乘以及求和的范圍 printf( 請輸入請輸入n: ); scanf(%d, s=0; for(i=1;i=n;i+) /外循環(huán),外循環(huán),i形成形成1、2、3、n t=1
24、; /存放階乘的變量存放階乘的變量t置初值為置初值為1 for(j=1;j=i;j+) /內(nèi)循環(huán),內(nèi)循環(huán),j形成形成1、2、3、i t=t*j; /求乘積求乘積 s=s+t; /將將i的階乘加到的階乘加到s中中 printf(1!+2!+3!+%d!=%.0fn,n,s); 1 將賦值語句:將賦值語句:s=0;放到語句:;放到語句:for(i=1;in;i+)之后之后 #include void main() int i,j,n; float t,s; printf(輸入輸入n:); scanf(%d, for(i=1;i=n;i+) s=0; /注意此語句的位置注意此語句的位置 t=1; f
25、or(j=1;j=i;j+) t=t*j; s=s+t; printf(1!+2!+3!+%d!=%.0f,n,s); 1 將賦值語句:將賦值語句:t=1;放到語句:;放到語句:for(j=1;ji;j+)之后之后 #include void main() int i,j,n; float t,s; printf(請輸入請輸入n:); scanf(%d, s=0; for(i=1;i=n;i+) for(j=1;j=i;j+) t=1; /注意此語句的位置注意此語句的位置 t=t*j; s=s+t; printf(1!+2!+3!+%d!=%.0f,n,s); 1 使用循環(huán)嵌套結(jié)構(gòu)時,應(yīng)注意以
26、下幾方面:使用循環(huán)嵌套結(jié)構(gòu)時,應(yīng)注意以下幾方面: (1) 在多層循環(huán)的嵌套結(jié)構(gòu)中,在多層循環(huán)的嵌套結(jié)構(gòu)中,層次層次必須清楚,每層必須清楚,每層 循環(huán)的功能應(yīng)該明確。循環(huán)的功能應(yīng)該明確。 (2) 嵌套結(jié)構(gòu)中,嵌套結(jié)構(gòu)中,內(nèi)外層內(nèi)外層循環(huán)的控制變量循環(huán)的控制變量不能是同一不能是同一 個變量個變量。 (3) 有關(guān)變量有關(guān)變量賦初值的位置賦初值的位置必須在對應(yīng)循環(huán)的前面或必須在對應(yīng)循環(huán)的前面或 for語句的表達(dá)式語句的表達(dá)式1中。前面的例中。前面的例5.4已經(jīng)說明了這已經(jīng)說明了這 種情況。種情況。 5.5.1 循環(huán)的嵌套循環(huán)的嵌套 1 5.5.2 循環(huán)的輔助控制循環(huán)的輔助控制 1. Break語句語句
27、 break語句語句可以用來從循環(huán)體內(nèi)跳出循環(huán)體,可以用來從循環(huán)體內(nèi)跳出循環(huán)體, 即即提前結(jié)束循環(huán)提前結(jié)束循環(huán),接著執(zhí)行循環(huán)下面的語句,接著執(zhí)行循環(huán)下面的語句。 例如,例如,break語句在語句在while循環(huán)中的使用形式如下:循環(huán)中的使用形式如下: while(表達(dá)式表達(dá)式1) if(表達(dá)式表達(dá)式2) break; 1 break語句在使用時應(yīng)注意:語句在使用時應(yīng)注意: (1) break語句語句只能用在三種只能用在三種循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)和由和由開關(guān)語句開關(guān)語句 構(gòu)成的多分支結(jié)構(gòu)構(gòu)成的多分支結(jié)構(gòu)中,對條件語句不起作用。中,對條件語句不起作用。 (2) 在多層循環(huán)中,一個在多層循環(huán)中,一個bre
28、ak語句語句只向外跳一層只向外跳一層,即即 退出本層循環(huán)。退出本層循環(huán)。 【例【例5.5】從鍵盤上輸入多行字符并按行顯示內(nèi)容,從鍵盤上輸入多行字符并按行顯示內(nèi)容, 在每行前顯示字符串是在每行前顯示字符串是“第幾行字符,遇到第幾行字符,遇到Esc鍵結(jié)鍵結(jié) 束。束。 1 #include #include void main() int i=0; char c; /i表示第幾行,初值為表示第幾行,初值為0;c存放字符存放字符 while(1) /設(shè)置循環(huán)設(shè)置循環(huán) c=0; /變量賦初值變量賦初值 i+; printf(第第%d行字符是行字符是:,i); while(c!=13 /從鍵盤輸入一個字符
29、,且不回顯從鍵盤輸入一個字符,且不回顯 if (c!=27) printf(%c,c); printf(n); if(c=27) break; /判斷若按判斷若按Esc鍵則退出循環(huán)鍵則退出循環(huán) printf(結(jié)束結(jié)束n); 1 2. 繼續(xù)語句繼續(xù)語句continue 繼續(xù)語句繼續(xù)語句continue的作用是的作用是跳過本次循環(huán)中剩余的跳過本次循環(huán)中剩余的 語句而去執(zhí)行下一次循環(huán)語句而去執(zhí)行下一次循環(huán)。 continue語句只能用在語句只能用在for循環(huán)體中,循環(huán)體中,常與常與if條件語條件語 句一起使用句一起使用,用來加速循環(huán)。例如:,用來加速循環(huán)。例如:continue語句語句 在在for循
30、環(huán)中的使用形式:循環(huán)中的使用形式: for(表達(dá)式表達(dá)式1;表達(dá)式表達(dá)式2;表達(dá)式表達(dá)式3 ) if(表達(dá)式表達(dá)式) continue; 1 n算法分析:如何判斷一個數(shù)是否為素數(shù)算法分析:如何判斷一個數(shù)是否為素數(shù)? 素數(shù)素數(shù)(prime,又稱質(zhì)數(shù),又稱質(zhì)數(shù))是指只能被是指只能被1和本身整和本身整 除的數(shù)除的數(shù))。 從定義出發(fā),將從定義出發(fā),將1和本身之外的數(shù),依次與原和本身之外的數(shù),依次與原 數(shù)相除,看能否被整除,若能被整除,說明不是數(shù)相除,看能否被整除,若能被整除,說明不是 素數(shù),提前結(jié)束比較。若不能被整除,繼續(xù)比較素數(shù),提前結(jié)束比較。若不能被整除,繼續(xù)比較 下一個數(shù),直到不滿足循環(huán)條件。下
31、一個數(shù),直到不滿足循環(huán)條件。 【例【例5.6】求求100以內(nèi)的所有素數(shù)及其個數(shù)。以內(nèi)的所有素數(shù)及其個數(shù)。 1 scanf( %d , for( ; ; ) /多種方法多種方法 if( ) break; if(in-1) /循環(huán)正常結(jié)束循環(huán)正常結(jié)束 printf( %d是素數(shù)是素數(shù) ,n); n 解題思路:解題思路: 如果如果n能被能被2(n-1)之中任何一個整數(shù)整除,之中任何一個整數(shù)整除, 則表示則表示n肯定不是素數(shù),不必再繼續(xù)被后面的整肯定不是素數(shù),不必再繼續(xù)被后面的整 數(shù)除,因此,可以提前結(jié)束循環(huán)數(shù)除,因此,可以提前結(jié)束循環(huán)。注意:注意:此時此時i的的 值必然小于值必然小于n。 1 #in
32、clude void main() int i,j,n; scanf(%d, for(i=2;in-1 ) /循環(huán)正常結(jié)束循環(huán)正常結(jié)束 printf( %d是素數(shù)是素數(shù)n ,n); n/2 n/2 #include k k=sqrt(n); int k; k 1 將將100以內(nèi)的素數(shù)依次判斷,若是素數(shù)則輸出。以內(nèi)的素數(shù)依次判斷,若是素數(shù)則輸出。 #include #include void main() int m,i,k,f,n; printf( 2 ); /2是特殊的素數(shù),單獨(dú)輸出是特殊的素數(shù),單獨(dú)輸出 n=1; /置素數(shù)的個數(shù)初值為置素數(shù)的個數(shù)初值為1 for(m=3;m=100;m=m
33、+2) f=1; /置素數(shù)的標(biāo)志為真置素數(shù)的標(biāo)志為真 k=(int)sqrt(m); 1 for(i=2;i=k;i+) if(m%i=0) f=0; /置素數(shù)的標(biāo)志為假置素數(shù)的標(biāo)志為假 break; /退出內(nèi)循環(huán)退出內(nèi)循環(huán) if(f=0) continue; printf( %d ,m); n=n+1; if(n%5=0) printf( n ); /每輸出每輸出5個數(shù)就換行個數(shù)就換行 printf( 100以內(nèi)的素數(shù)個數(shù)共有以內(nèi)的素數(shù)個數(shù)共有%d個個n ,n); 1 5.6 循環(huán)結(jié)構(gòu)程序設(shè)計及實例循環(huán)結(jié)構(gòu)程序設(shè)計及實例 5.6.1 1. 問題分析問題分析 此類問題的解決總是用循環(huán)結(jié)構(gòu)完成程
34、序段的多次重此類問題的解決總是用循環(huán)結(jié)構(gòu)完成程序段的多次重 復(fù)執(zhí)行。復(fù)執(zhí)行。 2. 算法分析算法分析 此類問題的算法一般較復(fù)雜,主要是恰當(dāng)選擇循環(huán)語此類問題的算法一般較復(fù)雜,主要是恰當(dāng)選擇循環(huán)語 句對循環(huán)體的重復(fù)執(zhí)行,特別累加和累乘的算法實句對循環(huán)體的重復(fù)執(zhí)行,特別累加和累乘的算法實 現(xiàn)。常見的典型算法:求各種數(shù)、求解表達(dá)式的近現(xiàn)。常見的典型算法:求各種數(shù)、求解表達(dá)式的近 似值、方程求根、求定積分的值、數(shù)據(jù)加密等。似值、方程求根、求定積分的值、數(shù)據(jù)加密等。 1 5.6.1 循環(huán)結(jié)構(gòu)程序設(shè)計循環(huán)結(jié)構(gòu)程序設(shè)計 3. 代碼設(shè)計代碼設(shè)計 (1) 輸入原始數(shù)據(jù);輸入原始數(shù)據(jù); (2) 恰當(dāng)選用當(dāng)型循環(huán)、
35、直到型循環(huán)或計數(shù)型循環(huán)恰當(dāng)選用當(dāng)型循環(huán)、直到型循環(huán)或計數(shù)型循環(huán) 實現(xiàn)循環(huán)體的重復(fù)執(zhí)行。特別注意:有關(guān)循環(huán)變實現(xiàn)循環(huán)體的重復(fù)執(zhí)行。特別注意:有關(guān)循環(huán)變 量初值語句及其位置的確定、循環(huán)體中累加或累量初值語句及其位置的確定、循環(huán)體中累加或累 乘的形式的表示。乘的形式的表示。 (3) 輸出計算或處理結(jié)果。輸出計算或處理結(jié)果。 4. 運(yùn)行調(diào)試運(yùn)行調(diào)試 用初始數(shù)據(jù)的不同情況分別測試程序的運(yùn)行結(jié)果。用初始數(shù)據(jù)的不同情況分別測試程序的運(yùn)行結(jié)果。 1 5.6.2 循環(huán)結(jié)構(gòu)程序設(shè)計實例循環(huán)結(jié)構(gòu)程序設(shè)計實例 【例【例5.7】求兩個正整數(shù)求兩個正整數(shù)m和和n的最大公約數(shù)和最小公的最大公約數(shù)和最小公 倍數(shù)。倍數(shù)。 n
36、算法分析:算法分析: 最小公倍數(shù)為兩個正整數(shù)最小公倍數(shù)為兩個正整數(shù)m和和n的乘積除以最大公約的乘積除以最大公約 數(shù),所以只要求兩個正整數(shù)數(shù),所以只要求兩個正整數(shù)m和和n的最大公約數(shù)即的最大公約數(shù)即 可。求兩個正整數(shù)可。求兩個正整數(shù)m和和n的最大公約數(shù)采用的是的最大公約數(shù)采用的是歐歐 幾里德算法。幾里德算法。 1 #include void main( ) int m,n,t,p,r; printf(輸入兩個正整數(shù)輸入兩個正整數(shù):); scanf(%d,%d, /輸入兩個正整數(shù)輸入兩個正整數(shù) if (mn) t=m; m=n; n=t;/將將m、n中的較大數(shù)放中的較大數(shù)放 入入m中中,較數(shù)放入較
37、數(shù)放入n中中 p=m*n; /將將m、n的乘積放入的乘積放入p中中 do /歐幾理德算法求最大公約數(shù)歐幾理德算法求最大公約數(shù) r=m%n; m=n; n=r; while(r!=0); printf(最大公約數(shù)是:最大公約數(shù)是:%dn,m); printf(最小公倍數(shù)是:最小公倍數(shù)是:%dn,p/m); p=m*n; r=m%n; while(r!=0) m=n; n=r; r=m%n; printf(最大公約數(shù)是:最大公約數(shù)是:%dn,n); printf(最小公倍數(shù)是:最小公倍數(shù)是:%dn,p/n); 1 【例【例5.8】用】用 公式求公式求 的近的近 似值,直到發(fā)現(xiàn)某一項的似值,直到發(fā)現(xiàn)
38、某一項的絕對值小于絕對值小于10-6 為止為止(該項該項 不累計加不累計加)。 7 1 5 1 3 1 1 4 1 解題思路:解題思路: 求求 近似近似值的值的方法方法很多,本題是很多,本題是一種一種。 其他方法:其他方法: 2222 2 1 3 1 2 1 1 1 6n 7 22 )2( ) 1( 75 66 53 44 31 22 2 2 nn n 1 每項的分子都是每項的分子都是1 后一項的分母是前一項的分母加后一項的分母是前一項的分母加2 第第1項的符號為正,從第項的符號為正,從第2項起,每一項的符號與項起,每一項的符號與 前一項的符號相反前一項的符號相反 7 1 5 1 3 1 1
39、4 n 1 2 1 n 1 1 #include #include void main() int s=1; double pi=0,n=1,t=1; while(fabs(t)=1e-6) pi=pi+t; n=n+2; s=-s; t=s/n; pi=pi*4; printf( pi=%10.8fn ,pi); 只保證前只保證前5位小數(shù)是準(zhǔn)確的位小數(shù)是準(zhǔn)確的 1 #include #include void main() int sign=1; double pi=0,n=1,term=1; while(fabs(term)=1e-6) pi=pi+term; n=n+2; sign=-s
40、ign; term=sign/n; pi=pi*4; printf(pi=%10.8fn,pi); /改為改為1e-8 1 【例例5.9】用牛頓迭代法求用牛頓迭代法求 方程在方程在0.5附附 近的根,要求精確到近的根,要求精確到10-6 。 n 算法分析:算法分析: 牛頓迭代法是逐次使用迭代公式:牛頓迭代法是逐次使用迭代公式: 進(jìn)行迭代:由進(jìn)行迭代:由x0求出求出x1,由,由x1求出求出x2 ,由,由x2求求 出出x3,直到連續(xù)兩次差的絕對值小于給,直到連續(xù)兩次差的絕對值小于給 定的精度即可。定的精度即可。 01 x xe )( )( 0 0 0 xf xf xx 1 #include #in
41、clude void main() float x1, x0,f,f1; scanf(%f, do x0=x1 ; f=(x0*exp(x0)-1 ; f1=(1+x0)*exp(x0) ; x1=x0-f/f1; while(fabs(x1-x0)=0.000001); printf(root=%fn, x1 ); root=0.567143 1 【例例5.10】求求1-1000之間的完數(shù)。一個數(shù)恰好等于之間的完數(shù)。一個數(shù)恰好等于 它的因子和,則稱它為完數(shù):它的因子和,則稱它為完數(shù): 如,如,6=1+2+3。輸出。輸出 格式為格式為: 6 的因子是的因子是: 1, 2, 3。 輸出輸出m及其因子及其因子 m=s 真真 假假 求求m的因子和的因子和s(條件累加條件累加) 輸入整數(shù)輸入整數(shù)m n算法分析:一個整數(shù)是否是完數(shù)?算法分析:一個整數(shù)是否是完數(shù)? 1 #include void main() int m,s,i; for(m=1;m=a printf( %c ,c); 1 本章小結(jié)本章小結(jié) 1. 循環(huán)結(jié)構(gòu)的基本概念:循環(huán)、循環(huán)條件、循環(huán)循環(huán)結(jié)構(gòu)的基本概念:循環(huán)、循
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 雙方個人修車合同范例
- 商業(yè)策展合同范本
- 商業(yè)勞務(wù)派遣合同范本
- 園林小品租賃合同范本
- 商業(yè)咨詢代理合同范本
- 商場采購定金合同范本模板
- 商業(yè)物業(yè)工程維保合同范本
- 土地賣買合同范例
- 商務(wù)局合同范本
- 回收貸款合同范本
- 2025年廣州市黃埔區(qū)東區(qū)街招考社區(qū)居委會專職工作人員高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 2025年黑龍江省高職單招《職測》高頻必練考試題庫400題(含答案)
- GB 45184-2024眼視光產(chǎn)品元件安全技術(shù)規(guī)范
- 2025年湖南科技職業(yè)學(xué)院高職單招數(shù)學(xué)歷年(2016-2024)頻考點(diǎn)試題含答案解析
- 2025年新人教版八年級下冊物理全冊教案
- 《建筑電氣設(shè)計》課件
- 品管圈PDCA案例-介入中心提高手術(shù)患者交接記錄書寫合格率醫(yī)院品質(zhì)管理成果匯報
- 第十七屆山東省職業(yè)院校技能大賽中職組“西式烹飪”賽項規(guī)程
- 華東師范大學(xué)《外國人文經(jīng)典(下)》2022-2023學(xué)年第一學(xué)期期末試卷
- 儲能電池模組PACK和系統(tǒng)集成項目可行性研究報告
- 2024年安徽省公務(wù)員錄用考試《行測》真題及解析
評論
0/150
提交評論