《新編C語(yǔ)言程序設(shè)計(jì)教程》課件第8章_第1頁(yè)
《新編C語(yǔ)言程序設(shè)計(jì)教程》課件第8章_第2頁(yè)
《新編C語(yǔ)言程序設(shè)計(jì)教程》課件第8章_第3頁(yè)
《新編C語(yǔ)言程序設(shè)計(jì)教程》課件第8章_第4頁(yè)
《新編C語(yǔ)言程序設(shè)計(jì)教程》課件第8章_第5頁(yè)
已閱讀5頁(yè),還剩93頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章數(shù)組類(lèi)型8.1一維數(shù)組8.2二維數(shù)組與多維數(shù)組8.3字符數(shù)組與字符串8.4重命名類(lèi)型8.5程序設(shè)計(jì)舉例8.1一維數(shù)組8.1.1一維數(shù)組的定義形式:存儲(chǔ)類(lèi)別類(lèi)型標(biāo)識(shí)符數(shù)組名[常量];類(lèi)型標(biāo)識(shí)符描述的是數(shù)組分量的類(lèi)型,是定義數(shù)組類(lèi)型的基類(lèi)型,可以是任何類(lèi)型。數(shù)組名代表數(shù)組所占存儲(chǔ)空間的首地址。常量表示數(shù)組的大小(長(zhǎng)度),即數(shù)組中分量的個(gè)數(shù)。與PASCAL語(yǔ)言不同,以上實(shí)際定義的是數(shù)組量,而非數(shù)組類(lèi)型,數(shù)組類(lèi)型隱含其中。提到數(shù)組,可能是指數(shù)組量,也可能是指數(shù)組類(lèi)型,注意根據(jù)上下文區(qū)分。例如,定義數(shù)組,描述下列數(shù)據(jù):(1)100個(gè)整數(shù):intnum[100];(2)1000個(gè)學(xué)生C語(yǔ)言課程的成績(jī):floatccj[1000];(3)一年中每月的天數(shù):intmonth[12];(4)100種商品的價(jià)格:floatprice[100];(5)500個(gè)字符類(lèi)型的數(shù)據(jù):charch[500];

說(shuō)明:

(1)數(shù)組名命名規(guī)則和變量名命名規(guī)則相同,都遵循標(biāo)識(shí)符命名規(guī)則。

(2)數(shù)組的長(zhǎng)度可以用符號(hào)常量描述,但不能用變量描述,C語(yǔ)言不提供動(dòng)態(tài)數(shù)組。

(3)數(shù)組以線性方式將數(shù)組分量依次存儲(chǔ),所占空間等于各分量所占空間之和,即數(shù)組分量個(gè)數(shù)乘以基類(lèi)型數(shù)據(jù)所占空間。數(shù)組名代表存放數(shù)組的首地址。8.1.2一維數(shù)組的引用

下標(biāo)變量的形式為:數(shù)組名[下標(biāo)表達(dá)式]

例如,對(duì)以上定義的num數(shù)組、ccj數(shù)組:

num數(shù)組的100個(gè)分量為num[0]、num[1]、…、num[i]、…、num[99],每個(gè)分量存放一個(gè)整數(shù),num[i]相當(dāng)于一個(gè)int型變量。

ccj數(shù)組的1000個(gè)分量為ccj[0]、ccj[1]、…、ccj[i]、…、ccj[999],每個(gè)分量對(duì)應(yīng)一個(gè)學(xué)生的成績(jī),ccj[i]相當(dāng)于一個(gè)float型變量。

說(shuō)明:

(1)下標(biāo)的取值范圍從0到數(shù)組長(zhǎng)度減1。

(2)下標(biāo)變量相當(dāng)于基類(lèi)型變量,能進(jìn)行基類(lèi)型量的一切運(yùn)算操作。

(3)下標(biāo)往往對(duì)應(yīng)于循環(huán)控制變量,通過(guò)循環(huán)、通過(guò)下標(biāo)的變化完成對(duì)數(shù)組所有分量的操作,即完成對(duì)整個(gè)數(shù)組的操作。

(4)下標(biāo)往往對(duì)應(yīng)特定的含義。

(5)對(duì)于下標(biāo)出界,C語(yǔ)言不進(jìn)行語(yǔ)法檢查,務(wù)請(qǐng)小心。(6)如果希望下標(biāo)為i的分量對(duì)應(yīng)第i個(gè)數(shù)據(jù),可將定義的數(shù)組大小增1。例如:intnum[101];

floatccj[1001];

100個(gè)整數(shù)用num數(shù)組的分量num[1]、num[2]、…、num[100]描述,num[i]對(duì)應(yīng)于第i個(gè)整數(shù)。

1000個(gè)學(xué)生的C語(yǔ)言成績(jī)用ccj數(shù)組的分量ccj[1]、ccj[2]、…、ccj[1000]描述,ccj[i]對(duì)應(yīng)于第i個(gè)學(xué)生的成績(jī)。下標(biāo)為0的分量未使用。8.1.3一維數(shù)組的初始化數(shù)組的初始化可以在執(zhí)行時(shí)進(jìn)行,也可以在編譯階段進(jìn)行。執(zhí)行時(shí)初始化可通過(guò)賦值運(yùn)算或賦值語(yǔ)句、或輸入函數(shù)進(jìn)行,但只能對(duì)數(shù)組分量進(jìn)行,要占用運(yùn)行時(shí)間。例如:輸入數(shù)據(jù)給數(shù)組num、ccj。for(i=0;i<101;i++)scanf("%d",&num[i]);for(i=0;i<1001;i++)scanf("%f",&ccj[i]);對(duì)靜態(tài)存儲(chǔ)數(shù)組和外部存儲(chǔ)數(shù)組,數(shù)組的初始化可以在編譯階段進(jìn)行,即在程序運(yùn)行之前初始化,節(jié)約運(yùn)行時(shí)間。初始化形式:存儲(chǔ)類(lèi)別類(lèi)型數(shù)組名[常量]={常量1,常量2,…,常量n};各分量依次初始化為常量1、常量2、…、常量n。注意初始化數(shù)據(jù)必須用花括號(hào)括起。例如:①staticintmonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};則month[0]=31,month[1]=29,month[2]=31,…,month[12]=31。②staticcharch[5]={'a','e','i','o','u'};則ch[0]='a',ch[1]='e',ch[2]='i',ch[3]='o',ch[4]='u'。說(shuō)明:

(1)對(duì)靜態(tài)存儲(chǔ)數(shù)組和外部存儲(chǔ)數(shù)組,默認(rèn)初值為0。

(2)可以只給一部分?jǐn)?shù)組分量初始化。例如:staticinta[50]={70,75,60,80,90};相當(dāng)于a[0]=70,a[1]=75,a[2]=60,a[3]=80,a[4]=90,沒(méi)有給定初值的分量取默認(rèn)初值。

(3)若對(duì)數(shù)組中所有分量給定了初值,則定義數(shù)組時(shí)可以不給出數(shù)組長(zhǎng)度。數(shù)組的長(zhǎng)度為給出的初值個(gè)數(shù)。例如:staticfloatx[?]={1.5,2.5,3.5,4.5,5.5};給了數(shù)組5個(gè)初值,則數(shù)組長(zhǎng)度為5。

(4)若僅給數(shù)組部分分量初值,則不能省略數(shù)組長(zhǎng)度。例8–1

求10個(gè)數(shù)的最大值與最小值,10個(gè)數(shù)用數(shù)組描述。程序如下:/*程序8-1,求10個(gè)數(shù)的最大值與最小值*/main(?){floata[10];/*存放10個(gè)數(shù)的數(shù)組*/inti;floatmax=?1e20,min=1e20;for(i=0;i<=9;i++)/*輸入10個(gè)數(shù)到數(shù)組*/scanf("%f",&a[i]);for(i=0;i<=9;i++)/*求最大值與最小值*/{if(a[i]>max)max=a[i];

if(a[i]<min)min=a[i];

}for(i=0;i<=9;i++)/*輸出數(shù)組中的10個(gè)數(shù)*/printf("%8.2f",&a[i]);printf("\n最大值=%f,最小值=%f",max,min);}

例8–2

求某班50個(gè)學(xué)生C語(yǔ)言課程的平均成績(jī)及每個(gè)學(xué)生與平均成績(jī)之差。算法提示:

(1)50個(gè)學(xué)生C語(yǔ)言課程的成績(jī)及每個(gè)學(xué)生與平均成績(jī)之差都是大量類(lèi)型相同的數(shù)據(jù),可分別用一個(gè)一維數(shù)組作整體描述。

(2)下標(biāo)為0的分量沒(méi)有使用,同時(shí)用下標(biāo)對(duì)應(yīng)學(xué)號(hào)。

(3)數(shù)組的整體操作轉(zhuǎn)化成對(duì)數(shù)組分量進(jìn)行,其實(shí)就是將對(duì)50個(gè)學(xué)生的成績(jī)處理轉(zhuǎn)化成對(duì)每個(gè)學(xué)生進(jìn)行。/*程序8-2,求C語(yǔ)言課程的平均成績(jī)及每個(gè)學(xué)生與平均成績(jī)之差*/main(?){floatccj[51];/*C語(yǔ)言成績(jī)數(shù)組*/inti;floattcj=0.0;/*總成績(jī)*/floatav,cav[51];/*平均成績(jī)av,與平均成績(jī)之差數(shù)組cav*//*輸入學(xué)生成績(jī)*/for(i=1;i<=50;i++){printf("請(qǐng)輸入第%d個(gè)學(xué)生成績(jī):",i);

scanf("%f",&ccj[i]);

}/*求總成績(jī)、平均成績(jī)*/for(i=1;i<=50;i++)tcj+=ccj[i];av=tcj/50;/*求與平均成績(jī)之差*/for(i=1;i<=50;i++)cav[i]=ccj[i]??av;/*輸出*/printf("C語(yǔ)言課程的平均成績(jī)=%5.2f\n",av);for(i=1;i<=50;i++)printf("第%d個(gè)學(xué)生與平均成績(jī)之差=%5.2\n",i,cav[i]);}

例8-3

用一維數(shù)組求Fibonacci數(shù)列前20項(xiàng),要求每行輸出5個(gè)數(shù)。/*程序8-3,求Fibonacci數(shù)列前20項(xiàng)*/main(){staticinta[20]={1,1};/*存放Fibonacci數(shù)列前20項(xiàng)的數(shù)組*/inti;for(i=2;i<20;i++)

f[i]=f[i-1]+f[i-2];printf(″Fibonacci數(shù)列前20項(xiàng)如下:\n″);for(i=2;i<20;i++)

{printf(″%8d″,f[i]);

if(i%5==0)printf(″\n″);/*if語(yǔ)句用來(lái)控制換行*/}}/*程序8-3,求Fibonacci數(shù)列前20項(xiàng)*/main(){staticinta[20]={1,1};/*存放Fibonacci數(shù)列前20項(xiàng)的數(shù)組*/inti;

for(i=2;i<20;i++)

f[i]=f[i-1]+f[i-2];

printf(″Fibonacci數(shù)列前20項(xiàng)如下:\n″);

for(i=2;i<20;i++)

{printf(″%8d″,f[i]);

if(i%5==0)printf(″\n″);/*if語(yǔ)句用來(lái)控制換行*/}}運(yùn)行結(jié)果:Fibonacci數(shù)列前20項(xiàng)如下:

112358132134558914423337761098715972584418167658.1.4一維數(shù)組作函數(shù)參數(shù)

數(shù)組作函數(shù)參數(shù)有數(shù)組元素作函數(shù)參數(shù)和整個(gè)數(shù)組作函數(shù)參數(shù)兩種情況。數(shù)組元素作函數(shù)參數(shù)只能是作函數(shù)的實(shí)參,與基類(lèi)型變量作函數(shù)一樣處理。整個(gè)數(shù)組作函數(shù)參數(shù),此時(shí)實(shí)參與形參都應(yīng)用數(shù)組名或后介紹的指針量,而且基類(lèi)型應(yīng)該一致。整個(gè)數(shù)組作函數(shù)參數(shù),傳遞的是數(shù)組的首地址,即將實(shí)參數(shù)組的首地址傳遞給形參數(shù)組,形參數(shù)組與實(shí)參數(shù)組共享存儲(chǔ)單元。在函數(shù)中改變了形參數(shù)組的值,實(shí)參數(shù)組將同時(shí)改變,因而數(shù)據(jù)是雙向傳遞的。例8-4

將例8-2中求C語(yǔ)言課程平均成績(jī)改用函數(shù)實(shí)現(xiàn)。函數(shù)如下:floatavf(xcj)/*求C語(yǔ)言課程平均成績(jī)*/floatxcj[51];{inti;

floatsum=0.0,tav;

for(i=1;i<=50;i++)

sum+=xcj[i];

tav=sum/50;

return(tav);}

主函數(shù)中調(diào)用函數(shù)avf()來(lái)求平均成績(jī):av=avf(ccj);此時(shí),實(shí)參數(shù)組為ccj,對(duì)應(yīng)的形參數(shù)組為xcj,調(diào)用時(shí)將實(shí)參數(shù)組ccj首地址傳遞給形參數(shù)組xcj。請(qǐng)注意本例中數(shù)組的第一個(gè)分量ccj[0]、xcj[0]無(wú)意義。對(duì)形參數(shù)組可以不指定數(shù)組大小,在定義數(shù)組時(shí)數(shù)組名后跟空的中括號(hào)。在函數(shù)中另設(shè)一個(gè)參數(shù),傳遞數(shù)組元素的個(gè)數(shù)。如此在函數(shù)中實(shí)現(xiàn)變相動(dòng)態(tài)數(shù)組。

例8-5

將上例中函數(shù)延伸考慮為求n個(gè)學(xué)生C語(yǔ)言課程平均成績(jī)。函數(shù)如下:floatavf(xcj,n)/*求n個(gè)學(xué)生C語(yǔ)言課程平均成績(jī)*/floatxcj[],n;{inti;

floatsum=0.0,tav;

for(i=1;i<=n;i++)

sum+=xcj[i];

tav=sum/n;

return(tav);}

例8-2求50個(gè)學(xué)生C語(yǔ)言課程平均成績(jī)可用如下函數(shù)調(diào)用:

av=avf(ccj,50);最后請(qǐng)注意一點(diǎn),C語(yǔ)言編譯系統(tǒng)對(duì)形參數(shù)組大小不作檢查。如果形參數(shù)組小于實(shí)參數(shù)組,這時(shí)形參數(shù)組得到實(shí)參數(shù)組的部分值。如果希望形參數(shù)組得到實(shí)參數(shù)組的全部值,則應(yīng)指定形參數(shù)組不小于實(shí)參數(shù)組。8.2二維數(shù)組與多維數(shù)組8.2.1二維數(shù)組的定義

形式:存儲(chǔ)類(lèi)別類(lèi)型標(biāo)識(shí)符數(shù)組名[常量1][常量2];

n維數(shù)組的定義形式:存儲(chǔ)類(lèi)別類(lèi)型標(biāo)識(shí)符數(shù)組名[常量1][常量2]…[常量n];類(lèi)型標(biāo)識(shí)符描述的同樣是數(shù)組分量的類(lèi)型,是定義數(shù)組類(lèi)型的基類(lèi)型,它可以是任何類(lèi)型。數(shù)組名代表數(shù)組所占存儲(chǔ)空間的首地址。常量分別表示數(shù)組相應(yīng)維的大小,數(shù)組分量個(gè)數(shù)等于常量1、常量2、…、常量n之積。(1)上述100個(gè)班,每班50個(gè)學(xué)生一門(mén)課程的成績(jī),定義如下二維數(shù)組描述:

floatcj[100][50];/*第一維對(duì)應(yīng)班級(jí),第二維對(duì)應(yīng)學(xué)生*/(2)1000個(gè)學(xué)生,30門(mén)課程的成績(jī),定義如下二維數(shù)組描述:

floatacj[1000][30];/*第一維對(duì)應(yīng)學(xué)生,第二維對(duì)應(yīng)課程*/(3)上述某高校社會(huì)實(shí)踐調(diào)查數(shù)據(jù),定義如下三維數(shù)組描述:intb[3][2][3];/*第一維對(duì)應(yīng)年級(jí),第二維對(duì)應(yīng)性別,第三維對(duì)應(yīng)交通工具*/

說(shuō)明:

(1)二維數(shù)組相當(dāng)于用一張表格描述數(shù)據(jù),第一維對(duì)應(yīng)表格的行,第二維對(duì)應(yīng)表格的列。

(2)二維數(shù)組以線性代數(shù)中的矩陣作為典型數(shù)學(xué)背景,矩陣在程序中用二維數(shù)組描述。

(3)二維數(shù)組還可看成由一維數(shù)組拓展而來(lái),相當(dāng)于一個(gè)基類(lèi)型為一維數(shù)組的一維數(shù)組。例如,二維數(shù)組cj相當(dāng)于基類(lèi)型為floatx[50]、具有100個(gè)分量的一維數(shù)組。(4)對(duì)于多維數(shù)組,同樣可看成由低維數(shù)組拓展而來(lái)。

(5)多維數(shù)組同樣將數(shù)組各分量依次連續(xù)存儲(chǔ),即按下標(biāo)1、下標(biāo)2、…、下標(biāo)n存儲(chǔ),所占空間等于各分量所占空間之和,即數(shù)組分量個(gè)數(shù)乘以基類(lèi)型數(shù)據(jù)所占空間。對(duì)于二維數(shù)組,也就是按行、按列存儲(chǔ)。數(shù)組名代表存放數(shù)組的首地址。8.2.2二維數(shù)組的引用二維數(shù)組下標(biāo)變量的形式為:數(shù)組名[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]多維數(shù)組下標(biāo)變量的形式為:數(shù)組名[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]?…?[下標(biāo)表達(dá)式n]例如,以上定義的acj數(shù)組的3000個(gè)分量為:acj[0][0]、acj[0][1]、…、acj[0][29]acj[1][0]、acj[1][1]、…、acj[1][29],

acj[999][0]、acj[999][1]、…、acj[999][29]…

說(shuō)明:

(1)每個(gè)下標(biāo)的取值范圍從0到數(shù)組長(zhǎng)度減1,下標(biāo)變量同樣相當(dāng)于基類(lèi)型變量。

(2)對(duì)于多維數(shù)組整體操作的完成需用多重循環(huán),一個(gè)下標(biāo)對(duì)應(yīng)于一重循環(huán)控制變量。二維數(shù)組的整體操作用兩重循環(huán)完成,外重循環(huán)對(duì)應(yīng)下標(biāo)1,內(nèi)重循環(huán)對(duì)應(yīng)下標(biāo)2。

(3)其它類(lèi)似于一維數(shù)組處理。8.2.3二維數(shù)組的初始化

初始化形式:存儲(chǔ)類(lèi)別類(lèi)型數(shù)組名[下標(biāo)1][下標(biāo)2]={常量1,常量2,…,常量n};例如:staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};初始化的結(jié)果是:a[0][0]=1,a[0][1]=2,a[0][2]=3,a[0][3]=4,a[1][0]=5,a[1][1]=6,a[1][2]=7,a[1][3]=8,a[2][0]=9,a[2][1]=10,a[2][2]=11,a[2][3]=12

說(shuō)明:

(1)二維數(shù)組的初始化可以分行進(jìn)行。例如,上面的a數(shù)組初始化還可以表示為:

staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};而定義4行3列的b數(shù)組可以表示為:

staticintb[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};(2)可以只對(duì)數(shù)組中部分分量進(jìn)行初始化。例如:staticinta[3][4]={{1,2},{5},{9}};初始化的結(jié)果是:

a[0][0]=1,a[0][1]=2,a[1][0]=5,a[2][0]=9,其它分量初值取默認(rèn)值,為0。(3)如果對(duì)二維數(shù)組中全部元素初始化,則定義數(shù)組時(shí)第一維的長(zhǎng)度可以省略,但第二維的長(zhǎng)度不能省略。例如:

staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};可以寫(xiě)成

staticinta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};但不能寫(xiě)成

staticinta[][]={1,2,3,4,5,6,7,8,9,10,11,12};因?yàn)閮蓚€(gè)維數(shù)都省略時(shí),可以理解為1*12、12*1、3*4、4*3、2*6、6*2等多種形式,會(huì)發(fā)生混淆,故只能省略第一個(gè)維數(shù)。(4)如果對(duì)二維數(shù)組按行進(jìn)行初始化,?則定義數(shù)組時(shí)第一維的長(zhǎng)度也可以省略。例如:

staticinta[][4]={{1,2},{5},{9}};二維數(shù)組與多維數(shù)組作函數(shù)參數(shù)跟一維數(shù)組作函數(shù)參數(shù)類(lèi)同處理,但對(duì)形參數(shù)組,只有第一維的大小可以省略,第二維及其它高維的大小均不能省略。

例8-6

從鍵盤(pán)輸入50個(gè)學(xué)生8門(mén)課程成績(jī),求每個(gè)學(xué)生的總成績(jī)與平均成績(jī)。/*程序8-6,求總成績(jī)及平均成績(jī)*/main(){floatcj[51][9];

inti,j;

floattcj[51],acj[51];

voidtcjf();

voidacjf();

for(i=1;i<=50;i++)/*輸入成績(jī)*/{printf(″請(qǐng)輸入第%d個(gè)學(xué)生8門(mén)課程成績(jī):″,i);

for(j=1;j<=8;j++)

scanf(″%f″,&cj[i][j]);

}tcjf(cj,tcj);/*調(diào)用函數(shù)tcjf()求總成績(jī)*/acjf(tcj,acj);/*調(diào)用函數(shù)acjf()求平均成績(jī)*/printf(″所求學(xué)生總成績(jī)與平均成績(jī)?nèi)缦拢篭n″);/*輸出處理結(jié)果*/for(i=1;i<=50;i++)

printf(″第%d個(gè)學(xué)生總成績(jī)=%6.2f,平均成績(jī)=%5.2f\n″,tcj[i],acj[i]);}voidtcjf(xcj,xtcj)/*求總成績(jī)函數(shù)*/floatxcj[51][9],xtcj[51];{inti,j;

for(i=1;i<=50;i++)

for(xtcj[i]=0.0,j=1;j<=8;j++)

xtcj[i]+=xcj[i][j];

}voidacjf(xtcj,xacj)/*求平均成績(jī)*/floatxtcj[51],xacj[51];{inti;

for(i=1;i<=50;i++)

xacj[i]=xtcj[i]/8;}例8-7

編寫(xiě)程序,計(jì)算兩個(gè)3×4的整數(shù)矩陣之和。算法提示:(1)兩個(gè)3×4的矩陣用兩個(gè)二維數(shù)組a、b描述。(2)和亦是一個(gè)3×4的矩陣,同樣用一個(gè)二維數(shù)組c描述。

(3)和矩陣元素等于矩陣對(duì)應(yīng)元素之和。/*程序8-7,求兩個(gè)3×4的矩陣之和*/main(){inta[3][4],b[3][4];

inti,j;

intc[3][4];

for(i=0;i<3;i++)/*輸入矩陣a*/for(j=0;j<4;j++)

scanf(″%d″,&a[i][j]);

for(i=0;i<3;i++)/*輸入矩陣b*/for(j=0;j<4;j++)

scanf(″%d″,&b[i][j]);

for(i=0;i<3;i++)/*計(jì)算矩陣c*/ for(j=0;j<4;j++) c[i][j]=a[i][j]+b[i][j];printf("所求和矩陣為:\n");for(i=0;i<3;i++)/*輸出矩陣c*/{for(j=0;j<4;j++)printf("%6d",c[i][j]);

printf("\n");

}}輸入數(shù)據(jù):111111111111 222222222222運(yùn)行結(jié)果:所求和矩陣為:

3333333333338.3字符數(shù)組與字符串8.3.1字符數(shù)組1.字符數(shù)組的定義

字符數(shù)組的定義和上面講述的數(shù)組定義形式完全一樣,只是字符數(shù)組的基類(lèi)型為特定的字符類(lèi)型。例如:

charch1[10],ch2[3][4],ch3[2][3][4];

定義了一個(gè)一維字符數(shù)組ch1,含有10個(gè)元素;定義了一個(gè)二維字符數(shù)組ch2,含有12個(gè)元素;定義了一個(gè)三維字符數(shù)組ch3,含有24個(gè)元素。2.字符數(shù)組的引用字符數(shù)組的引用通過(guò)字符數(shù)組的下標(biāo)變量進(jìn)行。字符數(shù)組的下標(biāo)變量相當(dāng)于字符類(lèi)型的變量。

3.字符數(shù)組的初始化對(duì)于字符數(shù)組的初始化,最易理解的方式是將字符一一賦給字符數(shù)組分量,或整體作為字串處理。如果只給字符數(shù)組的一部分分量初始化,那么沒(méi)有給出值的字符數(shù)組分量取默認(rèn)初值空格字符。例如:①staticcharcity[8]={'c','h','a','n','g','s','h','a'};②charcity[8];city[0]='c',city[1]='h',city[2]='a',city[3]='n',city[4]='g';city[5]='s',city[6]='h',

city[7]='a';8.3.2字符串

注意:

(1)字符串?dāng)?shù)據(jù)用雙引號(hào)表示,而字符數(shù)據(jù)用單引號(hào)表示。

(2)字符串的長(zhǎng)度可以根據(jù)串中字符的個(gè)數(shù)臨時(shí)確定,而字符數(shù)組的長(zhǎng)度必須事先給定。

(3)對(duì)于字符串,系統(tǒng)在串尾加'\0'作為其結(jié)束標(biāo)志,而字符數(shù)組并不要求最后一個(gè)字符是'\0'。(4)用字符數(shù)組來(lái)處理字符串時(shí),字符數(shù)組的長(zhǎng)度應(yīng)比要處理的字符串長(zhǎng)度大1,以存放串尾結(jié)束符'\0'。例如:

staticcharcity[9]={'c','h','a','n','g','s','h','a','\0'};用字符串描述為:

staticcharcity[9]={''changsha''}或?''changsha'';以上兩條語(yǔ)句可分別理解為用字符數(shù)組來(lái)處理字符串,用字符串對(duì)字符數(shù)組初始化。

(5)千萬(wàn)不能在程序中給字符數(shù)組賦值。例如:

city=''changsha'';/*絕對(duì)錯(cuò)誤*/1.輸入/輸出輸入/輸出分別用scanf(?)、printf(?)函數(shù)完成,采用“%s”格式。輸入、輸出參數(shù)用字符數(shù)組名。例如,有如下程序:

main(?){charcomp[9];

scanf("%s",comp);/*本身就是地址,不需加地址運(yùn)算符*/printf("COMP=%s",comp);}輸入數(shù)據(jù):CHINAONE

運(yùn)行結(jié)果:COMP=CHINAONE

說(shuō)明:

(1)輸入字符串?dāng)?shù)據(jù)時(shí)不需用界定符。

(2)輸入多個(gè)字符串?dāng)?shù)據(jù)時(shí),以空格分隔數(shù)據(jù)。如果字符串?dāng)?shù)據(jù)本身包含有空格字符,需使用gets()函數(shù)。

(3)輸出時(shí)先找到存放字符串的字符數(shù)組的首地址,遇串尾結(jié)束符'\0'結(jié)束。輸出字符不包括串尾結(jié)束符'\0'。

(4)如果字符數(shù)組中包含多個(gè)'\0',則輸出遇到第一個(gè)'\0'時(shí)結(jié)束。

(5)如果字符數(shù)組長(zhǎng)度大于字符串實(shí)際長(zhǎng)度,也只輸出到'\0'結(jié)束。2.字符串處理函數(shù)

puts()與gets()函數(shù)包含在頭文件stdio.h中,字符串處理函數(shù)包含在頭文件string.h中,用#include"string.h"指明。在以下函數(shù)中,參數(shù)str、str1、str2為字符數(shù)組或指向字符的指針。

(1)字符串輸出函數(shù)puts(str):輸出指定字符串。參數(shù)可以為字符串常量。

(2)字符串輸入函數(shù)gets(str):從鍵盤(pán)輸入字符串至字符數(shù)組str中,輸入的字符串可以包含空格。函數(shù)的返回值是字符數(shù)組str的首地址。

(3)字符串復(fù)制函數(shù)strcpy(str1,str2):將str2的值復(fù)制到str1中,實(shí)際上完成字符串的賦值操作。要求str1的長(zhǎng)度大于str2的長(zhǎng)度,第二個(gè)參數(shù)可以是字符串常量。(4)字符串連接函數(shù)strcat(str1,str2):將str2的值連接到str1中原有值的后面。注意str1必須足夠大,以便能容納兩個(gè)字符數(shù)組中的所有值。連接完成后,兩個(gè)字符串并成一個(gè)字符串,第一個(gè)字符串后面的原結(jié)束符自動(dòng)取消。

(5)字符串比較函數(shù)strcmp(str1,str2):比較str1和str2,若兩者相同,則返回函數(shù)值為0;若str1大于str2,則返回函數(shù)值為一個(gè)正整數(shù);若str1小于str2,則返回函數(shù)值為一個(gè)負(fù)整數(shù)。兩個(gè)參數(shù)可以是字符串常量。字符串比較規(guī)則與其它語(yǔ)言相同,將兩個(gè)字符串中的字符從左至右依次比較,如果全部字符相同,則認(rèn)為相等;若出現(xiàn)不同字符,則以第一個(gè)不同字符比較結(jié)果為準(zhǔn)。(6)strlen(str):函數(shù)的返回值為字符串的實(shí)際長(zhǎng)度。(7)strlwr(str):將字符串中大寫(xiě)字母轉(zhuǎn)換成小寫(xiě)字母。(8)strupr(str):將字符串中小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母。8.3.3字符串?dāng)?shù)組對(duì)于多個(gè)字符串的處理需用字符串?dāng)?shù)組描述,字符串?dāng)?shù)組相當(dāng)于二維字符數(shù)組。例如:

(1)100個(gè)城市名:

charcity[100][17];/*假定城市名不超過(guò)16個(gè)字符*/100個(gè)城市名分別用city[0]、city[1]、…、city[99]描述,city[i]相當(dāng)于一個(gè)字符數(shù)組。(2)1000本書(shū)名:

charbook[1000][31];/*假定書(shū)名不超過(guò)30個(gè)字符*/1000本書(shū)名分別用book[0]、book[1]、…、book[999]描述,book[i]相當(dāng)于一個(gè)字符數(shù)組。例8-8

用字符數(shù)組輸出下面的圖案。***********程序如下:/*程序8-8,用字符數(shù)組輸出圖案*/main(){staticcharch[3][5]={"***","*****","***"};

puts(ch[0]);

printf("\n");

puts(ch[1]);

printf("\n");

puts(ch[2]);

printf("\n");

}

例8-9輸入一行字符,統(tǒng)計(jì)數(shù)字字符、字母字符及其它字符的個(gè)數(shù)。算法提示:

(1)一行字符用一維字符數(shù)組line描述。數(shù)字字符、字母字符及其它字符的個(gè)數(shù)用大小為3的一維整型數(shù)組num描述。

(2)對(duì)line數(shù)組的分量依次判斷,若是數(shù)字字符,則數(shù)字字符數(shù)加1;若是字母字符,則字母字符數(shù)加1;否則,其它字符的個(gè)數(shù)加1。程序如下:/*程序8-9,統(tǒng)計(jì)數(shù)字字符、字母字符及其它字符的個(gè)數(shù)*/main(){charline[81];/*假定一行不超過(guò)80個(gè)字符*/inti;

intnum[3]={0,0,0};

gets(line);/*讀入一行字符*/for(i=0;line[i]!='\0';i++)if(line[i]>='0'&&line[i]<='9')num[0]++;

elseif((line[i]>='a'&&line[i]<='z')||(line[i]>='A'&&line[i]<='Z')num[1]++;

elsenum[2]++;

printf("數(shù)字字符數(shù)=%d字母字符數(shù)=%d其它字符數(shù)=%d",num[0],num[1],num[2]);}

例8-10

求80個(gè)字符串中的最大者。算法提示:

(1)80個(gè)字符串用二維字符數(shù)組str描述。

(2)字符串最大者的求法與求最大值的方法完全相同,但比較、賦值操作需用函數(shù)strcmp()、strcpy()完成。程序如下:/*程序8-10,求80個(gè)字符串中的最大者*/main(){charstr[80][21];/*假定字符串的最大長(zhǎng)度不超過(guò)20個(gè)字符*/inti;

charmstr[21];/*存放最大者*/for(i=0;i<80;i++)gets(str[i]);

strcpy(mstr,str[0]);/*最大者初始化為第一個(gè)字符串*/for(i=1;i<80;i++)/*求最大者*/if(strcmp(str[i],mstr)>0)strcpy(mstr,str[i]);

printf("字符串中的最大者=%s",mstr);}8.4重命名類(lèi)型8.4.1重命名類(lèi)型的方法一般形式:

typedef已有類(lèi)型新類(lèi)型名;一旦重命名類(lèi)型,就可以用新類(lèi)型名來(lái)描述數(shù)據(jù)。習(xí)慣上新類(lèi)型名用大寫(xiě)字母表示。例如:①typedefintinteger;/*重命名整型integer*/integeri,j;/*定義整型變量i、j*/②typedefintCOUNT;/*命名一計(jì)數(shù)類(lèi)型COUNT*/COUNTn1,n2;/*定義計(jì)數(shù)型變量n1、n2*/③typedefintNUM[100];/*命名一整型數(shù)組類(lèi)型NUM*/NUMn;/*定義NUM型數(shù)組n*/④typedefcharSTRING[81];/*命名一字符串類(lèi)型STRING*/STRINGstr1,str2;/*定義STRING型變量str1、str2*/⑤typedefstruct{intday;

intmonth;

intyear;

}DATE;/*命名一結(jié)構(gòu)體類(lèi)型DATE*/DATEdate1,date2;/*定義DATE型變量date1、date2*/8.4.2重命名類(lèi)型的作用重命名類(lèi)型的作用如下:

(1)有利于加強(qiáng)數(shù)據(jù)描述的針對(duì)性,增加程序的可讀性。如用上面的重命名類(lèi)型COUNT來(lái)定義計(jì)數(shù)器變量,用途一目了然。(2)有利于程序的通用和移植。

C語(yǔ)言程序設(shè)計(jì)有時(shí)可能會(huì)依賴于具體的計(jì)算機(jī)。例如,整型數(shù)據(jù)在某種機(jī)器上可能占2字節(jié)內(nèi)存單元,在另外一種機(jī)器上又可能占4字節(jié)的內(nèi)存單元,若將程序從2字節(jié)的機(jī)器移植到4字節(jié)的機(jī)器,則要將所有int說(shuō)明改成long說(shuō)明,修改的部分可能較多,程序的移植性較差。在整型數(shù)占2字節(jié)的機(jī)器上,若用typedef重命名類(lèi)型:typedefintinteger;,則可用integer定義變量。若要將程序移植到整型數(shù)占4字節(jié)的機(jī)器上,只要用long代替原來(lái)的int即可,這時(shí)可再用typedef重命名類(lèi)型:typedeflonginteger;。

(3)有利于減少程序書(shū)寫(xiě)的工作量。若程序中有不少地方要用到同一種復(fù)雜數(shù)據(jù)類(lèi)型,書(shū)寫(xiě)起來(lái)比較復(fù)雜,通過(guò)重命名類(lèi)型,可減少重復(fù)勞動(dòng)。8.4.3幾點(diǎn)說(shuō)明

(1)用typedef只能對(duì)已有類(lèi)型增加一個(gè)名字,而不能定義一個(gè)新的類(lèi)型。

(2)用typedef可以對(duì)各種已有類(lèi)型增加新的類(lèi)型名,但不能用來(lái)定義變量。

(3)重命名類(lèi)型可以將數(shù)組類(lèi)型與數(shù)組變量分離開(kāi)來(lái)。

(4)重命名類(lèi)型與編譯預(yù)處理不同,它是在編譯時(shí)處理的,實(shí)際上也并不是作簡(jiǎn)單的字符串替換。

(5)常將一些常用的重命名類(lèi)型單獨(dú)放在一個(gè)文件中,需要時(shí)用#include指令將它們包含至程序中。8.5程序設(shè)計(jì)舉例

例8-11

求n個(gè)實(shí)數(shù)的和、積、最大值及最小值。本題的算法我們已很清楚,這里是在考察在用數(shù)組描述數(shù)據(jù)的情況下的實(shí)現(xiàn)。求和、積、最大值、最小值均用數(shù)組作參數(shù)的函數(shù)完成。引入數(shù)組后,最大值、最小值可用其下標(biāo)來(lái)描述,先假定最大值、最小值是數(shù)組的第一個(gè)分量。程序如下:/*程序8-11,求n個(gè)數(shù)的和、積、最大值、最小值*/#defineN100main(){floata[N];

intn;

inti;

floatsf();/*函數(shù)申明*/floatmf();

floatmax();

floatmin();

scanf("%d",&n);/*輸入n個(gè)數(shù)*/for(i=1;i<=n;i++)scanf("%f",&a[i]);printf("和=%8.3f\n",sf(a,n));/*輸出結(jié)果*/printf("積=%8.3f\n",mf(a,n));printf("最大值=%8.3f\n",max(a,n));printf("最小值=%8.3f\n",min(a,n));}

floatsf(xa,xn)/*求和*/floatxa[];intxn;{inti;

floats=0;for(i=1;i<=xn;i++)s+=xa[i];

return(s);}

floatmf(xa,xn)/*求積*/floatxa[];intxn;{inti;

floatm=1;

for(i=1;i<=xn;i++)m*=xa[i];

return(m);}floatmax(xa,xn)/*求最大值*/floatxa[];intxn;{inti,k=1;/*k存放最大值下標(biāo)*/for(i=2;i<=xn;i++)if(xa[i]>xa[k])k=i;

return(xa[k]);}

floatmax(xa,xn)/*求最小值*/floatxa[];intxn;{inti,k=1;/*k存放最小值下標(biāo)*/for(i=2;i<=xn;i++)if(xa[i]<xa[k])k=i;

return(xa[k]);}

例8-12

給定一個(gè)4×3的整數(shù)矩陣,求矩陣中最小值及最小值所在行的行號(hào)和列號(hào)。程序如下:/*程序8-12,求矩陣中最小值及其位置*/main(){inta[4][3];/*存放矩陣*/inti,j;

intmin,row,col;/*存放最小值及最小值所在行的行號(hào)、列號(hào)*/for(i=0;i<4;i++)/*輸入矩陣*/for(j=0;j<3;j++)scanf("%d",&a[i][j]);row=0;col=0;min=a[0][0];/*初始化最小值及最小值所在行的行號(hào)、列號(hào)*/for(i=0;i<4;i++)/*求最小值及最小值所在行的行號(hào)、列號(hào)*/for(j=0;j<3;j++)if(a[i][j]<min){min=a[i][j];

row=i;col=j;

}printf("最小值為%d,處在%d行%d列",min,row,col);

例8-13

將n個(gè)實(shí)數(shù)由大到小排序。

n個(gè)實(shí)數(shù)用數(shù)組a描述。本例提供用選擇排序方法與冒泡排序方法分別實(shí)現(xiàn)n個(gè)實(shí)數(shù)由大到小排序的函數(shù)。算法一:選擇排序。選擇排序需反復(fù)進(jìn)行求最大值與交換兩個(gè)數(shù)這兩種基本操作。對(duì)a[0]、a[1]、…、a[n?1]由大到小排序:先求所有數(shù)的最大值,然后將最大值與a[0]進(jìn)行交換;再求a[1]至a[n-1]這些數(shù)的最大值,然后將最大值與a[1]進(jìn)行交換;再求a[2]至a[n-1]這些數(shù)的最大值,然后將最大值與a[2]進(jìn)行交換……最后求a[n-2]與a[n-1]這些數(shù)的最大值,然后將最大值與a[n?2]進(jìn)行交換。如此經(jīng)過(guò)n-1輪處理完成排序。排序函數(shù)如下:voidsort1(a,n)/*選擇排序函數(shù)*/floata[];intn;{intk,i,j;/*k最大值下標(biāo),i、j循環(huán)控制變量*/floatt;/*中間變量,用于兩個(gè)數(shù)的交換*/for(i=0;i<n?1;i++){k=i;/*求最大值下標(biāo)*/for(j=i+1;j<n;j++)if(a[j]>a[k])k=j;

t=a[i];a[i]=a[k];a[k]=t;/*進(jìn)行交換*/}}

算法二:冒泡排序。冒泡排序需反復(fù)進(jìn)行相鄰兩個(gè)數(shù)的比較與交換這兩種基本操作。對(duì)相鄰的兩個(gè)數(shù)進(jìn)行比較時(shí),如果后面的數(shù)大于前面的數(shù),將這兩個(gè)數(shù)進(jìn)行交換,大的數(shù)往前冒。將所有相鄰的兩個(gè)數(shù)比較一遍,稱為一輪比較。如果一輪比較中無(wú)交換,則排序完成。有無(wú)交換用一標(biāo)志變量描述,一輪比較用for循環(huán)完成,整個(gè)排序利用標(biāo)志變量用條件循環(huán)控制。排序函數(shù)如下:voidsort2(a,n)/*冒泡排序函數(shù)*/floata[];intn;{inti;/*一輪比較的循環(huán)控制變量*/intflag;/*標(biāo)志變量,為1有交換,為0無(wú)交換*/floatt;/*中間變量,用于兩個(gè)數(shù)的交換*/do{flag=0;/*先假定無(wú)交換,已排好序*/for(i=0;i<n-2;i++)if(a[i+1]>a[i]){t=a[i];a[i]=a[i+1];a[i+1]=t;/*進(jìn)行交換*/flag=1;/*有交換,標(biāo)志變量的值改變?yōu)?*/}}while(flag);}

例8-14

篩法求2~1000之間的所有素?cái)?shù)。算法提示:

(1)建立篩子,在這里正好利用數(shù)組作篩子,下標(biāo)對(duì)應(yīng)于數(shù),相應(yīng)下標(biāo)變量的值標(biāo)志是否在篩子中,為1表示在篩子中,為0表示已被篩去,不在篩子中。

(2)找每一輪篩選種子,篩選種子是完成一輪篩選后的下一個(gè)最小的素?cái)?shù),初值為2。

(3)對(duì)每一輪篩選種子,篩去其所有倍數(shù),即將相應(yīng)下標(biāo)變量的值賦值為0。倍數(shù)初值為篩選種子的2倍。

(4)篩選完成,篩子中剩下的即為素?cái)?shù)。程序如下:/*程序8-14,篩法求2~1000之間的所有素?cái)?shù)*/main(){inta[1000]; /*篩子數(shù)組*/inti;

intminp,double; /*minp篩選種子,double倍數(shù)*/intn=0; /*素?cái)?shù)個(gè)數(shù),用于輸出格式控制*/for(i=2;i<1000;i++) /*建立篩子*/a[i]=1;

minp=2; /*篩選種子初始化*/while(minp<500) /*完成整個(gè)篩選*/{double=2*minp; /*倍數(shù)初始化*/while(double<1000) /*完成一輪篩選*/{a[double]=0; /*篩去當(dāng)前倍數(shù)*/double+=minp; /*計(jì)算下一個(gè)倍數(shù)*/}do /*計(jì)算下一輪篩選種子*/{minp++;

}while(a[minp]==0);}printf("2~1000之間的所有素?cái)?shù)如下:\n");/*輸出*/for(i=2;i<1000;i++)if(a[i]==1){printf("%6d",i);

n++;

if(n%5==0)printf("\n"); /*5個(gè)素?cái)?shù)輸出在一行*/}}

例8-15

求10~1000之間的回文數(shù)。算法提示:

(1)要判斷一個(gè)數(shù)是不是回文數(shù),先將其數(shù)字分離,用一數(shù)組a存放,然后將相應(yīng)數(shù)字進(jìn)行比較。

(2)引入一標(biāo)志變量flag,為1表示是回文數(shù),為0表示不是回文數(shù)。程序如下:/*程序8-15,求10~1000之間的回文數(shù)*/main(){inti,x;

inta[8],j;

intb,e;

intflag;

for(i=10;i<1000;i++){j=0;x=i; /*將數(shù)i的數(shù)字分離,用數(shù)組a存放*/while(x>0){a[j]=x%10;

x/=10;

j++;

}flag=1; /*先假定i為回文數(shù)*/b=0;e=j?1;

while(b<e&&flag) /*判斷i是否為回文數(shù)*/if(a[b]!=a[e])flag=0; /*將對(duì)應(yīng)位數(shù)字進(jìn)行比較*/else{b++;e--;}if(flag)printf("%6d",i); /*i是回文數(shù),輸出*/}}

例8-16

從n個(gè)數(shù)據(jù)中查找指定數(shù)。

n個(gè)數(shù)據(jù)用一數(shù)組a描述,查找對(duì)象用x描述。算法一:將n個(gè)數(shù)據(jù)與查找對(duì)象依次比較,進(jìn)行順序查找,請(qǐng)讀者編程實(shí)現(xiàn)。

算法二:比順序查找進(jìn)一步的是折半查找或稱二分查找。折半查找要求n個(gè)數(shù)據(jù)已排好序,排序的目的就是為了快速查找。假定n個(gè)數(shù)據(jù)已經(jīng)由小到大排好序。查找到的數(shù)據(jù)用其下標(biāo)k表示,是否找到用一標(biāo)志變量flag描述。查找問(wèn)題轉(zhuǎn)化成在區(qū)間[0,n-1]中找k。折半查找時(shí)先計(jì)算其中點(diǎn)d,如果a[d]=x,則k=d,找到;如果a[d]>x,則查找區(qū)間縮小為[0,d];如果a[d]<x,則查找區(qū)間縮小為[d,n-1]。要么找到,要么查找區(qū)間縮小一半,繼續(xù)折半查找。折半查找函數(shù)如下:floatsearch(a,n,x) /*折半查找函數(shù)*/floata[],x;intn;{intk,flag;

intb=0,e=n?1,d;

flag=0; /*找到標(biāo)志*/do{d=(b+e)/2;

if(a[d]==x){k=d;flag=1;}elseif(a[d]>x)e=d;

elseb=d;

}while(b<e&&!flag);

if(flag==0)k=-1; /*沒(méi)找到*/return(k);}

例8-17

某班有50個(gè)學(xué)生,期終考試考了8門(mén)課程。求每個(gè)學(xué)生的總成績(jī)及平均成績(jī),并按總成績(jī)由高到低排序。算法提示:

(1)每個(gè)學(xué)生包括姓名和8門(mén)課程成績(jī),50個(gè)學(xué)生的數(shù)據(jù)分別用二維字符數(shù)組st、二維實(shí)型數(shù)組cj描述,通過(guò)第一個(gè)下標(biāo)進(jìn)行關(guān)聯(lián)。

(2)50個(gè)學(xué)生的總成績(jī)和平均成績(jī)用二維實(shí)型數(shù)組tacj描述,同樣通過(guò)第一個(gè)下標(biāo)與其姓名、8門(mén)課程成績(jī)進(jìn)行關(guān)聯(lián)。

(3)排序采用冒泡排序方法。

(4)整個(gè)程序由輸入input()、計(jì)算總成績(jī)及平均成績(jī)count()、排序sort()、輸出output()四個(gè)模塊組成。

(5)使用外部數(shù)組完成數(shù)據(jù)傳遞。程序如下:/*程序8-17,成績(jī)處理程序*/charst[51][12]; /*采用外部數(shù)組實(shí)現(xiàn)數(shù)據(jù)傳遞*/floatcj[51][9];floattacj[51][3];main(){voidinput(); /*函數(shù)申明*/voidcount();

voidsort();

voidoutput();

input(); /*調(diào)用輸入函數(shù)*/count(); /*調(diào)用計(jì)算函數(shù)*/sort(); /*調(diào)用排序函數(shù)*/output(); /*調(diào)用輸出函數(shù)*/}voidinput() /*輸入函數(shù)*/{inti,j;

for(i=1;i<=50;i++){printf("請(qǐng)輸入第%d個(gè)學(xué)生姓名,成績(jī):\n",i);

scanf("%s",st[i]);

for(j=1;j<=8;j++)scanf("%f",&cj[i][j]);

}}voidcount() /*計(jì)算函數(shù)*/{inti,j;

for(i=1;i<=50;i++){tacj[i][1]=0;

for(j=1;j<=8;j++)tacj[i][1]+=cj[i][j];

tacj[i][2]=tacj[i][1]/8;

}}voidsort() /*排序函數(shù)*/{inti,flag;

charts[12];

floatt;

do{flag=0;

for(i=1;i<=49;i++)if(tacj[i+1][1]>tacj[i][1]){strcpy(ts,st[i]);strcpy(st[I],st[i+1]);strcpy(st[i+1],st);/*交換姓名*/for(j=1;j<=8;j++) /*交換8門(mén)課程成績(jī)*/{t=cj[i][j];cj[i][j]=cj[i+1][j];cj[i+1][j]=t;}t=tacj[i][1];tacj[i][1]=tacj[i+1][1];tacj[i+1][1]=t;/*交換總成績(jī)*/t=tacj[i][2];tacj[i][2]=tacj[i+1][2];tacj[i+1][2]=t;/*交換平均成績(jī)*/flag=1;

}}while(flag);}voidoutput()/*輸出函數(shù)*/{inti;

printf("50個(gè)學(xué)生成績(jī)處理結(jié)果如下:\n");

printf("姓名課程1課程2課程3課程4課程5課程6課程7課程8總成績(jī)平均成績(jī)名次\n");

for(i=1;i<=50;i++){printf("%8s",st[i]);

for(j=1;j<=8;j++)printf("%7.2f",cj[i][j]);

printf("%7.2f%7.2f%5d",tacj[i][1],tacj[i][2],i);

printf("\n");

}}

例8-18

用遞歸的方法計(jì)算n個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)。算法提示:

(1)定義外部數(shù)組a存放n個(gè)數(shù),假定n不超過(guò)50。

(2)先計(jì)算頭兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù);再計(jì)算求出的最大公約數(shù)和最小公倍數(shù)與第3個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù);再計(jì)算與第4個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)……直至求出與最后一個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)即為所求。

(3)定義遞歸函數(shù)gysfn()計(jì)算n個(gè)數(shù)的最大公約數(shù),遞歸函數(shù)gbsf()計(jì)算n個(gè)數(shù)的最小公倍數(shù)。其中都調(diào)用求兩個(gè)數(shù)的最大公約數(shù)函數(shù)gysf2()。

(4)主函數(shù)中僅進(jìn)行n個(gè)數(shù)的輸入和計(jì)算結(jié)果的輸出。程序如下:/*例8-18,用遞歸的方法計(jì)算n個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)*/intn,a[50]; /*數(shù)組a存放n個(gè)數(shù)*/intgysf2(); /*計(jì)算兩個(gè)數(shù)的最大公約數(shù)*/intgysfn(); /*計(jì)算n個(gè)數(shù)的最大公約數(shù)*/intgbsf(); /*計(jì)算n個(gè)數(shù)的最小公倍數(shù)*/main(){inti;

clrscr();

printf("輸入數(shù)的個(gè)數(shù):");scanf("%d",&n);

for(i=0;i<n;i++){printf("輸入第%d個(gè)數(shù):",i);scanf("%d",&a[i]);}printf("\n\n");printf("最大公約數(shù)=%d\n",gys

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論