c語言教案ch循環(huán)結(jié)構(gòu)_第1頁
c語言教案ch循環(huán)結(jié)構(gòu)_第2頁
c語言教案ch循環(huán)結(jié)構(gòu)_第3頁
c語言教案ch循環(huán)結(jié)構(gòu)_第4頁
c語言教案ch循環(huán)結(jié)構(gòu)_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、制作人:制作人: 黃黃 熒熒制作人單位:河師大數(shù)學與信息科學學院制作人單位:河師大數(shù)學與信息科學學院1.1.此刻打盹,你將做夢;而此刻學習,你將圓夢。此刻打盹,你將做夢;而此刻學習,你將圓夢。2.2.我荒廢的今日,正是昨日殞身之人祈求的明日。我荒廢的今日,正是昨日殞身之人祈求的明日。3.3.覺得為時已晚的時候,恰恰是最早的時候。覺得為時已晚的時候,恰恰是最早的時候。4.4.勿將今日之事拖到明日。勿將今日之事拖到明日。5.5.學習時的苦痛是暫時的,未學到的痛苦是終生的。學習時的苦痛是暫時的,未學到的痛苦是終生的。6.6.學習這件事,不是缺乏時間,而是缺乏努力。學習這件事,不是缺乏時間,而是缺乏努

2、力。7.7.幸?;蛟S不排名次,但成功必排名次。幸福或許不排名次,但成功必排名次。8.8.學習并不是人生的全部。但,既然連人生的一部分學習并不是人生的全部。但,既然連人生的一部分學習也無法征服,還能做什么呢?學習也無法征服,還能做什么呢?9.9.請享受無法回避的痛苦。請享受無法回避的痛苦。10.10.只有比別人更早、更勤奮地努力,才能嘗到成功的滋味。只有比別人更早、更勤奮地努力,才能嘗到成功的滋味。11.11.誰也不能隨隨便便成功,它來自徹底的自我管理和毅力。誰也不能隨隨便便成功,它來自徹底的自我管理和毅力。12.12.時間在流逝。時間在流逝。13.13.現(xiàn)在淌的哈喇子,將成為明天的眼淚?,F(xiàn)在淌

3、的哈喇子,將成為明天的眼淚。14.14.狗一樣地學,紳士一樣地玩。狗一樣地學,紳士一樣地玩。15.15.今天不走,明天要跑。今天不走,明天要跑。16.16.投資未來的人是忠于現(xiàn)實的人。投資未來的人是忠于現(xiàn)實的人。17.17.教育程度代表收入。教育程度代表收入。18.18.一天過完,不會再來。一天過完,不會再來。19.19.即使現(xiàn)在,對手也不停地翻動書頁。即使現(xiàn)在,對手也不停地翻動書頁。20.20.沒有艱辛,便無所獲。沒有艱辛,便無所獲?;仡櫍夯仡櫍? 1 順序結(jié)構(gòu)程序能解決的問題:順序結(jié)構(gòu)程序能解決的問題: 直接能用直接能用計算的問題計算的問題. .如,如, ex4.8ex4.8#includ

4、e #include #define PI 3.14159#define PI 3.14159void main()void main() float r,h,l,s,s1,v,v1; float r,h,l,s,s1,v,v1; printfprintf(請輸入半徑請輸入半徑r r和高和高h:nh:n);); scanf(%f%f,&r,&hscanf(%f%f,&r,&h);); l=2.0 l=2.0* *PIPI* *r;r; s=PI s=PI* *r r* *r;r; s1=4.0 s1=4.0* *PIPI* *r r* *r;r; v=4.0 v=4.0* *PIPI* *r

5、r* *r r* *r/3.0; r/3.0; v1=PI v1=PI* *r r* *r r* *h;h; printfprintf(圓周長圓周長 L=%.2fn,l);L=%.2fn,l); printfprintf(圓面積圓面積: S=%.2fn,s);: S=%.2fn,s); printfprintf(圓球表面積圓球表面積 S1=%.2fn,s1);S1=%.2fn,s1); printfprintf(圓球體積圓球體積: V=%.2fn,v);: V=%.2fn,v); printfprintf(圓柱體積圓柱體積: V1=%.2fn,v1);: V1=%.2fn,v1); 例例 雞兔

6、同籠雞兔同籠. .已知雞兔總頭數(shù)為已知雞兔總頭數(shù)為h=8,h=8,總腳數(shù)為總腳數(shù)為f=22,f=22,求雞兔各多少只求雞兔各多少只? ?#include #include void main() void main() intint x,y,h,fx,y,h,f; ; h=8; f=22;h=8; f=22; x=2x=2* *h-f/2;h-f/2; y=f/2-h; y=f/2-h; printfprintf(頭頭=%d,=%d,腳腳=%=%dn,h,fdn,h,f); ); printfprintf(雞雞=%d,=%d,兔兔=%=%dn,x,ydn,x,y);); #include vo

7、id main() int a, b, sum; a=123; b=456; sum=; printf(sum=%dn, sum); 在一個實際問題中在一個實際問題中. .解決這類問題就需要用解決這類問題就需要用. .如,如,Ex5.5 Ex5.5 計算分段函數(shù)計算分段函數(shù): : #include #include void main()void main() float float x,yx,y; ; printfprintf(請輸入請輸入x: );x: ); scanf(%fscanf(%f,x);x); printf(f(%.2f)=%.2fn,x,y); printf(f(%.2f)=

8、%.2fn,x,y); Ex6.5 Ex6.5 將百分制轉(zhuǎn)化為等級分將百分制轉(zhuǎn)化為等級分(A B C D E)(A B C D E)。 #include #include void main()void main() intint score;charscore;char grade; grade; printfprintf(請輸入你的百分制分數(shù)(請輸入你的百分制分數(shù)(0-1000-100) :n);:n); scanf(%d,&scorescanf(%d,&score); ); switch (n) switch (n) case 10:case 10: case 9: grade=A; b

9、reak; case 9: grade=A; break; case 8: grade=B; break; case 8: grade=B; break; case 7: grade=C; break; case 7: grade=C; break; case 6: grade=D; break; case 6: grade=D; break; default: grade=E; default: grade=E; printf(gradeprintf(grade=%=%cn,gradecn,grade);); 1011310121)(xxxxxxxf6.1 概述概述1 1 什么是循環(huán)結(jié)構(gòu)什么

10、是循環(huán)結(jié)構(gòu)? ?,2 2 循環(huán)結(jié)構(gòu)的程序設計能解決什么樣的實際問題循環(huán)結(jié)構(gòu)的程序設計能解決什么樣的實際問題? ? 用來解決包含用來解決包含的實際問題的實際問題. . 如如, , 求和求和:1+2+3+4+:1+2+3+4+100+100 輸入全班同學的成績輸入全班同學的成績 等等等等3 3 循環(huán)結(jié)構(gòu)的問題要素循環(huán)結(jié)構(gòu)的問題要素: : 1 1)操作操作 2 2)循環(huán))循環(huán)( (循環(huán)在循環(huán)控制條件循環(huán)在循環(huán)控制條件不成立不成立的時候的時候結(jié)束結(jié)束) )4 4 實現(xiàn)循環(huán)結(jié)構(gòu)的四種方法:實現(xiàn)循環(huán)結(jié)構(gòu)的四種方法:1 1)gotogoto-if-if語句語句 (不提倡)(不提倡)2 2)whilewhil

11、e語句語句 (主要實現(xiàn)當型循環(huán))(主要實現(xiàn)當型循環(huán))3 3)dodowhilewhile語句語句 ( (主要實現(xiàn)直到型循環(huán)主要實現(xiàn)直到型循環(huán)) )4 4)forfor語句語句 (多功能)(多功能)語句語句非006.2 goto-if 語句實現(xiàn)的循環(huán)。語句實現(xiàn)的循環(huán)。1 1 無條件轉(zhuǎn)移語句:無條件轉(zhuǎn)移語句: 一般格式:一般格式:goto goto 標號;標號;語句語句必須是必須是, ,不能用整數(shù)!不能用整數(shù)!格式格式1 1標號標號: : if(if() ) goto goto 標號標號;2 2 實現(xiàn)循環(huán)的格式:實現(xiàn)循環(huán)的格式:格式格式2 2標號:標號: if(if()goto )goto 標號標

12、號; ;例例6.1 6.1 求求 = 1+2+3+4+= 1+2+3+4+100+1001001ii#include #include void main()void main() intint sum=0,i=1;sum=0,i=1; loop:loop: / /* * 標號標號* */ / if(if() ) sum=sum=sum+isum+i; ; i+; i+; gotogoto loop; loop; printf(sumprintf(sum=%=%dn,sumdn,sum);); 6.3 while語句(主要用于實現(xiàn)當型循環(huán)語句(主要用于實現(xiàn)當型循環(huán)) A塊塊一般格式:一般格式:

13、 whilewhile() 語句語句語句非00執(zhí)行過程執(zhí)行過程一般格式:一般格式: whilewhile() 語句語句例例6.2 6.2 求求 (用(用 whilewhile語句)語句)#include #include void main()void main() intint sum=0,i=1; sum=0,i=1; while ( while () ) sum=sum=sum+isum+i; ; printf(sumprintf(sum=%=%dn,sumdn,sum);); 1001ii語句非00執(zhí)行過程執(zhí)行過程6.4 do-while 語句語句 (主要用實現(xiàn)直到型循環(huán)主要用實現(xiàn)直到

14、型循環(huán))一般格式:一般格式: dodo 語句語句 whilewhile() 語句非00執(zhí)行過程執(zhí)行過程 A塊例例6.3 6.3 求求 (用(用 do-whiledo-while語句)語句)1001ii一般格式:一般格式: dodo 語句語句 whilewhile(); ; #include #include void main()void main() intint sum=0,i=1; sum=0,i=1; do do sum+=i; sum+=i; i+; i+; while(while(i i=100=100);); printf(sumprintf(sum=%=%dn,sumdn,su

15、m);); 語句非00執(zhí)行過程執(zhí)行過程分析兩程序作用是否相同分析兩程序作用是否相同? ?為什么為什么? ?程序程序1 1:#include #include void main()void main() intint sum=0, sum=0,i=11i=11; ; while(while(i i=10=10) ) sum= sum=sum+isum+i; ; i+; i+; printf(sumprintf(sum=%=%dn,sumdn,sum);); 程序程序2 2:#include #include void main()void main() intint sum=0, sum=0,

16、i=11i=11; ; do do sum= sum=sum+isum+i; ; i+; i+; while(while(i i=10=10);); printf(sumprintf(sum=%=%dn,sumdn,sum);); 輸出結(jié)果:輸出結(jié)果: sum=11 sum=11 輸出結(jié)果:輸出結(jié)果: sum=0 sum=0 6.5 for 語句語句一般格式:一般格式:for(for(表達式表達式1;1; ;表達式表達式3)3) 語句語句執(zhí)行過程執(zhí)行過程:語句非00求解表達式1求解表達式3語句求解表達式3為真求解表達式1給循環(huán)變量賦初值給循環(huán)變量賦初值循環(huán)控制條件循環(huán)控制條件給循環(huán)變量加增量給

17、循環(huán)變量加增量循環(huán)體循環(huán)體sum=0;sum=0;for(for(; ;i+) ;i+) sum=sum=sum+isum+i; ; 例例6.4 6.4 求求 (用(用 for for 語句)語句)#include #include void main ( )void main ( ) int sum,i; int sum,i; sum=0;sum=0; for(i=1; for(i=1;i+) ;i+) sum=sum+i;sum=sum+i; printf(sum=%dn,sum); printf(sum=%dn,sum); 1001ii考慮:考慮: 求求 , S=5+10+15+, S=

18、5+10+15+100 , , 20+100 , , 20!1001/1ii10013ii一般格式:一般格式:for(for(表達式表達式1;1; ;表達式表達式3)3) 語句語句例例6.4a 6.4a 求求 (用(用 for for 語句可以代替語句可以代替whilewhile)#include #include voidvoid main()main() int sum,i; int sum,i; sum=0;sum=0; for(i=0; for(i=0;i+) ;i+) sum=sum+i; sum=sum+i; printf(sum=%dn,sum);printf(sum=%dn,s

19、um); 1001ii i=0;i=0; while (i=100)while (i=100) sum= sum=sum+isum+i; ; i+; i+; 一般地一般地,對一般格式對一般格式 : for(for(表達式表達式1;1; ;表達式表達式3)3) 語句語句表達式表達式1;1;while (while () ) 語句語句 表達式表達式3;3;表達式2語句非00求解表達式1求解表達式3注意到:注意到:for語句中的三個表達式都是可以省略的。語句中的三個表達式都是可以省略的。如:如: for(ifor(i=1;i=100;i+ )=1;i100)break;100)break; sum=

20、 sum=sum+isum+i;i=1;i=1;for( ;i=100;i+ )for( ;i=100;i+ ) sum= sum=sum+isum+i; ;for(ifor(i=1;i=100; )=1;i100)break;100)break; sum= sum=sum+isum+i; ; i+; i+; for(ifor(i=1;i=100; sum=1;i=100; sum=sum+i,isum+i,i+);+);6.6 循環(huán)的嵌套循環(huán)的嵌套 P113. 1) while ( )1) while ( ) 2) do2) do while ( ); while ( );3) for (

21、; ; ;)3) for ( ; ; ;) 4) while ( )4) while ( ) 6.8 break語句和語句和continue語句語句 1) break 1) break: 跳出循環(huán)體跳出循環(huán)體, ,提前結(jié)束循環(huán)語句。提前結(jié)束循環(huán)語句。 2) continue2) continue: 結(jié)束本次循環(huán)結(jié)束本次循環(huán), ,提前進入下一輪循環(huán)。提前進入下一輪循環(huán)。 (執(zhí)行一次循環(huán)體(執(zhí)行一次循環(huán)體, ,叫做一輪循環(huán)。)叫做一輪循環(huán)。)例例 從從1 1開始累加自然數(shù)開始累加自然數(shù), ,輸出和不超過輸出和不超過8 8的的i i和累加和的值和累加和的值. .#include #include v

22、oid main()void main() int i,sum=0; int i,sum=0; printf(i, sumn); / printf(i, sumn); /* * 表頭表頭 * */ / for(i=1;for(i=1;i+);i+) sum=sum+i; sum=sum+i; if(sum8) if(sum8) printf(%d, %dn,i,sum); printf(%d, %dn,i,sum); 一一 break語句:語句: 讀程序讀程序,說出程序的功能和運行結(jié)果說出程序的功能和運行結(jié)果.breakbreak:跳出循環(huán)體:跳出循環(huán)體, ,提前結(jié)束循環(huán)語句。提前結(jié)束循環(huán)語句

23、。二二 continue語句語句 例例6.5 輸出輸出100200之間不能被之間不能被3整除的數(shù)。整除的數(shù)。#include #include voidvoid main()main() int n; int n; for(n=100;n=200;n+) for(n=100;n=200;n+) if(n%3=0) if(n%3=0) printf(%-4d,n); printf(%-4d,n); printf(n); printf(n); 讀程序讀程序,說出程序的功能說出程序的功能.continuecontinue:結(jié)束本次循環(huán):結(jié)束本次循環(huán), ,提前進入下一輪循環(huán)。提前進入下一輪循環(huán)。例例6

24、.5 輸出輸出100200之間不能被之間不能被3整除的數(shù)。整除的數(shù)。(另法。另法。) #include #include voidvoid main()main() intint n; n; for(nfor(n=100;n=200;n+)=100;n=200;n+) if(n%3!=0)printf(%-4d,n);if(n%3!=0)printf(%-4d,n); printf(nprintf(n); ); 回顧回顧: 三種三種語句語句 do do 語句語句 whilewhile() for(for(表達式表達式1;1; ;表達式表達式3)3) 語句語句 while while() 語句語

25、句6.9 常用循環(huán)算法舉例常用循環(huán)算法舉例將要介紹的常用算法將要介紹的常用算法: : 一一 求序列的前求序列的前n n項或求級數(shù)的部分和項或求級數(shù)的部分和 二二 篩選具有某性質(zhì)的數(shù)篩選具有某性質(zhì)的數(shù) 三三 處理字符串中字符的算法處理字符串中字符的算法 四四 窮舉法窮舉法 五五 其他算法實例其他算法實例循環(huán)結(jié)構(gòu)的問題要素循環(huán)結(jié)構(gòu)的問題要素: : 1 1)操作操作 2 2)循環(huán))循環(huán) 3) 3) 選擇哪個循環(huán)語句比較合適選擇哪個循環(huán)語句比較合適一一 求序列的前求序列的前n n項或求級數(shù)的部分和項或求級數(shù)的部分和#include #include void main()void main() sum

26、=0,t,i; sum=0,t,i; for(for(i i=1,t=1=1,t=1; ;i+);i+) t=t t=t* *i; i; sum+=t; sum+=t; printf(sumprintf(sum=%.0fn,sum);=%.0fn,sum); Ex6.4 Ex6.4 求求 1!1!+2!+3!+ +2!+3!+ +20! +20! 的值的值. .算法思路算法思路: : 1) 1) 建立一個累加變量建立一個累加變量( (如如,sum),sum),通常初始化為通常初始化為0.0. 2) 2) 然后然后, ,到累加變量到累加變量. . 3) 3) 重復重復2)2)直到滿足要求為止直到

27、滿足要求為止. . 1) 1) 當前后項有關系時當前后項有關系時, ,往往利用前一項求往往利用前一項求下一項下一項. . 2) 2) 當序列或級數(shù)的當序列或級數(shù)的比較復雜的時候比較復雜的時候, ,可可以分成以分成符號符號、分子分子、分母分母三部分三部分分別計算分別計算。 3) 3) 當序列有通項公式當序列有通項公式, ,直接利用通項公式直接利用通項公式來求項來求項. . (當通項公式比較復雜的時候也可以當通項公式比較復雜的時候也可以分成分成符號符號、分子分子、分母分母三部分三部分分別計算分別計算。)。)例例 6.6 6.6 求求 的近似值的近似值, ,最后一項的最后一項的小于小于1010-6-

28、6。 利用公式利用公式 : /4 = 1/4 = 1 1/3+1/51/3+1/5 1/7+ 1/7+ #include #include #include #include void main()void main() double double s,n,t,pis,n,t,pi ; ; t=1; pi=0;s=1;n=1; t=1; pi=0;s=1;n=1; while ( while () ) pi= pi=pi+tpi+t; ; s=-s; s=-s; /符號符號 n=n+2; n=n+2; /分母分母 t=t=s/ns/n; ; /下一項下一項 pi= pi=pipi* *4;4;

29、 printf(piprintf(pi=%f =%f n,pin,pi);); pi=3.141591pi=3.141591例例 6.7 6.7 求求FibonacciFibonacci數(shù)列數(shù)列 1,1,2,3,5,81,1,2,3,5,8的前的前4040項。項。 其通項公式為:其通項公式為:農(nóng)場里有一對兔子,農(nóng)場里有一對兔子,1 1) 從出生后第從出生后第3 3個月起每個月都生一對小兔子個月起每個月都生一對小兔子( (包括出生的這個月包括出生的這個月) ) ,2 2) 而生出的每一對小兔子,也是從出生后而生出的每一對小兔子,也是從出生后第第3 3個月個月起,每個月都生一對起,每個月都生一對小

30、兔子,小兔子,( (所有兔子永遠不死所有兔子永遠不死) ) 則:每月的兔子數(shù),為一個則:每月的兔子數(shù),為一個FibonacciFibonacci數(shù)列。數(shù)列。背景介紹背景介紹 :f fn n= = 1 n=1,21 n=1,2 f fn-1n-1+f+fn-2n-2 n n3 3題意分析:題意分析: 通項公式:通項公式: f fn n= = 1 n=1,21 n=1,2 f fn-1n-1+f+fn-2n-2 n3 n31 1) 上個月原有的兔子數(shù):上個月原有的兔子數(shù): f fn-1n-1對。對。2 2) 上上個月已有的兔子(上上個月已有的兔子( f fn-2n-2對),對), 上上個月已有的兔

31、子上上個月已有的兔子已成為老兔子已成為老兔子,。 即,這個月的新生兔子數(shù)為即,這個月的新生兔子數(shù)為f fn-2n-2對對!3 3)從而,上個月原有的兔子數(shù):()從而,上個月原有的兔子數(shù):(f fn-1n-1對)對)加上加上 這個月的新生兔子數(shù)這個月的新生兔子數(shù)(f fn-2n-2對),即為本月的兔子總數(shù)。對),即為本月的兔子總數(shù)。例例 6.7 求求FibonacciFibonacci數(shù)列數(shù)列 1,1,2,3,5,81,1,2,3,5,8的前的前4040項。項。其通項公式為:其通項公式為:f fn n= = 1 n=1,21 n=1,2 f fn-1n-1+f+fn-2n-2 n n3 3f1=

32、1,f2=1輸出輸出f1,f2f1=f1+f2f2=f2+f1#include #include void main()void main() f1,f2; int i; f1,f2; int i; f1=1; f2=1;f1=1; f2=1; for(i=1; for(i=1;i+);i+) printf(% printf(%1212 % %1212,f1,f2); ,f1,f2); if(i%2=0) printf(n);if(i%2=0) printf(n); /循環(huán)兩次換一次行循環(huán)兩次換一次行: : 控制一行輸出控制一行輸出4 4個數(shù)據(jù)個數(shù)據(jù) f1=f1=f1f1+f2; +f2; f

33、2=f2+ f2=f2+f1f1; ; 二二 篩選具有某性質(zhì)的數(shù)篩選具有某性質(zhì)的數(shù)算法思路算法思路: 判定給定數(shù)判定給定數(shù)m是否具有此性質(zhì)(是否具有此性質(zhì)(對于對于往往需要用往往需要用來來判定判定),如果具有此性質(zhì)則輸出),如果具有此性質(zhì)則輸出m.例例6.5 6.5 輸出輸出100-200100-200之間之間的數(shù)。的數(shù)。( (另法。另法。) ) #include #include voidvoid main()main() int n; int n; for(n=100;n=200;n+) for(n=100;n=200;n+) if(if()printf(%-4d,n);)printf(%

34、-4d,n); printf(n); printf(n); 例例6.8 判斷判斷m是否為素數(shù)。是否為素數(shù)。(m=a(m=a* *b b 則則a,ba,b中至少有一個是不大于中至少有一個是不大于m m的平方根的的平方根的) )2 2 中沒有中沒有m m的因子的因子m輸出m不是素數(shù)輸出m是素數(shù)k=sqrt(m) 真 假 break 真 假 輸入整數(shù)m算法分析算法分析: 檢驗從檢驗從2 2 , ,都不是都不是m m的因子的因子. .m題意分析題意分析: :素數(shù)素數(shù)m m:即除了自身:即除了自身m m及及1 1外沒有真因子的自然數(shù)外沒有真因子的自然數(shù)2 2m-1m-1中沒有中沒有m m的因子的因子例例

35、6.8 判斷判斷m是否為素數(shù)。是否為素數(shù)。 P118 輸出m不是素數(shù)輸出m是素數(shù)k=sqrt(m) 真 假 break 真 假 輸入整數(shù)m#include #include #include #include void main()void main() intint m,i,km,i,k; ; printfprintf(輸入整數(shù)輸入整數(shù)m(mm(m1): 1): ) ); scanf(%d,scanf(%d,&m m); ); k= k=sqrt(msqrt(m);); for(ifor(i=2;i=2;i=k;ik;i+) +) if(m%iif(m%i=0)break;=0)break;

36、 if(iif(i=k+1)=k+1) printf(%dprintf(%d是素數(shù)是素數(shù).n,mn,m);); else else printf(%dprintf(%d不是素數(shù)不是素數(shù).n,mn,m);); 例例6.9 求求100200之間的全部素數(shù)。之間的全部素數(shù)。算法分析:算法分析: 顯然只需把上題中的顯然只需把上題中的m m從從100100取到取到200200就可以了。就可以了。 breakm%i=0真 假輸出mi=k+1真 假k=sqrt(m)#include #include #include #include void main()void main() int m,k,i,n=0

37、; int m,k,i,n=0; for(m=101; for(m=101; ;m=m+2m=m+2) ) k=sqrt(m);k=sqrt(m); for(i=2; for(i=2;i+);i+) if(m%i=0)break; if(m%i=0)break; if( if() ) n+; n+; printf(%5d,m); printf(%5d,m); if(n%10=0)printf(n);if(n%10=0)printf(n); printf(n100printf(n100200200之間共有之間共有%d%d個素數(shù)個素數(shù)。n,n);n,n); ex6.7 一個數(shù)恰好等于它的因子和,則

38、稱它為完數(shù):一個數(shù)恰好等于它的因子和,則稱它為完數(shù): 如,如,6=1+2+3。求求1-1000之間的完數(shù)。輸出格式為之間的完數(shù)。輸出格式為: 6 的因子是的因子是: 1, 2, 3#include #include void main()void main() intint m,s,i,nm,s,i,n=0;=0; for(mfor(m=1;m=1000;m+) =1;m=1000;m+) for(ifor(i=1;=1;i;i+) +) if(m%iif(m%i=0) s=0) s=s+is+i; ; if(if() ) n+; n+; printf(%dprintf(%d 的因子是的因子是

39、: : ,m); ,m); for(ifor(i=1;=1;i;i+) +) if(m%iif(m%i=0) =0) printfprintf( %( %d,id,i);); printf(bprintf(b n); n); printf(printf(1110001000中共有中共有%d%d個完數(shù)個完數(shù)。 n,nn,n);); 輸出m和它的因子m=s真 假求m的因子和s(條件累加)輸入整數(shù)m一個整數(shù)是否是完數(shù)的算法:一個整數(shù)是否是完數(shù)的算法: 三三 處理字符串中字符的算法處理字符串中字符的算法一個常用的格式是一個常用的格式是: : while( while() ) 按按處理變量處理變量c c

40、中的字符中的字符 算法思路算法思路: 從從一個字符一個字符,處理一個字符處理一個字符,利用循環(huán)利用循環(huán)反復執(zhí)行反復執(zhí)行.:從從一個字符的函數(shù)是:一個字符的函數(shù)是: 例例6.10 譯密碼。譯密碼。題意分析:題意分析: 編密碼規(guī)則:編密碼規(guī)則:A A V V 和和 a a v v 的轉(zhuǎn)換規(guī)則是的轉(zhuǎn)換規(guī)則是: c: c對應對應c+4 c+4 W X Y ZW X Y Z和和w x y zw x y z的轉(zhuǎn)換規(guī)則是的轉(zhuǎn)換規(guī)則是:c:c對應對應c+4-26c+4-26輸出字符輸出字符c cc=c-26;c=c-26;是由W-Z或w-z轉(zhuǎn)換的嗎? 真 假c=c+4;c=c+4; 真 假#include #

41、include void main()void main() char c; char c; while(while() ) if(cif(c=a&ca&c=A&cA&c=Z)z)|cz) c=c-26; c=c-26; printf(%c,cprintf(%c,c);); printf(nprintf(n);); China! China! GlmreGlmre! !四四 窮舉法窮舉法算法思路:利用循環(huán)將算法思路:利用循環(huán)將一一檢驗一一檢驗, 挑出所有滿足要求的情況。挑出所有滿足要求的情況。例(百錢買百雞)例(百錢買百雞)雞翁雞翁1,1,錢值錢值5; 5; 雞母雞母1,1,錢值錢值3;3;雞

42、雛雞雛3,3,錢值錢值1;1;何以何以百錢買百雞百錢買百雞? ? 算法分析:算法分析:用窮舉法檢驗所有可能情況:用窮舉法檢驗所有可能情況:公:公:x x 母:母:y y ?。盒。簔 z 0 0 100 0 0 100 0 1 99 0 1 99 0 2 98 0 2 98 再進一步:再進一步:x x:0 - 20 (50 - 20 (5元一只元一只, ,最多買最多買2020只只) )。y y:0 - 33 0 - 33 (3 3元一只元一只,100,100元最多買元最多買3333只)。只)。z z:z=100-x-y z=100-x-y (z z由由x,yx,y所決定)。所決定)。輸出:(x,

43、y,z)(z%3=0)&(5*x+3*y+z/3100)真 假 z=100-x-y z=100-x-y for y=0 to 33 for x=0 to 20例例 程序:程序: (百錢買百雞)(百錢買百雞)#include #include void main()void main() intint x,y,zx,y,z; ; printfprintf(公雞公雞 母雞母雞 小雞小雞n);n); for(xfor(x=0;x20;x+)=0;x20;x+) for(yfor(y=0;y33;y+)=0;y33;y+) z=100-x-y; z=100-x-y; if(z%3=0&x if(z%3

44、=0&x* *5+y5+y* *3+z/3=100)3+z/3=100) printf(%-6d%-6d%-6dn,x,y,z); printf(%-6d%-6d%-6dn,x,y,z); 輸出:(x,y,z)(z%3=0) &(5*x+3*y+z/3100)真 假 z=100-x-y z=100-x-y for y=0 to 33 for x=0 to 20 五五 其他算法實例其他算法實例:Ex6.1 Ex6.1 輸入兩個整數(shù)輸入兩個整數(shù)m m和和n n,求其最大公約數(shù)和最小公倍數(shù)。,求其最大公約數(shù)和最小公倍數(shù)。 問題分析:問題分析: 最小公倍數(shù)最小公倍數(shù) q=mq=m* *n/n/最大公約

45、數(shù)最大公約數(shù) 關鍵:求最大公約數(shù)關鍵:求最大公約數(shù)p =p =(m,nm,n) ( (個人臨時的記號個人臨時的記號) )輸入輸入m,nm0=m,n0=n將大數(shù)放在將大數(shù)放在m中中n0r=m%n; m=n;n=r;輸出最大公約數(shù):輸出最大公約數(shù):m輸出最小公倍數(shù):輸出最小公倍數(shù):m0*n0/m如如:(:(6464,2424) = = (2424,1616) = = (1616,8 8) = = (8 8,0 0)=8=8 即即 :8 8為為6464和和2424的最大公約數(shù)。的最大公約數(shù)。 輾轉(zhuǎn)相除法輾轉(zhuǎn)相除法 求最大公約數(shù):求最大公約數(shù): ( (m,nm,n)=m )=m 當當n=0n=0 =

46、= ( ( n,rn,r) ) 當當n n0 0其中其中 r=r=m%nm%n(余數(shù))(余數(shù)) 對于一般的問題對于一般的問題, ,你沒見過的類型你沒見過的類型, ,首先自己考慮如何首先自己考慮如何解決它解決它, ,然后分析然后分析的的, ,找出循環(huán)部分找出循環(huán)部分, ,再再編程實現(xiàn)它編程實現(xiàn)它. .考慮那一部分操作在重復:考慮那一部分操作在重復: 1) 1) 求余:求余:r=r=m%nm%n 2) 2) n n作為新的作為新的m m , r r作為新的作為新的n n 3) 3) 重復重復1)-2)1)-2),當前的,當前的m m是最初是最初m,nm,n的的最大公約數(shù)最大公約數(shù)Ex6.1 Ex6

47、.1 輸入兩個整數(shù)輸入兩個整數(shù)m m和和n n,求其最大公約數(shù)和最小公倍數(shù)。,求其最大公約數(shù)和最小公倍數(shù)。輸入m,nm0=m,n0=n將大數(shù)放在m中r=m%n; m=n;n=r;輸出最大公約數(shù):m輸出最小公倍數(shù):m0*n0/m#include #include void main()void main() intint m,n,r,m0,n0; m,n,r,m0,n0; printfprintf(請輸入請輸入m,nm,n (m0, n0): ); (m0, n0): ); scanf(%d%d,&m,&nscanf(%d%d,&m,&n);); m0=m;n0=n; m0=m;n0=n; if

48、(nif(n m)rm)r= =m;mm;m= =n;nn;n=r; =r; /排序排序m m和和n n while(nwhile(n!=0)r=!=0)r=m%n;mm%n;m= =n;nn;n=r;=r; printf(%dprintf(%d和和%d%d的最大公約數(shù)為:的最大公約數(shù)為:%dn,m0,n0,m);%dn,m0,n0,m); printfprintf(最小公倍數(shù)為:最小公倍數(shù)為:%dn,m0%dn,m0* *n0/m);n0/m); 輾轉(zhuǎn)相除法輾轉(zhuǎn)相除法 :( (m,nm,n)= m )= m 當當n=0n=0 = ( = (n,rn,r) ) 當當n n0 0 其中其中 r=

49、r=m%nm%n(余數(shù))(余數(shù))Ch6Ch6循環(huán)控制循環(huán)控制循環(huán)編程所解決的問題和兩個要點循環(huán)編程所解決的問題和兩個要點1 1三種循環(huán)語句三種循環(huán)語句2 2兩種中斷語句兩種中斷語句forforwhilewhilebreakbreakcontinuecontinue3 3幾種關于循環(huán)的經(jīng)典算法幾種關于循環(huán)的經(jīng)典算法求序列和級數(shù)求序列和級數(shù)篩選某性質(zhì)的數(shù)篩選某性質(zhì)的數(shù)逐個字符的處理字符串逐個字符的處理字符串窮舉法窮舉法其他算法其他算法do-whiledo-while作業(yè)作業(yè): P129: P129Ex 6.2 6.3 Ex 6.2 6.3 6.6 6.11 6.6 6.11選做題:選做題:1 1

50、(棋盤上的小麥)(棋盤上的小麥)相傳古代印度國王舍罕要褒賞他的聰明能干的宰相達依爾相傳古代印度國王舍罕要褒賞他的聰明能干的宰相達依爾(國際象棋的發(fā)明者),問他需要什么,達依爾回答說:(國際象棋的發(fā)明者),問他需要什么,達依爾回答說:“國王只要在國際象棋國王只要在國際象棋的棋盤第一格放的棋盤第一格放1 1粒麥子,第二格放粒麥子,第二格放2 2粒麥子,第三格放粒麥子,第三格放4 4粒麥子,以后按此比例每粒麥子,以后按此比例每一格加一倍,一直放到第一格加一倍,一直放到第6464格(國際象棋棋盤是格(國際象棋棋盤是8 8* *8=648=64格),我就感恩不盡,其格),我就感恩不盡,其他我什么也不要了

51、。他我什么也不要了?!保瑖跸耄?,國王想:“這有多少!還不容易!這有多少!還不容易!”,于是讓人扛來一,于是讓人扛來一袋小麥,但是不到一會就全用完了,再來一袋很快又沒有了,結(jié)果全印度的糧食袋小麥,但是不到一會就全用完了,再來一袋很快又沒有了,結(jié)果全印度的糧食全部用完還是不夠。國王非常奇怪,到底需要多少呢?請你編程計算需要多少體全部用完還是不夠。國王非常奇怪,到底需要多少呢?請你編程計算需要多少體積的小麥?積的小麥? s=1+2s=1+21 1+2+22 2+2+23 3+ +2+26363 (1m1m3 31.421.42* *10108 8粒)粒)2 2 (換零鈔票)(換零鈔票)要將要將10

52、0100元的大鈔票元的大鈔票, ,換成等值的換成等值的1010元、元、5 5元、元、2 2元、元、1 1元一張的小鈔元一張的小鈔票,要求每次換成票,要求每次換成4040張小鈔票,每種至少一張。輸出所有換法。(窮舉法)張小鈔票,每種至少一張。輸出所有換法。(窮舉法)ex6.2 ex6.2 輸入一串字符,統(tǒng)計英文字母、空格、數(shù)字和其他字符個數(shù)。輸入一串字符,統(tǒng)計英文字母、空格、數(shù)字和其他字符個數(shù)。#include #include void main ( )void main ( ) char c; int n1,n2,n3,n4; char c; int n1,n2,n3,n4; n1=n2=n

53、3=n4=0; n1=n2=n3=n4=0; printf(printf(請輸入一串字符請輸入一串字符:n);:n); while( while(!=n)!=n) printf( printf(英文字母個數(shù)英文字母個數(shù)=%dn,n1);=%dn,n1); printf( printf(空格字符個數(shù)空格字符個數(shù)=%dn,n2);=%dn,n2); printf( printf(數(shù)字字符個數(shù)數(shù)字字符個數(shù)=%dn,n3);=%dn,n3); printf( printf(其他字符個數(shù)其他字符個數(shù)=%dn,n4);=%dn,n4); ex6.3 ex6.3 求求s=s=a+aa+aaaa+aa+aaa

54、+ + +aaaaaaa a的值。的值。#include #include void main()void main() long sum; long sum; intint n,t,a,in,t,a,i; ; printfprintf(請輸入請輸入n,a(0a=9):);n,a(0a=9):); scanf(%d%d,&n,&ascanf(%d%d,&n,&a);); sum=0;t=0; sum=0;t=0; for(ifor(i=0;i=0;in;in;i+)+) t=t t=t* *10+a;10+a; sum= sum=sum+tsum+t; ; printf(aprintf(a=%

55、d, n=%=%d, n=%dn,a,ndn,a,n);); printf(Snprintf(Sn= =a+aa+aaaa+aa+aaa+ + +aaaaa=%lda=%ldn,sumn,sum);); ex6.5 ex6.5 求求501101210011kkkkkk#include #include void main()void main() double sum=0;int k; double sum=0;int k; for(k=1;k=100;k+) sum+=k; for(k=1;k=100;k+) sum+=k; /=/= while( while(k=50k=50) ) sum

56、+=k sum+=k* *k;k+; k;k+; /= /= dodo sum+=1.0/k;k+; sum+=1.0/k;k+; while( while(k=10k=10);); printf(sum=%fn,sum); printf(sum=%fn,sum); ex6.6 ex6.6 求水仙花數(shù)。求水仙花數(shù)。( (如,如,153=1153=13 3+5+53 3+3+33 3) )#include #include void main()void main() int i,a,b,c; int i,a,b,c; for(i=100; i=999;i+) for(i=100; i=999;

57、i+) if( if()printf(%6d,i);)printf(%6d,i); printf(n); printf(n); ex6.6 ex6.6 求水仙花數(shù)。求水仙花數(shù)。( (如,如,153=1153=13 3+5+53 3+3+33 3) )(窮舉法)(窮舉法)#include #include void main()void main() int a,b,c,m,n; int a,b,c,m,n; for(a=1; a=9;a+) for(a=1; a=9;a+) for(b=0; b=9;b+) for(b=0; b=9;b+) for(c=0; c=9;c+) for(c=0;

58、c=9;c+) m=a m=a* *100+b100+b* *10+c;10+c; n=a n=a* *a a* *a+ba+b* *b b* *b+cb+c* *c c* *c;c; if( if()printf(%6d,m);)printf(%6d,m); printf(n); printf(n); Ex6.11 P120(由迭代公式求平方根)(由迭代公式求平方根)用迭代法求用迭代法求x= .x= .求平方根的迭代公式為:求平方根的迭代公式為: x xn+1n+1=(x=(xn n+a/x+a/xn n)/2)/2要求前后兩次求出的要求前后兩次求出的x x的差的絕對值小于的差的絕對值小于1

59、010-5-5。a#include #include #include #include void main()void main() float a,x0,x1; float a,x0,x1; printfprintf(請輸入請輸入 a: );a: ); scanf(%f,&ascanf(%f,&a);); x1=a; x1=a; do do x0=x1; x0=x1; x1=(x0+a/x0)/2; x1=(x0+a/x0)/2; while(fabs(x1-x0)=1e-6); while(fabs(x1-x0)=1e-6); printf(sqrt(%.2f)=%.2fn,a,x1);

60、printf(sqrt(%.2f)=%.2fn,a,x1); 例例 : (棋盤上的小麥)(棋盤上的小麥) 相傳古代印度國王舍罕要褒賞他的聰相傳古代印度國王舍罕要褒賞他的聰明能干的宰相達依爾(國際象棋的發(fā)明明能干的宰相達依爾(國際象棋的發(fā)明者),問他需要什么,達依爾回答說:者),問他需要什么,達依爾回答說:“國王只要在國際象棋的棋盤第一格放國王只要在國際象棋的棋盤第一格放1 1粒麥子,第二格放粒麥子,第二格放2 2粒麥子,第三格放粒麥子,第三格放4 4粒粒麥子,以后按此比例每一格加一倍,一直麥子,以后按此比例每一格加一倍,一直放到第放到第6464格(國際象棋棋盤是格(國際象棋棋盤是8 8* *8

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論