




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C語(yǔ)言程序設(shè)計(jì)(第2版)第1頁(yè),共139頁(yè)。第五章循環(huán)結(jié)構(gòu)程序設(shè)計(jì)第2頁(yè),共139頁(yè)。 本章要點(diǎn) 循環(huán)的基本概念 不同形式的循環(huán)控制 多重循環(huán)問(wèn)題 第3頁(yè),共139頁(yè)。5.1程序中需要用循環(huán)結(jié)構(gòu)5.2用while語(yǔ)句和do-while語(yǔ)句實(shí)現(xiàn)循環(huán)5.3用for 語(yǔ)句實(shí)現(xiàn)循環(huán) 5.4循環(huán)的嵌套5.5用break語(yǔ)句和continue語(yǔ)句改變循環(huán)狀態(tài)5.6幾種循環(huán)的比較5.7程序舉例5.8提高部分 主要內(nèi)容第4頁(yè),共139頁(yè)。 5.1 程序中需要用循環(huán)結(jié)構(gòu)什么是循環(huán)?為什么要使用循環(huán)?問(wèn)題1:?jiǎn)栴}2:求學(xué)生平均成績(jī) 分?jǐn)?shù)相加后除以課數(shù)在許多問(wèn)題中需要用到循環(huán)控制。循環(huán)結(jié)構(gòu)就是用來(lái)處理需要重復(fù)處理的
2、問(wèn)題的,所以又稱(chēng)重復(fù)結(jié)構(gòu)。它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。循環(huán)分為兩種:無(wú)休止循環(huán)和有終止循環(huán)構(gòu)成有效循環(huán)的條件:循環(huán)體和循環(huán)結(jié)束條件第5頁(yè),共139頁(yè)。5.2 用while語(yǔ)句和do-while語(yǔ)句實(shí)現(xiàn)循環(huán) 5.2.1 用while語(yǔ)句實(shí)現(xiàn)循環(huán)while語(yǔ)句用來(lái)實(shí)現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu)一般形式: while (表達(dá)式) 語(yǔ)句 當(dāng)表達(dá)式為非0值時(shí),執(zhí)行while語(yǔ)句中的內(nèi)嵌語(yǔ)句。其特點(diǎn)是:先判斷表達(dá)式,后執(zhí)行循環(huán)體,即內(nèi)嵌語(yǔ)句。第6頁(yè),共139頁(yè)。例題 5.1求1+2+3+100的和解題思路(1)開(kāi)始時(shí)使sum的值為0,被加數(shù)i第一次取值為1。開(kāi)始進(jìn)入循環(huán)結(jié)構(gòu)。(2)判別
3、“i100”條件是否滿(mǎn)足,由于i小于100,因此“i100”的值為真。所以應(yīng)當(dāng)執(zhí)行其下面矩形框中的操作。(3)執(zhí)行sum=sum+i,此時(shí)sum的值變?yōu)?了,然后使i的值加1,i的值變?yōu)?了,這是為下一次加2作準(zhǔn)備。流程返回菱形框。(4)再次檢查“i100”條件是否滿(mǎn)足,由于i的值為2,小于100,因此“i100”的值仍為真,所以應(yīng)執(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”條件是否滿(mǎn)足,如此反復(fù)執(zhí)行矩形框中的操作,直到i的
4、值變成了100,把i加到sum中,然后i又加1變成101了。當(dāng)再次返回菱形框檢查“i100”條件時(shí),由于I已是101,大于100,“i100” 的值為假,不再執(zhí)行矩形框中的操作,循環(huán)結(jié)構(gòu)結(jié)束。5.2 用while語(yǔ)句和do-while語(yǔ)句實(shí)現(xiàn)循環(huán) 第7頁(yè),共139頁(yè)。#include void main() int i,sum=0;/* sum是用來(lái)存放累加和的變量 */ /* 初值為0 */ i=1; while (i=100)/* 當(dāng)I小于或等于100時(shí) */* 執(zhí)行下面花括號(hào)中的復(fù)合語(yǔ)句 */ sum=sum+i;/* 將i的當(dāng)前值累加到變量sum中 */ i+;/* 使i的值加1 */
5、 printf(%dn,sum); 說(shuō)明:(1)循環(huán)體如果包含一個(gè)以上的語(yǔ)句,應(yīng)該用花括號(hào)括起來(lái),以復(fù)合語(yǔ)句形式出現(xiàn).(2)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語(yǔ)句。運(yùn)行結(jié)果: 5050編寫(xiě)程序5.2 用while語(yǔ)句和do-while語(yǔ)句實(shí)現(xiàn)循環(huán) 第8頁(yè),共139頁(yè)。5.2 用while語(yǔ)句和do-while語(yǔ)句實(shí)現(xiàn)循環(huán) 5.2.2 用do-while語(yǔ)句實(shí)現(xiàn)循環(huán) do-while語(yǔ)句的特點(diǎn):先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。執(zhí)行過(guò)程:先執(zhí)行一次指定的循環(huán)體語(yǔ)句,然后判別“表達(dá)式”,當(dāng)表達(dá)式的值為非0(“真”) 時(shí),返回重新執(zhí)行循環(huán)體語(yǔ)句,如此反復(fù),直到表達(dá)式的值等于0 (“假”)為止,此
6、時(shí)循環(huán)結(jié)束。while語(yǔ)句和do-while語(yǔ)句的關(guān)系:同一個(gè)問(wèn)題既可以用while循環(huán)處理,也可以用do-while循環(huán)來(lái)處理。二者是可以互相轉(zhuǎn)換的。一般形式: do 循環(huán)體語(yǔ)句 while(表達(dá)式);第9頁(yè),共139頁(yè)。例題 5.2 求1+2+3+100的和#include void main() int i,sum=0; i=1; do /* 在循環(huán)開(kāi)始時(shí)不檢查條件,先執(zhí)行一次循環(huán)體 */ sum=sum+i; i+; while(i=100); printf(%dn,sum); 運(yùn)行結(jié)果: 5050說(shuō)明:可以看到,結(jié)果和例5.1完全相同。編寫(xiě)程序5.2 用while語(yǔ)句和do-whil
7、e語(yǔ)句實(shí)現(xiàn)循環(huán) 第10頁(yè),共139頁(yè)。例題 5.3 募集慈善基金10000元,有若干人捐款,每輸入一個(gè)人的捐款數(shù)后,計(jì)算機(jī)就輸出當(dāng)時(shí)的捐款總和。當(dāng)某一次輸入捐款數(shù)后,總和達(dá)到或超過(guò)10000元時(shí),即宣告結(jié)束,輸出最后的累加值。解題思路解此題的思路是設(shè)計(jì)一個(gè)循環(huán)結(jié)構(gòu),在其中輸入捐款數(shù),求出累加值,然后檢查此時(shí)的累加值是否達(dá)到或超過(guò)預(yù)定值,如果達(dá)到了,就結(jié)束循環(huán)操作。5.2 用while語(yǔ)句和do-while語(yǔ)句實(shí)現(xiàn)循環(huán) 第11頁(yè),共139頁(yè)。#include void main() float amount,sum=0; /*變量sum用來(lái)存放累加和*/ do scanf(%f,&amount)
8、;/*輸入一個(gè)捐款金額*/ sum=sum+amount; /*求出當(dāng)前的累加和*/ while(sum10000);/*如未達(dá)10000元繼續(xù)循環(huán)*/ printf(sum=%9.2fn,sum);運(yùn)行結(jié)果:1000 (輸入捐款額)18501500260025001200sun= 10650.00說(shuō)明:設(shè)計(jì)循環(huán)結(jié)構(gòu),要考慮兩個(gè)問(wèn)題:一是循環(huán)體,二是循環(huán)結(jié)束條件。注意while循環(huán)中判斷的條件是循環(huán)繼續(xù)的條件,而不是結(jié)束條件。5.2 用while語(yǔ)句和do-while語(yǔ)句實(shí)現(xiàn)循環(huán) 編寫(xiě)程序第12頁(yè),共139頁(yè)。5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán)5.3.1 for語(yǔ)句的一般形式和執(zhí)行過(guò)程C語(yǔ)言中的fo
9、r語(yǔ)句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語(yǔ)句。一般形式: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語(yǔ)句第13頁(yè),共139頁(yè)。5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán)5.3.1 for語(yǔ)句的一般形式和執(zhí)行過(guò)程 for語(yǔ)句的執(zhí)行過(guò)程: (1) 先求解表達(dá)式1。 (2) 求解表達(dá)式2,若其值為真(值為非0),則執(zhí) 行for語(yǔ)句中指定的內(nèi)嵌語(yǔ)句,然后執(zhí)行下 面第(3)步。若為假(值為0),則結(jié)束循環(huán), 轉(zhuǎn)到第(5)步。 (3) 求解表達(dá)式3。 (4) 轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。 (5) 循環(huán)結(jié)束,執(zhí)行for語(yǔ)句下面的
10、一個(gè)語(yǔ)句。第14頁(yè),共139頁(yè)。for語(yǔ)句最簡(jiǎn)單的形式:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值) 例如: for(i=1;i=100;i+) sum=sum+i;相當(dāng)于: i=1; while(i=100) sum=sum+i;i+; 5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán)5.3.1 for語(yǔ)句的一般形式和執(zhí)行過(guò)程第15頁(yè),共139頁(yè)。5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán)5.3.2 for循環(huán)程序舉例 國(guó)王的小麥。相傳古代印度國(guó)王舍罕要褒賞他的聰明能干的宰相達(dá)依爾(國(guó)際象棋的發(fā)明者),國(guó)王問(wèn)他要什么?達(dá)依爾回答說(shuō):“國(guó)王只要在國(guó)際象棋的棋盤(pán)第1個(gè)格子中放1粒麥子,第2個(gè)格子中放2粒麥子,第3個(gè)格子中放4
11、粒麥子,以后按此比例每一格加一倍,一直放到第64格(國(guó)際象棋的棋盤(pán)8*8=64格),我感恩不盡,其他什么都不要了?!眹?guó)王想,這有多少!還不容易!讓人扛來(lái)一袋小麥,但不到一會(huì)兒全用沒(méi)了,再來(lái)一袋很快又用完了。結(jié)果全印度的糧食全部用完還不夠。國(guó)王納悶,怎樣也算不清這筆賬?,F(xiàn)在我們用計(jì)算機(jī)來(lái)算一下。例題 5.4第16頁(yè),共139頁(yè)。解題思路麥子的總粒數(shù)是:分別計(jì)算出每一格的麥子粒數(shù),把它們加起來(lái),就得到總粒數(shù)。據(jù)估算,1 小麥約有1.42 粒,可以計(jì)算出小麥的體積??梢杂胒or語(yǔ)句實(shí)現(xiàn)循環(huán)。5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán)第17頁(yè),共139頁(yè)。#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是當(dāng)前一個(gè)格子中的麥子粒數(shù) */ t = t + p; /* t是當(dāng)前麥子總粒數(shù) */ v = t / 1.42e8; /* v是總體積 */ printf(total=%en,t); /* 用指數(shù)形式輸出麥子總粒數(shù) */ printf(volume=%en,v);/* 用指數(shù)形式輸出麥子總體積 */運(yùn)行結(jié)果:total=1.844674e+019volnme=1.299066e+011編寫(xiě)程序5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán)第18頁(yè),共139頁(yè)。說(shuō)明: 變量i用來(lái)控制
13、循環(huán)的次數(shù),開(kāi)始時(shí)i=1,在完成第1次循環(huán)后,i的值加1變?yōu)?,由于264,所以執(zhí)行第2次循環(huán),依此類(lèi)推,當(dāng)i變到63時(shí),執(zhí)行最后一次循環(huán),i再變?yōu)?4,由于i不再小于64了,不再執(zhí)行循環(huán)。接著計(jì)算體積,輸出結(jié)果。5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán)第19頁(yè),共139頁(yè)。5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán) 人口增長(zhǎng)預(yù)測(cè)。據(jù)2005年末統(tǒng)計(jì),我國(guó)人口為130756萬(wàn)人,如果人口的年增長(zhǎng)率為1%,請(qǐng)計(jì)算到哪一年中國(guó)總?cè)丝诔^(guò)15億。例題 5.5解題思路計(jì)算人口增長(zhǎng)和計(jì)算存款利息的公式是相同的。假設(shè)原來(lái)人口為 ,則一年后的人口:其中r是年增長(zhǎng)率。用此公式依次計(jì)算出每年的人口,每算出一年的人口后就檢查一下是否達(dá)到或
14、超過(guò)15億?如果未達(dá)到或超過(guò)15億,就再計(jì)算下一年的人口,直到某一年的人口達(dá)到或超過(guò)15億為止。第20頁(yè),共139頁(yè)。編寫(xiě)程序5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán)#include void main() double p=1.30756e9,r=0.01; int y; for(y=2006; p1.5e9; y+) /* 賦值號(hào)兩側(cè)的變量p代表不同含義 */ p=p*(1+r); printf(year=%d,p=%en,y-1,p); 運(yùn)行結(jié)果:year=2019,p=1.503007e+009第21頁(yè),共139頁(yè)。說(shuō)明:注意區(qū)分變量p在不同階段中的不同含義。 y代表年份。循環(huán)體中只有一個(gè)語(yǔ)句,用
15、來(lái)計(jì)算從2006年開(kāi)始的各年的人口數(shù)。在for語(yǔ)句中設(shè)定的循環(huán)條件是p15億,當(dāng)某一年的p達(dá)到或超過(guò)15億,就停止循環(huán),輸出年份和當(dāng)年的人口數(shù)。由于在最后結(jié)束循環(huán)前y又加了1,因此在輸出年份時(shí)應(yīng)輸出y-1的值而不是y的值。5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán)第22頁(yè),共139頁(yè)。5.3 用for語(yǔ)句實(shí)現(xiàn)循環(huán)5.3.2 for循環(huán)程序舉例 一個(gè)變量開(kāi)始時(shí)有一初值,通過(guò)一定的運(yùn)算,可以推算出一個(gè)新的值,再?gòu)倪@個(gè)新值又推出下一個(gè)新值,即不斷用計(jì)算出的新值去取代原有的值,這種方法稱(chēng)為迭代。上面的計(jì)算公式p*(1+r)稱(chēng)為迭代公式。迭代算法一般是用循環(huán)來(lái)實(shí)現(xiàn)的。迭代是一種常用的算法,用人工實(shí)現(xiàn)很麻煩,而用計(jì)算機(jī)
16、實(shí)現(xiàn)卻十分方便。第23頁(yè),共139頁(yè)。5.4 循環(huán)的嵌套一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu)稱(chēng)為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)。三種循環(huán)(while循環(huán)、do-while循環(huán)和for循環(huán))可以互相嵌套。第24頁(yè),共139頁(yè)。5.4 循環(huán)的嵌套下面幾種都是合法的形式:(1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( );第25頁(yè),共139頁(yè)。5.4 循環(huán)的嵌套(4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while(
17、 ) 第26頁(yè),共139頁(yè)。5.5 提前結(jié)束循環(huán)5.5.1 用break語(yǔ)句提前退出循環(huán) break語(yǔ)句可以用來(lái)從循環(huán)體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán),接著執(zhí)行循環(huán)下面的語(yǔ)句。一般形式: break;說(shuō)明:break語(yǔ)句不能用于循環(huán)語(yǔ)句和switch語(yǔ)句之外的任何其他語(yǔ)句中。 第27頁(yè),共139頁(yè)。 統(tǒng)計(jì)各班級(jí)的學(xué)生的平均成績(jī)。已知各班人數(shù)不等,但都不超過(guò)30人。編一個(gè)程序能處理人數(shù)不等的各班學(xué)生的平均成績(jī)。例題 5.6解題思路 如果各班人數(shù)相同,問(wèn)題比較簡(jiǎn)單,只需用一個(gè)for語(yǔ)句控制即可: for(i=1;i31;i+) 但是現(xiàn)在有的班不足30人,應(yīng)當(dāng)設(shè)法告訴計(jì)算機(jī)本班的人數(shù),使程序也能統(tǒng)計(jì)出
18、該班的平均成績(jī)??梢约s定,當(dāng)輸入的成績(jī)是負(fù)數(shù)時(shí),就表示本班數(shù)據(jù)已結(jié)束(一般情況下成績(jī)不會(huì)是負(fù)數(shù))。在程序接收到一個(gè)負(fù)的分?jǐn)?shù)時(shí)就提前結(jié)束循環(huán),計(jì)算出本班平均成績(jī)。 用break語(yǔ)句可以用來(lái)實(shí)現(xiàn)提前結(jié)束循環(huán)。5.5 提前結(jié)束循環(huán)第28頁(yè),共139頁(yè)。編寫(xiě)程序5.5 提前結(jié)束循環(huán)#include void main() float score,sum=0,average; int i,n; for(i=1; i31; i+) scanf(%f,&score);/* 輸入一個(gè)學(xué)生的成績(jī) */ if(score0) break; /* 如果輸入負(fù)值,則跳出循環(huán) */ sum=sum+score; /*
19、把該成績(jī)累加到sum */ n=i-1; /* 學(xué)生數(shù)應(yīng)是i-1 */ average=sum/n; /* 計(jì)算平均成績(jī) */ /* 輸出學(xué)生數(shù)和平均成績(jī) */ printf(n=%d,average=%7.2fn,n,average); 運(yùn)行結(jié)果:100 (輸入一個(gè)學(xué)生成績(jī))8070-1 (輸入負(fù)數(shù),表示本班數(shù)據(jù)結(jié)束)n=3,average= 90.00第29頁(yè),共139頁(yè)。說(shuō)明: 如果一個(gè)班有30人,則輸入完30人的成績(jī)后累計(jì)總分后自動(dòng)結(jié)束循環(huán),不必再輸入負(fù)數(shù)作為結(jié)束標(biāo)志。在結(jié)束循環(huán)后i的值等于31(因?yàn)閳?zhí)行完30次循環(huán)后,i再加1,變成31,此時(shí)才終止循環(huán)),因此學(xué)生數(shù)n應(yīng)該等于i-1。
20、 如果一個(gè)班人數(shù)少于30人,則在輸入完全班學(xué)生的成績(jī)后,輸入一個(gè)負(fù)數(shù),此時(shí)程序就跳過(guò)循環(huán)體其余的語(yǔ)句,也不再繼續(xù)執(zhí)行其余的幾次循環(huán)。直接跳到循環(huán)下面的語(yǔ)句(n=i-1;)繼續(xù)執(zhí)行。剛輸入的數(shù)不進(jìn)行累加(不執(zhí)行sum=sum+score;)。注意此時(shí)i的值,假如已輸入了25個(gè)有效分?jǐn)?shù),在第26次循環(huán)時(shí)輸入一個(gè)負(fù)數(shù),此時(shí)i的值是26,而學(xué)生數(shù)n應(yīng)是i-1。5.5 提前結(jié)束循環(huán)第30頁(yè),共139頁(yè)。5.5 提前結(jié)束循環(huán)5.5.2 用continue語(yǔ)句提前結(jié)束本次循環(huán)continue語(yǔ)句作用為結(jié)束本次循環(huán),即跳過(guò)循環(huán)體中下面尚未執(zhí)行的語(yǔ)句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定.一般形式: continu
21、e;第31頁(yè),共139頁(yè)。5.5 提前結(jié)束循環(huán)5.5.2 用continue語(yǔ)句提前結(jié)束本次循環(huán) continue語(yǔ)句和break語(yǔ)句的區(qū)別: continue語(yǔ)句只結(jié)束本次循環(huán),而不是終止整個(gè)循環(huán)的執(zhí)行。while(表達(dá)式1) if(表達(dá)式2) continue; 第32頁(yè),共139頁(yè)。 continue語(yǔ)句和break語(yǔ)句的區(qū)別: break語(yǔ)句則是結(jié)束整個(gè)循環(huán)過(guò)程,不再判斷執(zhí)行循環(huán)的條件是否成立。 while(表達(dá)式1) if(表達(dá)式2) break; 5.5 提前結(jié)束循環(huán)5.5.2 用continue語(yǔ)句提前結(jié)束本次循環(huán)第33頁(yè),共139頁(yè)。 輸入一個(gè)班全體學(xué)生的成績(jī),把不及格的學(xué)生成
22、績(jī)輸出,并求及格學(xué)生的平均成績(jī)。例題 5.7解題思路 在進(jìn)行循環(huán)中,檢查學(xué)生的成績(jī),把其中不及格的成績(jī)輸出,然后跳過(guò)后面總成績(jī)的累加和求平均成績(jī)的語(yǔ)句。用continu語(yǔ)句即可處理此問(wèn)題。5.5 提前結(jié)束循環(huán)第34頁(yè),共139頁(yè)。#include void main() float score,sum=0,average; int i,n=0; for(i=1; i6; i+) /* 假設(shè)有5個(gè)學(xué)生 */ printf(please enter score:); scanf(%f,&score); /* 輸入學(xué)生成績(jī) */ if(score60) /* 如不及格 */ /* 輸出不及格的成績(jī)
23、*/printf(Fail:%7.2fn,score); continu; /* 跳過(guò)下面的語(yǔ)句,結(jié)束本次循環(huán) */ sum=sum+score; n=n+1; /* n是用來(lái)統(tǒng)計(jì)及格學(xué)生人數(shù) */ average=sum/n; /* 及格學(xué)生平均分?jǐn)?shù) */);/* 輸出及格學(xué)生人數(shù)和平均分?jǐn)?shù) */ printf(nn=%d,average=%7.2fn,n,average 運(yùn)行結(jié)果: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 提前結(jié)束循環(huán)編寫(xiě)程序第35頁(yè),共139頁(yè)。說(shuō)明: 為減少輸入量,本程序只按5個(gè)學(xué)生處理。在輸入不及格學(xué)生成績(jī)后,輸出該成績(jī),然后跳過(guò)循環(huán)體中未執(zhí)行的語(yǔ)句,即不參加累計(jì)總分sum,也不累計(jì)合格學(xué)生數(shù)n。但是,繼續(xù)執(zhí)行后面的幾次循環(huán)。5.5 提前結(jié)束循環(huán)第36頁(yè),共139頁(yè)。5.6 幾種循環(huán)的比較(1)三種循環(huán)都可以用來(lái)處理同一問(wèn)題,一般情況下它們可以互相代替。 (2)在while循環(huán)和do-while循環(huán)中,只在while后面的括號(hào)內(nèi)指定循環(huán)條件,因此為了使循環(huán)能正常結(jié)束,應(yīng)在循環(huán)體中包含使循環(huán)趨于結(jié)束的語(yǔ)句(如i+,或i=i+
25、1等)。第37頁(yè),共139頁(yè)。5.6 幾種循環(huán)的比較for循環(huán)可以在表達(dá)式3中包含使循環(huán)趨于結(jié)束的操作,甚至可以將循環(huán)體中的操作全部放到表達(dá)式3中。因此for語(yǔ)句的功能更強(qiáng),凡用while循環(huán)能完成的,用for循環(huán)都能實(shí)現(xiàn)。(3)用while和do-while循環(huán)時(shí),循環(huán)變量初始化的操作應(yīng)在while和do-while語(yǔ)句之前完成。而for語(yǔ)句可以在表達(dá)式1中實(shí)現(xiàn)循環(huán)變量的初始化。第38頁(yè),共139頁(yè)。5.6 幾種循環(huán)的比較(4) while循環(huán)、dowhile循環(huán)和for循環(huán),都可以用break語(yǔ)句跳出循環(huán),用continue語(yǔ)句結(jié)束本次循環(huán) 。 第39頁(yè),共139頁(yè)。 有一對(duì)兔子,出生后第
26、3個(gè)月起每個(gè)月都生一對(duì)兔子。小兔子長(zhǎng)到第3個(gè)月后每個(gè)月又生一對(duì)兔子。假設(shè)所有兔子都不死,問(wèn)40個(gè)月的兔子總數(shù)為多少?例題 5.8解題思路5.7 程序舉例 第幾個(gè)月小兔子對(duì)數(shù)中兔子對(duì)數(shù)老兔子對(duì)數(shù)兔子總數(shù)110012010131012411135212563238753513第40頁(yè),共139頁(yè)??梢钥吹矫總€(gè)月的兔子總數(shù)依次為 1,1,2,3,5,8,13這就是有名的費(fèi)波那西(Fibonacci)數(shù)列。 5.7 程序舉例 第41頁(yè),共139頁(yè)。編寫(xiě)程序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; 運(yùn)行結(jié)果: 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頁(yè),共139頁(yè)。說(shuō)明:(1)變量f1和f2用長(zhǎng)整型,在printf函數(shù)中輸出格式符用“%12ld”,而不是用“%12d”,這是由于在第23個(gè)數(shù)后,整數(shù)值已超過(guò)整數(shù)最大值32767,因此必須用長(zhǎng)整型變量才能容納,并用“%ld”格式輸出。(2)if語(yǔ)句的作用是使輸出4個(gè)數(shù)后換行。i是循環(huán)變量,當(dāng)i為偶數(shù)時(shí)換行,而i每增值1,就要計(jì)算和輸出2個(gè)數(shù)(f1,f2),因此i每隔2換一次行相當(dāng)于每輸出4個(gè)數(shù)后換行輸出。5.7 程序舉例 第43頁(yè),共139頁(yè)。給一個(gè)整數(shù)m,判斷它是否素?cái)?shù)。例題 5.9解題思路5.7 程序舉例 讓m被i(i由2變到k= )除,如果m能被某一個(gè)i(2k之間的任何一個(gè)整
29、數(shù))整除,則m必然不是素?cái)?shù),不必再進(jìn)行下去。此時(shí)的i必然小于或等于k;如果m不能被2-k之間的任一整數(shù)整除,則m應(yīng)是素?cái)?shù),此肘在完成最后一次循環(huán)后,使i再加1,因此i的值就等于k+1,這時(shí)才終止循環(huán)。在循環(huán)結(jié)束之后判別i的值是否大于或等于k+1,若是,則表明未曾被2-k之間任一整數(shù)整除過(guò),因此輸出“是素?cái)?shù)”。第44頁(yè),共139頁(yè)。#include #include void main() int m,i,k; printf(“please enter a integer number:”); scanf(“%d”,&m); /* 輸入一個(gè)整數(shù)m */ k=(int)sqrt(m); /* 對(duì)m
30、求平方根,再取整 */ for (i=2;ik) printf(%d is a prime number.n,m); else printf(%d is not a prime number.n,m); 編寫(xiě)程序5.7 程序舉例 運(yùn)行結(jié)果: please enter a integer number: 1717 is a prime number.第45頁(yè),共139頁(yè)。 譯密碼。為使電文保密,往往按一定規(guī)律將其轉(zhuǎn)換成密碼,收?qǐng)?bào)人再按約定的規(guī)律將其譯回原文。例題 5.10解題思路5.7 程序舉例 可以按以下規(guī)律將電文變成密碼: 將字母A變成字母E,a變成e,即變成其后的第4個(gè)字母,W變成A,X變
31、成B,Y變成C,Z變成D。第46頁(yè),共139頁(yè)。#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);編寫(xiě)程序5.7 程序舉例 運(yùn)行結(jié)果: China! Glmre! 第47頁(yè),共139頁(yè)。說(shuō)明:內(nèi)嵌的if語(yǔ)句不能寫(xiě)成: if( cZ| cz) /* 請(qǐng)和程序笫7行比較 */ c=c-26;因?yàn)槿绻行?xiě)字毋都滿(mǎn)足“cZ”的條件,從而也都執(zhí)行“c=c-26;”語(yǔ)句,這就會(huì)出錯(cuò)。因此必須限制其范圍為“cZ &
32、 c=Z+4”,即原字母為W到Z。只有符合此條件才減26,否則,不應(yīng)按此規(guī)律轉(zhuǎn)換。5.7 程序舉例 第48頁(yè),共139頁(yè)。5.8 提高部分5.8.1 while和 do-while循環(huán)的比較凡是能用while循環(huán)處理,都能用dowhile循環(huán)處理。dowhile循環(huán)結(jié)構(gòu)可以轉(zhuǎn)換成while循環(huán)結(jié)構(gòu)。 在一般情況下,用while語(yǔ)句和用do-while語(yǔ)句處理同一問(wèn)題時(shí),若二者的循環(huán)體部分是一樣的,它們的結(jié)果也一樣。但是如果while后面的表達(dá)式一開(kāi)始就為假(0值)時(shí),兩種循環(huán)的結(jié)果是不同的。第49頁(yè),共139頁(yè)。例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); 運(yùn)行結(jié)果:1 sum=55 再運(yùn)行一次: 11sum=0運(yùn)行結(jié)果:1 sum=55 再運(yùn)行一次: 11sum=11說(shuō)明:當(dāng)while后面的表達(dá)式的第一次的值為“真”時(shí),兩種循環(huán)得到的結(jié)果相同。否則
34、,二者結(jié)果不相同。5.8 提高部分第50頁(yè),共139頁(yè)。5.8 提高部分5.8.2 for語(yǔ)句的各種形式for語(yǔ)句相當(dāng)靈活,形式變化多樣: (1) for語(yǔ)句的一般形式中的“表達(dá)式1”可以省略,此時(shí)應(yīng)在for語(yǔ)句之前給循環(huán)變量賦初值。注意省略表達(dá)式1時(shí),其后的分號(hào)不能省略。如: for(;i=100;i+) sum=sum+i; 執(zhí)行時(shí),跳過(guò)“求解表達(dá)式1”這一步,其他不變。第51頁(yè),共139頁(yè)。(2) 如果表達(dá)式2省略,即不判斷循環(huán)條件,循環(huán)無(wú)終止地進(jìn)行下去。也就是認(rèn)為表達(dá)式2始終為真。如: for(i=1; ;i+) sum=sum+i; 表達(dá)式1是一個(gè)賦值表達(dá)式,表達(dá)式2空缺。它相當(dāng)于:
35、 i=1; while(1) sum=sum+1;i+;5.8 提高部分5.8.2 for語(yǔ)句的各種形式第52頁(yè),共139頁(yè)。(3) 表達(dá)式3也可以省略,但此時(shí)程序設(shè)計(jì)者應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束。如: for(i=1;i=100;) sum=sum+i;i+; 在上面的for語(yǔ)句中只有表達(dá)式1和表達(dá)式2,而沒(méi)有表達(dá)式3。i+的操作不放在for語(yǔ)句的表達(dá)式3的位置處,而作為循環(huán)體的一部分,效果是一樣的,都能使循環(huán)正常結(jié)束。5.8 提高部分5.8.2 for語(yǔ)句的各種形式第53頁(yè),共139頁(yè)。(4) 可以省略表達(dá)式1和表達(dá)式3,只有表達(dá)式2,即只給循環(huán)條件。如: for(;i=100;) wh
36、ile(i=100) sum=sum+i; 相當(dāng)于 sum=sum+i; i+; i+; 在這種情況下,完全等同于while語(yǔ)句??梢?jiàn)for語(yǔ)句比while語(yǔ)句功能強(qiáng),除了可以給出循環(huán)條件外,還可以賦初值,使循環(huán)變量自動(dòng)增值等。5.8 提高部分5.8.2 for語(yǔ)句的各種形式第54頁(yè),共139頁(yè)。(5) 3個(gè)表達(dá)式都可省略,如: for(; ;) 語(yǔ)句相當(dāng)于 while(1) 語(yǔ)句 即不設(shè)初值,不判斷條件(認(rèn)為表達(dá)式2為真值),循環(huán)變量不增值。無(wú)終止地執(zhí)行循環(huán)體。5.8 提高部分5.8.2 for語(yǔ)句的各種形式第55頁(yè),共139頁(yè)。(6) 表達(dá)式1可以是設(shè)置循環(huán)變量初值的賦值表達(dá)式,也可以是與
37、循環(huán)變量無(wú)關(guān)的其他表達(dá)式。如: for (sum=0;i=100;i+) sum=sum+i;表達(dá)式3也可以是與循環(huán)控制無(wú)關(guān)的任意表達(dá)式。5.8 提高部分5.8.2 for語(yǔ)句的各種形式第56頁(yè),共139頁(yè)。表達(dá)式1和表達(dá)式3可以是一個(gè)簡(jiǎn)單的表達(dá)式,也可以是逗號(hào)表達(dá)式,即包含一個(gè)以上的簡(jiǎn)單表達(dá)式,中間用逗號(hào)間隔。如: for(sum=0,i=1;i=100;i+) sum=sum+i;或 for(i=0,j=100;i=j;i+,j-) k=i+j;表達(dá)式1和表達(dá)式3都是逗號(hào)表達(dá)式,各包含兩個(gè)賦值表達(dá)式,即同時(shí)設(shè)兩個(gè)初值,使兩個(gè)變量增值。 5.8 提高部分5.8.2 for語(yǔ)句的各種形式第57
38、頁(yè),共139頁(yè)。 在逗號(hào)表達(dá)式內(nèi)按自左至右順序求解,整個(gè)逗號(hào)表達(dá)式的值為其中最右邊的表達(dá)式的值。如: for(i=1;i=100;i+,i+) sum=sum+i;相當(dāng)于 for(i=1;i=100;i=i+2) sum=sum+i;5.8 提高部分5.8.2 for語(yǔ)句的各種形式第58頁(yè),共139頁(yè)。(7) 表達(dá)式一般是關(guān)系表達(dá)式(如i=100)或邏輯表達(dá)式(如ab & xy),但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值為非零,就執(zhí)行循環(huán)體。5.8 提高部分5.8.2 for語(yǔ)句的各種形式第59頁(yè),共139頁(yè)。 for(i=0;(c=getchar()!=n;i+=c); 在表達(dá)式2中先從終
39、端接收一個(gè)字符賦給c,然后判斷此賦值表達(dá)式的值是否不等于n(換行符),如果不等于n,就執(zhí)行循環(huán)體。注意:此for語(yǔ)句的循環(huán)體為空語(yǔ)句,把本來(lái)要在循環(huán)體內(nèi)處理的內(nèi)容放在表達(dá)式3中,作用是一樣的??梢?jiàn)for語(yǔ)句功能強(qiáng),可以在表達(dá)式中完成本來(lái)應(yīng)在循環(huán)體內(nèi)完成的操作。5.8 提高部分5.8.2 for語(yǔ)句的各種形式第60頁(yè),共139頁(yè)。 for( ;(c=getchar()!=n;) printf(%c,c); for語(yǔ)句中只有表達(dá)式2,而無(wú)表達(dá)式1和表達(dá)式3。其作用是每讀入一個(gè)字符后立即輸出該字符,直到輸入一個(gè)“換行”為止。請(qǐng)注意,從終端鍵盤(pán)向計(jì)算機(jī)輸入時(shí),是在按Enter鍵以后才將一批數(shù)據(jù)一起送到
40、內(nèi)存緩沖區(qū)中去的。運(yùn)行情況:Computer (輸入)Computer (輸出)而不是Ccoommppuutteerr5.8 提高部分5.8.2 for語(yǔ)句的各種形式第61頁(yè),共139頁(yè)。注意: C語(yǔ)言中的for語(yǔ)句比其他語(yǔ)言(如BASIC,PASCAL)中的FOR語(yǔ)句功能強(qiáng)得多??梢园蜒h(huán)體和一些與循環(huán)控制無(wú)關(guān)的操作也作為表達(dá)式1或表達(dá)式3出現(xiàn),這樣程序可以短小簡(jiǎn)潔。但過(guò)分地利用這一特點(diǎn)會(huì)使for語(yǔ)句顯得雜亂,可讀性降低,最好不要把與循環(huán)控制無(wú)關(guān)的內(nèi)容放到for語(yǔ)句中。5.8 提高部分5.8.2 for語(yǔ)句的各種形式第62頁(yè),共139頁(yè)。第六章利用數(shù)組處理批量數(shù)據(jù)第63頁(yè),共139頁(yè)。問(wèn)題:
41、給一組數(shù)排序,這組 數(shù)該 如何存放呢? 這些數(shù)據(jù)如何存放才便于排序82945637617188888888881111111111111118888888888這便是本章所要解決的問(wèn)題第64頁(yè),共139頁(yè)。 本章要點(diǎn)掌握一維、二維數(shù)組的定義和引用方法、存儲(chǔ)結(jié)構(gòu)和初始化方法。掌握有關(guān)一維數(shù)組的有關(guān)算法掌握數(shù)組的運(yùn)算。第65頁(yè),共139頁(yè)。主要內(nèi)容6.1 為什么要用數(shù)組6.2 定義和引用一維數(shù)組6.3 二維數(shù)組的定義和引用6.4 字符數(shù)組6.5 提高部分第66頁(yè),共139頁(yè)。6.1 為什么要用數(shù)組 C語(yǔ)言為這些數(shù)據(jù),提供了一種構(gòu)造數(shù)據(jù)類(lèi)型:數(shù)組。所謂數(shù)組就是一組具有相同數(shù)據(jù)類(lèi)型的數(shù)據(jù)的有序集合。一
42、個(gè)班學(xué)生的學(xué)習(xí)成績(jī)一行文字一個(gè)矩陣這些數(shù)據(jù)的特點(diǎn)是:1、具有相同的數(shù)據(jù)類(lèi)型2、使用過(guò)程中需要保留原始數(shù)據(jù)第67頁(yè),共139頁(yè)。1.一維數(shù)組的定義格式為:類(lèi)型說(shuō)明符 數(shù)組名常量表達(dá)式;例如: int a10; 它表示定義了一個(gè)整形數(shù)組,數(shù)組名為a,此數(shù)組有10個(gè)元素。6.2 定義和引用一維數(shù)組6.2.1 定義一維數(shù)組說(shuō)明: 1.數(shù)組名定名規(guī)則和變量名相同,遵循標(biāo)識(shí)符定名規(guī)則。第68頁(yè),共139頁(yè)。2.在定義數(shù)組時(shí),需要指定數(shù)組中元素的個(gè)數(shù),方括弧中的常量表達(dá)式用來(lái)表示元素的個(gè)數(shù),即數(shù)組長(zhǎng)度。3.常量表達(dá)式中可以包括常量和符號(hào)常量,但不能包含變量。也就是說(shuō),C語(yǔ)言不允許對(duì)數(shù)組的大小作動(dòng)態(tài)定義,即數(shù)
43、組的大小不依賴(lài)于程序運(yùn)行過(guò)程中變量的值。第69頁(yè),共139頁(yè)。例如: int n; scanf(“%d,&n); /*在程序中臨時(shí)輸入數(shù) 組的大小 */ int an;數(shù)組說(shuō)明中其他常見(jiàn)的錯(cuò)誤: float a0;/* 數(shù)組大小為0沒(méi)有意義 */ int b(2)(3); /* 不能使用圓括號(hào) */ int k, ak; /* 不能用變量說(shuō)明數(shù)組大小*/ 第70頁(yè),共139頁(yè)。注意:定義數(shù)組時(shí)用到的“數(shù)組名常量表達(dá)式” 和引用數(shù)組元素時(shí)用到的“數(shù)組名下標(biāo)” 是有區(qū)別的。例如 int a10; t=a6; 6.2 一維數(shù)組的定義和引用6.2.2 引用一維數(shù)組元素1.數(shù)組元素的引用方式:數(shù)組名下標(biāo)
44、下標(biāo)可以是整型常量或整型表達(dá)式。例如: a0=a5+a7-a2*3第71頁(yè),共139頁(yè)。2.一維數(shù)組元素引用的程序?qū)嵗} 6.1 引用數(shù)組元素。利用循環(huán)給數(shù)組元素a0a9賦值為09,然后按逆序輸出各元素的值解題思路 循環(huán)給數(shù)組元素a0 a9賦值09,這樣,然后按a9到a0的順序輸出各元素的值。第72頁(yè),共139頁(yè)。2.一維數(shù)組元素引用的程序?qū)嵗?include void main() int i,a10; for (i=0; i=0; i-) printf(%d ,ai); printf(n); 運(yùn)行結(jié)果如下:9 8 7 6 5 4 3 2 1 0 說(shuō)明:1、第一個(gè)for循環(huán)的作用是給a數(shù)組
45、中的元素賦值。2、第2個(gè)for循環(huán)的作用是所按逆序輸出a數(shù)組中的10個(gè)元素編寫(xiě)程序第73頁(yè),共139頁(yè)。對(duì)數(shù)組元素初始化的實(shí)現(xiàn)方法: 1.在定義數(shù)組時(shí)對(duì)數(shù)組元素賦以初值。例如:int a10=0,1,2,3,4,5,6,7,8,9;將數(shù)組元素的初值依次放在一對(duì)花括弧內(nèi)。經(jīng)過(guò)上面的定義和初始化之后,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頁(yè),共139頁(yè)。 3. 如果想使一個(gè)數(shù)組中全部元素值為0,可以寫(xiě)成: 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個(gè)元素,但花括弧內(nèi)只提供5個(gè)初值,這表示只給前面5個(gè)元素賦初值,后5個(gè)元素值為0。第75頁(yè),共139頁(yè)。4. 在對(duì)全部數(shù)組元素賦初值時(shí),由于數(shù)據(jù)的個(gè)數(shù)已經(jīng)確定,因此可以不指定數(shù)組長(zhǎng)度。 例如:int a5=1,2,3,4,5; 也可以寫(xiě)成 int a=1,2,3,4,5; int a10=1,2,3,4,5; 只初始化前5個(gè)元素,后5個(gè)元素為0。第76頁(yè),共139頁(yè)。Fibonacci數(shù)列公式:已知: a1=a2=1,an=an-1+an-2 即:1,1,2,3,5,8,13建立一個(gè)數(shù)組
47、,將數(shù)列中第1個(gè)數(shù)放在數(shù)組第1個(gè)的元素中,數(shù)列第2個(gè)數(shù)放在數(shù)組第2個(gè)的元素中,。 6.2 一維數(shù)組的定義和引用6.2.4 一維數(shù)組程序舉例例題 6.2 用數(shù)組來(lái)處理求Fibonacci數(shù)列問(wèn)題。 解題思路第77頁(yè),共139頁(yè)。程序?qū)嵗?include void main() int i; int f20=1,1;6.2 一維數(shù)組的定義和引用6.2.4 一維數(shù)組程序舉例編寫(xiě)程序第78頁(yè),共139頁(yè)。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)結(jié)束*/ /*程序結(jié)束
48、*/運(yùn)行結(jié)果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765if語(yǔ)句用來(lái)控制換行,每行輸出5個(gè)數(shù)據(jù)。第79頁(yè),共139頁(yè)。例題 6.3 假如有n個(gè)人,各人年齡不同,希望按年齡將他們從小到大排列。 解題思路 這種問(wèn)題稱(chēng)為數(shù)的排序(sort)。排序的原則有兩 類(lèi),一類(lèi)是“升序”,從小到大;一類(lèi)是“降序”,從大到小。我們可以把這個(gè)題目抽象為一般形式: 對(duì)n個(gè)數(shù)按升序排列 對(duì)一組數(shù)據(jù)進(jìn)行排序的方法很多,本例介紹用“起泡法”排序。“起泡法”的思路是如下第80頁(yè),共139頁(yè)。第一趟比較 經(jīng)過(guò)第一趟(共5次比較與交換
49、)后,最大的數(shù)9已“沉底” 。然后進(jìn)行對(duì)余下的前面5個(gè)數(shù)第二趟比較,第81頁(yè),共139頁(yè)。第二趟比較如果有n個(gè)數(shù),則要進(jìn)行n-1趟比較。在第1趟比較中要進(jìn)行n-1次兩兩比較,在第j趟比較中要進(jìn)行n-j次兩兩比較。第82頁(yè),共139頁(yè)。程序流程圖如下:第83頁(yè),共139頁(yè)。#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;i10;i+) scanf(%d,&ai); printf(n); 編寫(xiě)程序第84頁(yè),共139頁(yè)。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);/*程序結(jié)束*/程序運(yùn)行結(jié)果如下: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說(shuō)明:1、程序中實(shí)現(xiàn)起泡法排序算法的主要是1013行。 2、仔細(xì)分析嵌套的for語(yǔ)句。 第85頁(yè),共139頁(yè)。 6.3 二維數(shù)組的定義和引用 6.3.1 定義二維數(shù)組二維數(shù)組定義的一般形式為類(lèi)型說(shuō)明符
51、 數(shù)組名常量表達(dá)式常量表達(dá)式;例如:定義a為34(3行4列)的數(shù)組,b為510(5行10列)的數(shù)組。如下:float a34,b510;不能寫(xiě)成 float a3,4,b5,10;第86頁(yè),共139頁(yè)。C語(yǔ)言中,二維數(shù)組中元素排列的順序是按行存放的,即在內(nèi)存中先順序存放第一行的元素,再存放第二行的元素。下圖表示對(duì)a34數(shù)組存放的順序。 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 6.3 二維數(shù)組的定義和引用 6.3.1 定義二維數(shù)組第87頁(yè),共139頁(yè)。二維數(shù)組元素的表示形式為:數(shù)組名下標(biāo)下標(biāo)例如: a23下標(biāo)可以是整型表達(dá)式,如 a2-12
52、*2-1數(shù)組元素可以出現(xiàn)在表達(dá)式中,也可以被賦值例如:b12=a23/2不要寫(xiě)成 a2,3,a2-1,2*2-1形式6.3 二維數(shù)組的定義和引用6.3.2 引用二維數(shù)組的元素第88頁(yè),共139頁(yè)。常出現(xiàn)的錯(cuò)誤有: int a34; /* 定義a為34的數(shù)組 */ a34=3; 在使用數(shù)組元素時(shí),應(yīng)該注意下標(biāo)值應(yīng)在已定義的數(shù)組大小的范圍內(nèi)。6.3 二維數(shù)組的定義和引用6.3.2 引用二維數(shù)組的元素第89頁(yè),共139頁(yè)。可以用下面4種方法對(duì)二維數(shù)組初始化:.分行給二維數(shù)組賦初值。例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; .可以將所有數(shù)據(jù)寫(xiě)在一個(gè)花括弧內(nèi),按數(shù)組
53、排列的順序?qū)Ω髟刭x初值。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 6.3 二維數(shù)組的定義和引用 6.3.3 二維數(shù)組的初始化第90頁(yè),共139頁(yè)。.可以對(duì)部分元素賦初值。例如: int a34=1,5,9; 1 0 0 05 0 0 0 9 0 0 0也可以對(duì)各行中的某一元素賦初值,如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也可以只對(duì)某幾行元素賦初值。如:int a34=1,5,6; 第91頁(yè),共139頁(yè)。.如果對(duì)全部元素都賦初值,則定義數(shù)組時(shí)對(duì)第一維的長(zhǎng)度可以不
54、指定,但第二維的長(zhǎng)度不能省。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;它等價(jià)于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;在定義時(shí)也可以只對(duì)部分元素賦初值而省略第一維的長(zhǎng)度,但應(yīng)分行賦初值。例如:int a4=0,0,3,0,10;0 0 3 00 0 0 00 10 0 0第92頁(yè),共139頁(yè)。 6.3 二維數(shù)組的定義和引用 6.3.4 二維數(shù)組程序舉例例如:a= 1 2 3 1 4 4 5 6 b= 2 5 3 6例題 6.4 將一個(gè)二維數(shù)組a的行和列的元素互換(即行列轉(zhuǎn)置),存到另一個(gè)二維數(shù)組b中。 解題思路 將a數(shù)組中第i行j
55、列元素賦給b數(shù)組中j行i列元素,例如a00賦給b00,a01 賦給b10,a02賦給b20,??梢杂秒p層循環(huán)來(lái)處理,用外循環(huán)控制行的變化,內(nèi)循環(huán)控制列的變化。第93頁(yè),共139頁(yè)。 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+) 編寫(xiě)程序第94頁(yè),共139頁(yè)。 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); /*程序結(jié)束*/運(yùn)行結(jié)果如下:array a: 1 2 3 4 5 6array b: 1 4 2 5 3 6 說(shuō)明:如果把第7行:“for (i=0;i2;i+)”改為“for (i=0;i=2;i+)”,意味著什么?結(jié)果會(huì)怎樣?第95頁(yè),共139頁(yè)。例題 6.5 有一個(gè)班30個(gè)學(xué)生,己知每個(gè)學(xué)生有5門(mén)課的成績(jī),要求輸出平均成績(jī)最高的學(xué)生的成績(jī)以及該學(xué)生的序號(hào)。 解題思路 對(duì)本題而言,宜用二維數(shù)組,用一行中的各元素存放一個(gè)學(xué)生的成績(jī),即行代表學(xué)生,列代表一門(mén)課的成績(jī)。要存放
57、30個(gè)學(xué)生5門(mén)課的成績(jī),要用一個(gè)30*5的二維數(shù)組。另外,由于要比較各人的平均成績(jī),因此,對(duì)每個(gè)學(xué)生來(lái)說(shuō),應(yīng)該存放6個(gè)數(shù)據(jù),每人平均成績(jī)要計(jì)算出來(lái),并存放在數(shù)組中。這樣,數(shù)組的大小就應(yīng)該是30*6。設(shè)計(jì)算法:(1)求每人平均成績(jī),放在數(shù)組每一行的最后一列中;(2)找出最高的平均分,和該學(xué)生的序號(hào);(3)輸出最高的平均分,和該學(xué)生的序號(hào)。第96頁(yè),共139頁(yè)。程序如下: #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; /* 累加序號(hào)為j的學(xué)生各門(mén)課的成績(jī) * si5=sum/5; /* 求序號(hào)為j的學(xué)生各門(mén)課的的平均分 */ 編寫(xiě)程序第97頁(yè),共139頁(yè)。for (i=0;imax) /* 逐個(gè)將5個(gè)學(xué)生的平均分與max比較 */ max=si5;max_i=i; /* 如果比max大,就用序號(hào)為i的學(xué)生的平均分取代max的原值,將i的當(dāng)前值保存在max_I中 */ printf(stu_or
59、der=%dnmax=%7.2fn,max_i,max); /* 輸出最高平均分和該生的序號(hào)i */ 運(yùn)行結(jié)果如下:max=10,row=2,colum=1 說(shuō)明: 1、在對(duì)數(shù)組初始化時(shí),只對(duì)各行的前5列賦初值,第6列默認(rèn)為0。2、注意第一個(gè)for語(yǔ)句的范圍。請(qǐng)思考能否不要“sum=0;”這一行?或者把這一句改放到for語(yǔ)句的前面? 3、第三個(gè)for語(yǔ)句內(nèi)嵌了一個(gè)if語(yǔ)句,用來(lái)將5個(gè)學(xué)生的平均分逐個(gè)與max比較 第98頁(yè),共139頁(yè)。6.4 字符數(shù)組6.4.1 定義字符數(shù)組及對(duì)其初始化定義方法與前面介紹的類(lèi)似。例如:char c10;c0=I;c1= ;c2=a;c3=m;c4= ;c5=h;
60、c6=a;c7=p;c8=p;c9=y;第99頁(yè),共139頁(yè)。對(duì)字符數(shù)組初始化,可逐個(gè)字符賦給數(shù)組中各元素。例如:char c10=I,a,m,h,a,p,p,y 6.4 字符數(shù)組6.4.1 定義字符數(shù)組及對(duì)其初始化第100頁(yè),共139頁(yè)。如果初值個(gè)數(shù)小于數(shù)組長(zhǎng)度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自動(dòng)定為空字符。char c10=c, ,p,r,o,g,r,a,m; 第101頁(yè),共139頁(yè)。如果提供的初值個(gè)數(shù)與預(yù)定的數(shù)組長(zhǎng)度相同,在定義時(shí)可以省略數(shù)組長(zhǎng)度,系統(tǒng)會(huì)自動(dòng)根據(jù)初值個(gè)數(shù)確定數(shù)組長(zhǎng)度。char c=I, ,a,m, ,h,a,p,p,y;數(shù)組c的長(zhǎng)度自動(dòng)定為10。 第10
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 漳州理工職業(yè)學(xué)院《燃燒與爆炸安全》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川文化藝術(shù)學(xué)院《臨床醫(yī)學(xué)導(dǎo)論(含醫(yī)學(xué)史)》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州黃河護(hù)理職業(yè)學(xué)院《食品調(diào)味與感官分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年湖北省武漢市漢口北高中高三4月聯(lián)考試題物理試題試卷含解析
- 廈門(mén)大學(xué)嘉庚學(xué)院《資源循環(huán)專(zhuān)業(yè)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年浙江建筑安全員《B證》考試題庫(kù)及答案
- 2025年-遼寧省安全員《C證》考試題庫(kù)
- 2025年吉林建筑安全員A證考試題庫(kù)附答案
- 2025吉林省安全員C證(專(zhuān)職安全員)考試題庫(kù)
- 2025廣東省安全員《C證》考試題庫(kù)
- 《政協(xié)委員培訓(xùn)材料》課件
- JJF(陜) 111-2024 超聲流量計(jì)在線(xiàn)校準(zhǔn)規(guī)范
- 2024年度城市公共交通線(xiàn)路特許經(jīng)營(yíng)協(xié)議2篇
- 心肺復(fù)蘇術(shù)-cpr課件
- 裝配式建筑混凝土構(gòu)件深化設(shè)計(jì)基本要求知識(shí)點(diǎn)結(jié)構(gòu)拆分設(shè)計(jì)課件講解
- 神東煤炭集團(tuán)筆試題
- 2023年高考英語(yǔ)真題全國(guó)乙卷及參考答案
- 倉(cāng)庫(kù)管理員轉(zhuǎn)正匯報(bào)
- 2024年形勢(shì)與政策 第二講 中國(guó)經(jīng)濟(jì)高質(zhì)量發(fā)展扎實(shí)推進(jìn)(課件)
- 2024年人教版初二地理下冊(cè)期末考試卷(附答案)
- 國(guó)家職業(yè)技術(shù)技能標(biāo)準(zhǔn) 4-04-05-05 人工智能訓(xùn)練師 人社廳發(fā)202181號(hào)
評(píng)論
0/150
提交評(píng)論