




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第六章第六章 循環(huán)構(gòu)造的循環(huán)構(gòu)造的C程程序設(shè)計序設(shè)計循環(huán)的必要性循環(huán)的必要性int result1,result2,result3;int result4,result5;result1 = 1 * 10;printf(1 10 %d n,result1);result2 = 2 * 10;printf(2 10 %d n,result2);result3 = 3 * 10;printf(3 10 %d n,result3);result4 = 4 * 10;printf(4 10 %d n,result4);result5 = 5 * 10;printf(5 10 %d n,result5)
2、; 1 10 102 10 203 10 304 10 405 10 50輸出結(jié)果反復(fù)語句6.1 6.1 概述概述循環(huán)的必要性循環(huán)的必要性1 10 = 102 10 = 203 10 = 304 10 = 405 10 = 500 + 11 + 12 + 1上個數(shù)字 + 1.反復(fù) (上個數(shù)字 +1) 10C 言語中的各種循環(huán)言語中的各種循環(huán)需求多次反復(fù)執(zhí)行一個或多個義務(wù)的問題思索運用循環(huán)來處理 C言語可實現(xiàn)循環(huán)的語句:用goto 和 if 構(gòu)成循環(huán)while 語句do while 語句for 語句循環(huán)型程序設(shè)計循環(huán)型程序設(shè)計6.2 while6.2 while語句語句普通方式:普通方式:whi
3、le(表達式) 循環(huán)體語句;v執(zhí)行流程:計算表達式的值,當值為真(非0)時,執(zhí)行循環(huán)體語句,一旦條件為假,就停頓執(zhí)行循環(huán)體。假設(shè)條件在開場時就為假,那么不執(zhí)行循環(huán)體語句直接退出循環(huán)。 任務(wù)原理表達式表達式循環(huán)體循環(huán)體假假(0)真真(非非0)開場闡明:語句部分可以是簡單語句也可以是復(fù)合語句。闡明:語句部分可以是簡單語句也可以是復(fù)合語句。不成立不成立表達式表達式?執(zhí)行語句成立成立執(zhí)行while循環(huán)之后的語句循環(huán)體循環(huán)體例 用while循環(huán)求 1001nn#include main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,s
4、um);循環(huán)初值循環(huán)初值循環(huán)終值循環(huán)變量增值循環(huán)變量增值循環(huán)條件循環(huán)體循環(huán)體i1; sum0i=100sumsum+1i+輸出sumv闡明:v循環(huán)體有能夠一次也不執(zhí)行v循環(huán)體可為恣意類型語句,一個以上的語句用括起來v以下情況,退出while循環(huán)v條件表達式不成立為零v循環(huán)體內(nèi)遇break,gotov無限循環(huán): while(1)v 循環(huán)體;l例:分析程序的運轉(zhuǎn)結(jié)果例:分析程序的運轉(zhuǎn)結(jié)果l #include lmain ( )l int i=1,sum=0;lwhile ( i=100 )lprintf(“i=%d,sum=%d,i,sum += i);li+;lprintf(Sum=%dn,su
5、m);ll結(jié)果:程序?qū)⒉煌5拇蛴〗Y(jié)果:程序?qū)⒉煌5拇蛴 癷=1,sum=.。l無法正常終止的程序,稱為無法正常終止的程序,稱為“死循環(huán)。死循環(huán)。l結(jié)論:在結(jié)論:在while語句循環(huán)體中,一定要有可以對循環(huán)控制條件產(chǎn)語句循環(huán)體中,一定要有可以對循環(huán)控制條件產(chǎn)生影響的語句。防止出現(xiàn)生影響的語句。防止出現(xiàn)“死循環(huán)景象。死循環(huán)景象。 例例 顯示顯示1 11010的平方的平方#include main() int i=1; while(i=10) printf(%d*%d=%dn,i,i,i*i); i+; 運轉(zhuǎn)結(jié)果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=
6、649*9=8110*10=1006.3 dowhile語句普通方式:do 循環(huán)體語句; while(表達式);v執(zhí)行流程:循環(huán)體expr假(0)真(非0)它先執(zhí)行循環(huán)體中的語句,然后再判別條件能否為真,假設(shè)為真那么繼續(xù)循環(huán);假設(shè)為假,那么終止循環(huán)。 任務(wù)原理v特點:先執(zhí)行循環(huán)體,后判別表達式v闡明:v至少執(zhí)行一次循環(huán)體vdowhile可轉(zhuǎn)化成while構(gòu)造分別用dowhile和while求 101nnmain() int i,sum=0; i=1; do sum+=i;i+; while(i=10); printf(%d,sum);main() int i,sum=0; i=1; while
7、(i number) printf(太大n); else if (guess number) printf(太小n); while (guess != number); printf(您猜中了! 答案為 %dn,number);猜一個介于猜一個介于 1 與與 10 之間的數(shù)之間的數(shù)請輸入您猜測的數(shù):請輸入您猜測的數(shù):3太小太小請輸入您猜測的數(shù):請輸入您猜測的數(shù):5您猜中了您猜中了! 答案為答案為 5輸入數(shù)字 5 后,dowhile 循環(huán)中的條件為假, 輸出結(jié)果音訊后,程序終止。比較比較 while 和和 do-while循環(huán)循環(huán)while(循環(huán)條件) 循環(huán)體;do 循環(huán)體; while( 循環(huán)
8、條件);do-while 循環(huán)是先執(zhí)行后判別,所以,即使開場條件為假,循環(huán)體也至少會被執(zhí)行一次。while循環(huán)是先判別后執(zhí)行,所以,假設(shè)條件為假,那么循環(huán)體一次也不會被執(zhí)行。q 比較 while 和 do-while 循環(huán)的任務(wù)原理編程:輾轉(zhuǎn)相除法求恣意兩個整數(shù)間的最大公約數(shù)編程:輾轉(zhuǎn)相除法求恣意兩個整數(shù)間的最大公約數(shù) 3:輸入一個正整數(shù),要求以相反的順序輸出該數(shù)。例:輸入一個正整數(shù),要求以相反的順序輸出該數(shù)。例如:輸入如:輸入1234512345,那么輸出為,那么輸出為5432154321。 根本思緒:可以從個位開場,按位輸出整數(shù)的每一位根本思緒:可以從個位開場,按位輸出整數(shù)的每一位Inpu
9、t an integer to numberUntil number = 0Output number%10number = number /10 main( ) main( ) unsigned int number; unsigned int number; printf (Input the number:); printf (Input the number:); scanf (%d, &number); scanf (%d, &number);do do printf(%d, number%10); printf(%d, number%10); number/=10;
10、 / number/=10; /* * number number減少減少1010倍倍 * */ / while (number!=0); while (number!=0); 思索:運用思索:運用whilewhile或或forfor語句,如何實現(xiàn)?語句,如何實現(xiàn)?兩個程序有何區(qū)別?前面的程序可以處置數(shù)字0,后面的程序不能處置123456.4 for語句普通方式:for(expr1 ; expr2 ; expr3) 循環(huán)體語句;循環(huán)體語句;v執(zhí)行流程:expr2循環(huán)體假(0)真(非0)forexpr1expr3for( 表達式1 ; 表達式2 ; 表達式3 ) 語句; for 循環(huán)的普通語法:
11、循環(huán)的普通語法:for 循環(huán)循環(huán)counter = 0;num = 1;cnt = 100;counter = 10;num 0counter +;num = num + 1;cnt-分號用于分隔 for 循環(huán)的三個表達式1、計算表達式1的值,通常為循環(huán)變量賦初值;2、計算表達式2的值,即判別循環(huán)條件能否為真,假設(shè)值為真那么執(zhí)行循環(huán)體一次, 否那么跳出循環(huán);3、計算表達式3的值,這里通常寫更新循環(huán)變量的賦值表達式,然后轉(zhuǎn)回第2步反復(fù)執(zhí)行;任務(wù)原理1234語句語句表達式表達式3N表達式表達式1表達式表達式2表達式表達式1表達式表達式2表達式表達式3語句語句表達式表達式1表達式表達式2Y表達式表達
12、式2for循環(huán)循環(huán)YN表達式表達式3例例 用用for循環(huán)求循環(huán)求 1001nn#include main() int i,sum=0; for(i=1;i=100;i+) sum+=i; printf(%d,sum);for 循環(huán)例如循環(huán)例如#include void main() int number,i,fac=1; printf(n 請輸入恣意一個正整數(shù):); scanf(%d,&number); for(i = 1; i=number; i+)fac=fac*i; printf(n %d的階乘 = %dn,number,fac);請輸入恣意一個正整數(shù):5內(nèi)存內(nèi)存numberif
13、ac51121206循環(huán)執(zhí)行五次5的階乘的階乘 = 120for 循環(huán)的表達式循環(huán)的表達式lfor 循環(huán)中有三個表達式lfor 語句中的各個表達式都可以省略l分號分隔符不能省略for( ; ; ) ;可省略不能省略省略表達式省略表達式1int num=0;for(;num 0;a+,n-) printf(%d ,a*2); l相當于省去了為循環(huán)變量賦初值,此時應(yīng)在for語句之前給循環(huán)變量賦初值省略表達式省略表達式2for(num=1;num+) . l 即不判別循環(huán)條件,也就是以為表達式2一直為真,l 這時應(yīng)在循環(huán)體內(nèi)設(shè)法終了循環(huán),否那么將成為死循環(huán)省略表達式省略表達式3for(i=1;i=1
14、00;) sum=sum+1; i+; l即省去修正循環(huán)變量的值,但此時應(yīng)在循環(huán)體內(nèi)設(shè)法終了循環(huán) 省略三個表達式省略三個表達式for( ; ; ) printf(這將不斷進展下去這將不斷進展下去); i = getchar(); if(i = X | i = x)break; l即不為循環(huán)變量賦初值,不設(shè)置循環(huán)條件(以為表達式2為真值),不修正循環(huán)變量的值,無終止地執(zhí)行循環(huán)體。此時應(yīng)在循環(huán)體內(nèi)設(shè)法終了循環(huán),否那么會成為死循環(huán)v闡明:vexpr1也可以是給其它變量賦初值;expr1和expr3也可以是逗號表達式v例:for(sum=0,i=1;i=100;i+,i+)vfor(sum=0,i=1
15、;i=100;i=i+2)vfor語句可以轉(zhuǎn)換成while構(gòu)造expr1;while(expr2)循環(huán)體語句;expr3;例:#include main( ) int i=0; for(i=0;i10;i+) putchar(a+i); 運轉(zhuǎn)結(jié)果:abcdefghij例:#include main( ) int i=0; for(;i10;i+) putchar(a+i); 例:#include main( ) int i=0; for(;i10;) putchar(a+(i+); 例:#include main( ) int i=0; for( ;i10; putchar(a+i),i+)
16、; main() int i,j,k; for(i=0,j=100;i=j;i+,j-) k=i+j; printf(%d+%d=%dn,i,j,k); #includemain() char c; for(;(c=getchar()!=n;) printf(%c ,c);0+100=1001+99=1002+98=100 50+50=100 :數(shù)列:數(shù)列1 1、1 1、2 2、3 3、5 5、8 8、1313、2121、是著名的菲波那是著名的菲波那奇數(shù)列,其遞推通項公式為:奇數(shù)列,其遞推通項公式為:F1 F1 F2 F2 Fn Fn Fn-1 Fn-1 Fn-2 Fn-2n=3n=3為求出第
17、為求出第N N項的值,請編寫程序。項的值,請編寫程序。根據(jù)遞推通項公式,可用遞推法編寫程序,計算第根據(jù)遞推通項公式,可用遞推法編寫程序,計算第N N項的項的值。值。遞推法:由初始的知條件開場,先計算出第遞推法:由初始的知條件開場,先計算出第(N(N1)1)步的結(jié)果,步的結(jié)果,再利用前面知的再利用前面知的(N(N1)1)項結(jié)果,按照遞推公式或遵照遞項結(jié)果,按照遞推公式或遵照遞推規(guī)那么,推出第推規(guī)那么,推出第N N步結(jié)果。步結(jié)果。遞推法是程序設(shè)計中最常用的方法之一,運用遞推法必需遞推法是程序設(shè)計中最常用的方法之一,運用遞推法必需有明確的遞推初始值和遞推規(guī)那么遞推公式。有明確的遞推初始值和遞推規(guī)那么
18、遞推公式。 6.5 break、continue、goto語句break語句功能:在循環(huán)語句和switch語句中,終止并跳出循環(huán)體或switch闡明:break只能終止并跳出最近一層的構(gòu)造break不能用于循環(huán)語句和switch語句之外的任何其它語句之中continue語句語句功能:終了本次循環(huán),跳過循環(huán)體中尚未執(zhí)行功能:終了本次循環(huán),跳過循環(huán)體中尚未執(zhí)行的語句,進展下一次能否執(zhí)行循環(huán)體的判別的語句,進展下一次能否執(zhí)行循環(huán)體的判別僅用于循環(huán)語句中僅用于循環(huán)語句中break 語句語句跳出 for 循環(huán)for( ; ; ) printf(這將不斷進展下去); i = getchar(); if(i
19、 = X | i = x)break; 跳出 while 循環(huán)while(1) if(x = 10)break; 跳出 do-while 循環(huán)do if (x = 10)break;while (x 15);continue 語句語句lcontinue 語句的作用是跳過循環(huán)體中剩余的語句語句的作用是跳過循環(huán)體中剩余的語句而執(zhí)行下一次循環(huán)而執(zhí)行下一次循環(huán)l對于對于while和和do-while循環(huán),循環(huán),continue 語句執(zhí)行之語句執(zhí)行之后的動作是條件判別;對于后的動作是條件判別;對于for循環(huán),隨后的動作循環(huán),隨后的動作是變量更新是變量更新 v功能:終了本次循環(huán),跳過循環(huán)體中尚未執(zhí)功能:終
20、了本次循環(huán),跳過循環(huán)體中尚未執(zhí)行的語句,進展下一次能否執(zhí)行循環(huán)體的判別行的語句,進展下一次能否執(zhí)行循環(huán)體的判別v僅用于循環(huán)語句中僅用于循環(huán)語句中continue 語句語句while() continue; while() break; 跳出整個循環(huán)繼續(xù)下一次循環(huán)例例6.5 6.5 把把100100200200之間的不能被之間的不能被3 3整除的數(shù)輸出整除的數(shù)輸出main() int n; for(n=100;n200;n+) if(n%3= =0) continue;printf(%d ,n); main() int n; for(n=100;n200;n+) if(n%3= =0) brea
21、k;printf(%d ,n); 100 101 103 104 106 107200100 101 :求:求555555555555的約數(shù)中最大的三位數(shù)是多少?的約數(shù)中最大的三位數(shù)是多少? main( ) main( ) int j; int j; long n=555555; long n=555555;/ /* *所求的約數(shù)的能夠取值是從所求的約數(shù)的能夠取值是從999999到到100100,j j從大到小從大到小* */ / for (j=999; j=100; j-) for (j=999; j=100; j-) if ( n%j=0 ) / if ( n%j=0 ) /* * 假設(shè)可
22、以整除假設(shè)可以整除j j,那么,那么j j是約數(shù)是約數(shù) * */ / printf( printf(3 digits in %ld=%dn3 digits in %ld=%dn, n, j );, n, j ); break; / break; /* * 控制退出循環(huán)控制退出循環(huán) * */ / main ( )main ( ) int i, count=0, j, sum=0; int i, count=0, j, sum=0; for ( i=1; i=10; i+) for ( i=1; i=10; i+) printf (Input integer:); printf (Input in
23、teger:); scanf (%d, &j); scanf (%d, &j); if (j=0) / if (j=0) /* * 假設(shè)為負數(shù)假設(shè)為負數(shù) * */ / continue; / continue; /* *那么終了本次循環(huán),不進展后續(xù)操作那么終了本次循環(huán),不進展后續(xù)操作* */ / count +; / count +; /* * 計數(shù)器計數(shù)器 * */ / sum += j; / sum += j; /* * 求累加和求累加和 * */ / if ( count ) if ( count ) printf(Plus numer:%d,average value:
24、%.2f, printf(Plus numer:%d,average value:%.2f, count, 1.0 count, 1.0* *sum/count);sum/count); else printf(Plus numer: 0, average value: 0); else printf(Plus numer: 0, average value: 0); :輸入:輸入1010個整數(shù),求其中正數(shù)的個數(shù)及平均值,準個整數(shù),求其中正數(shù)的個數(shù)及平均值,準確到小數(shù)點后兩位。確到小數(shù)點后兩位。gotogoto語句及用語句及用gotogoto構(gòu)成循環(huán)構(gòu)成循環(huán)lgoto語句普通格式: goto
25、語句標號; .標號:語句; n功能:使系統(tǒng)轉(zhuǎn)向標號所在的語句行執(zhí)行功能:使系統(tǒng)轉(zhuǎn)向標號所在的語句行執(zhí)行n闡明:語句標號用標識符表示,要符合標識符闡明:語句標號用標識符表示,要符合標識符命名規(guī)那么命名規(guī)那么goto loop;goto 255; #include main() int i,sum=0; i=1;loop: if(i=100) sum+=i; i+; goto loop; printf(%d,sum);sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050循環(huán)初值循環(huán)終值循環(huán)變量增值循環(huán)條件循環(huán)體n用用if if 和和gotogoto語句
26、構(gòu)成循環(huán)語句構(gòu)成循環(huán)C不主張運用不主張運用goto循環(huán)循環(huán) 從鍵盤輸入一組數(shù)據(jù),以從鍵盤輸入一組數(shù)據(jù),以0終了輸入,終了輸入,求數(shù)據(jù)和求數(shù)據(jù)和#include main() int number,sum=0;read_loop: scanf(%d,&number); if(!number) goto print_sum; sum+=number; goto read_loop;print_sum: printf(The total sum is %dn,sum);lC言語三種循環(huán)語句的特點如下:lfor和while先判別循環(huán)條件后執(zhí)行循環(huán)體,l do-while語句先執(zhí)行循環(huán)體后判別循
27、環(huán)條件。lwhile和do-while語句的條件表達式只需一個,l for語句有三個。lwhile、do-while、for可以相互交換運用。lwhile語句多用于不需求賦初值的或循環(huán)次數(shù)不定的情況。lfor語句多用于要賦初值或循環(huán)次數(shù)固定的情況。l do-while語句多用于至少要運轉(zhuǎn)一次的循環(huán)控制。l循環(huán)語句可以嵌套,循環(huán)可以并列,但不能交叉。l為了保證循環(huán)體正常運轉(zhuǎn),應(yīng)該特別留意:為了保證循環(huán)體正常運轉(zhuǎn),應(yīng)該特別留意:l 循環(huán)控制條件循環(huán)控制條件l 控制條件的初始形狀初始值控制條件的初始形狀初始值l 循環(huán)體內(nèi)部對控制條件的影響循環(huán)體內(nèi)部對控制條件的影響l以上三個方面相互配合,相互影響,共
28、同完成循環(huán)控以上三個方面相互配合,相互影響,共同完成循環(huán)控制制6.7 循環(huán)的嵌套定義:一個循環(huán)體內(nèi)又包含了另一個完好的循環(huán)構(gòu)造三種循環(huán)可相互嵌套,層數(shù)不限(1) while() while() . (2) do do while( ); . while( );(3) while() do while( ); . (4) for( ; ;) do while(); while() .內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)程序舉例main() int i,j; for(i=1;i=2;i+) printf(“ni=%dn,i); for(j=1;j=3;j+) printf(“j=%d,j); 程序舉例內(nèi)層循環(huán)終止內(nèi)
29、層循環(huán)終止j=2j=3j=4main() int i,j; for(i=1;i=2;i+) printf(“ni=%dn,i); for(j=1;j=3;j+) printf(“j=%d,j); 程序舉例運轉(zhuǎn)結(jié)果:循環(huán)全部終止循環(huán)全部終止i=2i=3main() int i,j; for(i=1;i=2;i+) printf(“ni=%dn,i); for(j=1;j=3;j+) printf(“j=%d,j); v嵌套循環(huán)的跳轉(zhuǎn)制止:從外層跳入內(nèi)層跳入同層的另一循環(huán)向上跳轉(zhuǎn)v三種循環(huán)可相互嵌套,層數(shù)不限v外層循環(huán)可包含兩個以上內(nèi)循環(huán),但不能相互交叉v嵌套循環(huán)的執(zhí)行流程l:輸出下三角形乘法九九
30、表。l 1 2 3 4 5 6 7 8 9l-l 1l 2 4l 3 6 9l 4 8 12 16l 5 10 15 20 25l 6 12 18 24 30 36l 7 14 21 28 35 42 49l 8 16 24 32 40 48 56 64l 9 18 27 36 45 54 63 72 81l 假設(shè):行號為i ,列號為ji=6i=6j=5j=5i i* *j j(1=i=9)(1=i=9)(1=j=i)(1=j=i) 那么:第那么:第 i i 行中要輸出行中要輸出 j j 個乘積個乘積輸出項輸出項aij和行和行(i)、列、列(j)的關(guān)系的關(guān)系#include #include
31、main ( )main ( ) int i=1, j; / int i=1, j; /* * i: i:行計數(shù)器行計數(shù)器 j: j:列計數(shù)器列計數(shù)器 * */ / while( i= 9 ) / while( i= 9 ) /* * 控制打印表頭控制打印表頭 * */ / printf ( %4d, i+); printf ( %4d, i+); printf (n-n); printf (n-n); i=1; i=1; while ( i= 9 ) / while ( i= 9 ) /* * 行控制行控制 * */ / j = 1; / j = 1; /* * 列計數(shù)器置列計數(shù)器置1 1
32、* */ / while ( j = i ) / while ( j = i ) /* * 嵌套的二重循環(huán)。輸出第嵌套的二重循環(huán)。輸出第i i行行 * */ / printf (%4d, i printf (%4d, i* *j );j ); j +; / j +; /* * 列計數(shù)器列計數(shù)器+1 +1 * */ / printf (n); / printf (n); /* * 一行輸出終了后,輸出一行輸出終了后,輸出n n * */ / i +; / i +; /* * 行計數(shù)器行計數(shù)器+1 +1 * */ / 外層循環(huán)體執(zhí)行外層循環(huán)體執(zhí)行1次,內(nèi)層循環(huán)要輸出次,內(nèi)層循環(huán)要輸出1行行程序設(shè)計
33、的普通步驟1.分析題意,明確問題的性質(zhì) 數(shù)值問題 / 非數(shù)值問題2.建立問題的描畫模型 數(shù)學(xué)模型 / 過程模型3.設(shè)計/確定算法 數(shù)學(xué)問題:數(shù)值分析 非數(shù)學(xué)問題:數(shù)據(jù)構(gòu)造 / 算法分析與設(shè)計普通方法:窮舉 / 遞推 / 遞歸 /.4.編程調(diào)試5.分析運轉(zhuǎn)結(jié)果6-8 程序舉例程序舉例 :判別輸入的整數(shù)能否是素數(shù):判別輸入的整數(shù)能否是素數(shù)算法算法 運用窮舉法,從運用窮舉法,從2 2開場嘗試能否整除整數(shù)開場嘗試能否整除整數(shù)m m。 #include #include “stdio.hstdio.h main() main() int m,i; int m,i; scanf( scanf(“%d%d,
34、&m);,&m); for(i=2;im;i+) for(i=2;i= m) if(i = m) printf( printf(“%d is a prinme number.n%d is a prinme number.n,m);,m); else else printf( printf(“%d is not a prinme number.n%d is not a prinme number.n,m);,m); l程序的優(yōu)化程序的優(yōu)化l 對于窮舉法來說,為了提高程序的效率,就要減少嘗試次數(shù)。對于窮舉法來說,為了提高程序的效率,就要減少嘗試次數(shù)。l#include #inclu
35、de “math.hmath.hlmain( )main( )l int m,i,k; int m,i,k;l scanf( scanf(“%d%d,&m);,&m);l k=sqrt(m); k=sqrt(m);l for(i=2;i=k;i+) for(i=2;i=k+1) printf( if(i=k+1) printf(“%d is a prime number.n%d is a prime number.n,m);,m);l else printf( else printf(“%d is not a prime number.n%d is not a prime nu
36、mber.n,m);,m);l 15 = 3 15 = 3 * * 5; 5;嘗試嘗試 15 % 3 15 % 3 以后,沒有以后,沒有必要再嘗試必要再嘗試 15 % 515 % 5。k k是嘗試的終點。是嘗試的終點。 :如何判別一個整數(shù)是另一個整數(shù)的平方:如何判別一個整數(shù)是另一個整數(shù)的平方 從鍵盤上恣意輸入一個正整數(shù),要求判別該正整數(shù)能否是另一個整數(shù)從鍵盤上恣意輸入一個正整數(shù),要求判別該正整數(shù)能否是另一個整數(shù)的平方。的平方。問題分析與算法設(shè)計問題分析與算法設(shè)計設(shè):輸入的正整數(shù)為設(shè):輸入的正整數(shù)為i i,假設(shè),假設(shè)i i滿足:滿足:i = = m i = = m * * m m m m為整數(shù)為
37、整數(shù)00那么那么i i為整數(shù)為整數(shù)m m的平方。的平方。main( )main( ) int i, m; int i, m; scanf ( scanf (“%d%d, &i);, &i);for( m = 1; m for( m = 1; m * * m i; m + +) ; m i; m + +) ;if( i = = m if( i = = m * * m) m) printf( printf(“% d % d * * % d = % d n % d = % d n, i, i, m);, i, i, m); :抓交通肇事犯 一輛卡車違犯交通規(guī)那么,撞人后逃跑?,F(xiàn)場有三
38、人目擊事件,但都沒有記住車號,只記下車號的一些特征: 甲說:牌照的前兩位數(shù)字是一樣的;乙說:牌照的后兩位數(shù)字是一樣的,但與前兩位不同;丙是位數(shù)學(xué)家,說:四位的車號剛好是一個整數(shù)的平方。 請根據(jù)以上線索求出車號。問題分析與算法設(shè)計 按照標題的要求造出一個前兩位數(shù)(i)一樣、后兩位數(shù)(j)一樣且相互間又不同的整數(shù)。得到: 10i=9 0=j=31main( )main( ) int i,j,k,m; int i,j,k,m; for(i=1;i=9;i+) / for(i=1;i=9;i+) /* * i: i:車號前二位的取值車號前二位的取值 * */ / for(j=0;j=9;j+) / f
39、or(j=0;j=9;j+) /* * j: j:車號后二位的取值車號后二位的取值 * */ / if(i!=j) / if(i!=j) /* * 判別兩位數(shù)字能否相異判別兩位數(shù)字能否相異 * */ / k=i k=i* *1000+i1000+i* *100+j100+j* *10+j;10+j; for(m=31;m for(m=31;m* *mk;m+) ; mk;m+) ; if(m if(m * * m = = k) / m = = k) /* * 判別能否為整數(shù)的平方判別能否為整數(shù)的平方 * */ / printf(Lorry_No. is %d.n, k); printf(Lor
40、ry_No. is %d.n, k); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:Lorry_No. is 7744.Lorry_No. is 7744.:百錢百雞問題 中國古代數(shù)學(xué)家張丘建在他的中提出了著名的“百錢百雞問題: 雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,翁、母、雛各幾何?問題分析與算法設(shè)計設(shè):要買x只公雞,y只母雞,z只小雞,可得到方程: x + y + z = 100 5 x + 3 y + z / 3 = 100 取值范圍:0 = x、y、z = 100 可以采用窮舉法求解。main( )main( ) int x,y,z,j=0; int x,y,z,j=0; for(x=0
41、;x=100;x+) for(x=0;x=100;x+) for(y=0;y=100;y+) for(y=0;y=100;y+) for(z=0;z=100;z+) for(z=0;z=100;z+) if(x+y+z=100 & 5 if(x+y+z=100 & 5* *x+3x+3* *y+z/3=100 )y+z/3=100 ) p r i n t f ( % 2 d : c o c k = % 2 d h e n = % 2 d p r i n t f ( % 2 d : c o c k = % 2 d h e n = % 2 d chicken=%2dn, chick
42、en=%2dn, +j,x,y,z);+j,x,y,z); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果: 1: cock= 0 hen=25 chicken=75 1: cock= 0 hen=25 chicken=75 2: cock= 3 hen=20 chicken=77 2: cock= 3 hen=20 chicken=77 7: cock=12 hen= 4 chicken=84 7: cock=12 hen= 4 chicken=84l喪失重要條件:z應(yīng)該可以被整除。lmain( )l int x,y,z,j=0;l for(x=0;x=100;x+)l for(y=0;y=100;y+)l for(z
43、=0;z=100;z+)l if(z%3= =0&x+y+z=100&5*x+3*y+z/3= =100 )l printf(%2d:cock=%2d hen=% 2 d chicken=%2dn,l +j,x,y,z);ll運轉(zhuǎn)程序,正確的結(jié)果:l 1: cock= 0 hen=25 chicken=75l2: cock= 4 hen=18 chicken=78l3: cock= 8 hen=11 chicken=81l4: cock=12 hen= 4 chicken=84l l優(yōu)化程序:優(yōu)化程序:l main( ) main( )l int x, y, z, j=0; i
44、nt x, y, z, j=0;l for(x=0; x=20; x+) for(x=0; x=20; x+)l for(y=0; y=33; y+) for(y=0; y=33; y+)l for(z=0; z=100; z+) for(z=0; z=100; z+)l if(z%3=0&x+y+z=100 & 5 if(z%3=0&x+y+z=100 & 5* *x+3x+3* *y+z/3=100)y+z/3=100)l printf(%2d:cock=%2d hen=%2d chicken=%2dn, printf(%2d:cock=%2d hen=%2
45、d chicken=%2dn, l +j,x,y,z); +j,x,y,z);l l再優(yōu)化再優(yōu)化 程序:程序:l for(x=0; x=20; x+) for(x=0; x=20; x+)l for(y=0; y=(100-5 for(y=0; y=(100-5* *x)/3; y+)x)/3; y+)l z=100-x-y; z=100-x-y;l if( z%3=0 & 5 if( z%3=0 & 5* *x+3x+3* *y+z/3=100)y+z/3=100)l printf(%2d:cock=%2d hen=%2d chicken=%2dn, printf(%2d:c
46、ock=%2d hen=%2d chicken=%2dn,l +j,x,y,z); +j,x,y,z);l 窮舉法的關(guān)鍵窮舉法的關(guān)鍵數(shù)學(xué)模型數(shù)學(xué)模型適宜進展窮舉的數(shù)學(xué)模型適宜進展窮舉的數(shù)學(xué)模型決議程序能否正確決議程序能否正確窮舉的范圍窮舉的范圍明確的窮舉終止條件明確的窮舉終止條件決議窮舉的效率,范圍過大,那么效率太低。決議窮舉的效率,范圍過大,那么效率太低。:打印邊長為m的正方型要求:從鍵盤輸入m值,輸出m行每行m個*號。例:輸入m=4,輸出的圖形如下:* * * * * * * * * * * * *算法分析與設(shè)計:1. 輸入m,2. 反復(fù)打印m行,每行打印m個 *; 加細: 1. 輸入m;
47、 2. for ( k=1; k=m; k+) 打印一行中的 m 個 * ;l算法分析與設(shè)計:l 加細:l1. 輸入m;l2. for( k=1; k=m; k+)l 打印 m 個 * ;l 換新行;l l 加細:l1. 輸入m;l2. for( k=1; k=m; k+)l for( j=1; j=m; j+)l printf (“*);l printf(“n) ;l #include main ( ) int k, m, j; scanf( “%d, &m); for(k=1; k=m; k+) /* 控制打印m行 */ for(j=1; j=m; j+) /*打印一行中的m個*號
48、*/ printf (“*); printf(“n) ; 分析方法 逐漸求精法。對于復(fù)雜問題,不能夠一下得到程序,可以先將簡單的部分明確出來,再逐漸對復(fù)雜部分進展細化,一步一步推出程序。:打印數(shù)字魔方 要求:從鍵盤輸入 m 值,輸出 m 行的數(shù)字方陣。例:輸入 m=5 ,輸出的圖形如下:1 2 3 4 5 2 3 4 5 13 4 5 1 24 5 1 2 35 1 2 3 4 分析: 1. 反復(fù)打印m行。 2. 2. 第第j j行的第一個數(shù)字為行的第一個數(shù)字為j j,之后依次遞增,之后依次遞增, 但以但以m m為模為模: : aij = ( i + j - 2 ) % m + 1 aij =
49、 ( i + j - 2 ) % m + 1輸出項和行、列的關(guān)系輸出項和行、列的關(guān)系#include #include main ( )main ( ) int i, j, m ; int i, j, m ; printf(Enter M:); printf(Enter M:); scanf(%d, &m); scanf(%d, &m); for(i=1;i=m;i+ ) / for(i=1;i=m;i+ ) /* * 控制打印控制打印m m行行 * */ / for(j=1;j=m;j+ ) / for(j=1;j=m;j+ ) /* * 打印一行中的數(shù)字打印一行中的數(shù)字 *
50、 */ / printf( %d, (i+j-2)%m + 1 ); printf( %d, (i+j-2)%m + 1 ); printf(n); printf(n); 問題描畫:用“*輸出一個菱形圖案,圖案如下: * * * * * * * * * * * * * * * * * * *main()int i,j,k; for(i=1;i=4;i+) for(j=1;j=4-i;j+) printf( ); for(k=1;k=2*i-1;k+) printf(*); printf(n); for(i=1;i=3;i+) for(j=1;j=i;j+) printf( ); for(k=1;k=7-2*i;k+) printf(*); printf(n); 嵌套循環(huán)例如嵌套循環(huán)例如輸出:* * * * * * * * * * * * * * * * * * *控制打印的行數(shù)控制每行打印的空格數(shù)控制每行打印的*號數(shù)控制打印的行數(shù)控制每行打印的空格數(shù)控制每行打印的*號數(shù)問題描畫:打印輸出100至200之間的全部素數(shù)。分析:素數(shù)是指只能被1和它本身整除的數(shù)。算法
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45230-2025數(shù)據(jù)安全技術(shù)機密計算通用框架
- 借用林地協(xié)議合同范本
- 包裝紙盒合同范本
- 北京車輛過戶合同范本
- 軍事拓展協(xié)議合同范本
- 企業(yè)價值咨詢合同范本
- 動產(chǎn)個人抵押合同范本
- 人工勞務(wù)外包合同范本
- 企業(yè)綠化合同范本
- 農(nóng)業(yè)機械改裝項目合同范例
- 綜合交通運輸體系認知
- GM/T 0115-2021信息系統(tǒng)密碼應(yīng)用測評要求
- YY 0670-2008無創(chuàng)自動測量血壓計
- JJF 1458-2014磁軛式磁粉探傷機校準規(guī)范
- GB/T 39935-2021塑料制品薄膜和片材抗粘連性的測定
- GB/T 324-2008焊縫符號表示法
- 機器人技術(shù) 第一章 緒論
- 馬工程教材 《公共財政概論》PPT-第八章 稅收
- GB/T 22544-2008蛋雞復(fù)合預(yù)混合飼料
- 高中生物 生態(tài)系統(tǒng)的能量流動課件 新人教版必修3
- GB/T 14343-2008化學(xué)纖維長絲線密度試驗方法
評論
0/150
提交評論