版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C語言程序設計(第2版)第1頁,共139頁。第五章循環(huán)結構程序設計第2頁,共139頁。 本章要點 循環(huán)的基本概念 不同形式的循環(huán)控制 多重循環(huán)問題 第3頁,共139頁。5.1程序中需要用循環(huán)結構5.2用while語句和do-while語句實現(xiàn)循環(huán)5.3用for 語句實現(xiàn)循環(huán) 5.4循環(huán)的嵌套5.5用break語句和continue語句改變循環(huán)狀態(tài)5.6幾種循環(huán)的比較5.7程序舉例5.8提高部分 主要內(nèi)容第4頁,共139頁。 5.1 程序中需要用循環(huán)結構什么是循環(huán)?為什么要使用循環(huán)?問題1:問題2:求學生平均成績 分數(shù)相加后除以課數(shù)在許多問題中需要用到循環(huán)控制。循環(huán)結構就是用來處理需要重復處理的
2、問題的,所以又稱重復結構。它和順序結構、選擇結構共同作為各種復雜程序的基本構造單元。循環(huán)分為兩種:無休止循環(huán)和有終止循環(huán)構成有效循環(huán)的條件:循環(huán)體和循環(huán)結束條件第5頁,共139頁。5.2 用while語句和do-while語句實現(xiàn)循環(huán) 5.2.1 用while語句實現(xiàn)循環(huán)while語句用來實現(xiàn)“當型”循環(huán)結構一般形式: while (表達式) 語句 當表達式為非0值時,執(zhí)行while語句中的內(nèi)嵌語句。其特點是:先判斷表達式,后執(zhí)行循環(huán)體,即內(nèi)嵌語句。第6頁,共139頁。例題 5.1求1+2+3+100的和解題思路(1)開始時使sum的值為0,被加數(shù)i第一次取值為1。開始進入循環(huán)結構。(2)判別
3、“i100”條件是否滿足,由于i小于100,因此“i100”的值為真。所以應當執(zhí)行其下面矩形框中的操作。(3)執(zhí)行sum=sum+i,此時sum的值變?yōu)?了,然后使i的值加1,i的值變?yōu)?了,這是為下一次加2作準備。流程返回菱形框。(4)再次檢查“i100”條件是否滿足,由于i的值為2,小于100,因此“i100”的值仍為真,所以應執(zhí)行其下面矩形框中的操作。(5)執(zhí)行sum=sum+i,由于sum的值已變?yōu)?,i的值已變?yōu)?,因此執(zhí)行sum=sum+i后sum的值變?yōu)?。再使i的值加1,i的值變?yōu)?。流程再返回菱形框。(6)再次檢查“i100”條件是否滿足,如此反復執(zhí)行矩形框中的操作,直到i的
4、值變成了100,把i加到sum中,然后i又加1變成101了。當再次返回菱形框檢查“i100”條件時,由于I已是101,大于100,“i100” 的值為假,不再執(zhí)行矩形框中的操作,循環(huán)結構結束。5.2 用while語句和do-while語句實現(xiàn)循環(huán) 第7頁,共139頁。#include void main() int i,sum=0;/* sum是用來存放累加和的變量 */ /* 初值為0 */ i=1; while (i=100)/* 當I小于或等于100時 */* 執(zhí)行下面花括號中的復合語句 */ sum=sum+i;/* 將i的當前值累加到變量sum中 */ i+;/* 使i的值加1 */
5、 printf(%dn,sum); 說明:(1)循環(huán)體如果包含一個以上的語句,應該用花括號括起來,以復合語句形式出現(xiàn).(2)在循環(huán)體中應有使循環(huán)趨向于結束的語句。運行結果: 5050編寫程序5.2 用while語句和do-while語句實現(xiàn)循環(huán) 第8頁,共139頁。5.2 用while語句和do-while語句實現(xiàn)循環(huán) 5.2.2 用do-while語句實現(xiàn)循環(huán) do-while語句的特點:先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。執(zhí)行過程:先執(zhí)行一次指定的循環(huán)體語句,然后判別“表達式”,當表達式的值為非0(“真”) 時,返回重新執(zhí)行循環(huán)體語句,如此反復,直到表達式的值等于0 (“假”)為止,此
6、時循環(huán)結束。while語句和do-while語句的關系:同一個問題既可以用while循環(huán)處理,也可以用do-while循環(huán)來處理。二者是可以互相轉換的。一般形式: do 循環(huán)體語句 while(表達式);第9頁,共139頁。例題 5.2 求1+2+3+100的和#include void main() int i,sum=0; i=1; do /* 在循環(huán)開始時不檢查條件,先執(zhí)行一次循環(huán)體 */ sum=sum+i; i+; while(i=100); printf(%dn,sum); 運行結果: 5050說明:可以看到,結果和例5.1完全相同。編寫程序5.2 用while語句和do-whil
7、e語句實現(xiàn)循環(huán) 第10頁,共139頁。例題 5.3 募集慈善基金10000元,有若干人捐款,每輸入一個人的捐款數(shù)后,計算機就輸出當時的捐款總和。當某一次輸入捐款數(shù)后,總和達到或超過10000元時,即宣告結束,輸出最后的累加值。解題思路解此題的思路是設計一個循環(huán)結構,在其中輸入捐款數(shù),求出累加值,然后檢查此時的累加值是否達到或超過預定值,如果達到了,就結束循環(huán)操作。5.2 用while語句和do-while語句實現(xiàn)循環(huán) 第11頁,共139頁。#include void main() float amount,sum=0; /*變量sum用來存放累加和*/ do scanf(%f,&amount)
8、;/*輸入一個捐款金額*/ sum=sum+amount; /*求出當前的累加和*/ while(sum10000);/*如未達10000元繼續(xù)循環(huán)*/ printf(sum=%9.2fn,sum);運行結果:1000 (輸入捐款額)18501500260025001200sun= 10650.00說明:設計循環(huán)結構,要考慮兩個問題:一是循環(huán)體,二是循環(huán)結束條件。注意while循環(huán)中判斷的條件是循環(huán)繼續(xù)的條件,而不是結束條件。5.2 用while語句和do-while語句實現(xiàn)循環(huán) 編寫程序第12頁,共139頁。5.3 用for語句實現(xiàn)循環(huán)5.3.1 for語句的一般形式和執(zhí)行過程C語言中的fo
9、r語句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結束條件的情況,它完全可以代替while語句。一般形式: for(表達式1;表達式2;表達式3) 語句第13頁,共139頁。5.3 用for語句實現(xiàn)循環(huán)5.3.1 for語句的一般形式和執(zhí)行過程 for語句的執(zhí)行過程: (1) 先求解表達式1。 (2) 求解表達式2,若其值為真(值為非0),則執(zhí) 行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下 面第(3)步。若為假(值為0),則結束循環(huán), 轉到第(5)步。 (3) 求解表達式3。 (4) 轉回上面第(2)步驟繼續(xù)執(zhí)行。 (5) 循環(huán)結束,執(zhí)行for語句下面的
10、一個語句。第14頁,共139頁。for語句最簡單的形式:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值) 例如: for(i=1;i=100;i+) sum=sum+i;相當于: i=1; while(i=100) sum=sum+i;i+; 5.3 用for語句實現(xiàn)循環(huán)5.3.1 for語句的一般形式和執(zhí)行過程第15頁,共139頁。5.3 用for語句實現(xiàn)循環(huán)5.3.2 for循環(huán)程序舉例 國王的小麥。相傳古代印度國王舍罕要褒賞他的聰明能干的宰相達依爾(國際象棋的發(fā)明者),國王問他要什么?達依爾回答說:“國王只要在國際象棋的棋盤第1個格子中放1粒麥子,第2個格子中放2粒麥子,第3個格子中放4
11、粒麥子,以后按此比例每一格加一倍,一直放到第64格(國際象棋的棋盤8*8=64格),我感恩不盡,其他什么都不要了?!眹跸耄@有多少!還不容易!讓人扛來一袋小麥,但不到一會兒全用沒了,再來一袋很快又用完了。結果全印度的糧食全部用完還不夠。國王納悶,怎樣也算不清這筆賬。現(xiàn)在我們用計算機來算一下。例題 5.4第16頁,共139頁。解題思路麥子的總粒數(shù)是:分別計算出每一格的麥子粒數(shù),把它們加起來,就得到總粒數(shù)。據(jù)估算,1 小麥約有1.42 粒,可以計算出小麥的體積??梢杂胒or語句實現(xiàn)循環(huán)。5.3 用for語句實現(xiàn)循環(huán)第17頁,共139頁。#include void main() double p=
12、1, t=1, v; int i; for(i=1; i64; i+) /* 執(zhí)行63次循環(huán) */ p = p * 2; /* p是當前一個格子中的麥子粒數(shù) */ t = t + p; /* t是當前麥子總粒數(shù) */ v = t / 1.42e8; /* v是總體積 */ printf(total=%en,t); /* 用指數(shù)形式輸出麥子總粒數(shù) */ printf(volume=%en,v);/* 用指數(shù)形式輸出麥子總體積 */運行結果:total=1.844674e+019volnme=1.299066e+011編寫程序5.3 用for語句實現(xiàn)循環(huán)第18頁,共139頁。說明: 變量i用來控制
13、循環(huán)的次數(shù),開始時i=1,在完成第1次循環(huán)后,i的值加1變?yōu)?,由于264,所以執(zhí)行第2次循環(huán),依此類推,當i變到63時,執(zhí)行最后一次循環(huán),i再變?yōu)?4,由于i不再小于64了,不再執(zhí)行循環(huán)。接著計算體積,輸出結果。5.3 用for語句實現(xiàn)循環(huán)第19頁,共139頁。5.3 用for語句實現(xiàn)循環(huán) 人口增長預測。據(jù)2005年末統(tǒng)計,我國人口為130756萬人,如果人口的年增長率為1%,請計算到哪一年中國總人口超過15億。例題 5.5解題思路計算人口增長和計算存款利息的公式是相同的。假設原來人口為 ,則一年后的人口:其中r是年增長率。用此公式依次計算出每年的人口,每算出一年的人口后就檢查一下是否達到或
14、超過15億?如果未達到或超過15億,就再計算下一年的人口,直到某一年的人口達到或超過15億為止。第20頁,共139頁。編寫程序5.3 用for語句實現(xiàn)循環(huán)#include void main() double p=1.30756e9,r=0.01; int y; for(y=2006; p1.5e9; y+) /* 賦值號兩側的變量p代表不同含義 */ p=p*(1+r); printf(year=%d,p=%en,y-1,p); 運行結果:year=2019,p=1.503007e+009第21頁,共139頁。說明:注意區(qū)分變量p在不同階段中的不同含義。 y代表年份。循環(huán)體中只有一個語句,用
15、來計算從2006年開始的各年的人口數(shù)。在for語句中設定的循環(huán)條件是p15億,當某一年的p達到或超過15億,就停止循環(huán),輸出年份和當年的人口數(shù)。由于在最后結束循環(huán)前y又加了1,因此在輸出年份時應輸出y-1的值而不是y的值。5.3 用for語句實現(xiàn)循環(huán)第22頁,共139頁。5.3 用for語句實現(xiàn)循環(huán)5.3.2 for循環(huán)程序舉例 一個變量開始時有一初值,通過一定的運算,可以推算出一個新的值,再從這個新值又推出下一個新值,即不斷用計算出的新值去取代原有的值,這種方法稱為迭代。上面的計算公式p*(1+r)稱為迭代公式。迭代算法一般是用循環(huán)來實現(xiàn)的。迭代是一種常用的算法,用人工實現(xiàn)很麻煩,而用計算機
16、實現(xiàn)卻十分方便。第23頁,共139頁。5.4 循環(huán)的嵌套一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結構稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)。三種循環(huán)(while循環(huán)、do-while循環(huán)和for循環(huán))可以互相嵌套。第24頁,共139頁。5.4 循環(huán)的嵌套下面幾種都是合法的形式:(1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( );第25頁,共139頁。5.4 循環(huán)的嵌套(4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while(
17、 ) 第26頁,共139頁。5.5 提前結束循環(huán)5.5.1 用break語句提前退出循環(huán) break語句可以用來從循環(huán)體內(nèi)跳出循環(huán)體,即提前結束循環(huán),接著執(zhí)行循環(huán)下面的語句。一般形式: break;說明:break語句不能用于循環(huán)語句和switch語句之外的任何其他語句中。 第27頁,共139頁。 統(tǒng)計各班級的學生的平均成績。已知各班人數(shù)不等,但都不超過30人。編一個程序能處理人數(shù)不等的各班學生的平均成績。例題 5.6解題思路 如果各班人數(shù)相同,問題比較簡單,只需用一個for語句控制即可: for(i=1;i31;i+) 但是現(xiàn)在有的班不足30人,應當設法告訴計算機本班的人數(shù),使程序也能統(tǒng)計出
18、該班的平均成績??梢约s定,當輸入的成績是負數(shù)時,就表示本班數(shù)據(jù)已結束(一般情況下成績不會是負數(shù))。在程序接收到一個負的分數(shù)時就提前結束循環(huán),計算出本班平均成績。 用break語句可以用來實現(xiàn)提前結束循環(huán)。5.5 提前結束循環(huán)第28頁,共139頁。編寫程序5.5 提前結束循環(huán)#include void main() float score,sum=0,average; int i,n; for(i=1; i31; i+) scanf(%f,&score);/* 輸入一個學生的成績 */ if(score0) break; /* 如果輸入負值,則跳出循環(huán) */ sum=sum+score; /*
19、把該成績累加到sum */ n=i-1; /* 學生數(shù)應是i-1 */ average=sum/n; /* 計算平均成績 */ /* 輸出學生數(shù)和平均成績 */ printf(n=%d,average=%7.2fn,n,average); 運行結果:100 (輸入一個學生成績)8070-1 (輸入負數(shù),表示本班數(shù)據(jù)結束)n=3,average= 90.00第29頁,共139頁。說明: 如果一個班有30人,則輸入完30人的成績后累計總分后自動結束循環(huán),不必再輸入負數(shù)作為結束標志。在結束循環(huán)后i的值等于31(因為執(zhí)行完30次循環(huán)后,i再加1,變成31,此時才終止循環(huán)),因此學生數(shù)n應該等于i-1。
20、 如果一個班人數(shù)少于30人,則在輸入完全班學生的成績后,輸入一個負數(shù),此時程序就跳過循環(huán)體其余的語句,也不再繼續(xù)執(zhí)行其余的幾次循環(huán)。直接跳到循環(huán)下面的語句(n=i-1;)繼續(xù)執(zhí)行。剛輸入的數(shù)不進行累加(不執(zhí)行sum=sum+score;)。注意此時i的值,假如已輸入了25個有效分數(shù),在第26次循環(huán)時輸入一個負數(shù),此時i的值是26,而學生數(shù)n應是i-1。5.5 提前結束循環(huán)第30頁,共139頁。5.5 提前結束循環(huán)5.5.2 用continue語句提前結束本次循環(huán)continue語句作用為結束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循環(huán)的判定.一般形式: continu
21、e;第31頁,共139頁。5.5 提前結束循環(huán)5.5.2 用continue語句提前結束本次循環(huán) continue語句和break語句的區(qū)別: continue語句只結束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。while(表達式1) if(表達式2) continue; 第32頁,共139頁。 continue語句和break語句的區(qū)別: break語句則是結束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立。 while(表達式1) if(表達式2) break; 5.5 提前結束循環(huán)5.5.2 用continue語句提前結束本次循環(huán)第33頁,共139頁。 輸入一個班全體學生的成績,把不及格的學生成
22、績輸出,并求及格學生的平均成績。例題 5.7解題思路 在進行循環(huán)中,檢查學生的成績,把其中不及格的成績輸出,然后跳過后面總成績的累加和求平均成績的語句。用continu語句即可處理此問題。5.5 提前結束循環(huán)第34頁,共139頁。#include void main() float score,sum=0,average; int i,n=0; for(i=1; i6; i+) /* 假設有5個學生 */ printf(please enter score:); scanf(%f,&score); /* 輸入學生成績 */ if(score60) /* 如不及格 */ /* 輸出不及格的成績
23、*/printf(Fail:%7.2fn,score); continu; /* 跳過下面的語句,結束本次循環(huán) */ sum=sum+score; n=n+1; /* n是用來統(tǒng)計及格學生人數(shù) */ average=sum/n; /* 及格學生平均分數(shù) */);/* 輸出及格學生人數(shù)和平均分數(shù) */ printf(nn=%d,average=%7.2fn,n,average 運行結果:please enter score:89please enter score:56Fail:56please enter score:76please enter score:58Fail:58please e
24、nter score:98n=3 average=87.675.5 提前結束循環(huán)編寫程序第35頁,共139頁。說明: 為減少輸入量,本程序只按5個學生處理。在輸入不及格學生成績后,輸出該成績,然后跳過循環(huán)體中未執(zhí)行的語句,即不參加累計總分sum,也不累計合格學生數(shù)n。但是,繼續(xù)執(zhí)行后面的幾次循環(huán)。5.5 提前結束循環(huán)第36頁,共139頁。5.6 幾種循環(huán)的比較(1)三種循環(huán)都可以用來處理同一問題,一般情況下它們可以互相代替。 (2)在while循環(huán)和do-while循環(huán)中,只在while后面的括號內(nèi)指定循環(huán)條件,因此為了使循環(huán)能正常結束,應在循環(huán)體中包含使循環(huán)趨于結束的語句(如i+,或i=i+
25、1等)。第37頁,共139頁。5.6 幾種循環(huán)的比較for循環(huán)可以在表達式3中包含使循環(huán)趨于結束的操作,甚至可以將循環(huán)體中的操作全部放到表達式3中。因此for語句的功能更強,凡用while循環(huán)能完成的,用for循環(huán)都能實現(xiàn)。(3)用while和do-while循環(huán)時,循環(huán)變量初始化的操作應在while和do-while語句之前完成。而for語句可以在表達式1中實現(xiàn)循環(huán)變量的初始化。第38頁,共139頁。5.6 幾種循環(huán)的比較(4) while循環(huán)、dowhile循環(huán)和for循環(huán),都可以用break語句跳出循環(huán),用continue語句結束本次循環(huán) 。 第39頁,共139頁。 有一對兔子,出生后第
26、3個月起每個月都生一對兔子。小兔子長到第3個月后每個月又生一對兔子。假設所有兔子都不死,問40個月的兔子總數(shù)為多少?例題 5.8解題思路5.7 程序舉例 第幾個月小兔子對數(shù)中兔子對數(shù)老兔子對數(shù)兔子總數(shù)110012010131012411135212563238753513第40頁,共139頁??梢钥吹矫總€月的兔子總數(shù)依次為 1,1,2,3,5,8,13這就是有名的費波那西(Fibonacci)數(shù)列。 5.7 程序舉例 第41頁,共139頁。編寫程序5.7 程序舉例 #include void main() long int f1,f2; int i; f1=1;f2=1; for(i=1; i
27、=20; i+) printf(%12ld %12ld ,f1,f2); if(i%2=0) printf(n); f1=f1+f2; f2=f2+f1; 運行結果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 57022887 9227465 14930352 24157817 39088169 63245986 1023341
28、55 第42頁,共139頁。說明:(1)變量f1和f2用長整型,在printf函數(shù)中輸出格式符用“%12ld”,而不是用“%12d”,這是由于在第23個數(shù)后,整數(shù)值已超過整數(shù)最大值32767,因此必須用長整型變量才能容納,并用“%ld”格式輸出。(2)if語句的作用是使輸出4個數(shù)后換行。i是循環(huán)變量,當i為偶數(shù)時換行,而i每增值1,就要計算和輸出2個數(shù)(f1,f2),因此i每隔2換一次行相當于每輸出4個數(shù)后換行輸出。5.7 程序舉例 第43頁,共139頁。給一個整數(shù)m,判斷它是否素數(shù)。例題 5.9解題思路5.7 程序舉例 讓m被i(i由2變到k= )除,如果m能被某一個i(2k之間的任何一個整
29、數(shù))整除,則m必然不是素數(shù),不必再進行下去。此時的i必然小于或等于k;如果m不能被2-k之間的任一整數(shù)整除,則m應是素數(shù),此肘在完成最后一次循環(huán)后,使i再加1,因此i的值就等于k+1,這時才終止循環(huán)。在循環(huán)結束之后判別i的值是否大于或等于k+1,若是,則表明未曾被2-k之間任一整數(shù)整除過,因此輸出“是素數(shù)”。第44頁,共139頁。#include #include void main() int m,i,k; printf(“please enter a integer number:”); scanf(“%d”,&m); /* 輸入一個整數(shù)m */ k=(int)sqrt(m); /* 對m
30、求平方根,再取整 */ for (i=2;ik) printf(%d is a prime number.n,m); else printf(%d is not a prime number.n,m); 編寫程序5.7 程序舉例 運行結果: please enter a integer number: 1717 is a prime number.第45頁,共139頁。 譯密碼。為使電文保密,往往按一定規(guī)律將其轉換成密碼,收報人再按約定的規(guī)律將其譯回原文。例題 5.10解題思路5.7 程序舉例 可以按以下規(guī)律將電文變成密碼: 將字母A變成字母E,a變成e,即變成其后的第4個字母,W變成A,X變
31、成B,Y變成C,Z變成D。第46頁,共139頁。#include void main() char c; while(c=getchar()!=n) /* 判定c是否字母 */ if(c=a & c=A & cZ & cz) c=c-26; printf(%c,c); printf(n);編寫程序5.7 程序舉例 運行結果: China! Glmre! 第47頁,共139頁。說明:內(nèi)嵌的if語句不能寫成: if( cZ| cz) /* 請和程序笫7行比較 */ c=c-26;因為如果所有小寫字毋都滿足“cZ”的條件,從而也都執(zhí)行“c=c-26;”語句,這就會出錯。因此必須限制其范圍為“cZ &
32、 c=Z+4”,即原字母為W到Z。只有符合此條件才減26,否則,不應按此規(guī)律轉換。5.7 程序舉例 第48頁,共139頁。5.8 提高部分5.8.1 while和 do-while循環(huán)的比較凡是能用while循環(huán)處理,都能用dowhile循環(huán)處理。dowhile循環(huán)結構可以轉換成while循環(huán)結構。 在一般情況下,用while語句和用do-while語句處理同一問題時,若二者的循環(huán)體部分是一樣的,它們的結果也一樣。但是如果while后面的表達式一開始就為假(0值)時,兩種循環(huán)的結果是不同的。第49頁,共139頁。例5.11 while和do-while循環(huán)的比較 (1) (2) #includ
33、e #include void main ( ) void main( ) int sum=0,i; int sum=0,i; scanf(“%d,&i); scanf(”%d,&i); while (i=10) do sum=sum+I; sum=sum+i; i+; i+; while (i=10); printf(“sum=%dn”, printf(“sum=%dn”, sum); sum); 運行結果:1 sum=55 再運行一次: 11sum=0運行結果:1 sum=55 再運行一次: 11sum=11說明:當while后面的表達式的第一次的值為“真”時,兩種循環(huán)得到的結果相同。否則
34、,二者結果不相同。5.8 提高部分第50頁,共139頁。5.8 提高部分5.8.2 for語句的各種形式for語句相當靈活,形式變化多樣: (1) for語句的一般形式中的“表達式1”可以省略,此時應在for語句之前給循環(huán)變量賦初值。注意省略表達式1時,其后的分號不能省略。如: for(;i=100;i+) sum=sum+i; 執(zhí)行時,跳過“求解表達式1”這一步,其他不變。第51頁,共139頁。(2) 如果表達式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進行下去。也就是認為表達式2始終為真。如: for(i=1; ;i+) sum=sum+i; 表達式1是一個賦值表達式,表達式2空缺。它相當于:
35、 i=1; while(1) sum=sum+1;i+;5.8 提高部分5.8.2 for語句的各種形式第52頁,共139頁。(3) 表達式3也可以省略,但此時程序設計者應另外設法保證循環(huán)能正常結束。如: for(i=1;i=100;) sum=sum+i;i+; 在上面的for語句中只有表達式1和表達式2,而沒有表達式3。i+的操作不放在for語句的表達式3的位置處,而作為循環(huán)體的一部分,效果是一樣的,都能使循環(huán)正常結束。5.8 提高部分5.8.2 for語句的各種形式第53頁,共139頁。(4) 可以省略表達式1和表達式3,只有表達式2,即只給循環(huán)條件。如: for(;i=100;) wh
36、ile(i=100) sum=sum+i; 相當于 sum=sum+i; i+; i+; 在這種情況下,完全等同于while語句。可見for語句比while語句功能強,除了可以給出循環(huán)條件外,還可以賦初值,使循環(huán)變量自動增值等。5.8 提高部分5.8.2 for語句的各種形式第54頁,共139頁。(5) 3個表達式都可省略,如: for(; ;) 語句相當于 while(1) 語句 即不設初值,不判斷條件(認為表達式2為真值),循環(huán)變量不增值。無終止地執(zhí)行循環(huán)體。5.8 提高部分5.8.2 for語句的各種形式第55頁,共139頁。(6) 表達式1可以是設置循環(huán)變量初值的賦值表達式,也可以是與
37、循環(huán)變量無關的其他表達式。如: for (sum=0;i=100;i+) sum=sum+i;表達式3也可以是與循環(huán)控制無關的任意表達式。5.8 提高部分5.8.2 for語句的各種形式第56頁,共139頁。表達式1和表達式3可以是一個簡單的表達式,也可以是逗號表達式,即包含一個以上的簡單表達式,中間用逗號間隔。如: for(sum=0,i=1;i=100;i+) sum=sum+i;或 for(i=0,j=100;i=j;i+,j-) k=i+j;表達式1和表達式3都是逗號表達式,各包含兩個賦值表達式,即同時設兩個初值,使兩個變量增值。 5.8 提高部分5.8.2 for語句的各種形式第57
38、頁,共139頁。 在逗號表達式內(nèi)按自左至右順序求解,整個逗號表達式的值為其中最右邊的表達式的值。如: for(i=1;i=100;i+,i+) sum=sum+i;相當于 for(i=1;i=100;i=i+2) sum=sum+i;5.8 提高部分5.8.2 for語句的各種形式第58頁,共139頁。(7) 表達式一般是關系表達式(如i=100)或邏輯表達式(如ab & xy),但也可以是數(shù)值表達式或字符表達式,只要其值為非零,就執(zhí)行循環(huán)體。5.8 提高部分5.8.2 for語句的各種形式第59頁,共139頁。 for(i=0;(c=getchar()!=n;i+=c); 在表達式2中先從終
39、端接收一個字符賦給c,然后判斷此賦值表達式的值是否不等于n(換行符),如果不等于n,就執(zhí)行循環(huán)體。注意:此for語句的循環(huán)體為空語句,把本來要在循環(huán)體內(nèi)處理的內(nèi)容放在表達式3中,作用是一樣的??梢奻or語句功能強,可以在表達式中完成本來應在循環(huán)體內(nèi)完成的操作。5.8 提高部分5.8.2 for語句的各種形式第60頁,共139頁。 for( ;(c=getchar()!=n;) printf(%c,c); for語句中只有表達式2,而無表達式1和表達式3。其作用是每讀入一個字符后立即輸出該字符,直到輸入一個“換行”為止。請注意,從終端鍵盤向計算機輸入時,是在按Enter鍵以后才將一批數(shù)據(jù)一起送到
40、內(nèi)存緩沖區(qū)中去的。運行情況:Computer (輸入)Computer (輸出)而不是Ccoommppuutteerr5.8 提高部分5.8.2 for語句的各種形式第61頁,共139頁。注意: C語言中的for語句比其他語言(如BASIC,PASCAL)中的FOR語句功能強得多。可以把循環(huán)體和一些與循環(huán)控制無關的操作也作為表達式1或表達式3出現(xiàn),這樣程序可以短小簡潔。但過分地利用這一特點會使for語句顯得雜亂,可讀性降低,最好不要把與循環(huán)控制無關的內(nèi)容放到for語句中。5.8 提高部分5.8.2 for語句的各種形式第62頁,共139頁。第六章利用數(shù)組處理批量數(shù)據(jù)第63頁,共139頁。問題:
41、給一組數(shù)排序,這組 數(shù)該 如何存放呢? 這些數(shù)據(jù)如何存放才便于排序82945637617188888888881111111111111118888888888這便是本章所要解決的問題第64頁,共139頁。 本章要點掌握一維、二維數(shù)組的定義和引用方法、存儲結構和初始化方法。掌握有關一維數(shù)組的有關算法掌握數(shù)組的運算。第65頁,共139頁。主要內(nèi)容6.1 為什么要用數(shù)組6.2 定義和引用一維數(shù)組6.3 二維數(shù)組的定義和引用6.4 字符數(shù)組6.5 提高部分第66頁,共139頁。6.1 為什么要用數(shù)組 C語言為這些數(shù)據(jù),提供了一種構造數(shù)據(jù)類型:數(shù)組。所謂數(shù)組就是一組具有相同數(shù)據(jù)類型的數(shù)據(jù)的有序集合。一
42、個班學生的學習成績一行文字一個矩陣這些數(shù)據(jù)的特點是:1、具有相同的數(shù)據(jù)類型2、使用過程中需要保留原始數(shù)據(jù)第67頁,共139頁。1.一維數(shù)組的定義格式為:類型說明符 數(shù)組名常量表達式;例如: int a10; 它表示定義了一個整形數(shù)組,數(shù)組名為a,此數(shù)組有10個元素。6.2 定義和引用一維數(shù)組6.2.1 定義一維數(shù)組說明: 1.數(shù)組名定名規(guī)則和變量名相同,遵循標識符定名規(guī)則。第68頁,共139頁。2.在定義數(shù)組時,需要指定數(shù)組中元素的個數(shù),方括弧中的常量表達式用來表示元素的個數(shù),即數(shù)組長度。3.常量表達式中可以包括常量和符號常量,但不能包含變量。也就是說,C語言不允許對數(shù)組的大小作動態(tài)定義,即數(shù)
43、組的大小不依賴于程序運行過程中變量的值。第69頁,共139頁。例如: int n; scanf(“%d,&n); /*在程序中臨時輸入數(shù) 組的大小 */ int an;數(shù)組說明中其他常見的錯誤: float a0;/* 數(shù)組大小為0沒有意義 */ int b(2)(3); /* 不能使用圓括號 */ int k, ak; /* 不能用變量說明數(shù)組大小*/ 第70頁,共139頁。注意:定義數(shù)組時用到的“數(shù)組名常量表達式” 和引用數(shù)組元素時用到的“數(shù)組名下標” 是有區(qū)別的。例如 int a10; t=a6; 6.2 一維數(shù)組的定義和引用6.2.2 引用一維數(shù)組元素1.數(shù)組元素的引用方式:數(shù)組名下標
44、下標可以是整型常量或整型表達式。例如: a0=a5+a7-a2*3第71頁,共139頁。2.一維數(shù)組元素引用的程序實例例題 6.1 引用數(shù)組元素。利用循環(huán)給數(shù)組元素a0a9賦值為09,然后按逆序輸出各元素的值解題思路 循環(huán)給數(shù)組元素a0 a9賦值09,這樣,然后按a9到a0的順序輸出各元素的值。第72頁,共139頁。2.一維數(shù)組元素引用的程序實例#include void main() int i,a10; for (i=0; i=0; i-) printf(%d ,ai); printf(n); 運行結果如下:9 8 7 6 5 4 3 2 1 0 說明:1、第一個for循環(huán)的作用是給a數(shù)組
45、中的元素賦值。2、第2個for循環(huán)的作用是所按逆序輸出a數(shù)組中的10個元素編寫程序第73頁,共139頁。對數(shù)組元素初始化的實現(xiàn)方法: 1.在定義數(shù)組時對數(shù)組元素賦以初值。例如:int a10=0,1,2,3,4,5,6,7,8,9;將數(shù)組元素的初值依次放在一對花括弧內(nèi)。經(jīng)過上面的定義和初始化之后,a0=0,a1=1,a2=2,a3=3,a4=4,a5=5,a6=6,a7=7,a8=8,a9=9。 6.2 一維數(shù)組的定義和引用6.2.3 一維數(shù)組的初始化第74頁,共139頁。 3. 如果想使一個數(shù)組中全部元素值為0,可以寫成: int a10=0,0,0,0,0,0,0,0,0,0; 或 int
46、 a10=0; 2. 可以只給一部分元素賦值。例如: int a10=0,1,2,3,4; 定義a數(shù)組有10個元素,但花括弧內(nèi)只提供5個初值,這表示只給前面5個元素賦初值,后5個元素值為0。第75頁,共139頁。4. 在對全部數(shù)組元素賦初值時,由于數(shù)據(jù)的個數(shù)已經(jīng)確定,因此可以不指定數(shù)組長度。 例如:int a5=1,2,3,4,5; 也可以寫成 int a=1,2,3,4,5; int a10=1,2,3,4,5; 只初始化前5個元素,后5個元素為0。第76頁,共139頁。Fibonacci數(shù)列公式:已知: a1=a2=1,an=an-1+an-2 即:1,1,2,3,5,8,13建立一個數(shù)組
47、,將數(shù)列中第1個數(shù)放在數(shù)組第1個的元素中,數(shù)列第2個數(shù)放在數(shù)組第2個的元素中,。 6.2 一維數(shù)組的定義和引用6.2.4 一維數(shù)組程序舉例例題 6.2 用數(shù)組來處理求Fibonacci數(shù)列問題。 解題思路第77頁,共139頁。程序實例:#include void main() int i; int f20=1,1;6.2 一維數(shù)組的定義和引用6.2.4 一維數(shù)組程序舉例編寫程序第78頁,共139頁。for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+) if(i%5=0) printf(n); printf(%12d,fi) /*For循環(huán)結束*/ /*程序結束
48、*/運行結果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765if語句用來控制換行,每行輸出5個數(shù)據(jù)。第79頁,共139頁。例題 6.3 假如有n個人,各人年齡不同,希望按年齡將他們從小到大排列。 解題思路 這種問題稱為數(shù)的排序(sort)。排序的原則有兩 類,一類是“升序”,從小到大;一類是“降序”,從大到小。我們可以把這個題目抽象為一般形式: 對n個數(shù)按升序排列 對一組數(shù)據(jù)進行排序的方法很多,本例介紹用“起泡法”排序?!捌鹋莘ā钡乃悸肥侨缦碌?0頁,共139頁。第一趟比較 經(jīng)過第一趟(共5次比較與交換
49、)后,最大的數(shù)9已“沉底” 。然后進行對余下的前面5個數(shù)第二趟比較,第81頁,共139頁。第二趟比較如果有n個數(shù),則要進行n-1趟比較。在第1趟比較中要進行n-1次兩兩比較,在第j趟比較中要進行n-j次兩兩比較。第82頁,共139頁。程序流程圖如下:第83頁,共139頁。#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;i10;i+) scanf(%d,&ai); printf(n); 編寫程序第84頁,共139頁。for(j=0;j9;j+) for(i=0;iai+1) t=ai;a
50、i=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n);/*程序結束*/程序運行結果如下:input 10 numbers:1 0 4 8 12 65 -76 100 -45 123the sorted numbers:-76 -45 0 1 4 8 12 65 100 123說明:1、程序中實現(xiàn)起泡法排序算法的主要是1013行。 2、仔細分析嵌套的for語句。 第85頁,共139頁。 6.3 二維數(shù)組的定義和引用 6.3.1 定義二維數(shù)組二維數(shù)組定義的一般形式為類型說明符
51、 數(shù)組名常量表達式常量表達式;例如:定義a為34(3行4列)的數(shù)組,b為510(5行10列)的數(shù)組。如下:float a34,b510;不能寫成 float a3,4,b5,10;第86頁,共139頁。C語言中,二維數(shù)組中元素排列的順序是按行存放的,即在內(nèi)存中先順序存放第一行的元素,再存放第二行的元素。下圖表示對a34數(shù)組存放的順序。 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 6.3 二維數(shù)組的定義和引用 6.3.1 定義二維數(shù)組第87頁,共139頁。二維數(shù)組元素的表示形式為:數(shù)組名下標下標例如: a23下標可以是整型表達式,如 a2-12
52、*2-1數(shù)組元素可以出現(xiàn)在表達式中,也可以被賦值例如:b12=a23/2不要寫成 a2,3,a2-1,2*2-1形式6.3 二維數(shù)組的定義和引用6.3.2 引用二維數(shù)組的元素第88頁,共139頁。常出現(xiàn)的錯誤有: int a34; /* 定義a為34的數(shù)組 */ a34=3; 在使用數(shù)組元素時,應該注意下標值應在已定義的數(shù)組大小的范圍內(nèi)。6.3 二維數(shù)組的定義和引用6.3.2 引用二維數(shù)組的元素第89頁,共139頁??梢杂孟旅?種方法對二維數(shù)組初始化:.分行給二維數(shù)組賦初值。例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; .可以將所有數(shù)據(jù)寫在一個花括弧內(nèi),按數(shù)組
53、排列的順序對各元素賦初值。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 6.3 二維數(shù)組的定義和引用 6.3.3 二維數(shù)組的初始化第90頁,共139頁。.可以對部分元素賦初值。例如: int a34=1,5,9; 1 0 0 05 0 0 0 9 0 0 0也可以對各行中的某一元素賦初值,如int a34=1,0,6,0,0,11; 1 0 0 00 6 0 00 0 0 11 1 0 0 05 6 0 0 0 0 0 0也可以只對某幾行元素賦初值。如:int a34=1,5,6; 第91頁,共139頁。.如果對全部元素都賦初值,則定義數(shù)組時對第一維的長度可以不
54、指定,但第二維的長度不能省。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;它等價于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;在定義時也可以只對部分元素賦初值而省略第一維的長度,但應分行賦初值。例如:int a4=0,0,3,0,10;0 0 3 00 0 0 00 10 0 0第92頁,共139頁。 6.3 二維數(shù)組的定義和引用 6.3.4 二維數(shù)組程序舉例例如:a= 1 2 3 1 4 4 5 6 b= 2 5 3 6例題 6.4 將一個二維數(shù)組a的行和列的元素互換(即行列轉置),存到另一個二維數(shù)組b中。 解題思路 將a數(shù)組中第i行j
55、列元素賦給b數(shù)組中j行i列元素,例如a00賦給b00,a01 賦給b10,a02賦給b20,??梢杂秒p層循環(huán)來處理,用外循環(huán)控制行的變化,內(nèi)循環(huán)控制列的變化。第93頁,共139頁。 6.3 二維數(shù)組的定義和引用 6.3.4 二維數(shù)組程序舉例#include void main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for (i=0;i=1;i+) for (j=0;j=2;j+) 編寫程序第94頁,共139頁。 printf(%5d,aij); bji=aij; printf(n); printf(array b:n);f
56、or (i=0;i=2;i+) for(j=0;j=1;j+) printf(%5d,bij); printf(n); /*程序結束*/運行結果如下:array a: 1 2 3 4 5 6array b: 1 4 2 5 3 6 說明:如果把第7行:“for (i=0;i2;i+)”改為“for (i=0;i=2;i+)”,意味著什么?結果會怎樣?第95頁,共139頁。例題 6.5 有一個班30個學生,己知每個學生有5門課的成績,要求輸出平均成績最高的學生的成績以及該學生的序號。 解題思路 對本題而言,宜用二維數(shù)組,用一行中的各元素存放一個學生的成績,即行代表學生,列代表一門課的成績。要存放
57、30個學生5門課的成績,要用一個30*5的二維數(shù)組。另外,由于要比較各人的平均成績,因此,對每個學生來說,應該存放6個數(shù)據(jù),每人平均成績要計算出來,并存放在數(shù)組中。這樣,數(shù)組的大小就應該是30*6。設計算法:(1)求每人平均成績,放在數(shù)組每一行的最后一列中;(2)找出最高的平均分,和該學生的序號;(3)輸出最高的平均分,和該學生的序號。第96頁,共139頁。程序如下: #include void main() int i,j,max_i; float sum,max=0; float s66=78,82,93,74,65,91,82,72,76,67,100,90,85,72,98, 67,8
58、9,90,65,78,77,88,99,45,89,78,89,76,99.97; for (i=0;i5;i+) sum=0; /* 使sum初值為0 */ for (j=0;j5;j+) sum=sum+sij; /* 累加序號為j的學生各門課的成績 * si5=sum/5; /* 求序號為j的學生各門課的的平均分 */ 編寫程序第97頁,共139頁。for (i=0;imax) /* 逐個將5個學生的平均分與max比較 */ max=si5;max_i=i; /* 如果比max大,就用序號為i的學生的平均分取代max的原值,將i的當前值保存在max_I中 */ printf(stu_or
59、der=%dnmax=%7.2fn,max_i,max); /* 輸出最高平均分和該生的序號i */ 運行結果如下:max=10,row=2,colum=1 說明: 1、在對數(shù)組初始化時,只對各行的前5列賦初值,第6列默認為0。2、注意第一個for語句的范圍。請思考能否不要“sum=0;”這一行?或者把這一句改放到for語句的前面? 3、第三個for語句內(nèi)嵌了一個if語句,用來將5個學生的平均分逐個與max比較 第98頁,共139頁。6.4 字符數(shù)組6.4.1 定義字符數(shù)組及對其初始化定義方法與前面介紹的類似。例如:char c10;c0=I;c1= ;c2=a;c3=m;c4= ;c5=h;
60、c6=a;c7=p;c8=p;c9=y;第99頁,共139頁。對字符數(shù)組初始化,可逐個字符賦給數(shù)組中各元素。例如:char c10=I,a,m,h,a,p,p,y 6.4 字符數(shù)組6.4.1 定義字符數(shù)組及對其初始化第100頁,共139頁。如果初值個數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自動定為空字符。char c10=c, ,p,r,o,g,r,a,m; 第101頁,共139頁。如果提供的初值個數(shù)與預定的數(shù)組長度相同,在定義時可以省略數(shù)組長度,系統(tǒng)會自動根據(jù)初值個數(shù)確定數(shù)組長度。char c=I, ,a,m, ,h,a,p,p,y;數(shù)組c的長度自動定為10。 第10
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 著作權轉讓合同書
- 公積金貸款合同樣式
- 預制構件交易協(xié)議
- 深夜維修服務合同
- 光伏設備交易合同
- 購貨合同范本模板
- 農(nóng)村自建房買賣合同的違約責任認定
- 植物種苗購銷合同
- 電子產(chǎn)品購買合同格式
- 多孔磚購銷合同簽訂優(yōu)惠條件說明
- 天津市勘察設計院集團有限公司招聘筆試題庫2024
- 石油鉆采設備招標合同三篇
- 婚介合同協(xié)議書
- 2024屆廣東省廣州市高三上學期調(diào)研測試數(shù)學試題及答案
- 《中國近現(xiàn)代史綱要》課程教學大綱
- 中國近代史(1840~1949年)大事年表知識清單
- 沙利文 2024中國生物醫(yī)藥出海現(xiàn)狀與趨勢藍皮書
- 第六單元 百分數(shù)(一)(講義)-2024-2025學年六年級上冊數(shù)學人教版
- 7《背影》第一課時修省公開課一等獎全國示范課微課金獎課件
- 深靜脈血栓VTE防治中心年度工作報告總結
- 2024版美團商家合作協(xié)議合同范本
評論
0/150
提交評論