006-循環(huán)結(jié)構(gòu)的程序設(shè)計(圖形打印題)_第1頁
006-循環(huán)結(jié)構(gòu)的程序設(shè)計(圖形打印題)_第2頁
006-循環(huán)結(jié)構(gòu)的程序設(shè)計(圖形打印題)_第3頁
006-循環(huán)結(jié)構(gòu)的程序設(shè)計(圖形打印題)_第4頁
006-循環(huán)結(jié)構(gòu)的程序設(shè)計(圖形打印題)_第5頁
已閱讀5頁,還剩114頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、循環(huán)結(jié)構(gòu)的程序設(shè)計,1,第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計,本章要點 循環(huán)語句的執(zhí)行流程 不同形式的循環(huán)控制 多重循環(huán)問題 簡單算法設(shè)計,2,第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計,循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用,3,6.1 循環(huán)的基本概念,提出問題 提問:從鍵盤上輸入10個整數(shù)并求和,怎么編程? 回答:在程序中寫10個scanf語句,還可以寫%d%d 提問:從鍵盤上輸入500個整數(shù)并求和,怎么編程? 回答:這個,嗯? 不會讓我寫500個 以上問題的實質(zhì)是:將scanf函數(shù)重復(fù)執(zhí)行N遍。我們可以引出一個概念“循環(huán)”,簡單而言:循環(huán)就是不斷反復(fù)地執(zhí)行同一段程序。

2、,?,4,6.1 循環(huán)的基本概念,循環(huán) 反復(fù)執(zhí)行同一段程序,直到滿足一定的條件后才停止執(zhí)行該段程序。 C語言中控制循環(huán)的語句: while for do_while,5,第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計,循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用,6,6.2 while語句,while語句格式 while (表達式) 語句; 說明:語句可是簡單語句,也可是復(fù)合語句。 while語句的執(zhí)行流程,7,6.2 while語句,執(zhí)行語句,成立,不成立,執(zhí)行while循環(huán)之后的語句,while (表達式) 語句;,8,例:從鍵盤輸入10個整數(shù),求這10個整數(shù)之和 程序

3、主體:,輸入num,成立,不成立,輸出結(jié)果total,計數(shù)器count=0,累加器total=0,total += num,count+,開始,結(jié)束,while ( count10 ) ,count+;,scanf(%d, ,total += num;,8,9,#include int main ( ) int count,num,total; /* count:計數(shù)器,num:輸入的整數(shù) */ count=0; total=0; /* total:存放累加和 */,while (count10) /* 循環(huán)控制條件 */ printf (Enter the No.%d=, count); /

4、*循環(huán)體*/ scanf (%d, ,printf(Total=%dn, total); ,10,例:求n的階乘n! (1=n=10) 程序主體: while(i=n) s*=i; i+; ,s*=i,成立,不成立,輸出結(jié)果,計數(shù)器i=1,累積器s=1,i+,開始,結(jié)束,遞推公式: f(n)=1 當(dāng)n=1時 f(n)=f(n-1)*n 當(dāng)n1時,11,6.2 while語句,#include int main ( ) long s=1; /* s:存放累積結(jié)果 */ int i=1; /* i:計數(shù)器,同時是累積的對象 */,while (i=10) /* 循環(huán)控制條件 */ /* 循環(huán)體 *

5、/ s*=i; /* 計算累積和 */ i+; ,printf(“10!=%dn, s); ,以求10!為例,12,6.2 while語句,比較 total=0; count=0; while (count10) total += num; count +; ,s=1; i=1; while (i=10) s *= i; i +; ,10個數(shù)相加,10個數(shù)相乘,13,例:分析程序運行結(jié)果,#include int main ( ) int n=0; while ( n3 ) printf (“n is %dn”,n); n+; ,結(jié)果:程序?qū)⒉煌5拇蛴 皀 is 0”,直至終止程序無法正常終止

6、的程序,稱為“死循環(huán)”。 結(jié)論:while語句循環(huán)體中,一定要有能夠?qū)ρh(huán)控制條件產(chǎn)生影響的語句,避免出現(xiàn)“死循環(huán)”現(xiàn)象。,14,例:求1413的最后三位數(shù)。 問題分析:,14的13次方已經(jīng)超出了計算機所能表示的整數(shù)范圍,乘法規(guī)律:乘積的最后三位的值只與乘數(shù)和被乘數(shù)的后三位有關(guān),C語言中最長的整數(shù)是:,無符號長整型數(shù): 0 4294967295,10位,1410=289254654976,12位,問題被簡化為求三位數(shù)乘法,15,6.2 while語句,int main() int i=1,x,y,a=1; printf(Input X and Y:); scanf(%d*%d, ,Input

7、X and Y:14*13 3 digits is:144 Input X and Y:15*12 3 digits is:625,16,6.2 while語句,如何一次輸入多個字符或數(shù)值 例:將從鍵盤輸入的一行字符(回車結(jié)束)復(fù)制到標(biāo)準(zhǔn)輸出(顯示器)。 回顧字符輸入輸出函數(shù): getchar():調(diào)用時,等待用戶按鍵,輸入的字符存入鍵盤緩沖區(qū),直到用戶按Enter為止(Enter即n也在緩沖區(qū))。輸入Enter后,getchar從輸入流每次讀一個字符,作為其返回值。其它未讀的字符保留在緩沖區(qū),待下一個getchar調(diào)用。,17,6.2 while語句,#include int main( )

8、 char ch; ch = getchar( ); while ( ch != n ) putchar ( ch ); ch = getchar( ); ,ab13cde ab13cde,putchar(ch=getchar();,putchar(getchar();,18,6.2 while語句,#include int main( ) char ch; while (ch= getchar( ) != n ) putchar ( ch ); ,一段更簡潔的程序,19,6.2 while語句,例:輸入若干整數(shù),豎排輸出,當(dāng)輸入為0時程序結(jié)束。如:輸入13 -6 356 0 輸出: 13 -

9、6 356 scanf():調(diào)用時,等待用戶輸入,輸入的內(nèi)容存入鍵盤緩沖區(qū),直到用戶按Enter為止。輸入Enter后,scanf從輸入流每次按格式讀一個單元,作為其返回值。其它未讀的內(nèi)容保留在緩沖區(qū),待下一個scanf調(diào)用。,20,6.2 while語句,#include int main( ) int x; scanf(“%d”, ,scanf()把緩沖區(qū)的內(nèi)容全部讀完以后,才再次等待用戶從鍵盤輸入,輸入:13 -6 356 0 輸出:13 -6 356,輸入:13 -6 356 0 7 輸出:13 -6 356,輸入:13 -6,21,6.2 while語句,循環(huán)嵌套 在循環(huán)體中,又包含

10、有循環(huán)語句。 while while ,22,例:輸出下三角形乘法九九表。 1 2 3 4 5 6 7 8 9 - 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 假設(shè):行號為i ,列號為j 則第i行中一共要輸出i個乘積,每一項為i*j。,(1=i=9),(1=j=i),i=6 j=5 i*j,屏幕上的字符只能從上到下逐行顯示,同一行內(nèi),只能從左到右逐字顯示。,22,23,顯示要求 屏幕上的字符只能從

11、上到下逐行顯示,同一行內(nèi),只能從左到右逐字顯示。 偽代碼(Pseudocode) while (控制顯示n行 ) while (控制顯示一行中的m個字符 ) 輸出一個需要的字符; 列計數(shù)器 j+; 行數(shù)計數(shù)器 i+; ,24,#include int main ( ) int i=1, j; /* i:行計數(shù)器 j:列計數(shù)器 */ while ( i = 9 ) /* 控制打印表頭 */ printf ( %4d, i+ ); printf (n-n); i=1; while ( i= 9 ) j = 1; /* 列計數(shù)器置1 */ while ( j = i ) /* 嵌套的二重循環(huán),輸出第

12、i行 */ printf (%4d, i*j ); j +; /* 列計數(shù)器+1 */ printf (n); /* 一行輸出結(jié)束后,輸出n */ i +; /* 行計數(shù)器+1 */ ,外層循環(huán)體執(zhí)行1次,內(nèi)層循環(huán)要完整執(zhí)行1次,25,第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計,循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用,26,6.3 for語句,for語句格式 for (表達式1;表達式2;表達式3) 語句; 說明:語句可是簡單語句,也可是復(fù)合語句。 for語句的執(zhí)行流程,27,循環(huán)初始條件,循環(huán)控制條件,執(zhí)行語句,成立,不成立,執(zhí)行for循環(huán)之后的語句,執(zhí)行表達式

13、3,執(zhí)行表達式1,循環(huán)體,for (表達式1;表達式2;表達式3) 語句;,for語句等價于下列語句: 表達式1; while (表達式2) 語句; 表達式3; ,28,6.3 for語句,#include int main ( ) long n=1; int i;,i=1; while (i=10) n*=i; i+; ,printf(“10!=%dn, n); ,for (i=1;i=10;i+) n*=i;,for語句最常用的形式: for (初值;控制條件;增量) 語句;,29,例:用for語句實現(xiàn)打印乘法九九表 #include int main ( ) int i, j; for

14、( i=1; i= 9; i+ ) printf ( %4d, i); printf (n-n); for ( i=1; i= 9; i+ ) for ( j=1; j= i; j+ ) printf (j=i?%4dn: %4d,i*j ); ,輸出函數(shù)printf中使用了“?”操作,含義相當(dāng)于: if ( j=i ) printf (%4dn, i*j ); else printf (%4d, i*j );,30,for語句的變化形式 for語句中的三個表達式中的任意一個都是可以省略的,但是分號不能省略。 省略表達式2,則: for (表達式1; ;表達式3) 省略表達式1和表達式3,則:

15、 for (;表達式2;) 據(jù)此可得結(jié)論:所有用 while 語句實現(xiàn)的循環(huán)都可以用for語句實現(xiàn)。 表達式1、2、3全省略,則: for ( ;),等同于: while (表達式 ),構(gòu)成一個死循環(huán),等同于: while (1),31,6.3 for語句,草原上有一對小兔子,它們剛出生后的第1個月就會逐步長大,到了第2個月末就生出一對小兔子。第3個月大兔子會繼續(xù)生一對小兔子,而第2個月出生的小兔子會逐步長大。第4個月時,第1月出生的兔子繼續(xù)生育,第2月出生的小兔子也可以生育一對小兔子了,第3月出生的小兔子則逐步長大 假設(shè)這些草原的兔子非常長壽,可以認為它們不會死亡。請建立數(shù)學(xué)模型,計算第N個

16、月時,草原上將會有多少對兔子?,32,6.3 for語句,例:數(shù)列1、1、2、3、5、8、13、21、 是著名的菲波那契數(shù)列,其遞推通項公式為: F1 = F2 = 1 Fn = Fn-1 + Fn-2(n=3) 為求出第 N 項的值,請編寫程序。 根據(jù)遞推通項公式,可用遞推法編寫程序,計算第N項的值。,33,6.3 for語句,遞推法 由初始的已知條件開始,先計算出第(N-1)步的結(jié)果,再利用已知的前(N-1)項結(jié)果,按遞推公式(或遵照遞推規(guī)則),推出第 N 步結(jié)果。 遞推法是程序設(shè)計中最常用的方法之一,使用遞推法必須有明確的遞推初始值和遞推規(guī)則(遞推公式)。,34,程序主體 f = f2

17、= 1; for ( i=3; i=n; i+ ) f1 = f2; f2 = f; f = f1 + f2; ,向前傳遞前兩項 f1 = f2 f2 = f,成立,不成立,初始化:f=f2=1,計算 f=f1+f2,遞推項:i=3,i +,數(shù)列對應(yīng)關(guān)系: f1,f2, f,遞推計算,f1=f2=1; for(i=3;i=n;i+) f=f1+f2; f1=f2; f2=f; ,35,#include int main( ) long f1, f2, f; int i; for ( ; ; ) printf (Input n=?); scanf (%d, ,36,語句中的逗號(,)運算 逗號(

18、,)運算常見的三種用途是: 在變量說明表中用來分隔變量,起分隔符的作用,如: int i, j, k, m3, *p; 在函數(shù)的參數(shù)表中分隔參數(shù)。如: printf (n=%d, x=%dn, n, x); 在語句中使用。其形式是: 表達式n1, 表達式n2; 用逗號分隔開的表達式從左到右進行計算,結(jié)果的類型和值是最右邊表達式的類型和值。,37,6.3 for語句,例:輸出下列字符串: a z b y c x d w e v f u g t h s i r j q k p l o m n 分析:奇數(shù)位上的字符從a開始逐次遞增,偶數(shù)位上的字符從z開始逐次遞減。 #include int main

19、 ( ) char i, j; /* i:奇位字符 j:偶位字符 */ for ( i=a, j=z; ij; i+, j- ) printf( %c %c, i, j); /* 輸出兩個字符 */ printf(n); ,a z b y c x d w e v f u g t h s i r j q k p l o m n,38,第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計,循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用,39,6.4 do_while語句,do_while語句格式 do 語句; while (表達式); do_while語句的執(zhí)行流程,40,6.4 do

20、_while語句,執(zhí)行語句,成立,不成立,執(zhí)行while子句之后的語句,循環(huán)控制條件,循環(huán)體,后判斷,do 語句; while(表達式);,41,6.4 do_while語句,do_while語句的特點 與 while 和 for 的區(qū)別: do_while 語句先執(zhí)行循環(huán)體然后再判斷循環(huán)控制條件;使用 do_while 構(gòu)成的循環(huán),循環(huán)體部分至少要執(zhí)行一次,使用 while 和 for 構(gòu)成的循環(huán),循環(huán)體部分有可能一次也不會執(zhí)行。 do_while語句條件表達式后面的分號不是空語句。,42,6.4 do_while語句,#include int main ( ) long n=1; int

21、i;,i=1; while (i=10) n*=i; i+; ,printf(“10!=%dn, n); ,for (i=1;i=10;i+) n*=i;,i=1; do n*=i; i+; while (i=10);,43,6.4 do_while語句,例:輸入一個=0的整數(shù),要求以相反的順序輸出。例如:輸入12345,則輸出為54321。 思路:可以從個位開始,按位輸出整數(shù)的每一位 int main( ) unsigned int num; printf (Input the number:); scanf (%d, ,簡單轉(zhuǎn)變?yōu)閣hile或for語句,程序?qū)⒉荒芴幚頂?shù)字0。,44,6.4

22、 do_while語句,例:從鍵盤輸入任意的字符,按下列規(guī)則進行分類計數(shù)。 第一類 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 第二類 +, -, *, /, %, = 第三類 其它字符 當(dāng)輸入字符 時先計數(shù)然后停止接收輸入。,45,int main( ) int class1=0, class2=0, class3=0; char ch; do putchar(ch=getch(); /*函數(shù)的嵌套調(diào)用*/ switch (ch) case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: ca

23、se 9: class1+; break; /* 對分類1計數(shù) */ case +: case -: case *: case /: case %: case =: class2+; break; /* 對分類2計數(shù) */ default: class3+; break;/*對分類3計數(shù)*/ while (ch != ); printf(class1=%d, class2=%d, class3=%dn, class1, class2, class3); ,46,循環(huán)語句小結(jié),C語言提供三種循環(huán):for、while、do_while for和while先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while

24、語句先執(zhí)行循環(huán)體后判斷循環(huán)條件; while和do-while語句的條件表達式只有 1個,for語句有3個表達式,表達式2是條件表達式; while、do-while、for可以相互替換使用; while語句多用于不需要賦初值的或循環(huán)次數(shù)不定的情況; for語句多用于要賦初值或循環(huán)次數(shù)固定的情況; do-while語句多用于至少要運行一次的循環(huán); 循環(huán)語句可串可并可嵌套,但不能交叉。,47,循環(huán)語句小結(jié),為了保證循環(huán)正常運行,應(yīng)該特別注意: 循環(huán)控制條件 控制條件的初始狀態(tài)(初始值) 循環(huán)體內(nèi)部對控制條件的影響 以上三個方面相互配合,相互影響,共同完成循環(huán)控制,48,第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計

25、,循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用,49,6.5 轉(zhuǎn)移語句,轉(zhuǎn)移語句的作用 改變程序的運行流程 C語言轉(zhuǎn)移語句 break continue goto return,50,6.5.1 break語句,格式 break; 功能 在switch語句中結(jié)束case子句,使控制轉(zhuǎn)到switch語句之外。 在循環(huán)語句的循環(huán)體中使用,結(jié)束循環(huán)過程,使控制轉(zhuǎn)移到整個循環(huán)語句之外的下一條語句處。,51,break語句的執(zhí)行流程,break,break,break,while語句,for語句,do-while語句,52,例:求555555的約數(shù)中最大的三位數(shù)

26、int main() int j; long n; printf(Please input number:); scanf(%ld, ,53,6.5.1 break語句,break語句使用注意 在嵌套循環(huán)中,break 語句僅能退出一層(當(dāng)前層)循環(huán); 若在循環(huán)語句中包含了switch 語句,那么switch 語句中的 break 語句僅能使控制退出 switch 語句; break 語句并不是程序設(shè)計中必不可少的語句,可以通過改變程序的結(jié)構(gòu)去掉。,54,6.5.2 continue語句,格式 continue; 功能 continue語句僅能在循環(huán)語句中使用:它的作用不是結(jié)束循環(huán),而是開始一

27、次新的循環(huán)。 對于for語句,將控制轉(zhuǎn)到執(zhí)行表達式3和條件測試部分; 對于while和do-while語句,將控制轉(zhuǎn)到條件測試部分; 從邏輯上講,適當(dāng)改變程序的結(jié)構(gòu)就可以不需要使用continue語句。,55,continue語句的執(zhí)行流程,continue,continue,continue,while語句,for語句,do-while語句,56,例:輸入10個整數(shù),求其中正數(shù)的個數(shù)及平均值,精確到小數(shù)點后兩位。 int main ( ) int i, count=0, j, sum=0; for ( i=1; i0 ) printf(Plus number:%d,average value

28、:%.2f, count, 1.0*sum/count); else printf(Plus number: 0, average value: 0); ,57,6.5.3 goto語句,格式goto 標(biāo)號; 功能 將程序控制轉(zhuǎn)移到標(biāo)號所指定的語句處繼續(xù)執(zhí)行。標(biāo)號的唯一功能就是作為goto語句的目標(biāo)。標(biāo)號的作用域是它所在的整個函數(shù)。,注意:為了保證程序的結(jié)構(gòu)化,不允許使用向上goto語句,58,6.5.3 goto語句,例:已知一首項大于0的等差遞增數(shù)列的前四項和為26,前四項的積為880,求這數(shù)列。 設(shè)數(shù)列的第一項為a(a0),公差為d(d0)。則該數(shù)列滿足條件: a+(a+d)+(a+2*

29、d)+(a+3*d) = 4*a+6*d = 26 a*(a+d)*(a+2*d)*(a+3*d) = 880 可以推出,首項a和公差d的取值范圍為: 1 = a =5 1 = d =3 可以使用窮舉的方法,在 首項a 和 公差d 的取值范圍內(nèi)進行判斷。,59,6.5.3 goto語句,int main( ) int a, x, y, d, i; for (a=1; a=5; +a) /* 在a的范圍內(nèi)窮舉 */ for (d=1; d=3; +d) /* 在d的范圍內(nèi)窮舉 */ x=a+(a+d)+(a+2*d)+(a+3*d); /*前四項的和*/ y=a*(a+d)*(a+2*d)*(a

30、+3*d); /*前四項的積*/ if (x=26 ,60,6.5.3 goto語句,int main( ) int a, x, y, d, i, flag=1; /* flag:標(biāo)志變量 */ for (a=1; a=5 /* 控制退出二重循環(huán) */ ,通過增加標(biāo)志變量可以有效地控制循環(huán),61,6.5.4 return語句,格式 格式1:return; 格式2:return (表達式); 功能 return語句使程序從被調(diào)用函數(shù)中返回到調(diào)用函數(shù)的調(diào)用處繼續(xù)運行; 如果return后跟一表達式,則該表達式的值會從被調(diào)用函數(shù)中帶回到調(diào)用它的函數(shù),稱為返回值。,幾個程序片段,int s=1,i=1

31、; scanf(“%d”,62,求階乘,int power(int x,int y) int pro=1; while(y-0) pro*=x; return pro; ,63,子函數(shù)power:計算x的y次方,不要用標(biāo)準(zhǔn)庫函數(shù)pow處理整型,int m=0; scanf(%d,64,求反序數(shù),例:求最大最小數(shù)的算術(shù)運算結(jié)果 用例輸入:15,1,11,2,0,3,+,= 輸出:15+0=15 如何用字符輸入形式讀入一個整數(shù)? int s=0; char ch; while(ch=getchar()!=) if(ch=0 else ,65,int a,b; char ch; scanf (“%d

32、%c%d”, 輸入 3 5 后, a為3,b為5,ch為n,66,“字符”對“%d”來講是非法輸入,但對%c是合法的,空格和n等也將不作為輸入結(jié)束標(biāo)志。,char ch; while (ch= getchar( ) != = ) putchar ( ch );,67,如何判斷“沒有任何一項匹配上”?,68,69,第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計,循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用,70,程序設(shè)計的一般步驟 分析題意,明確問題的性質(zhì) 數(shù)值問題 / 非數(shù)值問題 建立問題的描述模型 數(shù)學(xué)模型 / 過程模型 設(shè)計/確定算法 數(shù)學(xué)問題:數(shù)值分析 非數(shù)學(xué)問題:數(shù)

33、據(jù)結(jié)構(gòu) / 算法分析與設(shè)計 一般方法:窮舉 / 遞推 / 遞歸 /. 編程調(diào)試 分析運行結(jié)果,71,6.6 循環(huán)應(yīng)用,窮舉法,72,例:百錢百雞問題 中國古代數(shù)學(xué)家張丘建在他的算經(jīng)中提出了著名的“百錢百雞問題”:雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,翁、母、雛各幾何? 問題分析與算法設(shè)計 設(shè):要買x只公雞,y只母雞,z只小雞,可得到方程: x + y + z = 100 5 x + 3 y + z / 3 = 100 取值范圍:0 = x, y, z = 100,可以采用窮舉法求解:將變量 x、y、z 的所有取值可能代入方程進行計算,73,int main( ) int

34、x,y,z,j=0; for(x=0;x=100;x+) for(y=0;y=100;y+) for(z=0;z=100;z+) if (x+y+z=100 運行結(jié)果: 1: cock= 0 hen=25 chicken=75 2: cock= 3 hen=20 chicken=77 7: cock=12 hen= 4 chicken=84,74,丟失重要條件:z 應(yīng)該能夠被3整除。 int main( ) int x, y, z, j=0; for(x=0; x=20; x+) for(y=0; y=33; y+) for(z=0; z=100; z+) if(z%3=0 運行程序,正確的結(jié)

35、果: 1: cock= 0 hen=25 chicken=75 2: cock= 4 hen=18 chicken=78 3: cock= 8 hen=11 chicken=81 4: cock=12 hen= 4 chicken=84,z+=3),75,優(yōu)化程序: for(x=0; x=20; x+) for(y=0; y=33; y+) for(z=0; z=100; z+) if(z%3=0 ,76,例:新娘和新郎 問題:三對情侶參加婚禮,三個新郎為A、B、C,三個新娘為X、Y、Z。有人不知道誰和誰結(jié)婚,于是詢問了其中的三位,聽到的回答是這樣的:說他將和結(jié)婚;說她的未婚夫是;說他將和結(jié)婚

36、。這人聽后知道他們在開玩笑,全是假話。請編程找出誰將和誰結(jié)婚。 問題分析與算法設(shè)計: 設(shè):A、B、C三人用1、2、3表示,將X和A結(jié)婚表示為x=1,將Y不與A結(jié)婚表示為y!=1。則: x!=1 A不與X結(jié)婚 x!=3 X的未婚夫不是C z!=3 C不與Z結(jié)婚 題意還隱含:x!=y 且 x!=z 且 y!=z,77,int main ( ) int x, y, z; for (x=1; x=3; x+) /*窮舉X的全部可能配偶*/ for (y=1; y=3; y+) /*窮舉Y的全部可能配偶*/ for (z=1; z=3; z+) /*窮舉Z的全部可能配偶*/ if (x!=1 ,78,例

37、:設(shè)有一個正整數(shù) X,當(dāng) X 加上100后得到的數(shù) Y 是一個正整數(shù)的平方,然后用 Y 再加上68,又是另外一個正整數(shù)的平方,你能算出 X 為多少嗎? 問題分析與算法設(shè)計: 根據(jù)題目直接列方程: y = x + 100 y = m * m y + 68 = n * n 取值范圍:x0;nm10的整數(shù),79,int main ( ) int x, y, m, flag; /* flag:標(biāo)志變量 */ for ( x=0,flag=1; flag ; x+ ) /* 窮舉x */ y = 100+x; /* 計算y */ for ( m=10; m*m y; m+ ) ; if ( m*m =

38、y ) /*判斷y是否為一個數(shù)的平方*/ for ( ; m*m y+68; m+ ) ; if ( m*m = y+68 ) /* 判斷 y+68 */ printf(%dn, x); flag = 0; /* flag置0,結(jié)束循環(huán) */ ,窮舉x、m、n,80,int main ( ) int y, m, flag; for ( y=101,flag=1; flag ; y+ ) /* 窮舉y */ for ( m=10; m*m y; m+ ) ; if ( m*m = y ) for ( ; m*m y+68; m+ ) ; if ( m*m = y+68 ) printf(%dn,

39、 y-100); flag = 0; ,窮舉y、m、n,81,int main ( ) int m, n, flag; /* flag:標(biāo)志變量 */ for ( m=10,flag=1; flag; m+ ) /* 通過窮舉m,直接構(gòu)造平方數(shù)y */ for ( n=10; n*n m*m+68; n+ ) ; /* 判斷 m*m+68 是否為平方數(shù) */ if ( n*n = m*m+68 ) printf(%dn, m*m-100); flag = 0; /* flag置0,結(jié)束循環(huán) */ ,窮舉m、n,82,6.6 循環(huán)應(yīng)用,窮舉法的關(guān)鍵 判斷問題是否適合使用窮舉法 明確窮舉的終止條件

40、 窮舉的對象(變量)的范圍 注意效率減少嘗試次數(shù),83,求555555的約數(shù)中最大的三位數(shù) 求不超過n的最大素數(shù) 求首項大于0的等差數(shù)列:前四項和為26,前四項的積為880 從鍵盤上任意輸入一個正整數(shù),要求判斷該正整數(shù)是否是另一個整數(shù)的平方。 百錢百雞 新娘和新郎 其它排列組合問題 親密數(shù)、黑色星期五、求各位數(shù)字之和等于5且能被5整除的整數(shù)、馬戲團觀眾人數(shù)、求等于其各位數(shù)字的階乘之和的正整數(shù)、求滿足條件的等差數(shù)列、乒乓球比賽對陣方案,84,6.6 循環(huán)應(yīng)用,圖形問題,85,例:在一行中輸出 n 個 * 號。 例如,輸入 n=4,輸出的圖形如下: * * * *,基本語句: 輸出一個 * 號:p

41、rintf(“*”); 或 putchar(*); 基本算法: 1. 輸入 n 2. 重復(fù)輸出 n 個 *; 3. 輸出一個 n,scanf (“%d”, ,86,例:輸出邊長為 n 的正方型 例如,輸入 n=4,輸出如下圖形: * * * * * * * * * * * * * * * * 算法分析與設(shè)計: 1. 輸入 n ; 2. 重復(fù)輸出 n行,每行輸出 n 個 *; 加細一: 1. 輸入 n ; 2. for ( i=1; i=n; i+ ) 輸出一行中的 n 個 * ;,87,加細二: 1. 輸入n; 2. for ( i=1; i=n; i+ ) 輸出 n 個 * ; 換新行; 加

42、細三: 1.輸入n; 2. for ( i=1; i=n; i+ ) for ( j=1; j=n; j+ ) printf (“*”); printf(“n”) ; ,88,整理,得到程序如下: int main ( ) int m, i, j; scanf( “%d”, j+ ) /*輸出一行中的n個*號*/ printf(“*”); printf(“n”); 分析方法逐步求精法 對于比較復(fù)雜問題,不可能一下得到程序,可以先將簡單的部分明確出來,再逐步對復(fù)雜部分進行細化,一步一步推出完整程序。,89,例:輸出邊長為 n 的平行四邊形 例如,輸入 n=4,輸出如下圖形: * * * * *

43、* * * * * * * * * * *,算法分析與設(shè)計: 在正方型每行*號的前面先多輸出若干個空格。對于第 i 行,1=i=n,則應(yīng)先輸出 個空格。,n-i,90,int main ( ) int n, i, j; scanf( “%d”, j+ ) /*輸出一行中的n個*號*/ printf(“*”); printf(“n”); ,關(guān)鍵在于找出每行要輸出的空格和*的個數(shù),91,j = i,i + j = n+1,* * * * * * * * * *,* * * * * * * * * *,j 控制輸出i個*,j :i-1 個,* * * * * * * * * *,* * * * *

44、* * * * *,j :n-i+1 個*,j :n-i 個,j :n-i+1個 *,j :i 個*,j = n-i+1,92,例:輸出n行用*組成的等腰三角形 例如,輸入 n=4,輸出如下圖形:,* * * * * * * * * * * * * * * *,j = 1n-i ,j = 12i-1 * (“n”),i = 1n,i個*,i-1個*,93,例:輸出邊長為n的菱形 例如,輸入 n=4,輸出如下圖形:,* * * * * * * * * * * * * * * * * * * * * * * * *,j = 1n-i ,j = 12i-1 *,i = 1n,j = 1n-i ,j

45、= 12i-1 *,i = n-11,i = 1 2 3 4 3 2 1,94,例:輸出邊長為n的空心菱形 例如,輸入 n=4,輸出如下圖形:,* * * * * * * * * * * *,j = 1n-i ,j = 12i-1 如果j=1或2i-1 * 其它 ,i = 1n,同左,i = n-11,95,打印圖形小結(jié) int main ( ) int n, i, j; scanf(“%d”, , * * * * * * * * * * * * * * * *,特殊情況 特殊處理,96,* * * * * * * * * * * *,* * * * * * * * * * * *,97,例:

46、打印數(shù)字魔方。 例如,輸入 n=5 ,輸出的圖形如下: 1 2 3 4 5 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4 基本算法: 重復(fù)打印n行。 第 i 行的第一個數(shù)字為 i,之后依次遞增,但以 n 為模:aij = ( i + j - 2 ) % n + 1,98,int main ( ) int i, j, n; printf(Enter N:); scanf(%d, ,99,例:輸出數(shù)字陣列: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 算法分析與設(shè)計: 設(shè)法找到數(shù)字的分布規(guī)律,用循環(huán)的方式自動生成。陣列中數(shù)字按行的

47、順序依次是1,2,16。,100,#define N 4 int main() int i,j,k=1; for(i=1;i=N;i+) for(j=1;j=N;j+) printf(“%4d”, ); printf(“n”); ,在行、列輸出循環(huán)的基礎(chǔ)上加入一個自增變量,k+,101,例:輸出數(shù)字陣列: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 算法分析與設(shè)計: 用二維數(shù)組ann更簡單一些。,102,例:打印數(shù)字菱形: 4 4 3 4 4 3 2 3 4 4 3 2 1 2 3 4 4 3 2 3 4 4 3 4 4 算法分析與設(shè)計: 在實心菱形基礎(chǔ)上加入

48、一個自變量 k,103,void tri (int n,int q) int j,k=n; for(j=1;j=1;j-) printf(%-2d,+k); printf(n); ,int main() int m,i; scanf(%d, ,104,例:打印數(shù)字菱形: 1 3 6 10 15 第1行 2 5 9 14 第2行 4 8 13 7 12 11 算法分析與設(shè)計: 判斷輸出項aij與行號i和列號j之間的關(guān)系。,每行第一個數(shù)k加當(dāng)前行的行號i等于下一行第一個數(shù);,當(dāng)前數(shù)m加上該數(shù)所在行號i和列號j,等于下一個數(shù),105,int main() int i,j,n,m,k=1; scanf(“%d”, ,106,打印字符圖形小結(jié) 先考慮形狀的輸出用來控制循環(huán); 然后考慮數(shù)字或字符的分布規(guī)律按照從上到下、從左到右的打印順序,當(dāng)前位置的輸出項與行號i和列號j以及前一個輸出項之間的關(guān)系。,107,思考:打印回形方陣: 要求:從鍵盤輸入邊長n,輸出回形方陣。例如,輸入 n=5 ,n=6,輸出的圖形如

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論