




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、2021/3/90循環(huán)結(jié)構(gòu)的程序設(shè)計2021/3/91 1第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計 本章要點q 循環(huán)語句的執(zhí)行流程q 不同形式的循環(huán)控制q 多重循環(huán)問題q 簡單算法設(shè)計2021/3/92 2第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計 循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用2021/3/93 36.1 循環(huán)的基本概念 提出問題提出問題提問:從鍵盤上輸入提問:從鍵盤上輸入10個整數(shù)并求和,怎么編程?個整數(shù)并求和,怎么編程?回答:在程序中寫回答:在程序中寫10個個scanf語句,還可以寫語句,還可以寫%d%d提問:從鍵盤上輸入提問:從鍵盤上輸入500個整數(shù)并求和,怎么
2、編程?個整數(shù)并求和,怎么編程?回答:這個,嗯回答:這個,嗯? 不會讓我寫不會讓我寫500個個 以上問題的實質(zhì)是:將以上問題的實質(zhì)是:將scanf函數(shù)重復(fù)執(zhí)行函數(shù)重復(fù)執(zhí)行N遍。我們可以引出一個概念遍。我們可以引出一個概念“循環(huán)循環(huán)”,簡單而,簡單而言:言:循環(huán)循環(huán)就是不斷反復(fù)地執(zhí)行同一段程序。就是不斷反復(fù)地執(zhí)行同一段程序。?2021/3/94 46.1 循環(huán)的基本概念q 循環(huán)循環(huán) 反復(fù)執(zhí)行同一段程序,直到滿足一定反復(fù)執(zhí)行同一段程序,直到滿足一定的條件后才停止執(zhí)行該段程序。的條件后才停止執(zhí)行該段程序。q C語言中控制循環(huán)的語句語言中控制循環(huán)的語句:q whileq forq do_while202
3、1/3/95 5第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計 循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用2021/3/96 66.2 while語句一一while語句格式語句格式while (表達(dá)式表達(dá)式)語句;語句;說明:語句可是簡單語句,也可是復(fù)合語句。說明:語句可是簡單語句,也可是復(fù)合語句。二二while語句語句的執(zhí)行流程的執(zhí)行流程2021/3/97 76.2 while語句表達(dá)式表達(dá)式?執(zhí)行語句執(zhí)行語句成立成立不成立不成立執(zhí)行執(zhí)行while循環(huán)之后的語句循環(huán)之后的語句循環(huán)控制條件循環(huán)控制條件循環(huán)體循環(huán)體while (表達(dá)式表達(dá)式)語句;語句;2021/3/988
4、例:從鍵盤輸入例:從鍵盤輸入10個整數(shù),求這個整數(shù),求這10個整數(shù)之和個整數(shù)之和q程序主體:程序主體:count10?輸入輸入num成立成立不成立不成立輸出結(jié)果輸出結(jié)果total計數(shù)器計數(shù)器count=0累加器累加器total=0total += numcount+開始開始結(jié)束結(jié)束while ( count10 )count+;scanf(%d, &num);total += num;82021/3/99 9 #include int main ( ) int count,num,total; / /* * count:計數(shù)器,計數(shù)器,num:輸入的整數(shù)輸入的整數(shù) * */ / cou
5、nt=0; total=0; / /* * total:存放累加和存放累加和 * */ / while (count10) / /* * 循環(huán)控制條件循環(huán)控制條件 * */ / printf (Enter the No.%d=, count); / /* *循環(huán)體循環(huán)體* */ / scanf (%d, &num); total += num; / /* * 計算累加和計算累加和 * */ / count +; printf(Total=%dn, total);2021/3/91010 例:求例:求n的階乘的階乘n! (1=n=10)q程序主體:程序主體: while(i=n) s*=
6、i; i+; i1時時2021/3/911116.2 while語句 #include int main ( ) long s=1; / /* * s:存放累積結(jié)果存放累積結(jié)果 * */ / int i=1; / /* * i:計數(shù)器,同時是累積的對象計數(shù)器,同時是累積的對象 * */ / while (i=10) / /* * 循環(huán)控制條件循環(huán)控制條件 * */ / / /* * 循環(huán)體循環(huán)體 * */ / s*=i; / /* * 計算累積和計算累積和 * */ / i+; printf(“10!=%dn, s);以求以求10!為例為例2021/3/912126.2 while語句q 比較
7、比較total=0;count=0;while (count10) total += num; count +;s=1;i=1;while (i=10) s *= i; i +;10個數(shù)相加個數(shù)相加10個數(shù)相乘個數(shù)相乘2021/3/91313例:分析程序運行結(jié)果例:分析程序運行結(jié)果 #include int main ( ) int n=0;while ( n3 ) printf (“n is %dn”,n); n+;結(jié)果結(jié)果:程序?qū)⒉煌5拇蛴。撼绦驅(qū)⒉煌5拇蛴 皀 is 0”,直至終止程序無,直至終止程序無法正常終止的程序,稱為法正常終止的程序,稱為“死循環(huán)死循環(huán)”。結(jié)論結(jié)論:while語句
8、循環(huán)體中,一定要有能夠?qū)ρh(huán)控語句循環(huán)體中,一定要有能夠?qū)ρh(huán)控制條件產(chǎn)生影響的語句,避免出現(xiàn)制條件產(chǎn)生影響的語句,避免出現(xiàn)“死循環(huán)死循環(huán)”現(xiàn)象?,F(xiàn)象。2021/3/91414 例:求例:求1413的最后三位數(shù)。的最后三位數(shù)。問題分析:問題分析:14的的13次方已經(jīng)超次方已經(jīng)超出了計算機(jī)所能表出了計算機(jī)所能表示的整數(shù)范圍示的整數(shù)范圍乘法規(guī)律:乘積的最后乘法規(guī)律:乘積的最后三位的值只與乘數(shù)和被三位的值只與乘數(shù)和被乘數(shù)的后三位有關(guān)乘數(shù)的后三位有關(guān)C語言中最長的整數(shù)是:語言中最長的整數(shù)是:無符號長整型數(shù):無符號長整型數(shù):0 429496729510位位1410=28925465497612位位問題被
9、簡化為問題被簡化為求三位數(shù)乘法求三位數(shù)乘法2021/3/915156.2 while語句int main() int i=1,x,y,a=1; printf(Input X and Y:); scanf(%d*%d,&x,&y); while (i=y) a=a*x%1000; i+; printf(3 digits is:); printf(%dn,a%1000);Input X and Y:14*133 digits is:144Input X and Y:15*123 digits is:6252021/3/916166.2 while語句如何一次輸入多個字符或數(shù)值如何一
10、次輸入多個字符或數(shù)值例:例:將從鍵盤輸入的一行字符將從鍵盤輸入的一行字符(回車結(jié)束回車結(jié)束)復(fù)制復(fù)制到標(biāo)準(zhǔn)輸出到標(biāo)準(zhǔn)輸出(顯示器顯示器)?;仡欁址斎胼敵龊瘮?shù):回顧字符輸入輸出函數(shù):getchar():調(diào)用時,等待用戶按鍵,輸入的:調(diào)用時,等待用戶按鍵,輸入的字符存入鍵盤緩沖區(qū),直到用戶按字符存入鍵盤緩沖區(qū),直到用戶按Enter為止為止(Enter即即n也在緩沖區(qū)也在緩沖區(qū))。輸入。輸入Enter后,后,getchar從輸入流每次讀一個字符,作為其返從輸入流每次讀一個字符,作為其返回值。其它未讀的字符保留在緩沖區(qū),待下回值。其它未讀的字符保留在緩沖區(qū),待下一個一個getchar調(diào)用。調(diào)用。20
11、21/3/917176.2 while語句#include int main( ) char ch; ch = getchar( ); while ( ch != n ) putchar ( ch ); ch = getchar( ); ch!=n?顯示顯示ch成立成立不成立不成立ch=讀入一個字符讀入一個字符ch=讀入下一個字符讀入下一個字符開始開始結(jié)束結(jié)束ab13cdeab13cdeputchar(ch=getchar();putchar(getchar();2021/3/918186.2 while語句#include int main( ) char ch; while (ch= ge
12、tchar( ) != n ) putchar ( ch );一段更簡潔的程序一段更簡潔的程序2021/3/919196.2 while語句例:輸入若干整數(shù),豎排輸出,當(dāng)輸入為例:輸入若干整數(shù),豎排輸出,當(dāng)輸入為0時時程序結(jié)束。如:輸入程序結(jié)束。如:輸入13 -6 356 0 輸出:輸出:13-6356scanf():調(diào)用時,等待用戶輸入,輸入的:調(diào)用時,等待用戶輸入,輸入的內(nèi)容存入鍵盤緩沖區(qū),直到用戶按內(nèi)容存入鍵盤緩沖區(qū),直到用戶按Enter為止。為止。輸入輸入Enter后,后,scanf從輸入流每次按格式讀從輸入流每次按格式讀一個單元,作為其返回值。其它未讀的內(nèi)容一個單元,作為其返回值。其
13、它未讀的內(nèi)容保留在緩沖區(qū),待下一個保留在緩沖區(qū),待下一個scanf調(diào)用。調(diào)用。2021/3/920206.2 while語句#include int main( ) int x; scanf(“%d”,&x); while ( x ) printf (“%dn”,x); scanf(“%d”,&x); scanf()把緩沖區(qū)的內(nèi)容把緩沖區(qū)的內(nèi)容全部讀完以后,才再次全部讀完以后,才再次等待用戶從鍵盤輸入等待用戶從鍵盤輸入輸入:輸入:13 -6 356 0輸出:輸出:13 -6 356輸入:輸入:13 -6 356 0 7輸出:輸出:13 -6 356輸入:輸入:13 -6 202
14、1/3/921216.2 while語句循環(huán)嵌套循環(huán)嵌套在循環(huán)體中,又包含有循環(huán)語句。在循環(huán)體中,又包含有循環(huán)語句。whilewhile2021/3/92222例:輸出下三角形乘法九九表。例:輸出下三角形乘法九九表。 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è):行號為假設(shè):行號為i ,列號為,列號為j 則第則第i行中一共要輸出行中一共要輸出i個乘積,每一
15、項為個乘積,每一項為i*j。(1=i=9)(1=j=i)i=6j=5i*j屏幕上的字符只能從上到下逐屏幕上的字符只能從上到下逐行顯示,同一行內(nèi),只能從左行顯示,同一行內(nèi),只能從左到右逐字顯示。到右逐字顯示。222021/3/92323l顯示要求顯示要求 屏幕上的字符只能從上到下逐行顯示,同屏幕上的字符只能從上到下逐行顯示,同一行內(nèi),只能從左到右逐字顯示。一行內(nèi),只能從左到右逐字顯示。l偽代碼偽代碼(Pseudocode) while (控制顯示控制顯示n行行 ) while (控制顯示一行中的控制顯示一行中的m個字符個字符 ) 輸出一個需要的字符輸出一個需要的字符; 列計數(shù)器列計數(shù)器 j+;
16、行數(shù)計數(shù)器行數(shù)計數(shù)器 i+; 2021/3/92424 #include int main ( ) int i=1, j; /* i:行計數(shù)器行計數(shù)器 j:列計數(shù)器列計數(shù)器 */ while ( i = 9 ) /* 控制打印表頭控制打印表頭 */ printf ( %4d, i+ ); printf (n-n); i=1; while ( i= 9 ) j = 1; /* 列計數(shù)器置列計數(shù)器置1 */ while ( j = i ) /* 嵌套的二重循環(huán),輸出第嵌套的二重循環(huán),輸出第i行行 */ printf (%4d, i*j ); j +; /* 列計數(shù)器列計數(shù)器+1 */ printf
17、 (n); /* 一行輸出結(jié)束后,輸出一行輸出結(jié)束后,輸出n */ i +; /* 行計數(shù)器行計數(shù)器+1 */ 外層循環(huán)體執(zhí)行外層循環(huán)體執(zhí)行1次,內(nèi)層循環(huán)要完整執(zhí)行次,內(nèi)層循環(huán)要完整執(zhí)行1次次2021/3/92525第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計 循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用2021/3/926266.3 for語句一一for語句格式語句格式for (表達(dá)式表達(dá)式1;表達(dá)式表達(dá)式2;表達(dá)式表達(dá)式3) 語句;語句; 說明:語句可是簡單語句,也可是復(fù)合語句。說明:語句可是簡單語句,也可是復(fù)合語句。二二for語句語句的執(zhí)行流程的執(zhí)行流程2021/3
18、/92727循環(huán)初始條件循環(huán)初始條件循環(huán)控制條件循環(huán)控制條件表達(dá)式表達(dá)式2?執(zhí)行語句執(zhí)行語句成立成立不成立不成立執(zhí)行執(zhí)行for循環(huán)之后的語句循環(huán)之后的語句執(zhí)行表達(dá)式執(zhí)行表達(dá)式3執(zhí)行表達(dá)式執(zhí)行表達(dá)式1循環(huán)體循環(huán)體 for (表達(dá)式表達(dá)式1;表達(dá)式表達(dá)式2;表達(dá)式表達(dá)式3) 語句;語句;for語句等價于下列語句:語句等價于下列語句:表達(dá)式表達(dá)式1;while (表達(dá)式表達(dá)式2) 語句;語句; 表達(dá)式表達(dá)式3;2021/3/928286.3 for語句 #include int main ( ) long n=1; int i; i=1;while (i=10) n*=i; i+;printf(“1
19、0!=%dn, n); for (i=1;i=10;i+) n*=i;for語句最常用的形式:語句最常用的形式:for (初值;控制條件;增量初值;控制條件;增量) 語句;語句;2021/3/92929 例:用例:用for語句實現(xiàn)打印乘法九九表語句實現(xiàn)打印乘法九九表 #include int main ( ) int i, j; for ( i=1; i= 9; i+ ) printf ( %4d, i); printf (n-n); for ( i=1; i= 9; i+ ) for ( j=1; j=3)為求出第為求出第 N 項的值,請編寫程序。項的值,請編寫程序。 根據(jù)遞推通項公式,可用
20、根據(jù)遞推通項公式,可用遞推法遞推法編寫程編寫程序,計算第序,計算第N項的值。項的值。2021/3/933336.3 for語句遞推法遞推法 由初始的已知條件開始,先計算出第由初始的已知條件開始,先計算出第(N-1)步的結(jié)果,再利用已知的前步的結(jié)果,再利用已知的前(N-1)項結(jié)果,項結(jié)果,按遞推公式按遞推公式(或遵照遞推規(guī)則或遵照遞推規(guī)則),推出第,推出第 N 步結(jié)果。步結(jié)果。 遞推法是程序設(shè)計中最常用的方法之一,遞推法是程序設(shè)計中最常用的方法之一,使用遞推法必須有明確的遞推初始值和遞使用遞推法必須有明確的遞推初始值和遞推規(guī)則推規(guī)則(遞推公式遞推公式)。2021/3/93434程序主體程序主體f
21、 = f2 = 1;for ( i=3; i=n; i+ ) f1 = f2; f2 = f; f = f1 + f2;i = n?向前傳遞前兩項向前傳遞前兩項f1 = f2f2 = f成立成立不成立不成立初始化:初始化:f=f2=1計算計算 f=f1+f2遞推項:遞推項:i=3i +數(shù)列對應(yīng)關(guān)系:數(shù)列對應(yīng)關(guān)系: f1,f2, f遞推計算遞推計算f1=f2=1;for(i=3;i=n;i+) f=f1+f2; f1=f2; f2=f;2021/3/93535#include int main( ) long f1, f2, f; int i; for ( ; ; ) printf (Input
22、 n=?); scanf (%d,&n); if ( n = 3 ) break; / /* *退出退出for循環(huán)循環(huán)* */ / else printf (nInput n is error !n); / /* *控制輸入正確的控制輸入正確的N值值* */ / f = f2 = 1; / /* *設(shè)置遞推初始值設(shè)置遞推初始值* */ / for ( i=3; i=n; i+) / /* *用遞推法計算第用遞推法計算第N項的值項的值* */ / f1 = f2; f2 = f; f = f1 + f2; printf (No. %d is %dn, n, f);2021/3/93636
23、 語句中的逗號語句中的逗號(,)運算運算逗號逗號(,)運算常見的三種用途是:運算常見的三種用途是: 在變量說明表中用來分隔變量,起分隔符的在變量說明表中用來分隔變量,起分隔符的作用,如:作用,如:int i, j, k, m3, *p; 在函數(shù)的參數(shù)表中分隔參數(shù)。如:在函數(shù)的參數(shù)表中分隔參數(shù)。如:printf (n=%d, x=%dn, n, x); 在語句中使用。其形式是:在語句中使用。其形式是:表達(dá)式表達(dá)式n1, 表達(dá)式表達(dá)式n2; 用逗號分隔開的表達(dá)式從左到右進(jìn)行計算,用逗號分隔開的表達(dá)式從左到右進(jìn)行計算,結(jié)果的類型和值是最右邊表達(dá)式的類型和值。結(jié)果的類型和值是最右邊表達(dá)式的類型和值。2
24、021/3/937376.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ù)位上的字符從分析:奇數(shù)位上的字符從a開始逐次遞增,偶開始逐次遞增,偶數(shù)位上的字符從數(shù)位上的字符從z開始逐次遞減。開始逐次遞減。 #include int main ( ) char i, j; / /* * i:奇位字符奇位字符 j:偶位字符偶位字符 * */ / for ( i=a, j=z; ij; i+, j- ) printf( %c %c, i, j); / /* * 輸出兩個字符輸出兩個字符
25、* */ / 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 n2021/3/93838第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計 循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用2021/3/939396.4 do_while語句一一do_while語句格式語句格式do 語句語句; while (表達(dá)式表達(dá)式);二二do_while語句語句的執(zhí)行流程的執(zhí)行流程2021/3/940406.4 do_while語句表達(dá)式表達(dá)式?執(zhí)行語句執(zhí)行語句成立成立不成立不成立執(zhí)行執(zhí)行while子句之后的語句子句之后
26、的語句循環(huán)控制條件循環(huán)控制條件循環(huán)體循環(huán)體后判斷后判斷do 語句語句; while(表達(dá)式表達(dá)式);2021/3/941416.4 do_while語句do_while語句的特點語句的特點與與 while 和和 for 的區(qū)別:的區(qū)別: do_while 語句語句先執(zhí)行循環(huán)體先執(zhí)行循環(huán)體然后然后再再判斷判斷循環(huán)循環(huán)控制條件控制條件;使用;使用 do_while 構(gòu)構(gòu)成的循環(huán),循環(huán)體部分成的循環(huán),循環(huán)體部分至少要執(zhí)行一次至少要執(zhí)行一次,使用使用 while 和和 for 構(gòu)成的循環(huán),循環(huán)體構(gòu)成的循環(huán),循環(huán)體部分有可能一次也不會執(zhí)行。部分有可能一次也不會執(zhí)行。 do_while語句條件表達(dá)式后面的
27、分號語句條件表達(dá)式后面的分號不是空語句。不是空語句。2021/3/942426.4 do_while語句 #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;i=1;do n*=i; i+;while (i=0的整數(shù),要求以相反的順序的整數(shù),要求以相反的順序輸出。例如:輸入輸出。例如:輸入12345,則輸出為,則輸出為54321。 思路:可以從個位開始,按位輸出整數(shù)的每一位思路:可以從個位開始,按位輸出整數(shù)的每一位 int ma
28、in( ) unsigned int num; printf (Input the number:); scanf (%d, &num); do printf(%d, num%10); num /= 10; / /* *num縮小縮小10倍倍* */ / while ( num != 0 );簡單轉(zhuǎn)變?yōu)楹唵无D(zhuǎn)變?yōu)閣hile或或for語句,程序?qū)⒉徽Z句,程序?qū)⒉荒芴幚頂?shù)字能處理數(shù)字0。2021/3/944446.4 do_while語句 例:從鍵盤輸入任意的字符,按下列規(guī)例:從鍵盤輸入任意的字符,按下列規(guī)則進(jìn)行分類計數(shù)。則進(jìn)行分類計數(shù)。第一類第一類 0, 1, 2, 3, 4, 5, 6
29、, 7, 8, 9第二類第二類 +, -, *, /, %, =第三類第三類 其它字符其它字符當(dāng)輸入字符當(dāng)輸入字符 時時先計數(shù)然后停止先計數(shù)然后停止接收輸入。接收輸入。2021/3/94545int main( ) int class1=0, class2=0, class3=0; char ch; do putchar(ch=getch(); / /* *函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用* */ / switch (ch) case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: class1+
30、; break; / /* * 對分類對分類1計數(shù)計數(shù) * */ / case +: case -: case *: case /: case %: case =: class2+; break; / /* * 對分類對分類2計數(shù)計數(shù) * */ / default: class3+; break;/ /* *對分類對分類3計數(shù)計數(shù)* */ / while (ch != ); printf(class1=%d, class2=%d, class3=%dn, class1, class2, class3);2021/3/94646循環(huán)語句小結(jié)C語言提供三種循環(huán):語言提供三種循環(huán):for、while
31、、do_while for和和while先判斷循環(huán)條件后執(zhí)行循環(huán)體,先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語句先執(zhí)行循環(huán)體后判斷循環(huán)條件;語句先執(zhí)行循環(huán)體后判斷循環(huán)條件; while和和do-while語句的條件表達(dá)式只有語句的條件表達(dá)式只有 1個,個,for語句有語句有3個表達(dá)式,表達(dá)式個表達(dá)式,表達(dá)式2是條件表達(dá)式;是條件表達(dá)式; while、do-while、for可以相互替換使用;可以相互替換使用; while語句多用于語句多用于不需要賦初值不需要賦初值的或的或循環(huán)次數(shù)不定循環(huán)次數(shù)不定的情況;的情況; for語句多用于語句多用于要賦初值要賦初值或或循環(huán)次數(shù)固定循環(huán)次數(shù)固定的情況;
32、的情況; do-while語句多用于語句多用于至少要運行一次至少要運行一次的循環(huán);的循環(huán);1.循環(huán)語句可串可并可嵌套,但不能交叉。循環(huán)語句可串可并可嵌套,但不能交叉。2021/3/94747循環(huán)語句小結(jié) 為了保證循環(huán)正常運行,應(yīng)該特別注意:為了保證循環(huán)正常運行,應(yīng)該特別注意:q循環(huán)控制條件循環(huán)控制條件q控制條件的初始狀態(tài)控制條件的初始狀態(tài)(初始值初始值)q循環(huán)體內(nèi)部對控制條件的影響循環(huán)體內(nèi)部對控制條件的影響 以上三個方面相互配合,相互影響,共同以上三個方面相互配合,相互影響,共同完成循環(huán)控制完成循環(huán)控制2021/3/94848第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計 循環(huán)的基本概念 while語句 for語
33、句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用2021/3/949496.5 轉(zhuǎn)移語句一一轉(zhuǎn)移語句的作用轉(zhuǎn)移語句的作用改變程序的運行流程改變程序的運行流程C語言轉(zhuǎn)移語句語言轉(zhuǎn)移語句qbreakqcontinueqgoto二二return2021/3/950506.5.1 break語句一一格式格式break;功能功能q在在switch語句中結(jié)束語句中結(jié)束case子句,使控制轉(zhuǎn)到子句,使控制轉(zhuǎn)到switch語句之外。語句之外。二二在循環(huán)語句的循環(huán)體中使用,結(jié)束循環(huán)過程,在循環(huán)語句的循環(huán)體中使用,結(jié)束循環(huán)過程,使控制轉(zhuǎn)移到整個循環(huán)語句之外的下一條語使控制轉(zhuǎn)移到整個循環(huán)語句之外的下一條語句處。句處。2
34、021/3/95151break語句的執(zhí)行流程語句的執(zhí)行流程表達(dá)式表達(dá)式?成立成立不成立不成立后續(xù)語句后續(xù)語句break表達(dá)式表達(dá)式2?成立成立不成立不成立后續(xù)語句后續(xù)語句執(zhí)行表達(dá)式執(zhí)行表達(dá)式3執(zhí)行表達(dá)式執(zhí)行表達(dá)式1break表達(dá)式表達(dá)式?成立成立不成立不成立后續(xù)語句后續(xù)語句breakwhile語句語句for語句語句do-while語句語句2021/3/95252 例:例:求求555555的約數(shù)中最大的三位數(shù)的約數(shù)中最大的三位數(shù)int main() int j; long n; printf(Please input number:); scanf(%ld, &n); / /* *所求
35、的約數(shù)的可能取值是從所求的約數(shù)的可能取值是從999到到100,j從大到小從大到小* */ / for (j=999; j=100; j-) if ( n%j=0 ) / /* * 若能被若能被j整除,則整除,則j是約數(shù)是約數(shù) * */ / printf(3 digits in %ld=%dn, n, j ); break; / /* * 控制退出循環(huán)控制退出循環(huán) * */ / return 0;2021/3/953536.5.1 break語句break語句使用注意語句使用注意q 在嵌套循環(huán)中,在嵌套循環(huán)中,break 語句僅能退出語句僅能退出一層一層(當(dāng)當(dāng)前層前層)循環(huán);循環(huán);q 若在循環(huán)語
36、句中包含了若在循環(huán)語句中包含了switch 語句,那么語句,那么switch 語句中的語句中的 break 語句僅能使控制退語句僅能使控制退出出 switch 語句;語句;q break 語句并不是程序設(shè)計中必不可少的語語句并不是程序設(shè)計中必不可少的語句,可以通過改變程序的結(jié)構(gòu)去掉。句,可以通過改變程序的結(jié)構(gòu)去掉。2021/3/954546.5.2 continue語句一一格式格式 continue;功能功能 continue語句僅能在循環(huán)語句中使用:它的作語句僅能在循環(huán)語句中使用:它的作用不是結(jié)束循環(huán),而是開始一次新的循環(huán)。用不是結(jié)束循環(huán),而是開始一次新的循環(huán)。q 對于對于for語句,將控制
37、轉(zhuǎn)到執(zhí)行表達(dá)式語句,將控制轉(zhuǎn)到執(zhí)行表達(dá)式3和條和條件測試部分;件測試部分;q 對于對于while和和do-while語句,將控制轉(zhuǎn)到條件語句,將控制轉(zhuǎn)到條件測試部分;測試部分;二二從邏輯上講,適當(dāng)改變程序的結(jié)構(gòu)就可以不從邏輯上講,適當(dāng)改變程序的結(jié)構(gòu)就可以不需要使用需要使用continue語句。語句。2021/3/95555continue語句的執(zhí)行流程語句的執(zhí)行流程表達(dá)式表達(dá)式?成立成立不成立不成立后續(xù)語句后續(xù)語句continue表達(dá)式表達(dá)式2?成立成立不成立不成立后續(xù)語句后續(xù)語句執(zhí)行表達(dá)式執(zhí)行表達(dá)式3執(zhí)行表達(dá)式執(zhí)行表達(dá)式1continue表達(dá)式表達(dá)式?成立成立不成立不成立后續(xù)語句后續(xù)語句co
38、ntinuewhile語句語句for語句語句do-while語句語句2021/3/95656例:例:輸入輸入10個整數(shù),求其中正數(shù)的個數(shù)及平個整數(shù),求其中正數(shù)的個數(shù)及平均值,精確到小數(shù)點后兩位。均值,精確到小數(shù)點后兩位。 int main ( ) int i, count=0, j, sum=0; for ( i=1; i=10; i+) printf(Input integer:); scanf(%d, &j); if ( j 0 ) printf(Plus number:%d,average value:%.2f, count, 1.0*sum/count); else print
39、f(Plus number: 0, average value: 0);2021/3/957576.5.3 goto語句一一格式格式goto 標(biāo)號標(biāo)號;功能功能 將程序控制轉(zhuǎn)移到標(biāo)號所指定的語句處將程序控制轉(zhuǎn)移到標(biāo)號所指定的語句處繼續(xù)執(zhí)行。標(biāo)號的唯一功能就是作為繼續(xù)執(zhí)行。標(biāo)號的唯一功能就是作為goto語句的目標(biāo)。標(biāo)號的作用域是它所在的整語句的目標(biāo)。標(biāo)號的作用域是它所在的整個函數(shù)。個函數(shù)。注意:為了保證程序的結(jié)構(gòu)化,注意:為了保證程序的結(jié)構(gòu)化,不允許使用向上不允許使用向上goto語句語句2021/3/958586.5.3 goto語句例:已知一首項大于例:已知一首項大于0的等差遞增數(shù)列的前四的等
40、差遞增數(shù)列的前四項和為項和為26,前四項的積為,前四項的積為880,求這數(shù)列。,求這數(shù)列。 設(shè)數(shù)列的第一項為設(shè)數(shù)列的第一項為a(a0),公差為,公差為d(d0)。則該數(shù)列滿足條件:則該數(shù)列滿足條件: a+(a+d)+(a+2*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)進(jìn)行判斷。的取值范圍內(nèi)進(jìn)行判斷。2021/3/959596.5.
41、3 goto語句int main( ) int a, x, y, d, i; for (a=1; a=5; +a) / /* * 在在a的范圍內(nèi)窮舉的范圍內(nèi)窮舉 * */ / for (d=1; d=3; +d) / /* * 在在d的范圍內(nèi)窮舉的范圍內(nèi)窮舉 * */ / x=a+(a+d)+(a+2*d)+(a+3*d); / /* *前四項的和前四項的和* */ / y=a*(a+d)*(a+2*d)*(a+3*d); / /* *前四項的積前四項的積* */ / if (x=26 & y=880 ) / /* *若滿足條件若滿足條件* */ / goto out; / /* *
42、退出二重循環(huán)退出二重循環(huán) * */ / out: / /* * 語句標(biāo)號語句標(biāo)號 * */ / for (i=0; i=20; +i) / /* * 輸出運行結(jié)果輸出運行結(jié)果 * */ / printf(%d, a+i*d);2021/3/960606.5.3 goto語句int main( ) int a, x, y, d, i, flag=1; / /* * flag:標(biāo)志變量:標(biāo)志變量 * */ / for (a=1; a=5 & flag; +a) / /* *flag!=0是進(jìn)行循環(huán)是進(jìn)行循環(huán)* */ / for (d=1; d=3 & flag; +d) x=a+(
43、a+d)+(a+2*d)+(a+3*d); / /* *前四項的和前四項的和* */ / y=a*(a+d)*(a+2*d)*(a+3*d); / /* * 前四項的積前四項的積* */ / if (x=26 & y=880) / /* * 若滿足條件若滿足條件 * */ / for (i=0; i=20; +i) / /* * 輸出結(jié)果輸出結(jié)果 * */ / printf(%d, a+i*d); flag = 0; / /* * 控制退出二重循環(huán)控制退出二重循環(huán) * */ / 通過增加標(biāo)志變量可以有效地控制循環(huán)通過增加標(biāo)志變量可以有效地控制循環(huán)2021/3/961616.5.4 re
44、turn語句一一格式格式q 格式格式1:return;q 格式格式2:return (表達(dá)式表達(dá)式);功能功能qreturn語句使程序從被調(diào)用函數(shù)中返回到調(diào)語句使程序從被調(diào)用函數(shù)中返回到調(diào)用函數(shù)的調(diào)用處繼續(xù)運行;用函數(shù)的調(diào)用處繼續(xù)運行;二二如果如果return后跟一表達(dá)式,則該表達(dá)式的值后跟一表達(dá)式,則該表達(dá)式的值會從被調(diào)用函數(shù)中帶回到調(diào)用它的函數(shù),稱會從被調(diào)用函數(shù)中帶回到調(diào)用它的函數(shù),稱為返回值。為返回值。2021/3/962幾個程序片段int s=1,i=1;scanf(“%d”,&n);while(i0) pro*=x; return pro;63子函數(shù)子函數(shù)power:計算計算
45、x的的y次方次方不要用標(biāo)準(zhǔn)庫函數(shù)不要用標(biāo)準(zhǔn)庫函數(shù)pow處理整型處理整型2021/3/964int m=0; scanf(%d,&n);do m=m*10+n%10; n/=10; while(n!=0);64求反序數(shù)求反序數(shù)2021/3/965例:求最大最小數(shù)的算術(shù)運算結(jié)果例:求最大最小數(shù)的算術(shù)運算結(jié)果用例輸入:用例輸入:15,1,11,2,0,3,+,= 輸出:輸出:15+0=15 如何用字符輸入形式讀入一個整數(shù)?如何用字符輸入形式讀入一個整數(shù)? int s=0; char ch; while(ch=getchar()!=) if(ch=0&ch=9) s=s*10+ch-0
46、; else 652021/3/966int a,b;char ch;scanf (“%d%c%d”,&a,&ch,&b); scanf (“%c”,&ch); 輸入輸入 3 5 后,后,a為為3,b為為5,ch為為n66“字符字符”對對“%d”來講是非法輸入,但對來講是非法輸入,但對%c是合是合法的,空格和法的,空格和n等也將不作為輸入結(jié)束標(biāo)志。等也將不作為輸入結(jié)束標(biāo)志。2021/3/967char ch;while (ch= getchar( ) != = ) putchar ( ch );672021/3/968如何判斷如何判斷“沒有任何一項匹配上沒有任何
47、一項匹配上”?682021/3/96969第6章 循環(huán)結(jié)構(gòu)的程序設(shè)計 循環(huán)的基本概念 while語句 for語句 do_while語句 轉(zhuǎn)移語句 循環(huán)應(yīng)用2021/3/97070程序設(shè)計的一般步驟程序設(shè)計的一般步驟q 分析題意分析題意,明確問題的性質(zhì)明確問題的性質(zhì) 數(shù)值問題數(shù)值問題 / 非數(shù)值問題非數(shù)值問題q 建立問題的描述模型建立問題的描述模型 數(shù)學(xué)模型數(shù)學(xué)模型 / 過程模型過程模型q 設(shè)計設(shè)計/確定算法確定算法l數(shù)學(xué)問題:數(shù)值分析數(shù)學(xué)問題:數(shù)值分析l非數(shù)學(xué)問題:數(shù)據(jù)結(jié)構(gòu)非數(shù)學(xué)問題:數(shù)據(jù)結(jié)構(gòu) / 算法分析與設(shè)計算法分析與設(shè)計 一般方法:一般方法:窮舉窮舉 / 遞推遞推 / 遞歸遞歸 /.q
48、編程調(diào)試編程調(diào)試1. 分析運行結(jié)果分析運行結(jié)果2021/3/971716.6 循環(huán)應(yīng)用一一窮舉法窮舉法2021/3/97272例:百錢百雞問題例:百錢百雞問題 中國古代數(shù)學(xué)家張丘建在他中國古代數(shù)學(xué)家張丘建在他的算經(jīng)中提出了著名的的算經(jīng)中提出了著名的“百錢百雞問題百錢百雞問題”:雞雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,翁、母、雛各幾何一;百錢買百雞,翁、母、雛各幾何? 問題分析與算法設(shè)計問題分析與算法設(shè)計 設(shè):要買設(shè):要買x只公雞,只公雞,y只母雞,只母雞,z只小雞,可得只小雞,可得到方程到方程: x + y + z = 100 5
49、 x + 3 y + z / 3 = 100 取值范圍:取值范圍:0 = x, y, z = 100 可以采用窮舉法求解:將變量可以采用窮舉法求解:將變量 x、y、z 的所有的所有取值可能代入方程進(jìn)行計算取值可能代入方程進(jìn)行計算2021/3/97373int main( ) int 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 & 5*x+3*y+z/3=100) printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j,x,y,z);z=10
50、0滿足方滿足方程?程?Y N輸出輸出z+z = 0y=100y+y = 0 x=100 x+x = 0開始開始結(jié)束結(jié)束2021/3/97474丟失重要條件:丟失重要條件:z 應(yīng)該能夠被應(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&x+y+z=100&5*x+3*y+z/3=100) printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j,x,y,z) ;運行程序,正確的結(jié)果:
51、運行程序,正確的結(jié)果: 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=84z+=3)2021/3/97575優(yōu)化程序:優(yōu)化程序:for(x=0; x=20; x+) for(y=0; y=33; y+) for(z=0; z=100; z+) if(z%3=0&x+y+z=100 & 5*x+3*y+z/3=100) printf(%2d:cock=%2d hen=%2d chicken=%2dn,
52、+j,x,y,z);再優(yōu)化:再優(yōu)化:for(x=0; x=20; x+) for(y=0; y=(100-5*x)/3; y+) z=100-x-y; if( z%3=0 & 5*x+3*y+z/3=100) printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j,x,y,z); 2021/3/97676例:新娘和新郎例:新娘和新郎問題:問題:三對情侶參加婚禮,三個新郎為三對情侶參加婚禮,三個新郎為A、B、C,三個,三個新娘為新娘為X、Y、Z。有人不知道誰和誰結(jié)婚,于是詢問了。有人不知道誰和誰結(jié)婚,于是詢問了其中的三位,聽到的回答是這樣的:其中的三位,
53、聽到的回答是這樣的:說他將和結(jié)婚;說他將和結(jié)婚;說她的未婚夫是;說他將和結(jié)婚。說她的未婚夫是;說他將和結(jié)婚。這人聽后知這人聽后知道他們在開玩笑,道他們在開玩笑,全是假話全是假話。請編程找出誰將和誰結(jié)婚。請編程找出誰將和誰結(jié)婚。問題分析與算法設(shè)計:問題分析與算法設(shè)計: 設(shè):設(shè):A、B、C三人用三人用1、2、3表示,將表示,將X和和A結(jié)婚表示結(jié)婚表示為為x=1,將,將Y不與不與A結(jié)婚表示為結(jié)婚表示為y!=1。則:。則: x!=1 A不與不與X結(jié)婚結(jié)婚 x!=3 X的未婚夫不是的未婚夫不是C z!=3 C不與不與Z結(jié)婚結(jié)婚題意還隱含:題意還隱含:x!=y 且且 x!=z 且且 y!=z2021/3/
54、97777int main ( ) int x, y, z; for (x=1; x=3; x+) / /* *窮舉窮舉X的全部可能配偶的全部可能配偶* */ / for (y=1; y=3; y+) / /* *窮舉窮舉Y的全部可能配偶的全部可能配偶* */ / for (z=1; z0;nm10的整數(shù)的整數(shù)2021/3/97979int main ( ) int x, y, m, flag; / /* * flag:標(biāo)志變量:標(biāo)志變量 * */ / for ( x=0,flag=1; flag ; x+ ) / /* * 窮舉窮舉x * */ / y = 100+x; / /* * 計算計
55、算y * */ / for ( m=10; m*m y; m+ ) ; if ( m*m = y ) / /* *判斷判斷y是否為一個數(shù)的平方是否為一個數(shù)的平方* */ / for ( ; m*m y+68; m+ ) ; if ( m*m = y+68 ) / /* * 判斷判斷 y+68 * */ / printf(%dn, x); flag = 0; / /* * flag置置0,結(jié)束循環(huán),結(jié)束循環(huán) * */ / 窮舉窮舉x、m、n2021/3/98080int main ( ) int y, m, flag; for ( y=101,flag=1; flag ; y+ ) / /* *
56、 窮舉窮舉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, y-100); flag = 0; 窮舉窮舉y、m、n2021/3/98181int main ( ) int m, n, flag; / /* * flag:標(biāo)志變量:標(biāo)志變量 * */ / for ( m=10,flag=1; flag; m+ ) / /* * 通過窮舉通過窮舉m,直接構(gòu)造平方數(shù),直接構(gòu)造平方數(shù)y * */ / for ( n=10; n*n 0) pri
57、ntf (“* *”); n-;printf (“n”);2021/3/98686例:輸出邊長為例:輸出邊長為 n 的正方型的正方型 例如,輸入例如,輸入 n=4,輸出如下圖形:,輸出如下圖形:* * * * * * * * * * * * * * * * * * * * * * * * * * * * *算法分析與設(shè)計:算法分析與設(shè)計:1. 輸入輸入 n ;2. 重復(fù)輸出重復(fù)輸出 n行,每行輸出行,每行輸出 n 個個 * *;加細(xì)一:加細(xì)一:1. 輸入輸入 n ;2. for ( i=1; i=n; i+ ) 輸出一行中的輸出一行中的 n 個個 * * ;2021/3/98787加細(xì)二:加細(xì)
58、二:1. 輸入輸入n;2. for ( i=1; i=n; i+ )輸出輸出 n 個個 * * ;換新行換新行;加細(xì)三:加細(xì)三:1.輸入輸入n;2. for ( i=1; i=n; i+ )for ( j=1; j=n; j+ ) printf (“* *”);printf(“n”) ;2021/3/98888l整理,得到程序如下:整理,得到程序如下:int main ( ) int m, i, j; scanf( “%d”, &n ); for ( i=1; i=n; i+ ) / /* * 控制輸出控制輸出n行行 * */ / for ( j=1; j=n; j+ ) / /* *
59、輸出一行中的輸出一行中的n個個* *號號* */ / printf(“* *”); printf(“n”); 分析方法分析方法逐步求精法逐步求精法 對于比較復(fù)雜問題,不可能一下得到程序,對于比較復(fù)雜問題,不可能一下得到程序,可以先將簡單的部分明確出來,再逐步對復(fù)雜可以先將簡單的部分明確出來,再逐步對復(fù)雜部分進(jìn)行細(xì)化,一步一步推出完整程序。部分進(jìn)行細(xì)化,一步一步推出完整程序。2021/3/98989例:輸出邊長為例:輸出邊長為 n 的平行四邊形的平行四邊形 例如,輸入例如,輸入 n=4,輸出如下圖形:,輸出如下圖形: * * * * * * * * * * * * * * * * * * * *
60、 * * * * * * * * * * * * 算法分析與設(shè)計:算法分析與設(shè)計: 在正方型每行在正方型每行* *號的前面先多輸出若干個空格。號的前面先多輸出若干個空格。對于第對于第 i 行,行,1=i=n,則應(yīng)先輸出,則應(yīng)先輸出 個空格。個空格。 n-i2021/3/99090int main ( ) int n, i, j; scanf( “%d”, &n ); for ( i=1; i=n; i+ ) / /* * 控制輸出控制輸出 n 行行 * */ / for ( j=1; j=n-i; j+) / /* *控制輸出控制輸出n-i個空格個空格* */ / printf(“ ”); for ( j=1; j=n; j+ ) / /* *輸出一行中的輸出一行中的n個個* *號號* */ / printf(“* *”); printf(“n”); 關(guān)鍵在于找出每行要關(guā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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)品質(zhì)量檢測合格證明書(8篇)
- 全國地理競賽試題及答案
- 人力資源行業(yè)特別聲明與工作證明(6篇)
- ??途W(wǎng)java面試題及答案咋樣
- 環(huán)保題庫考試題及答案
- 考核校長面試題及答案
- fod考試題及答案
- 茶藝師考試題及答案
- 弱電智能化工程合同
- 員工在職表現(xiàn)及崗位變動證明(7篇)
- 護(hù)理網(wǎng)格化管理制度
- 浙江省溫州市樂清市2023-2024學(xué)年四年級下學(xué)期數(shù)學(xué)期末考試試卷(含答案)
- 2025中考英語書面表達(dá)終極押題(附范文)
- 2025年高考真題-數(shù)學(xué)(全國一卷) 無答案
- 2025《政務(wù)數(shù)據(jù)共享條例》解讀課件
- 國開電大《公司金融》形考任務(wù)1234答案
- 江蘇省鎮(zhèn)江市江南中學(xué)2025屆七下數(shù)學(xué)期末調(diào)研試題含解析
- 安徽省歷年中考作文題與審題指導(dǎo)(2015-2024)
- 2025年北京市豐臺區(qū)九年級初三二模英語試卷(含答案)
- 設(shè)定目標(biāo)的2025年稅法考試試題及答案
- Unit 7 A Day to Remember 單元話題閱讀理解練習(xí)(原卷版)
評論
0/150
提交評論