




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第8章數(shù)組本章要點
一維數(shù)組
二維數(shù)組字符數(shù)組數(shù)組元素作函數(shù)實參
數(shù)組是同類型數(shù)據(jù)的集合,集合中的每個數(shù)據(jù)稱為數(shù)組元素或下標變量,數(shù)組元素的類型相同、個數(shù)確定。下標變量中如果只用一個下標,則稱為一維數(shù)組,用兩個下標則稱之為二維數(shù)組,用三個下標稱之為三維數(shù)組,依此類推?;靖拍?.1一維數(shù)組8.1.1一維數(shù)組的定義定義形式為:
[存儲類別]類型標識符數(shù)組名[常量表達式],…;例如:inta[6]; floatx[100],y[100];說明:類型標識符”表明了數(shù)組元素的數(shù)據(jù)類型常量表達式是由常量、符號常量和運算符組成的表達式,它的值規(guī)定了數(shù)組中數(shù)組元素的個數(shù)(數(shù)組的長度)常量表達式中不能含有變量。intn;scanf("%d",&n);inta[n];數(shù)組在內(nèi)存中占據(jù)一片連續(xù)的存儲單元,數(shù)組中的每個數(shù)組元素在這片連續(xù)的存儲單元中按序存儲。C語言規(guī)定數(shù)組名表示該連續(xù)存儲單元的首地址(首字節(jié)編號)。a
a[0]a[1]a[2]a[3]a[4] a[5]
圖8.1數(shù)組的存儲結(jié)構(gòu)
數(shù)組的定義語句給每個數(shù)組元素分配了一定的存儲單元,和簡單變量一樣它們的值是不確定的、是隨機的,只有通過賦值或賦初值才能得到確定的值。同類型的數(shù)組的定義和普通變量的定義可以出現(xiàn)在同一個定義語句中。如: inta[6],b[20],i,j;數(shù)組初始化的一般形式為:
[存儲類別]類型標識符數(shù)組名[常量表達式]={初值表};在編譯過程中完成的,不占程序運行時間。數(shù)組初始化常見的幾種形式:對所有數(shù)組元素賦初值,此時數(shù)組定義中表示數(shù)組長度的常量表達式可以省略。
inta[6]={0,1,2,3,4,5};可以只給一部分數(shù)組元素賦初值,此時數(shù)組長度一般不省略。后面3個元素由C編譯系統(tǒng)自動賦值為0。
inta[6]={0,1,2};
8.1.2一維數(shù)組的初始化引用形式為:
數(shù)組名[下標表達式]
例如:
a[0]=123;
scanf(“%d”,&a[3]);
printf(“%d”,a[5]);
a[i++]=2*a[i+j];8.1.3一維數(shù)組元素的引用【例8.1】輸入100個整型數(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ù)組元素時應(yīng)注意: ①引用數(shù)組元素時,下標表達式的值是確定的。 ②數(shù)組元素本身可以看作是一個普通變量,代表內(nèi)存中的一個存儲單元。因此數(shù)組元素可以在任何相同類型簡單變量允許使用的位置引用。 ③數(shù)組引用時,下標值應(yīng)該在已定義的數(shù)組大小范圍內(nèi)。常出現(xiàn)的錯誤是:
inta[100];
a[100]=4;8.1.4一維數(shù)組應(yīng)用【例8.2】從鍵盤輸入10個整數(shù)存放在數(shù)組中,輸出其中最大的一個數(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,位序為:%d\n",max,id);}【例8.4】已知一個一維數(shù)組中的各個元素值均不相同,編寫程序查找數(shù)組中是否有值為x的數(shù)組元素。如果有,輸出相應(yīng)的下標;如果沒有,輸出“該值在數(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ù)組中的下標是%d”,i);}【例8.5】編寫程序,利用選擇法對10個整數(shù)進行遞增排序,并輸出排序后的結(jié)果。選擇法排序的思路是:先從全體待排序的n個數(shù)據(jù)中找出最大的數(shù),把它放到數(shù)組的第0個位置上,完成第1趟選擇排序;接著再在剩余的n-1個數(shù)據(jù)中找出最大的數(shù)放到數(shù)組的第1個位置上,完成第2趟選擇排序,……,如此反復(fù),經(jīng)過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】編寫程序,利用冒泡法對10個整數(shù)進行遞增排序?!谝惶?/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ù)組例:求一個矩陣的轉(zhuǎn)置矩陣356768292456245668293567定義二維數(shù)組的一般形式為:[存儲類別]類型標識符數(shù)組名[常量表達式1][常量表達式2],…;例如:inta[2][3];說明:①二維數(shù)組定義中的第1個下標表示該數(shù)組具有的行數(shù),第2個下標表示該數(shù)組具有的列數(shù),兩個下標之積是組成該數(shù)組的元素的個數(shù),即二維數(shù)組的長度。②二維數(shù)組在內(nèi)存中占據(jù)一片連續(xù)的存儲單元。aa[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]8.2.1二維數(shù)組的定義③在C語言中,一個二維數(shù)組可以看作是一個特殊的一維數(shù)組,其中一維數(shù)組中的每個元素又是一個一維數(shù)組,即二維數(shù)組是由元素類型為數(shù)組類型的一維數(shù)組構(gòu)成的一維數(shù)組。因此C系統(tǒng)就把a[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ù)寫在一個花括弧內(nèi),按數(shù)組在內(nèi)存中的排列順序?qū)Ω鲾?shù)組元素賦初值。如:
inta[2][3]={1,2,3,6,7,8};
(3)給二維數(shù)組所有元素賦初值,二維數(shù)組第一維的長度可以省略。如:inta[2][3]={1,2,3,6,7,8};等價于:
inta[][3]={1,2,3,6,7,8};
(4)在定義時也可以只對部分元素賦初值而省略第一維的長度,但應(yīng)按行賦初值。如:
inta[][3]={{0,2},{6}};8.2.2二維數(shù)組的初始化二維數(shù)組元素的引用形式為:
數(shù)組名[下標表達式1][下標表達式2]數(shù)組元素的行列下標都從0開始??梢詫ΧS數(shù)組元素進行與普通變量相同的操作,因為它們的本質(zhì)就是一個普通變量,如運算、賦值等。如:a[0][0]=a[0][2]/3-30;
printf(“%d”,a[1][1]);區(qū)分在定義數(shù)組時使用的維數(shù)和各維大小與引用數(shù)組元素時下標值的不同。如:
inta[3][5];
a[3][5]=6;8.2.3二維數(shù)組元素的引用【例8.8】輸入12個整型數(shù)據(jù)形成一個具有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】將一個二維數(shù)組的行和列元素互換,存到另一個二維數(shù)組中。a=b=【例8.11】已知一個小組5個學(xué)生的4門課成績,要求分別求每門課的平均成績和每個學(xué)生的平均成績。
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)計每個學(xué)生的平均成績*/{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)計每門課程的平均成績*/{for(i=0;i<5;i++)score[5][j]+=score[i][j];
score[5][j]=score[5][j]/5;}求一個矩陣所有靠外側(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ù)組。其中每個數(shù)組元素的值都是字符型數(shù)據(jù)(單個字符或轉(zhuǎn)義字符)。常用的字符數(shù)組為一維字符數(shù)組和二維字符數(shù)組。8.3.1字符數(shù)組的定義charstr1[5];charstr2[3][10];用賦值語句可以對字符數(shù)組元素逐個賦初值。例如:
str1[0]='C';str1[1]='h';str1[2]='i';
str1[3]='n';str1[4]='a';China字符數(shù)組的存儲狀態(tài)
字符串常量在內(nèi)存中占用一串連續(xù)的空間,相當于字符數(shù)組,可以按照字符數(shù)組的方式訪問字符串。對字符串的處理常常采用一維字符數(shù)組實現(xiàn)。不能通過賦值語句把字符串常量或其它字符數(shù)組中的字符串直接賦給字符數(shù)組8.3.2字符串與字符數(shù)組hello\0逐個字符對字符數(shù)組初始化(不會自動在最后一個字符后加’\0’)
例如:
charstr1[5]={‘C’,‘h’,‘i’,‘n’,‘a(chǎn)’};
charstr2[2][3]={‘W’,‘i’,‘n’,‘d’,‘o’,‘w’};如果初值個數(shù)小于數(shù)組長度,C編譯系統(tǒng)將其余的元素自動定為空字符(即‘\0’)用字符串常量對字符數(shù)組初始化(系統(tǒng)會自動在最后一個字符后加’\0’)例如:
charc1[13]={"Goodmorning"};
charc2[2][10]={"Hello","World"};8.3.3字符數(shù)組的初始化不可以用賦值語句給字符數(shù)組整體賦一串字符如:charc1[13];c1=“Goodmorning”;逐個字符輸入輸出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]);
必須在接受到“回車”時,scanf()才開始讀取數(shù)據(jù)。如果按“回車”時,輸入的字符少于scanf()循環(huán)讀取的字符,scanf()繼續(xù)等待用戶將剩下字符輸入;否則,scanf()循環(huán)只將前面的字符讀入。逐個讀入字符結(jié)束后,不會自動在末尾加’\0’。字符串整體輸入輸出scanf()函數(shù)中用格式符“%s”整體輸入例如:從鍵盤上讀入5個字符并輸出:charstr[6];scanf("%s",str);printf("%s",str);①用“%s”輸入輸出字符串,以上函數(shù)的第二個參數(shù)都要求是字符數(shù)組的首地址,如字符數(shù)組名。②按照“%s”格式輸入字符串時,輸入的字符串中不能有空格(由空格鍵或Tab鍵產(chǎn)生,空格或是輸入數(shù)據(jù)的結(jié)束標志),否則空格后面的字符不能讀入,這時scanf()函數(shù)認為輸入的是兩個字符串。
如輸入:Iamhappy
則輸出:Iprintf()函數(shù)中用格式符“%s”整體輸出printf("%s",str);
輸出項是一個地址值??梢允亲址麛?shù)組名、字符指針或字符數(shù)組元素的地址。函數(shù)從這一地址開始依次輸出,直至遇到第一個’\0’。
‘\0’是結(jié)束標志,不在輸出字符之列,輸出結(jié)束后不自動換行。1.字符串輸入和輸出函數(shù) (1)字符串輸出函數(shù)puts()函數(shù)的調(diào)用形式為:
puts(str);功能:從str指定的地址開始,一次將存儲單元中的各個字符輸出到顯示器,直到遇到'\0'。例如下列程序段:
charstr[]=“China”;puts(str);注意:在輸出時將字符串結(jié)束標志轉(zhuǎn)換成'\n',即輸出完字符串后換行。8.3.5字符串(字符數(shù)組)處理函數(shù)(2)字符串輸入函數(shù)gets()函數(shù)的調(diào)用形式:
gets(str);功能:從鍵盤輸入一個字符串(可包含空格),直到遇到回車符,并將字符串存放到由str指定的字符數(shù)組(或內(nèi)存區(qū)域)中。換行符讀入后,不作為字符串的內(nèi)容,系統(tǒng)自動用’\0’代替。函數(shù)調(diào)用完成后,輸入的字符串存放在str開始的內(nèi)存空間中。2.字符串連接函數(shù)strcat()函數(shù)調(diào)用形式為:
strcat(str1,str2)功能:將以str2為首地址的字符串連接到str1字符串的后面。從str1原來的字符串結(jié)束標志’\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的長度應(yīng)大到足夠容納字符串2.
字符數(shù)組2的形式可以是字符數(shù)組名也可以是字符串常量. 如:strcpy(str1,“Computer”);3.字符串拷貝函數(shù)strcpy()
格式:strcmp(字符串1,字符串2);功能:對兩個字符串從左到右逐個字符進行比較,直到相應(yīng)位置上的字符不一樣或遇到‘\0’,比較結(jié)果由函數(shù)返回
(1)如果字符串1=字符串2,函數(shù)返回值為0(2)如果字符串1>字符串2,函數(shù)返回值為正整數(shù)
(3)如果字符串1<字符串2,函數(shù)返回值為負整數(shù)4、字符串比較函數(shù)strcmp()格式:strlen(字符串);功能:測試字符串的實際長度(不包括‘\0’)
如:charstr[15]={“Ilovechina”}; printf(“%d”,strlen(str));
結(jié)果:125、測字符串長度函數(shù)strlen()8.3.6字符數(shù)組應(yīng)用【例8.13】編寫程序求一個字符串的逆串。如:字符串”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ū)⑤斎氲膬蓚€字符串連接起來,以實現(xiàn)strcat()函數(shù)的功能。#include"string.h"main(){charstr1[50],str2[20];
inti,j=0;
printf("PleaseinputthestringNo.1:\n");
gets(str1);
printf("Pleaseinpu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 草房子考試題及答案
- 雙線匯報面試題及答案
- java中io流面試題及答案
- 后勤核算面試題及答案
- 垃圾降解測試題及答案
- 電瓶叉車考試題及答案
- 洪水救援面試題及答案
- 面試時政試題及答案
- 2025年彈藥工程與爆炸技術(shù)專業(yè)畢業(yè)設(shè)計開題報告
- 吉林省部分學(xué)校2022-2023學(xué)年高三上學(xué)期聯(lián)合模擬考試語文試題
- 商住綜合體物業(yè)管理投標方案技術(shù)標
- 臨床醫(yī)生教師如何上好一堂課課件
- 商用熒光粉Zn2SiO4-Mn2+的長余輝特性引入及改造
- 聽診胎心音操作流程及評分標準
- 電力設(shè)備狀態(tài)檢修試驗規(guī)程
- 工作秘密定義及事項范圍8篇
- (完整版)50028-城鎮(zhèn)燃氣設(shè)計規(guī)范
- 正式策劃案郵件和戰(zhàn)報系統(tǒng)
- GB/T 27689-2011無動力類游樂設(shè)施兒童滑梯
- 變壓器有載分接開關(guān)的試驗課件
- 鋼結(jié)構(gòu)技術(shù)(安全)交底記錄
評論
0/150
提交評論