大學(xué)計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(C語(yǔ)言)-第8章 數(shù)組_第1頁(yè)
大學(xué)計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(C語(yǔ)言)-第8章 數(shù)組_第2頁(yè)
大學(xué)計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(C語(yǔ)言)-第8章 數(shù)組_第3頁(yè)
大學(xué)計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(C語(yǔ)言)-第8章 數(shù)組_第4頁(yè)
大學(xué)計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)(C語(yǔ)言)-第8章 數(shù)組_第5頁(yè)
已閱讀5頁(yè),還剩33頁(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ù)組本章要點(diǎn)

一維數(shù)組

二維數(shù)組字符數(shù)組數(shù)組元素作函數(shù)實(shí)參

數(shù)組是同類型數(shù)據(jù)的集合,集合中的每個(gè)數(shù)據(jù)稱為數(shù)組元素或下標(biāo)變量,數(shù)組元素的類型相同、個(gè)數(shù)確定。下標(biāo)變量中如果只用一個(gè)下標(biāo),則稱為一維數(shù)組,用兩個(gè)下標(biāo)則稱之為二維數(shù)組,用三個(gè)下標(biāo)稱之為三維數(shù)組,依此類推。基本概念8.1一維數(shù)組8.1.1一維數(shù)組的定義定義形式為:

[存儲(chǔ)類別]類型標(biāo)識(shí)符數(shù)組名[常量表達(dá)式],…;例如:inta[6]; floatx[100],y[100];說(shuō)明:類型標(biāo)識(shí)符”表明了數(shù)組元素的數(shù)據(jù)類型常量表達(dá)式是由常量、符號(hào)常量和運(yùn)算符組成的表達(dá)式,它的值規(guī)定了數(shù)組中數(shù)組元素的個(gè)數(shù)(數(shù)組的長(zhǎng)度)常量表達(dá)式中不能含有變量。intn;scanf("%d",&n);inta[n];數(shù)組在內(nèi)存中占據(jù)一片連續(xù)的存儲(chǔ)單元,數(shù)組中的每個(gè)數(shù)組元素在這片連續(xù)的存儲(chǔ)單元中按序存儲(chǔ)。C語(yǔ)言規(guī)定數(shù)組名表示該連續(xù)存儲(chǔ)單元的首地址(首字節(jié)編號(hào))。a

a[0]a[1]a[2]a[3]a[4] a[5]

圖8.1數(shù)組的存儲(chǔ)結(jié)構(gòu)

數(shù)組的定義語(yǔ)句給每個(gè)數(shù)組元素分配了一定的存儲(chǔ)單元,和簡(jiǎn)單變量一樣它們的值是不確定的、是隨機(jī)的,只有通過(guò)賦值或賦初值才能得到確定的值。同類型的數(shù)組的定義和普通變量的定義可以出現(xiàn)在同一個(gè)定義語(yǔ)句中。如: inta[6],b[20],i,j;數(shù)組初始化的一般形式為:

[存儲(chǔ)類別]類型標(biāo)識(shí)符數(shù)組名[常量表達(dá)式]={初值表};在編譯過(guò)程中完成的,不占程序運(yùn)行時(shí)間。數(shù)組初始化常見的幾種形式:對(duì)所有數(shù)組元素賦初值,此時(shí)數(shù)組定義中表示數(shù)組長(zhǎng)度的常量表達(dá)式可以省略。

inta[6]={0,1,2,3,4,5};可以只給一部分?jǐn)?shù)組元素賦初值,此時(shí)數(shù)組長(zhǎng)度一般不省略。后面3個(gè)元素由C編譯系統(tǒng)自動(dòng)賦值為0。

inta[6]={0,1,2};

8.1.2一維數(shù)組的初始化引用形式為:

數(shù)組名[下標(biāo)表達(dá)式]

例如:

a[0]=123;

scanf(“%d”,&a[3]);

printf(“%d”,a[5]);

a[i++]=2*a[i+j];8.1.3一維數(shù)組元素的引用【例8.1】輸入100個(gè)整型數(shù)據(jù),然后分別按順序和逆序的方式輸出。main(){inti,a[100];

for(i=0;i<100;i++)

scanf("%d",&a[i]);/*順序輸入*/

for(i=0;i<100;i++)

printf("%d",a[i]);/*順序輸出*/for(i=99;i>=0;i--)

printf("%d",a[i]);/*逆序輸出*/}在引用數(shù)組元素時(shí)應(yīng)注意: ①引用數(shù)組元素時(shí),下標(biāo)表達(dá)式的值是確定的。 ②數(shù)組元素本身可以看作是一個(gè)普通變量,代表內(nèi)存中的一個(gè)存儲(chǔ)單元。因此數(shù)組元素可以在任何相同類型簡(jiǎn)單變量允許使用的位置引用。 ③數(shù)組引用時(shí),下標(biāo)值應(yīng)該在已定義的數(shù)組大小范圍內(nèi)。常出現(xiàn)的錯(cuò)誤是:

inta[100];

a[100]=4;8.1.4一維數(shù)組應(yīng)用【例8.2】從鍵盤輸入10個(gè)整數(shù)存放在數(shù)組中,輸出其中最大的一個(gè)數(shù)和它在數(shù)組中的位序。main(){inta[10],i,max,id;printf("Enterdata:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);max=a[0];id=0;for(i=1;i<10;i++)if(a[i]>max) {max=a[i];id=i;}printf(“最大數(shù)是%d,位序?yàn)椋?d\n",max,id);}【例8.4】已知一個(gè)一維數(shù)組中的各個(gè)元素值均不相同,編寫程序查找數(shù)組中是否有值為x的數(shù)組元素。如果有,輸出相應(yīng)的下標(biāo);如果沒(méi)有,輸出“該值在數(shù)組中不存在”字樣信息。main(){intnum[10]={1,32,14,56,74,3,56,6,9,12},x,i,j;printf(“inputx:”);scanf("%d",&x);for(i=0;i<10;i++)if(num[i]==x)break;if(i==10)printf(“該數(shù)在數(shù)組中不存在");elseprintf(“該數(shù)在數(shù)組中的下標(biāo)是%d”,i);}【例8.5】編寫程序,利用選擇法對(duì)10個(gè)整數(shù)進(jìn)行遞增排序,并輸出排序后的結(jié)果。選擇法排序的思路是:先從全體待排序的n個(gè)數(shù)據(jù)中找出最大的數(shù),把它放到數(shù)組的第0個(gè)位置上,完成第1趟選擇排序;接著再在剩余的n-1個(gè)數(shù)據(jù)中找出最大的數(shù)放到數(shù)組的第1個(gè)位置上,完成第2趟選擇排序,……,如此反復(fù),經(jīng)過(guò)n-1趟選擇排序后,原始數(shù)組已經(jīng)有序。main(){inti,j,k,temp,a[10];for(i=0;i<10;i++)scanf(“%d”,&a[i]);for(i=0;i<9;i++){k=i;

for(j=k+1;j<10;j++)if(a[k]<a[j])k=j;

temp=a[i];a[i]=a[k];

a[k]=temp;}for(i=0;i<10;i++)printf(“%4d”,a[i]);}交換:199763第4趟查找:19976

3交換:1997

63第3趟查找:199673交換:199673第2趟查找:193679交換:19

3679第1趟查找:736199排序前:736199【例8.6】編寫程序,利用冒泡法對(duì)10個(gè)整數(shù)進(jìn)行遞增排序?!谝惶?/p>

124156

341215634

121563412

615341263

15第二趟

463

12第三趟

43

6main(){inta[10],i,j,temp;

printf("Input10numbers\n");

for(i=0;i<10;i++)scanf("%d",&a[i]);

printf("\n");

for(j=0;j<9;j++)for(i=0;i<9-j;i++)if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}printf("thesortednumbers:\n");for(i=0;i<10;i++)printf("%d",a[i]);}8.2二維數(shù)組例:求一個(gè)矩陣的轉(zhuǎn)置矩陣356768292456245668293567定義二維數(shù)組的一般形式為:[存儲(chǔ)類別]類型標(biāo)識(shí)符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2],…;例如:inta[2][3];說(shuō)明:①二維數(shù)組定義中的第1個(gè)下標(biāo)表示該數(shù)組具有的行數(shù),第2個(gè)下標(biāo)表示該數(shù)組具有的列數(shù),兩個(gè)下標(biāo)之積是組成該數(shù)組的元素的個(gè)數(shù),即二維數(shù)組的長(zhǎng)度。②二維數(shù)組在內(nèi)存中占據(jù)一片連續(xù)的存儲(chǔ)單元。aa[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]8.2.1二維數(shù)組的定義③在C語(yǔ)言中,一個(gè)二維數(shù)組可以看作是一個(gè)特殊的一維數(shù)組,其中一維數(shù)組中的每個(gè)元素又是一個(gè)一維數(shù)組,即二維數(shù)組是由元素類型為數(shù)組類型的一維數(shù)組構(gòu)成的一維數(shù)組。因此C系統(tǒng)就把a(bǔ)[0]、a[1]看作是一維數(shù)組的數(shù)組名。a[0]a[1]aa[0][0]a[0][2]a[0][1]a[1][1]a[1][2]a[1][0]inta[2][3];二維數(shù)組初始化的幾種常見形式:

(1)按行給二維數(shù)組元素賦初值。如:

inta[2][3]={{1,2,3},{6,7,8}};

(2)將所有數(shù)據(jù)寫在一個(gè)花括弧內(nèi),按數(shù)組在內(nèi)存中的排列順序?qū)Ω鲾?shù)組元素賦初值。如:

inta[2][3]={1,2,3,6,7,8};

(3)給二維數(shù)組所有元素賦初值,二維數(shù)組第一維的長(zhǎng)度可以省略。如:inta[2][3]={1,2,3,6,7,8};等價(jià)于:

inta[][3]={1,2,3,6,7,8};

(4)在定義時(shí)也可以只對(duì)部分元素賦初值而省略第一維的長(zhǎng)度,但應(yīng)按行賦初值。如:

inta[][3]={{0,2},{6}};8.2.2二維數(shù)組的初始化二維數(shù)組元素的引用形式為:

數(shù)組名[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]數(shù)組元素的行列下標(biāo)都從0開始??梢詫?duì)二維數(shù)組元素進(jìn)行與普通變量相同的操作,因?yàn)樗鼈兊谋举|(zhì)就是一個(gè)普通變量,如運(yùn)算、賦值等。如:a[0][0]=a[0][2]/3-30;

printf(“%d”,a[1][1]);區(qū)分在定義數(shù)組時(shí)使用的維數(shù)和各維大小與引用數(shù)組元素時(shí)下標(biāo)值的不同。如:

inta[3][5];

a[3][5]=6;8.2.3二維數(shù)組元素的引用【例8.8】輸入12個(gè)整型數(shù)據(jù)形成一個(gè)具有3行4列的二維數(shù)組,然后按數(shù)組的邏輯排列形式輸出。main(){inti,j,a[3][4];

for(i=0;i<3;i++)

for(j=0;j<4;j++)scanf("%d",&a[i][j]);/*按行順序輸入*/for(i=0;i<2;i++)

{for(j=0;j<3;j++) printf("%2d",a[i][j]);/*按行順序輸出*/printf(“\n”);/*一行輸出完后,要換行*/}}#defineM2#defineN3main(){inta[M][N]={{1,2,3},{4,5,6}},b[N][M],i,j;for(i=0;i<M;i++){for(j=0;j<N;j++){b[j][i]=a[i][j];}

}for(i=0;i<N;i++){for(j=0;j<M;j++)printf(“%5d”,b[i][j]);}}8.2.4二維數(shù)組應(yīng)用舉例【例8.10】將一個(gè)二維數(shù)組的行和列元素互換,存到另一個(gè)二維數(shù)組中。a=b=【例8.11】已知一個(gè)小組5個(gè)學(xué)生的4門課成績(jī),要求分別求每門課的平均成績(jī)和每個(gè)學(xué)生的平均成績(jī)。

cour1cour2cour3cour4stud187699862stud259926877stud378884560stud489629794stud572997564main(){inti,j;

floatscore[6][5]={{87,69,98,62},{59,92,68,77},

{78,88,45,60},{89,62,97,94},{72,99,75,64}}for(i=0;i<5;i++)/*統(tǒng)計(jì)每個(gè)學(xué)生的平均成績(jī)*/{for(j=0;j<4;j++)

score[i][4]+=score[i][j];

score[i][4]=score[i][4]/4;

}}for(j=0;j<4;j++)/*統(tǒng)計(jì)每門課程的平均成績(jī)*/{for(i=0;i<5;i++)score[5][j]+=score[i][j];

score[5][j]=score[5][j]/5;}求一個(gè)矩陣所有靠外側(cè)的元素的和#defineM3#defineN4main(){inta[3][4]={{3,5,6,7},{6,8,2,9},{2,4,5,6}};intk,j,sum=0;

for(j=0;j<N;j++)sum+=a[0][j]+a[M-1][j]

for(i=1;i<M-1;i++)sum+=a[i][0]+a[i][N-1];printf(“%d”,sum);} 3567682924568.3字符數(shù)組字符數(shù)組是存放字符型數(shù)據(jù)的數(shù)組。其中每個(gè)數(shù)組元素的值都是字符型數(shù)據(jù)(單個(gè)字符或轉(zhuǎn)義字符)。常用的字符數(shù)組為一維字符數(shù)組和二維字符數(shù)組。8.3.1字符數(shù)組的定義charstr1[5];charstr2[3][10];用賦值語(yǔ)句可以對(duì)字符數(shù)組元素逐個(gè)賦初值。例如:

str1[0]='C';str1[1]='h';str1[2]='i';

str1[3]='n';str1[4]='a';China字符數(shù)組的存儲(chǔ)狀態(tài)

字符串常量在內(nèi)存中占用一串連續(xù)的空間,相當(dāng)于字符數(shù)組,可以按照字符數(shù)組的方式訪問(wèn)字符串。對(duì)字符串的處理常常采用一維字符數(shù)組實(shí)現(xiàn)。不能通過(guò)賦值語(yǔ)句把字符串常量或其它字符數(shù)組中的字符串直接賦給字符數(shù)組8.3.2字符串與字符數(shù)組hello\0逐個(gè)字符對(duì)字符數(shù)組初始化(不會(huì)自動(dòng)在最后一個(gè)字符后加’\0’)

例如:

charstr1[5]={‘C’,‘h’,‘i’,‘n’,‘a(chǎn)’};

charstr2[2][3]={‘W’,‘i’,‘n’,‘d’,‘o’,‘w’};如果初值個(gè)數(shù)小于數(shù)組長(zhǎng)度,C編譯系統(tǒng)將其余的元素自動(dòng)定為空字符(即‘\0’)用字符串常量對(duì)字符數(shù)組初始化(系統(tǒng)會(huì)自動(dòng)在最后一個(gè)字符后加’\0’)例如:

charc1[13]={"Goodmorning"};

charc2[2][10]={"Hello","World"};8.3.3字符數(shù)組的初始化不可以用賦值語(yǔ)句給字符數(shù)組整體賦一串字符如:charc1[13];c1=“Goodmorning”;逐個(gè)字符輸入輸出scanf()和printf()函數(shù)中用格式符“%c”,循環(huán)8.3.4字符數(shù)組的輸入輸出charstr[5];for(i=0;i<5;i++)scanf(“%c”,&str[i]);for(i=4;i>=0;i--)printf(“%c”,str[i]);

必須在接受到“回車”時(shí),scanf()才開始讀取數(shù)據(jù)。如果按“回車”時(shí),輸入的字符少于scanf()循環(huán)讀取的字符,scanf()繼續(xù)等待用戶將剩下字符輸入;否則,scanf()循環(huán)只將前面的字符讀入。逐個(gè)讀入字符結(jié)束后,不會(huì)自動(dòng)在末尾加’\0’。字符串整體輸入輸出scanf()函數(shù)中用格式符“%s”整體輸入例如:從鍵盤上讀入5個(gè)字符并輸出:charstr[6];scanf("%s",str);printf("%s",str);①用“%s”輸入輸出字符串,以上函數(shù)的第二個(gè)參數(shù)都要求是字符數(shù)組的首地址,如字符數(shù)組名。②按照“%s”格式輸入字符串時(shí),輸入的字符串中不能有空格(由空格鍵或Tab鍵產(chǎn)生,空格或是輸入數(shù)據(jù)的結(jié)束標(biāo)志),否則空格后面的字符不能讀入,這時(shí)scanf()函數(shù)認(rèn)為輸入的是兩個(gè)字符串。

如輸入:Iamhappy

則輸出:Iprintf()函數(shù)中用格式符“%s”整體輸出printf("%s",str);

輸出項(xiàng)是一個(gè)地址值。可以是字符數(shù)組名、字符指針或字符數(shù)組元素的地址。函數(shù)從這一地址開始依次輸出,直至遇到第一個(gè)’\0’。

‘\0’是結(jié)束標(biāo)志,不在輸出字符之列,輸出結(jié)束后不自動(dòng)換行。1.字符串輸入和輸出函數(shù) (1)字符串輸出函數(shù)puts()函數(shù)的調(diào)用形式為:

puts(str);功能:從str指定的地址開始,一次將存儲(chǔ)單元中的各個(gè)字符輸出到顯示器,直到遇到'\0'。例如下列程序段:

charstr[]=“China”;puts(str);注意:在輸出時(shí)將字符串結(jié)束標(biāo)志轉(zhuǎn)換成'\n',即輸出完字符串后換行。8.3.5字符串(字符數(shù)組)處理函數(shù)(2)字符串輸入函數(shù)gets()函數(shù)的調(diào)用形式:

gets(str);功能:從鍵盤輸入一個(gè)字符串(可包含空格),直到遇到回車符,并將字符串存放到由str指定的字符數(shù)組(或內(nèi)存區(qū)域)中。換行符讀入后,不作為字符串的內(nèi)容,系統(tǒng)自動(dòng)用’\0’代替。函數(shù)調(diào)用完成后,輸入的字符串存放在str開始的內(nèi)存空間中。2.字符串連接函數(shù)strcat()函數(shù)調(diào)用形式為:

strcat(str1,str2)功能:將以str2為首地址的字符串連接到str1字符串的后面。從str1原來(lái)的字符串結(jié)束標(biāo)志’\0’處開始連接。例如:

charstrl[13]={“Ilove”};

charstr2[]={“China”};

printf("%s",strcat(str1,str2)); 輸出結(jié)果為:

IloveChinastr1必須足夠大格式:strcpy(字符數(shù)組1,字符數(shù)組2);功能:將字符數(shù)組2拷貝到字符數(shù)組1中;

例如:charstr1[10],str2[]={“Computer”}; strcpy(str1,str2);

執(zhí)行后str1中的內(nèi)容為:Computer;注意:字符數(shù)組1的長(zhǎng)度應(yīng)大到足夠容納字符串2.

字符數(shù)組2的形式可以是字符數(shù)組名也可以是字符串常量. 如:strcpy(str1,“Computer”);3.字符串拷貝函數(shù)strcpy()

格式:strcmp(字符串1,字符串2);功能:對(duì)兩個(gè)字符串從左到右逐個(gè)字符進(jìn)行比較,直到相應(yīng)位置上的字符不一樣或遇到‘\0’,比較結(jié)果由函數(shù)返回

(1)如果字符串1=字符串2,函數(shù)返回值為0(2)如果字符串1>字符串2,函數(shù)返回值為正整數(shù)

(3)如果字符串1<字符串2,函數(shù)返回值為負(fù)整數(shù)4、字符串比較函數(shù)strcmp()格式:strlen(字符串);功能:測(cè)試字符串的實(shí)際長(zhǎng)度(不包括‘\0’)

如:charstr[15]={“Ilovechina”}; printf(“%d”,strlen(str));

結(jié)果:125、測(cè)字符串長(zhǎng)度函數(shù)strlen()8.3.6字符數(shù)組應(yīng)用【例8.13】編寫程序求一個(gè)字符串的逆串。如:字符串”abcdefg”的逆串為:”gfedcba”。main(){charstr[50];intc,i,j,n;

printf("Pleaseinputthestring:\n");

scanf("%s",str);

for(n=0;str[n]!=‘\0’;n++);

for(i=0,j=n-1;i<j;i++,j--){c=str[i];str[i]=str[j];str[j]=c;}printf("Reversedstring:\n%s",str);}gets(str);n=strlen(str);【例8.14】編寫程序?qū)⑤斎氲膬蓚€(gè)字符串連接起來(lái),以實(shí)現(xiàn)strcat()函數(shù)的功能。#include"string.h"main(){charstr1[50],str2[20];

inti,j=0;

printf("PleaseinputthestringNo.1:\n");

gets(str1);

printf("Pleaseinpu

溫馨提示

  • 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)論