版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6章數(shù)組6.1一維數(shù)組6.2二維數(shù)組6.3字符數(shù)組和字符串?dāng)?shù)組是一種構(gòu)造型的數(shù)據(jù)類型,所謂構(gòu)造型數(shù)據(jù)類型,是根據(jù)已定義的一個(gè)或多個(gè)數(shù)據(jù)類型,用構(gòu)造的方法來定義的一種數(shù)據(jù)類型。也就是說,一個(gè)構(gòu)造類型的值可以分解成若干個(gè)“成員”或“元素”。每個(gè)數(shù)組中有多個(gè)元素(或者稱為成員),而每個(gè)數(shù)組中的元素是同一種數(shù)據(jù)類型,這些元素在內(nèi)存中占用一塊連續(xù)的存儲(chǔ)區(qū)域,并且每個(gè)元素占用相同大小的內(nèi)存空間。數(shù)組中的元素可以通過下標(biāo)進(jìn)行訪問。在程序設(shè)計(jì)語言中,數(shù)組是一種非常重要的數(shù)據(jù)結(jié)構(gòu),許多問題通過抽象,可以用這種數(shù)據(jù)結(jié)構(gòu)來表示數(shù)據(jù)。數(shù)組與我們后面章節(jié)中要介紹的指針有密切的關(guān)系。本章主要介紹一維數(shù)組和二維數(shù)組的定義、數(shù)組元素的引用以及數(shù)組的應(yīng)用。
6.1.1一維數(shù)組的定義
一維數(shù)組是指數(shù)組中每個(gè)元素只帶有一個(gè)下標(biāo)。在C語言中,定義一維數(shù)組的語法形式為
類型名數(shù)組名[常量表達(dá)式],……;
方括號(hào)中的常量表達(dá)式稱為數(shù)組的下標(biāo)。例如:
intdat[5],dat1[6];
charname[7];6.1一維數(shù)組都是一維數(shù)組的合法定義形式。第一種定義形式定義了兩個(gè)一維數(shù)組,數(shù)組名分別為dat和dat1,dat含有5個(gè)整型元素,dat1含有6個(gè)整型元素;第二種定義形式定義了一個(gè)含有7個(gè)字符型元素的數(shù)組,數(shù)組名為name。
數(shù)組一旦被定義,編譯系統(tǒng)將為該數(shù)組在內(nèi)存中分配一定的連續(xù)存儲(chǔ)空間,用來存放數(shù)組元素;空間的大小與數(shù)組的下標(biāo)以及數(shù)組元素的類型有關(guān)。例如,dat數(shù)組在內(nèi)存中占用的存儲(chǔ)空間如圖6-1所示。數(shù)組的下標(biāo)從0(稱為數(shù)組下標(biāo)下界)開始,如dat[5]是由data[0]、dat[1]、dat[2]、dat[3]、dat[4]這5個(gè)元素組成的,我們看到dat數(shù)組中最后一個(gè)元素的下標(biāo)是4(注意不是5!),4稱為數(shù)組下標(biāo)的上界。
圖6-1dat數(shù)組在內(nèi)存中占用的存儲(chǔ)空間6.1.2一維數(shù)組的初始化
定義數(shù)組,雖然在內(nèi)存占用了一塊連續(xù)空間,但內(nèi)存中存放什么還不確定,可以采用如下形式給數(shù)組元素賦初值,即初始化:
intdat[5]={0,2,3,5,7};
在dat數(shù)組的定義中,其中,賦值號(hào)右邊用花擴(kuò)號(hào){}括起來的部分稱為初值表。將{}內(nèi)的數(shù)值分別對應(yīng)地賦給數(shù)組元素dat[0]~dat[4],即
dat[0]←0
dat[1]←2
dat[2]←3
dat[3]←5
dat[4]←7
C語言規(guī)定,當(dāng)初值表中的元素個(gè)數(shù)少于數(shù)組元素個(gè)數(shù)時(shí),多余的數(shù)組元素被賦予零值,但不允許初值表中數(shù)值個(gè)數(shù)大于數(shù)組元素個(gè)數(shù);另外,初值表中的數(shù)值可以缺省,但以逗號(hào)分隔的除了最后一個(gè)可缺省外,其余的不可缺省,缺省的數(shù)值為零,如:
intdata[5]={3,5}; 正確。
intdata[5]={3,5,}; 正確。
intdata[5]={,,3,,5}; 錯(cuò)誤。
intdata1[5]={9}; 正確。
初始化結(jié)果是:
data[0],data[1],data[2],data[3],data[4]的初始值分別為3,5,0,0,0。
data1[0],data1[2],data1[3],data1[4]的初值分別為9,0,0,0,0。
再如:
charc[5]={'a'};
初始化結(jié)果是:
c[0],c[1],c[2],c[3],c[4]的初值分別為字符
'a','\0','\0','\0','\0'。數(shù)組初始化時(shí),下標(biāo)[]中的數(shù)字可以省略,即不指明元素的個(gè)數(shù),這時(shí)元素的個(gè)數(shù)通過初值表中元素的個(gè)數(shù)來決定。如:
intb[]={1,2,3,4,5,6};
數(shù)組b有6個(gè)int型的元素,其等價(jià)于:
intb[6]={1,2,3,4,5,6};
數(shù)組也可以先定義,然后分別對每個(gè)元素賦值。例如:
intb[6];
b[0]=1;b[1]=2;b[2]=3;b[3]=4;b[4]=5;b[5]=6;
通過賦值后,等價(jià)于:
intb[6]={1,2,3,4,5,6};
b[6]={1,2,3,4,5,6};6.1.3一維數(shù)組的引用
定義了數(shù)組,在程序中如何使用呢?對一維數(shù)組的引用形式如下:
數(shù)組名[下標(biāo)表達(dá)式]
例如,定義如下數(shù)組:
inta[8];
則a[0]、a[j]、a[j+k]都是對數(shù)組a中的元素的合法引用形式,其中0、j、j+k稱為下標(biāo)表達(dá)式,要求下標(biāo)表達(dá)式的值不能超出數(shù)組下標(biāo)的下界和上界規(guī)定的范圍。本例中數(shù)組a的下標(biāo)范圍是0~7。下標(biāo)表達(dá)式的值必須是整數(shù),下標(biāo)的下界為0。C語言程序運(yùn)行過程中,對數(shù)組元素的訪問如果越界,程序運(yùn)行時(shí)會(huì)產(chǎn)生不可預(yù)知的錯(cuò)誤,系統(tǒng)并不自動(dòng)檢驗(yàn)引用數(shù)組元素的下標(biāo)是否越界,因此需要程序員在程序中自己判別,避免這種錯(cuò)誤發(fā)生。
數(shù)組中的元素只能單個(gè)地引用,如a[2]表示數(shù)組a中的第3個(gè)元素(a[0]是第一個(gè)),不能用a代表a中所有的8個(gè)元素。在C語言中,數(shù)組名是一個(gè)常量指針,用于存放整個(gè)數(shù)組的起始地址,也可以引用。有關(guān)指針的概念我們將在后續(xù)章節(jié)中介紹。6.1.4一維數(shù)組應(yīng)用舉例
【例6.1】
5個(gè)人的年齡分別為18、20、17、21、19,請計(jì)算5個(gè)人的平均年齡。
我們用一維數(shù)組來表示5個(gè)人的年齡,在定義數(shù)組的同時(shí),對數(shù)組進(jìn)行初始化。
#include<stdio.h>
main()
{
intage[5]={18,20,17,21,19}; /*定義并初始化一維數(shù)組*/
inti,sum=0; /*定義中間變量*/
for(i=0;i<5;i++) /*年齡累加*/
sum+=age[i];
printf("Theaverageageis:%3.1f\n",sum/5.0); /*輸出平均年齡,保留一位小數(shù)點(diǎn)*/
}
程序運(yùn)行結(jié)果:
Theaverageageis:19.0
也可以修改一下程序,通過鍵盤讀取5個(gè)人的年齡,然后把讀取的年齡放到數(shù)組中。程序如下:
#include<stdio.h>
main()
{
intage[5]; /*定義一維數(shù)組*/
inti,sum=0; /*定義中間變量*/
printf(“Inputages:”);
for(i=0;i<5;i++)
scanf("%d",&age[i]);
for(i=0;i<5;i++) /*年齡累加*/
sum+=age[i];
printf("Theaverageageis:%3.1f\n",sum/5.0);/*輸出平均年齡,保留一位小數(shù)點(diǎn)*/
}
【例6.2】
從鍵盤輸入5個(gè)整數(shù),存入一個(gè)一維數(shù)組,求5個(gè)數(shù)中最大的數(shù)。
#include<stdio.h>
main()
{
intdat[5];/*定義一維數(shù)組*/
inti,max;/*定義中間變量*/
printf("Pleaseinput5data:");
for(i=0;i<5;i++)/*從鍵盤讀入數(shù)據(jù)*/
scanf("%d",&dat[i]);
max=dat[0];/*假設(shè)數(shù)組中第一個(gè)元素最大*/
for(i=1;i<5;i++)/*求最大的數(shù)*/
if(dat[i]>max)
max=dat[i];
printf("Themaximumdatais:%d\n",max);/*輸出最大的數(shù)*/
}程序運(yùn)行結(jié)果:
45234689↙
Themaximumdatais:89
【例6.3】
通過鍵盤輸入10個(gè)整數(shù),分類輸出偶數(shù)和奇數(shù)。
#include<stdio.h>
main()
{
inti,j,k;
intnum[10],unev[10],even[10];
printf("Input10numbers:\n");
for(i=0;i<10;i++)
scanf("%f",&num[i]);
j=0;
k=0;
for(i=0;i<10;i++){
if(num[i]%2==0){
even[k]=num[i];
k++;
}
else{
unev[j]=num[i];
j++;
}
}
printf("Theevenis:");
for(i=0;i<k;i++)
printf("%d,",even[i]);
printf("\nTheunevenis:");
for(i=0;i<j;i++)
printf("%d,",unev[i]);
}
程序運(yùn)行結(jié)果:
Input10numbers:
232144556768924↙
Theevenis:2,14,6,8,24
Theunevenis:23,45,5,67,9,6.1.5查找
查找是“數(shù)據(jù)結(jié)構(gòu)”課程的重要內(nèi)容,查找算法有很多種,下面只對兩種基本查找算法作介紹,其它查找算法請參考相關(guān)資料。
1.順序查找
順序查找也稱線性查找,其查找過程是:對n個(gè)數(shù)據(jù)元素的序列{R1,R2,…,Rn},給定關(guān)鍵字k,從其一端開始順序掃描表中元素,依次與每個(gè)元素的關(guān)鍵字域的值相比較,如果某個(gè)元素的關(guān)鍵字域的值等于k,則查找成功,否則,查找失敗。
2.折半查找
折半查找也稱二分查找,它是一種效率較高的查找方法,但它要求n個(gè)數(shù)據(jù)元素的序列{R1,R2,…,Rn}必須有序(依關(guān)鍵字域的值從小到大或從大到小排列),其查找過程是:對n個(gè)數(shù)據(jù)元素的有序序列{R1,R2,…,Rn}(假設(shè)依關(guān)鍵字域的值從小到大排列),給定關(guān)鍵字k,首先與有序序列的中間位置的元素的關(guān)鍵字域的值進(jìn)行比較,如果相等,則查找成功,否則,該中間元素將有序序列分成兩部分,前一部分中的所有元素的關(guān)鍵字域的值均小于該中間元素關(guān)鍵字域的值,后一部分中的所有元素的關(guān)鍵字域的值均大于該中間元素關(guān)鍵字域的值。因此,k與該中間元素的關(guān)鍵字域的值比較后,若k小于該中間元素的關(guān)鍵字域的值,則在前一部分中繼續(xù)進(jìn)行折半查找,否則,在后一部分中繼續(xù)進(jìn)行折半查找。重復(fù)上述過程,直至查找成功或失敗。
3.順序查找和折半查找程序設(shè)計(jì)
1)順序查找程序設(shè)計(jì)
【例6.4】從鍵盤上任意輸入10個(gè)整數(shù),然后再任意輸入1個(gè)整數(shù),順序查找該整數(shù)是否在前面的10個(gè)整數(shù)中。
#include<stdio.h>
main()
{
intnum[10],i,k;
printf("Input10integernumbers:");
for(i=0;i<10;i++) /*給數(shù)組賦值*/
scanf("%d",&num[i]);
printf("Inputk:");
scanf("%d",&k); /*給關(guān)鍵字k輸入值*/
printf("\nOriginal10integernumbers:\n");
for(i=0;i<10;i++) /*輸出原始數(shù)據(jù)*/
printf("%d,",num[i]);
for(i=0;i<10;i++) /*順序掃描,依次比較*/
if(k==num[i]) /*比較k和num[i],若相等,則結(jié)束查找*/
break;
if(i<10)
printf("\n%disFound.\n",k);
else
printf("\n%disnotFound.\n",k);
}程序運(yùn)行結(jié)果:
Input10integernumbers:1357908642
Inputk:12
Original10integernumbers:
1,3,5,7,9,0,8,6,4,2,
12isnotFound.
或
Input10integernumbers:1357908642
Inputk:8
Original10integernumbers:
1,3,5,7,9,0,8,6,4,2,
8isFound.
2)折半查找程序設(shè)計(jì)
【例6.5】從鍵盤上按照從小到大順序任意輸入9個(gè)整數(shù),然后再任意輸入1個(gè)整數(shù),查找該整數(shù)是否在前面的9個(gè)整數(shù)中。
#include<stdio.h>
main()
{
intnum[10],i,k,low,high,mid;
printf("Input10integernumbersfromsmalltolargeorder:");
for(i=0;i<10;i++) /*給數(shù)組賦值*/
scanf("%d",&num[i]);
printf("Inputk:");
scanf("%d",&k); /*給關(guān)鍵字k輸入值*/
printf("\nOriginal10integernumbers:\n");
for(i=0;i<10;i++) /*輸出原始數(shù)據(jù)*/
printf("%d,",num[i]);
low=0; /*左端位置low*/
high=9; /*右端位置high*/
while(low<=high){
mid=(low+high)/2; /*計(jì)算中間位置mid*/
if(k==num[mid]) /*比較k和num[mid],若相等,則結(jié)束查找*/
break;
elseif(k<num[mid]) /*如果k小于num[mid],則新的右端位置high為mid-1*/
high=mid-1;
else /*如果k大于num[mid],則新的左端位置high為mid+1*/
low=mid+1;
}
if(low<=high)
printf("\n%disFound.\n",k);
else
printf("\n%disnotFound.\n",k);
}程序運(yùn)行結(jié)果:
Input10integernumbersfromsmalltolargeorder:0123456789
Inputk:12
Original10integernumbers:
0,1,2,3,4,5,6,7,8,9,
12isnotFound.
或
Input10integernumbersfromsmalltolargeorder:0123456789
Inputk:8
Original10integernumbers:
0,1,2,3,4,5,6,7,8,9,
8isFound.6.1.6排序
排序是“數(shù)據(jù)結(jié)構(gòu)”課程的重要內(nèi)容,排序算法有很多種,下面只對兩種基本排序算法作介紹,其它排序算法請參考相關(guān)資料。
1.選擇排序
1)基本思想
對n個(gè)數(shù)據(jù)元素的序列{R1,R2,…,Rn}進(jìn)行n-1趟選擇操作,而第i(i=1,2,…,n-1)趟選擇操作是從第i個(gè)數(shù)據(jù)元素開始,與其后的n-i個(gè)數(shù)據(jù)元素逐一進(jìn)行比較,若某個(gè)數(shù)據(jù)元素小于(或大于)第i個(gè)數(shù)據(jù)元素,則與第i個(gè)數(shù)據(jù)元素交換,經(jīng)過一趟排序后,挑選出n-i個(gè)元素中最小(或最大)的元素,第i個(gè)元素就是最小(或最大)的元素。經(jīng)過n-1趟選擇操作后,這n個(gè)數(shù)據(jù)元素就按從小到大(或從大到小)順序排列了。說明:
(1)選擇排序總共進(jìn)行n-1趟選擇操作。
(2)第i趟選擇操作使得第i個(gè)數(shù)據(jù)元素成為從第i個(gè)數(shù)據(jù)元素到第n個(gè)數(shù)據(jù)元素中最小(或最大)的。
(3)第i趟選擇操作需要進(jìn)行n-i次比較。
(4)之所以只進(jìn)行n-1趟選擇操作,是因?yàn)楫?dāng)n-1趟選擇操作完后,最后一個(gè)數(shù)據(jù)元素已無須進(jìn)行選擇操作。
2)示例
整數(shù)序列
493865977613278154
第1趟134965977638278154
第2趟132765977649388154
第3趟132738977665498154
第4趟132738499776658154
第5趟132738495497768165
第6趟132738495465978176
第7趟132738495465769781
第8趟132738495465768197以上選擇排序過程中,第i次選擇操作不僅使得第i個(gè)數(shù)據(jù)元素成為從第i個(gè)數(shù)據(jù)元素到第n個(gè)數(shù)據(jù)元素中最小的,而且也可能使得其它數(shù)據(jù)元素的位置發(fā)生變化。
2.冒泡排序
1)基本思想
對n個(gè)數(shù)據(jù)元素的序列{R1,R2,…,Rn}進(jìn)行n-1趟冒泡操作,而第i(i=1,2,…,n-1)趟冒泡操作是從第1個(gè)數(shù)據(jù)元素到第n-i+1個(gè)數(shù)據(jù)元素的每相鄰兩個(gè)數(shù)據(jù)元素從前向后逐一進(jìn)行比較,若前一個(gè)數(shù)據(jù)元素大于(或小于)后一個(gè)數(shù)據(jù)元素,則交換這兩個(gè)數(shù)據(jù)元素。經(jīng)過n-1趟冒泡操作后,這n個(gè)數(shù)據(jù)元素即按從小到大(或從大到小)排序了。說明:
(1)冒泡排序總共進(jìn)行n-1趟冒泡操作。
(2)第i趟冒泡操作使得第n-i+1個(gè)數(shù)據(jù)元素(或記錄)成為從第1個(gè)數(shù)據(jù)元素到第n-i+1個(gè)數(shù)據(jù)元素中最大(或最小)的。
(3)第i趟冒泡操作需要進(jìn)行n-i次比較。
(4)之所以只進(jìn)行n-1趟冒泡操作是因?yàn)楫?dāng)n-1趟冒泡操作完成后,第一個(gè)數(shù)據(jù)元素已無須進(jìn)行冒泡操作。
2)示例
整數(shù)序列
493865977613278154
第1趟384965761327815497
第2趟384965132776548197
第3趟384913276554768197
第4趟381327495465768197
第5趟132738495465768197
第6趟132738495465768197
第7趟132738495465768197
第8趟132738495465768197
3.選擇排序和冒泡排序程序設(shè)計(jì)
【例6.6】
從鍵盤上任意輸入10個(gè)整數(shù),然后進(jìn)行從小到大排序,并輸出排序前的結(jié)果和排序后的結(jié)果。
程序1:選擇排序算法程序
#include<stdio.h>
main()
{
intnum[10],i,j,t;
printf("Input10integernumbersarbitrarily:");
for(i=0;i<10;i++)/*給數(shù)組賦值*/
scanf("%d",&num[i]);
printf("\nOriginal10integernumbers:\n");
for(i=0;i<10;i++)/*輸出原始數(shù)據(jù)*/
printf("%d,",num[i]);
for(i=0;i<9;i++)/*9趟選擇操作*/
for(j=i+1;j<10;j++)/*第i趟選擇操作*/
if(num[i]>num[j]){/*比較num[i]和num[j]*/
t=num[i];/*逆序時(shí)交換num[i]和num[j]*/
num[i]=num[j];
num[j]=t;
}
printf("\nSortingresult:\n");
for(i=0;i<10;i++)
printf("%d,",num[i]);
printf("\n");
}程序運(yùn)行結(jié)果:
Input10integernumbersarbitrarily:1357908642
Original10integernumbers:
1,3,5,7,9,0,8,6,4,2,
Sortingresult:
0,1,2,3,4,5,6,7,8,9,
程序2:冒泡排序算法程序。
#include<stdio.h>
main()
{
intnum[10],i,j,t;
printf("Input10integernumbers:");
for(i=0;i<10;i++)
scanf("%d",&num[i]);
printf("\nOriginal10integernumbers:\n");
for(i=0;i<10;i++) /*輸出原始數(shù)據(jù)*/
printf("%d,",num[i]);
for(i=0;i<9;i++) /*9趟冒泡操作*/
for(j=0;j<9-i;j++) /*第i趟冒泡操作*/
if(num[j]>num[j+1]){ /*比較num[j]
和
num[j+1],即相鄰兩整數(shù)*/
t=num[j]; /*逆序時(shí)交換num[j]
和
num[j+1]*/
num[j]=num[j+1];
num[j+1]=t;
}
printf("\nSortingresult:\n");
for(i=0;i<10;i++)
printf("%d,",num[i]);
printf("\n");
}
程序運(yùn)行結(jié)果:
Input10integernumbers:1357908642
Original10integernumbers:
1,3,5,7,9,0,8,6,4,2,
Sortingresult:
0,1,2,3,4,5,6,7,8,9,
6.2.1二維數(shù)組的定義
數(shù)組中的每個(gè)元素帶有兩個(gè)下標(biāo)時(shí),稱這種數(shù)組為二維數(shù)組。在C語言中,二維數(shù)組的定義語句形式為
類型名數(shù)組名[常量表達(dá)式1][常量表達(dá)式2],…6.2二維數(shù)組二維數(shù)組定義中,常量表達(dá)式1和常量表達(dá)式2與一維數(shù)組一樣,必須是整數(shù),必須用方括號(hào)擴(kuò)起來;如果把二維數(shù)組在邏輯上與矩陣相對應(yīng)的話,我們可以把常量表達(dá)式1的值作為矩陣的行,常量表達(dá)式2的值作為矩陣的列,兩個(gè)下標(biāo)的下界都是0,上界分別為常量表達(dá)式1-1、常量表達(dá)式2-1。一個(gè)m行n列的矩陣,我們可以用一個(gè)array[m][n]的二維數(shù)組來表示,array是二維數(shù)組名,有m×n個(gè)元素。例如定義一個(gè)二維數(shù)組:
intdata[2][3];則data數(shù)組是二維數(shù)組,有6個(gè)元素,每個(gè)元素的類型為int型。我們可以用一個(gè)2行3列的矩陣(或者一個(gè)行列結(jié)構(gòu)的表格)與其對應(yīng):
該矩陣中,每個(gè)元素就是二維數(shù)組的元素,有兩個(gè)下標(biāo),每個(gè)下標(biāo)都要用方括號(hào)括起來;第一個(gè)下標(biāo)表示矩陣的行,叫行下標(biāo);第二個(gè)下標(biāo)表示矩陣的列,叫列下標(biāo)。本例中行下標(biāo)和列下標(biāo)的上界分別為1和2。在C語言中,實(shí)際上二維數(shù)組可以用一維數(shù)組來構(gòu)造,我們把二維數(shù)組看成一個(gè)一維數(shù)組,但這個(gè)一維數(shù)組中的元素不是一般的數(shù)據(jù)類型,而是由若干個(gè)相同類型元素組成的一維數(shù)組。上例中的data數(shù)組可以看做是由2個(gè)一維數(shù)組元素組成的一維數(shù)組(data是數(shù)組名),這2個(gè)一維數(shù)組元素分別為data[0]、data[1]。data[0]和data[1]是2個(gè)一維數(shù)組(數(shù)組名分別為data[0]和data[1]),每個(gè)數(shù)組的元素是3個(gè)。data[0]的元素分別為data[0][0]、data[0][1]、data[0][2];data[1]的元素分別為data[1][0]、data[1][1]、data[1][2];元素的數(shù)據(jù)類型是int。n維數(shù)組也可以按照這個(gè)思路來考慮。請思考n維數(shù)組如何構(gòu)造?我們在一維數(shù)組的學(xué)習(xí)中交待過,數(shù)組名是一個(gè)常量指針,可以當(dāng)作指針來引用,也就是說,二維數(shù)組data其數(shù)組名data、data[0]、data[1]都是常量指針。有關(guān)指針的概念,在后續(xù)章節(jié)中介紹。
數(shù)組在內(nèi)存中占用連續(xù)的一塊存儲(chǔ)區(qū),那么二維數(shù)組在內(nèi)存中如何布局呢?我們還是以data數(shù)組為例說明這個(gè)問題。圖6-2所示是data數(shù)組在內(nèi)存中的存儲(chǔ)布局。
圖6-2data數(shù)組在內(nèi)存中的存儲(chǔ)布局在圖6-2中,假設(shè)是從低到高的順序存data數(shù)組,可以看到先存第0行0列的元素data[0][0],然后是data[0][1],……我們看到,先存第0行,再存第1行,這種存放順序稱為“按行存放”。6.2.2二維數(shù)組的初始化
我們說過,二維數(shù)組可以用一維數(shù)組來構(gòu)造,自然初始化時(shí)也可以用一維數(shù)組初始化,例如:
inta[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
a是一個(gè)二維數(shù)組,對應(yīng)一個(gè)3行5列的矩陣,每一行放在一對花括號(hào)中,行和行之間用逗號(hào)隔開,最外層是一對花括號(hào)。
也可以像一維數(shù)組的初始化一樣,每行的元素個(gè)數(shù)少于定義中的下標(biāo)值,例如:
inta[3][5]={{1,2,3},{2,3,4,5,6},{1,2}};
此時(shí),二維數(shù)組a中不夠的元素系統(tǒng)會(huì)用0補(bǔ)充,這時(shí)a實(shí)際對應(yīng)的矩陣為
賦值時(shí),也可以行數(shù)少于定義中的下標(biāo)值,例如:
inta[3][5]={{1,2,3},{4,5}};
此時(shí),二維數(shù)組a中不夠的行以及元素系統(tǒng)會(huì)用0補(bǔ)充,這時(shí)a實(shí)際對應(yīng)的矩陣為
賦值時(shí),初值表中表示行的花括號(hào)也可省略,例如:
inta[3][5]={1,2,3,4,5};
此時(shí),二維數(shù)組a中不夠的行以及元素系統(tǒng)會(huì)用0補(bǔ)充,但這時(shí)a實(shí)際對應(yīng)的矩陣與前一個(gè)例子不同,對應(yīng)的矩陣為
二維數(shù)組和一維數(shù)組一樣,也可以通過初始化定義二維數(shù)組的大小,但二維數(shù)組只可以省略第一個(gè)方括號(hào)中的常量表達(dá)式(即行下標(biāo)),不能省略第二個(gè)括號(hào)中的常量表達(dá)式,
例如:
intdata[][4]={{1,2,3,4},{5,6,7},{7},{9,10}};
此時(shí),data數(shù)組的行下標(biāo)省略,在賦值表中,含有4組行花括號(hào)對,所以data數(shù)組得有4行,它等同于:
intdata[4][4]={{1,2,3,4},{5,6,7,0},{7,0,0,0},{9,10,0,0}};
再如:
intdata[][3]={1,2,3,4,5,6};
從定義中知道,data對應(yīng)的矩陣,每行有3個(gè)元素,把1,2,3,4,5,6按順序放到這個(gè)二維數(shù)組中,則對應(yīng)的矩陣為
所以data數(shù)組的行數(shù)為2。6.2.3二維數(shù)組的引用
二維數(shù)組的引用與一維數(shù)組的引用相似,其引用形式如下:
數(shù)組名[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]
例如,定義如下數(shù)組:
inta[3][4];
a[2][3]、a[i][j]都是對二維數(shù)組a中的元素的合法引用,i、j的值不能超過定義給出的范圍。本例中,i不能超過2,j不能超過3。
二維數(shù)組的數(shù)組名也可以以指針的形式進(jìn)行引用,指針的內(nèi)容在后面章節(jié)介紹。6.2.4二維數(shù)組應(yīng)用舉例
【例6.7】
有一個(gè)3
×
4的矩陣,編寫一個(gè)程序,找出其中的最大元素和最小元素,并輸出其所在的行號(hào)和列號(hào)。
#include<stdio.h>
main()
{
inti,j,row1,col1,row2,col2,max,min;
staticinta[3][4]={{12,3,45,5},{23,34,56,1},{11,22,33,74}};
max=a[0][0];min=a[0][0];
row1=0;col1=0;
row2=0;col2=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++){
if(a[i][j]>max){
max=a[i][j];
row1=i;
col1=j;
}
if(a[i][j]<min){
min=a[i][j];
row2=i;
col2=j;
}
}
printf("max=%5d,row=%d,col=%d\n",max,row1,col1);
printf("min=%5d,row=%d,col=%d\n",min,row2,col2);
}程序運(yùn)行結(jié)果:
max=74,row=2,col=3
min=1,row=1,col=3
【例6.8】
編寫程序?qū)⑾铝芯仃嚨男凶優(yōu)榱校凶優(yōu)樾?求其轉(zhuǎn)置矩陣),保存到另一個(gè)數(shù)組中,并輸出該矩陣。
變換為
main()
{
intb[4][3],a[3][4]={{1,2,3,4,},{7,9,8,2},{3,5,6,7}}; /*定義二維數(shù)組并初始化*/
inti,j;
printf("Theoriginalmatrixis:\n");
for(i=0;i<3;i++){ /*輸出原始矩陣*/
for(j=0;j<4;j++)
printf("%d",a[i][j]);
printf("\n");
}
for(i=0;i<4;i++){
for(j=0;j<3;j++)
b[i][j]=a[j][i]; /*轉(zhuǎn)置,轉(zhuǎn)置結(jié)果存入二維數(shù)組b*/
}
printf("Thereversematrixis:\n");
for(i=0;i<4;i++){ /*輸出轉(zhuǎn)置矩陣*/
for(j=0;j<3;j++)
printf("%d",b[i][j]);
printf("\n");
}
}
程序運(yùn)行結(jié)果:
Theoriginalmatrixis:
1234
7982
3567
Thereversematrixis:
173
295
386
427
6.3.1字符數(shù)組的定義
數(shù)組元素為字符型變量的數(shù)組,稱為字符數(shù)組。例如:
charstr[6];6.3字符數(shù)組和字符串
str是一個(gè)字符數(shù)組的數(shù)組名,該數(shù)組由6個(gè)字符組成。如果一個(gè)一維數(shù)組的最末尾一個(gè)元素為
'\0'(空字符(NULL)的ASCII碼),則該數(shù)組中的字符構(gòu)成一個(gè)字符串。C語言規(guī)定,字符串存放在內(nèi)存中,末尾要帶一個(gè)結(jié)束符NULL(其ASCII編碼為0),所以一個(gè)字符數(shù)組要存放10個(gè)字符的字符串,其大小至少要為11。字符串常量需要用雙引號(hào)引起來,如"Hello!World!",該字符串中有12個(gè)可顯示字符,另外末尾還有一個(gè)NULL字符,一共是13個(gè)字符,在內(nèi)存中占用13個(gè)字節(jié)的存儲(chǔ)空間。6.3.2字符數(shù)組的初始化
字符數(shù)組可以像前面介紹的一維數(shù)組一樣賦初值。例如:
charstr[5]={'g','o','o','d','\0'};
charstr[5]={103,111,111,100,0};
charstr[5]="good";
上例中三種對字符數(shù)組str進(jìn)行初始化的方法是等效的。第一種是用字符常量進(jìn)行初始化;第二種是用字符的ASCII碼進(jìn)行初始化;第三種是用字符串進(jìn)行初始化,字符串要用雙引號(hào)引起來,"good"
字符串本身有4個(gè)字符,但由于字符串的末尾還有一個(gè)NULL字符,其ASCII碼值為0,所以str字符數(shù)組的大小應(yīng)該是5,而不是4。
注意:
charstr[]={'g','o','o','d','\0'};
str數(shù)組中的字符構(gòu)成了一個(gè)字符串。
charstr1[]={'g','o','o','d'};
str1數(shù)組中的字符不能構(gòu)成一個(gè)字符串,因?yàn)樽詈竺嫒鄙倏兆址鸑ULL。
字符數(shù)組在初始化時(shí),如果初始化表中的元素個(gè)數(shù)少于定義的元素個(gè)數(shù),則不夠的部分用
'\0'
來給其余的元素賦值,例如:
charstr[10]={'g','o','o','d','\0'};
此時(shí),str中的元素分別為:'g','o','o','d','\0','\0','\0','\0','\0','\0'。
字符數(shù)組和一維數(shù)組一樣,也可以按照單個(gè)元素來賦值(先定義、后賦值的方式)。6.3.3字符數(shù)組的引用
字符數(shù)組的引用與我們在前面介紹的一維數(shù)組的引用沒有本質(zhì)區(qū)別,只是字符數(shù)組中的元素是字符。我們前面講過,數(shù)組名是一個(gè)常量指針,也可以通過數(shù)組名來引用字符數(shù)組中的元素。6.3.4字符數(shù)組的輸出
字符型數(shù)組的輸出可以用printf(
)函數(shù),也可以使用專門用于字符串輸出的庫函數(shù)puts()。
1.用printf()函數(shù)輸出字符串
除了可以逐個(gè)字符輸出字符串,即用格式符“%c”輸出1個(gè)字符,也可以用格式符“%s”來輸出整個(gè)字符串。
如:
charch[]="China";
printf("%s",ch);
在內(nèi)存中,數(shù)組ch的存放情況為輸出字符串應(yīng)該注意以下幾點(diǎn):
(1)輸出字符串不包括結(jié)束符
'\0'。
(2)用
"%s"
格式輸出字符串時(shí),printf()函數(shù)中的輸出項(xiàng)是字符數(shù)組名。
(3)如果數(shù)組長度大于字符串實(shí)際長度,則輸出時(shí)遇到
'\0'
結(jié)束輸出。
(4)如果1個(gè)字符數(shù)組中包含多個(gè)
'\0',則遇到第一個(gè)
'\0'
時(shí)輸出就結(jié)束。
2.用puts()函數(shù)輸出字符串
puts()函數(shù)的使用形式為
puts(str);
其中,str代表待輸出字符串的首地址,即字符數(shù)組名,或者代表將要輸出的字符串常量。
使用puts(
)函數(shù)輸出字符串時(shí),字符串結(jié)束標(biāo)志
‘\0’
將轉(zhuǎn)換為
‘\n’,所以,輸出完1個(gè)字符后換行。
如:
main()
{
charstr[]="Cprogram.";
puts(str);
puts("Iamastudent.");
puts("China");
}
運(yùn)行結(jié)果為
Cprogram
Iamastudent.
China6.3.5字符數(shù)組的輸入
字符數(shù)組的輸入可以使用scanf(
)函數(shù),也可以使用專門用于字符串輸入的庫函數(shù)gets()。
1.用scanf()函數(shù)輸入字符串
除了可以逐個(gè)字符輸入字符串,即用格式符
“%c”
輸入1個(gè)字符,也可以用格式符
“%s”來輸入整個(gè)字符串。
如:
charch[10];
scanf("%s",ch);
從鍵盤輸入:
China↙
系統(tǒng)自動(dòng)在后面加1個(gè)
'\0'
結(jié)束符。輸入字符串應(yīng)注意以下幾點(diǎn):
(1)在向字符數(shù)組輸入1個(gè)字符串時(shí),應(yīng)該先定義字符數(shù)組,數(shù)組的長度至少應(yīng)該比字符串的實(shí)際長度大1。
(2)數(shù)組名代表該數(shù)組的起始地址,在數(shù)組名前不用加&。
(3)用scanf()函數(shù)輸入字符串有一定的限制,被輸入的字符串開始于第一個(gè)遇見的非空字符,而停止于其后遇見的第一個(gè)空字符。
【例6.9】用scanf()函數(shù)輸入字符串。
main()
{
charst[15];
printf("inputstring:\n");
scanf("%s",st);
printf("%s\n",st);
}
本例中由于定義數(shù)組長度為15,因此輸入的字符串長度必須小于15,以留出一個(gè)字節(jié)用于存放字符串結(jié)束標(biāo)志
'\0'。應(yīng)該說明的是,對一個(gè)字符數(shù)組,如果不作初始化賦值,則必須說明數(shù)組長度。還應(yīng)該特別注意的是,當(dāng)用scanf()函數(shù)輸入字符串時(shí),字符串中不能含有空格,否則將以空格作為串的結(jié)束符。
例如當(dāng)輸入的字符串中含有空格時(shí),運(yùn)行情況為
inputstring:
thisisabook↙
輸出為
this
從輸出結(jié)果可以看出,空格以后的字符都未能輸出。為了避免這種情況,可多設(shè)幾個(gè)字符數(shù)組分段存放含空格的串。
程序可改寫如下:
main()
{
charst1[6],st2[6],st
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 哺乳期解除勞動(dòng)合同協(xié)議范本
- 2024年房屋補(bǔ)漏維修工程合同
- 2024專項(xiàng)資金借款的合同范本
- 員工聘用合同協(xié)議書范文2024年
- 建設(shè)工程內(nèi)部承包合同書2024年
- 2024新款供貨合同協(xié)議書
- 2024【流動(dòng)資金外匯借貸合同】公司流動(dòng)資金合同
- 2024年公司股東之間借款合同實(shí)例
- 專業(yè)房屋買賣合同模板大全
- 2024年事業(yè)單位聘用
- 高??爝f包裝回收現(xiàn)狀分析及對策-以廣東省中山市三大高校為例
- 初創(chuàng)企業(yè)財(cái)務(wù)管理計(jì)劃書
- 新民事訴訟書范文追債通用21篇
- 100ml生理鹽水的配制講解
- 加油站消防安全基本常識(shí)
- 熱力集團(tuán)招聘試題
- 如何預(yù)防生銹醫(yī)療器械
- 西蒙決策理論研究
- 人教鄂教版小學(xué)科學(xué)三年級(jí)下冊全冊教案教學(xué)設(shè)計(jì)
- 學(xué)前教育教研工作計(jì)劃與目標(biāo)
- pvc卷材樓地面施工工藝
評(píng)論
0/150
提交評(píng)論