《計(jì)算機(jī)基礎(chǔ)與C語言程序設(shè)計(jì)》課件第6章_第1頁
《計(jì)算機(jī)基礎(chǔ)與C語言程序設(shè)計(jì)》課件第6章_第2頁
《計(jì)算機(jī)基礎(chǔ)與C語言程序設(shè)計(jì)》課件第6章_第3頁
《計(jì)算機(jī)基礎(chǔ)與C語言程序設(shè)計(jì)》課件第6章_第4頁
《計(jì)算機(jī)基礎(chǔ)與C語言程序設(shè)計(jì)》課件第6章_第5頁
已閱讀5頁,還剩96頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論