版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《電路分析基礎(chǔ)試題》課件
- 《微觀經(jīng)濟(jì)學(xué)》考試試卷試題及參考答案
- 《專業(yè)英語(yǔ)(計(jì)算機(jī)英語(yǔ))》復(fù)習(xí)題
- 八下期末考拔高測(cè)試卷(5)(原卷版)
- 《誠(chéng)邀創(chuàng)業(yè)伙伴》課件
- 2012年高考語(yǔ)文試卷(安徽)(解析卷)
- 父母課堂與教育理念分享計(jì)劃
- 購(gòu)物中心導(dǎo)購(gòu)員服務(wù)總結(jié)
- 水產(chǎn)養(yǎng)殖行業(yè)銷售工作總結(jié)
- 娛樂(lè)場(chǎng)館衛(wèi)生要素
- 變曲率雙向可調(diào)收縫式翻升模板施工工法
- 教你炒紅爐火版00纏論大概
- 消防管道施工合同
- 大學(xué)生計(jì)算與信息化素養(yǎng)-北京林業(yè)大學(xué)中國(guó)大學(xué)mooc課后章節(jié)答案期末考試題庫(kù)2023年
- 2023年中國(guó)社會(huì)科學(xué)院外國(guó)文學(xué)研究所專業(yè)技術(shù)人員招聘3人(共500題含答案解析)筆試歷年難、易錯(cuò)考點(diǎn)試題含答案附詳解
- 2023年國(guó)開大學(xué)期末考復(fù)習(xí)題-3987《Web開發(fā)基礎(chǔ)》
- 《駱駝祥子》1-24章每章練習(xí)題及答案
- 《伊利乳業(yè)集團(tuán)盈利能力研究》文獻(xiàn)綜述3000字
- 減鹽防控高血壓培訓(xùn)課件
- 2023年百一測(cè)評(píng)-房地產(chǎn)企業(yè)崗位招聘工程副總經(jīng)理筆試試題
- 英語(yǔ)課presentation中國(guó)麻將-Chinese-mahjong
評(píng)論
0/150
提交評(píng)論