C語言程序設(shè)計(jì)08(二維數(shù)組)_第1頁
C語言程序設(shè)計(jì)08(二維數(shù)組)_第2頁
C語言程序設(shè)計(jì)08(二維數(shù)組)_第3頁
C語言程序設(shè)計(jì)08(二維數(shù)組)_第4頁
C語言程序設(shè)計(jì)08(二維數(shù)組)_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

C語言程序設(shè)計(jì)第8章二維數(shù)組及其指針第8章內(nèi)容二維數(shù)組二維數(shù)組的定義與初始化二維數(shù)組的引用指向二維數(shù)組的指針二維數(shù)組的地址列指針行指針二維數(shù)組及其指針作函數(shù)參數(shù)二維數(shù)組作函數(shù)參數(shù)指向二維數(shù)組的指針作函數(shù)參數(shù)課堂練習(xí)1#include<stdio.h>voidmain(){ inta[]={1,3,5,7,9,11,13,15,17,19}; inti; for(i=0;i<=7;i+=2) printf(“%d”,a[i]);}

程序執(zhí)行過后,輸出的結(jié)果是什么?

課堂練習(xí)1的問題數(shù)組a包含多少個(gè)元素?數(shù)組元素的下標(biāo)范圍是多少?程序中的for循環(huán)體能被執(zhí)行幾次?循環(huán)控制變量i的值是怎樣變化的?在循環(huán)過程中,數(shù)組a的哪些元素的值被輸出了?課堂練習(xí)2voidmain(){ intn=10; while(n--) printf("%d",--n);}程序執(zhí)行過程中,輸出的結(jié)果是什么?課堂練習(xí)2的問題n--與--n的區(qū)別是什么?程序中的while循環(huán)體能執(zhí)行幾次?程序執(zhí)行過后,n的值是多少?課堂練習(xí)3

#include<stdio.h>voidmain(){intx=1,a=0,b=0;

switch(x){case0:b++;case1:a++;case2:a++;b++;

}printf("a=%d,b=%d\n",a,b);}程序執(zhí)行后,屏幕上輸出的結(jié)果是什么?課堂練習(xí)3的問題break的作用是什么?在switch結(jié)構(gòu)中,用于退出當(dāng)前分支結(jié)構(gòu)在循環(huán)結(jié)構(gòu)中,用于退出當(dāng)前層次的循環(huán)8.2多維數(shù)組的概念在C語言中,若數(shù)組元素又是數(shù)組,這種數(shù)組就是多維數(shù)組。具有相同數(shù)據(jù)類型的二維表格數(shù)據(jù),可以使用二維數(shù)組來表示,這種數(shù)據(jù)結(jié)構(gòu)又稱為矩陣。在C語言中,還可以使用三維或多維數(shù)組,但很少出現(xiàn)。在計(jì)算機(jī)中,多維數(shù)組只是一個(gè)邏輯概念,在內(nèi)存中,多維數(shù)組元素的排列順序“按行優(yōu)先”存放,其排列順序?yàn)椋旱谝痪S的下標(biāo)變化最慢,最右邊的下標(biāo)變化最快。最后形成一個(gè)就像一維數(shù)組一樣的序列。8.2.1二維數(shù)組的定義在C語言中,二維數(shù)組定義的一般形式為:

數(shù)據(jù)類型數(shù)組名[整型常量表達(dá)式1][整型常量表達(dá)式2];二維數(shù)組的元素個(gè)數(shù)為

整型常量表達(dá)式1×整型常量表達(dá)式2各個(gè)元素的下標(biāo)仍然從0開始二維數(shù)組中的“表達(dá)式1”和“表達(dá)式2”分別稱為數(shù)組的行和列。因此,二維數(shù)組定義的一般形式又可表達(dá)為:

數(shù)據(jù)類型數(shù)組名[行數(shù)][列數(shù)];二維數(shù)組實(shí)例執(zhí)行inta[3][4];表示定義了一個(gè)3行4列的二維數(shù)組,共12個(gè)元素,每個(gè)元素均是int型數(shù)據(jù)。二維數(shù)組元素在矩陣中的位置如下:a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0]a[1]a[2]第1行第2行第3行a第1列第4列二維數(shù)組可看成若干元素的一維數(shù)組定義二維數(shù)組inta[3][4];可以看成具有三個(gè)元素的一維數(shù)組: a[3]==>{a[0],a[1],a[2]};一維數(shù)組的每個(gè)元素又是一個(gè)一維數(shù)組: a[0]:{a[0][0],a[0][1],a[0][2],a[0][3]} a[1]:{a[1][0],a[1][1],a[1][2],a[1][3]} a[2]:{a[2][0],a[2][1],a[2][2],a[2][3]}即定義:inta[3][4];

相當(dāng)于定義:int

a[0][4],a[1][4],a[2][4];2.二維數(shù)組的存儲在內(nèi)存中,二維數(shù)組元素遵循“按行優(yōu)先”的原則進(jìn)行存放。即:先存儲第1行各元素,再存儲第2行各元素,依此類推。如定義:inta[3][4];則內(nèi)存中的存儲順序依次為:a[0][0],a[0][1],a[0][2],a[0][3],a[1][0],a[1][1],a[1][2],a[1][3],a[2][0],a[2][1],a[2][2],a[2][3]二維數(shù)組元素在內(nèi)存中的存儲順序號如果定義:inta[3][4];該數(shù)組各元素在內(nèi)存中是“按行優(yōu)先”原則依次存放的,也就是說,二維數(shù)組的各元素在內(nèi)存中的存放形式可以看成是一個(gè)一維數(shù)組。二維數(shù)組下標(biāo)與對應(yīng)的一維數(shù)組下標(biāo)可以使用如下公式計(jì)算:i*N+j(即:二維數(shù)組元素在內(nèi)存中的存儲序號)其中:N為二維數(shù)組定義時(shí)給出的列長度,i為二維數(shù)組的行下標(biāo),j為二維數(shù)組的列下標(biāo)。值數(shù)組元素序號存儲單元

3a[0][0]

0

4a[0][1]

1

5a[0][2]

2

6a[0][3]

3

7a[1][0]

4

8a[1][1]

5

9a[1][2]

6

0a[1][3]

7

1a[2][0]

8

2a[2][1]

9-3a[2][2]

10-4a[2][3]

11200020022004200620082010201220142016201820202022a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[3][4]=二維數(shù)組的初始化二維數(shù)組與一維數(shù)組一樣,可以在定義二維數(shù)組時(shí)對其各元素進(jìn)行初始化賦值。按行賦初值:

inta[2][3]={{1,2,3},{4,5,6}};按順序賦初值:

inta[2][3]={1,2,3,4,5,6};使用關(guān)鍵字static賦值: staticinta[2][2];相當(dāng)于staticinta[2][2]={0,0,0,0};二維數(shù)組的初始化(續(xù))對部分元素賦初值:在對部分元素賦初值時(shí),如果后面的數(shù)組元素不賦初值,系統(tǒng)會對未賦值的所有數(shù)組元素自動賦以0或‘\0’。如:inta[2][3]={{0,2},{1}};相當(dāng)于inta[2][3]={{0,2,0},{1,0,0}};。全部元素賦值時(shí)可缺省第一維長度:如果對數(shù)組全部元素都賦初值,則定義數(shù)組時(shí),第一維(行)的長度可以不指定,但第二維(列)的長度必須指定。如int

a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

等價(jià)于inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};。缺省數(shù)組第一維長度的部分賦值:定義數(shù)組時(shí)也可以只對部分元素賦值,同時(shí)省略第一維的長度,但應(yīng)使用分行賦值方式明確指定行數(shù)。如inta[][4]={{1},{3,1},{0,0,9}};與inta[3][4]={{1},{3,1},{0,0,9}};等價(jià)。8.2.2二維數(shù)組的引用二維數(shù)組元素基本的引用方法是下標(biāo)法,一般格式如下:數(shù)組名[行下標(biāo)表達(dá)式][列下標(biāo)表達(dá)式];其中:行下標(biāo)表達(dá)式和列下標(biāo)表達(dá)式與一維數(shù)組的下標(biāo)表達(dá)式一樣,可以是常量和變量及其表達(dá)式,并且行下標(biāo)表達(dá)式取值為0、1、…、行數(shù)-1,列下標(biāo)表達(dá)式取值為0、1、…、列數(shù)-1,其他規(guī)則類似一維數(shù)組。二維數(shù)組元素的使用與一維數(shù)組元素、普通變量一樣,在使用中只能逐個(gè)引用數(shù)組元素而不能一次引用整個(gè)數(shù)組,并且必須遵循“先定義,后使用”的原則。二維數(shù)組的地址、指針引用方式在后面介紹。2.二維數(shù)組的基本操作先按行輸入二維數(shù)組各元素值:

for(i=0;i<2;i++) /*先循環(huán)行下標(biāo)*/

for(j=0;j<3;j++) /*控制列下標(biāo)*/

scanf("%d",&a[i][j]); /*對每個(gè)元素賦值*/先按列輸入二維數(shù)組各元素值:

for(j=0;j<3;j++) /*先循環(huán)列下標(biāo)*/

for(i=0;i<2;i++) /*控制行下標(biāo)*/

scanf("%d",&a[i][j]);/*對每個(gè)元素賦值*/2.二維數(shù)組的基本操作求二維數(shù)組各元素最大值:

max=a[0][0];

for(i=0;i<2;i++)/*控制行*/

for(j=0;j<3;j++)/*控制列*/

if(a[i][j]>max)max=a[i][j];/*將最大值放在max變量中*/求二維數(shù)組各元素最小值:

min=a[0][0];

for(i=0;i<2;i++)/*控制行*/

for(j=0;j<3;j++)/*控制列*/

if(a[i][j]<min)min=a[i][j];/*將最小值放在min變量中*/8.3指向二維數(shù)組的指針指針變量可以指向一維數(shù)組中的元素,同時(shí)也可以指向二維數(shù)組中的元素。從使用上而言,指向二維數(shù)組的指針比指向一維數(shù)組的指針要復(fù)雜得多,但在很多情況下,指針的使用可以幫助程序更好地實(shí)現(xiàn)。8.3.1二維數(shù)組的地址二維數(shù)組可以按行看成具有多個(gè)元素的一維數(shù)組,而它的每個(gè)元素(即每個(gè)行)又是一個(gè)具有多個(gè)元素的一維數(shù)組。如:

int

a[4][3]={{1,2,3},{3,5,4},{7,5,9},{6,11,7}};二維數(shù)組名a代表整個(gè)二維數(shù)組的首地址,也是二維數(shù)組第0行的首地址,還是二維數(shù)組第0個(gè)元素a[0][0]的地址。二維數(shù)組的地址(續(xù))為了幫助理解,把a(bǔ)數(shù)組看成具有4個(gè)元素a[0]、a[1]、a[2]、a[3]的一維數(shù)組,而一維數(shù)組名a[i]表示第i行一維數(shù)組中第0列元素的地址(即&a[i][0]),同理a[i]+j表示第i行一維數(shù)組中第j列元素的地址(即&a[i][j])。二維數(shù)組地址示意圖如下:{1

2

3}{3

5

4}{7

5

9}{6

11

7}a[0]a[1]a[2]aa[3]6000600660126018a+1a+2a+3表示形式含義a二維數(shù)組名,表示第0行首地址a+i,&a[i]表示第i行首地址a[0],*(a+0),*a,&a[0][0]表示第0行第0列元素的地址a[i],*(a+i),&a[i][0]表示第i行第0列元素的地址a[i]+j,*(a+i)+j,&a[i][j]表示第i行第j列元素的地址*(a[i]+j),*(*(a+i)+j),a[i][j]表示第i行第j列元素的值二維數(shù)組地址和元素值的表示a+i表示a[i]的地址,因此,*(a+i)就是a[i]的值,**(a+i)就是a[i][0]的值。a[i]表示a[i][0]的地址,因此,*a[i]就是a[i][0]的值。a[i][j]、*(a[i]+j)、*(*(a+i)+j)都表示a[i][j]的值,甚至還可以寫成(*(a+i))[j]的形式。二維數(shù)組名的行列指向示意圖二維數(shù)組名a是指向行的,因此,a+i中的i代表一行中全部元素所占的字節(jié)數(shù)。一維數(shù)組名a[i]是指向列元素的,a[i]+j中的j代表一個(gè)元素所占的字節(jié)數(shù)。指向二維數(shù)組行的指針稱之為行指針,指向二維數(shù)組元素的指針稱之為列指針。二維數(shù)組名的行列指向如下圖所示:6022760201160186601696014560127601046008560063600436002260001a[0]a[0]+1a[0]+2aa+1a+2a+3行列二維數(shù)組地址說明如果a是一維數(shù)組名,則a[i]代表數(shù)組a第i個(gè)元素所占的內(nèi)存單元的值,a[i]是有物理地址的,是占內(nèi)存單元的;如果a是二維數(shù)組名,則a[i]代表一維數(shù)組名,它本身并不占實(shí)際的內(nèi)存單元,也不存放數(shù)組a中各個(gè)元素的值,它只是一個(gè)地址。在行指針前面加一個(gè)*就轉(zhuǎn)換為列指針,若a和a+1是行指針,則*a和*(a+1)就成了列指針,分別指向數(shù)組a的第0行第0列的元素和第1行第0列的元素。反之,在列指針前面加&就成為行指針,若a[0]是指向第0行第0列的元素的列指針,則&a[0]就指向二維數(shù)組的第0行(由于a[0]與*(a+0)等價(jià),因此,&a[0]與&*a等價(jià))。不要把&a[i]簡單地理解為a[i]的物理地址,因?yàn)椴⒉淮嬖赼[i]這個(gè)變量。它只是一種地址的計(jì)算方法,能得到第i行的地址。雖然&a[i]和a[i]的值是一樣的,但它的含義卻不同。&a[i]或a+i指向行,而a[i]或*(a+i)指向列。指向二維數(shù)組的列指針假設(shè)定義有int

a[M][N];,則二維數(shù)組元素a[i][j]看成一維數(shù)組元素時(shí)為a[i*N+j]。指向數(shù)組元素的指針變量稱之為列指針,列指針變量自加1后指向當(dāng)前元素的下一個(gè)元素。二維數(shù)組列指針變量實(shí)際上就是指向一維數(shù)組的指針變量,它將一個(gè)二維數(shù)組看成一個(gè)一維數(shù)組來處理,其定義方式與指向一維數(shù)組的指針變量一樣,采用如下形式:

數(shù)據(jù)類型*指針變量名;05二月202327例8.2【例8.2】用列指針變量輸出二維數(shù)組各元素的值。分析問題:首先定義一個(gè)二維數(shù)組inta[3][4]并初始化,然后再定義一個(gè)列指針變量int*p,并采用p=&a[0][0]或p=*a語句使該列指針變量指向二維數(shù)組的首元素,這時(shí)p指向的是a[0][0]元素,*p表示a[0][0]的值。執(zhí)行p++后p就指向a[0][1]元素了,這時(shí)*p就是a[0][1]的值。二維數(shù)組a具有12個(gè)元素,&a[0][0]是第0個(gè)元素的地址,&a[0][0]+11是最后一個(gè)元素的地址。05二月202328例8.2程序#include<stdio.h>intmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int*p; /*定義列指針變量p*/p=&a[0][0]; /*注意列指針變量p的初值*/for(;p<=&a[0][0]+11;p++){if((p-&a[0][0])%4==0)

printf("\n");printf("%4d",*p); /*輸出二維數(shù)組中的元素*/}}指向二維數(shù)組的行指針指向二維數(shù)組中某一行的指針變量稱之為行指針變量。行指針?biāo)赶虻男锌梢钥闯梢粋€(gè)由m個(gè)元素組成的一維數(shù)組,其定義的一般形式為:

數(shù)據(jù)類型(*指針變量名)[N];

其中,N為一個(gè)整型常量表達(dá)式,一般情況下取值與二維數(shù)組的列數(shù)相同。行指針變量的增值以一維數(shù)組的長度為單位。當(dāng)執(zhí)行inta[4][3],(*p)[3];

p=a;語句后,行指針變量p就與二維數(shù)組a建立了聯(lián)系。這時(shí),行指針變量p指向二維數(shù)組a或指向第一個(gè)一維數(shù)組a[0],p+1就指向了a[1],p+i就指向了a[i]。也就是說,p+1所指向的元素,是在p所指向的元素基礎(chǔ)上移動了3個(gè)元素,剛好指向到二維數(shù)組的下一行。二維數(shù)組的列數(shù)與行指針定義的長度N應(yīng)相同,才能確保行指針每增加1自動指向下一行。二維數(shù)組行指針指向示意圖6022760201160186601696014560127601046008560063600436002260001pp+1p+2p+3a[3]a[2]a[1]a[0]執(zhí)行inta[3][4],(*p)[4],*q;p=a;q=*a;

后,行指針變量p和列指針變量q與二維數(shù)組a的關(guān)系如下圖所示。值數(shù)組元素序號存儲單元

3a[0][0]0

4a[0][1]1

5a[0][2]2

6a[0][3]3

7a[1][0]4

8a[1][1]5

9a[1][2]6

0a[1][3]7

1a[2][0]8

2a[2][1]9-3a[2][2]10-4a[2][3]11200020022004200620082010201220142016201820202022p,ap+1,a+1p+2,a+2q,aq+1,*a+1q+4,*a+4*p+1,*a+1*(p+1)+2,*(a+1)+2q+6,*a+6**p,**a*(*p+1),*(*a+1)**(p+1),**(a+1)*(*(p+1)+2),*(*(a+1)+2)*(p+2)+2,*(a+2)+2*(*(p+2)+2),*(*(a+2)+2)q+8,*a+8q+2*4+2,*a+2*4+2*q,**a*(q+1),*(*a+1)*(q+4),*(*a+4)*(q+6),*(*a+6)*(q+2*4+2),*(*a+2*4+2)元素值描述地址描述地址描述元素值描述指向二維數(shù)組的指針與二維數(shù)組元素的關(guān)系行指針p列指針q05二月202332例8.3【例8.3】用行指針變量輸出二維數(shù)組各元素的值。分析問題:先定義一個(gè)二維數(shù)組inta[3][4]并初始化,再定義一個(gè)行指針變量int(*p)[4],并采用p=a語句使該行指針變量指向二維數(shù)組的首行。這時(shí)p指向a[0]行,如果要讀取a[0]行的第2個(gè)元素a[0][2]的話,只需要用*(*(p+0)+2)表示,依次類推。使用二重循環(huán)輸出二維數(shù)組各元素。05二月202333例8.3程序/*LT8_3.c*/#include<stdio.h>intmain(){inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

int(*p)[4];/*定義行指針p*/

int

i,j;p=a;/*注意行指針變量p的初值*/

for(i=0;i<3;i++)/*控制行*/{for(j=0;j<4;j++)/*控制列*/printf("%4d",*(*(p+i)+j));

printf("\n");/*輸完一行后換行*/}return(0);}8.4二維數(shù)組及其指針作函數(shù)參數(shù)二維數(shù)組元素作函數(shù)參數(shù)的方法與一維數(shù)組元素作函數(shù)參數(shù)的方法一樣,就像單個(gè)的一般數(shù)據(jù)類型的變量作函數(shù)參數(shù)一樣。二維數(shù)組名作函數(shù)參數(shù)的方法與一維數(shù)組名作函數(shù)參數(shù)的方法一樣。二維數(shù)組名作參數(shù)時(shí),是地址傳遞方式,在被調(diào)函數(shù)中對數(shù)組元素的改變,會影響到主調(diào)函數(shù),對二維數(shù)組而言,在主調(diào)函數(shù)和被調(diào)函數(shù)中使用數(shù)組的方法都一樣。二維數(shù)組作實(shí)參時(shí),只需要將數(shù)組名帶入即可。在定義二維數(shù)組作形參的函數(shù)時(shí),二維數(shù)組的定義必須與主調(diào)函數(shù)相應(yīng)的二維數(shù)組列元素個(gè)數(shù)一致。在被調(diào)函數(shù)中定義形參為二維數(shù)組的方法就像定義二維數(shù)組本身一樣,可以省略第一維的大小,而不能省略第二維的大小。二維數(shù)組形參與實(shí)參的內(nèi)存關(guān)系如果在主調(diào)函數(shù)中定義:

inta[3][4];

而在被調(diào)函數(shù)中定義intx[2][6]的話,同樣是12個(gè)元素,但在兩個(gè)函數(shù)中的實(shí)參與形參的內(nèi)存對應(yīng)關(guān)系則不一樣,具體如右圖所示:第1行第2行第3行實(shí)參數(shù)組形參數(shù)組第1行第2行a[0][0]x[0][0]a[1][0]x[0][4]a[1][1]x[0][5]a[1][2]x[1][0]a[1][3]x[1][1]a[2][0]x[1][2]a[2][3]x[1][5]a[0][2]x[0][2]a[0][3]x[0][3]a[0][1]x[0][1]a[2][2]x[1][4]a[2][1]x[1][3]05二月202336例8.4【例8.4】求3行4列矩陣中所有元素的最小值。分析問題:使用循環(huán)語句對3×4數(shù)組的全部元素逐一比較,輸出最小元素的值。在主函數(shù)中輸入數(shù)組各元素的值,然后在自定義函數(shù)中求得最小值返回給主函數(shù)并輸出。例8.4程序90357246815173412ijmin=9090357246815173412ijmin=390357246815173412ijmin=3j90357246815173412imin=3j90357246815173412imin=2j90357246815173412imin=2/*LT8_4.c*/#include<stdio.h>int

minvalue(intx[][4],intn);intmain(){inta[3][4];

int

i,j,min;

for(i=0;i<3;i++)/*控制行*/

for(j=0;j<4;j++)/*控制列*/{printf("Input

a[%d][%d]:",i,j);

scanf("%d",&a[i][j]);/*輸入數(shù)組元素*/}min=minvalue(a,3);

printf("minvalueis:%d\n",min);return(0);}int

minvalue(intx[][4],intn){int

i,j,min;min=x[0][0];/*最小值賦初值*/

for(i=0;i<n;i++)/*循環(huán)行*/

for(j=0;j<4;j++)/*循環(huán)列*/

if(min>x[i][j])min=x[i][j];

return(min);}8.4.2指向二維數(shù)組的指針作函數(shù)參數(shù)指向二維數(shù)組的指針作函數(shù)參數(shù)的方法與指向一維數(shù)組的指針作函數(shù)參數(shù)的方法類似。在用指針變量作形參,接收實(shí)參數(shù)組名傳遞的地址時(shí),既可以用指向變量的指針變量,也可以用指向一維數(shù)組的指針變量。作為二維數(shù)組的列指針和行指針變量,既可以在主調(diào)函數(shù)中使用,也可以在被調(diào)函數(shù)中使用,并兩個(gè)地方的使用方法是一致的。指針變量與二維數(shù)組名,可以作為實(shí)參或形參,其使用方法都一樣。05二月202339例8.5【例8.5】求二維數(shù)組中最大值及其下標(biāo)值。分析問題:本程序使用二維數(shù)組的列指針實(shí)現(xiàn)。在主調(diào)函數(shù)中采用二維數(shù)組方式訪問,列指針在被調(diào)函數(shù)中相當(dāng)于采用一維數(shù)組方式訪問二維數(shù)組各元素。二維數(shù)組a[i][j]元素對應(yīng)列指針的地址為p+i*N+j。其中N為二維數(shù)組的列長度。05二月202340例8.5程序/*LT8_5.c*/#include<stdio.h>int

fun(int*p,int*x,int*y);intmain(){inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int

max,row,col;max=fun(*a,&row,&col);/*帶入列指針*/

printf("max=%d,row=%d,col=%d\n",max,row,col);return(0);}/*求矩陣的最大值及其行列下標(biāo)號*/intfun(int*p,int*x,int*y){int

i,j,max;max=*p;*x=0;*y=0;

for(i=0;i<3;i++){for(j=0;j<4;j++)if(*(p+i*4+j)>max){max=*(p+i*4+j);/*將第i*4+j個(gè)元素值賦給max*/*x=i;/*最大值的行號*/*y=j;/*最大值的列號*/}}

return(max);/*返回最大值*/}05二月202341例8.6【例8.6】求方陣兩對角線元素之和。分析問題:方陣的兩個(gè)對角線包括主對角線(二維數(shù)組的行和列號相等)、次對角線(二維數(shù)組的行和列號之和等于方陣的階數(shù))。假定定義了二維數(shù)組inta[3][3];則a[i][i]+a[i][3-i-1]就是我們所要的值。本例將在主調(diào)函數(shù)中輸入二維數(shù)組的元素值,在被調(diào)函數(shù)中求和,并使用行指針方式實(shí)現(xiàn)。05二月202342例8.6程序/*LT8_6.c*/#include<stdio.h>int

fun(int(*p)[3],intn);intmain(){inta[3][3],(*q)[3],sum,i,j;

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

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

scanf("%d",*(a+i)+j);q=a;sum=fun(q,3);/*調(diào)用求和函數(shù)*/

for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%6d",*(*(q+i)+j));

printf("\n");}

printf("sum=%d\n",sum);return(0);}/*計(jì)算矩陣兩對角線之和形參int(*p)[3]為二維數(shù)組行指針*/int

fun(int(*p)[3],intn){int

i,j,s=0;

for(i=0;i<n;i++)s=s+*(*(p+i)+i)+*(*(p+i)+(n-i-1));

return(s);}05二月202343應(yīng)用實(shí)例【例8.7】打印n×n魔方矩陣。分析問題:魔方矩陣的每一行、每一列和對角線之和均相等。魔方陣中各數(shù)的排列規(guī)律如下。(1)將1放在第一行中間一列。(2)從2~n×n的各數(shù)依次按下列規(guī)則存放:每一個(gè)數(shù)存放的行比前一個(gè)數(shù)的行數(shù)減1,列數(shù)加1,如3階魔方陣,5在4的上一行后一列。(3)如果上一數(shù)的行數(shù)為1,則下一個(gè)數(shù)的行數(shù)為n,列數(shù)加1,如1在第1行,則2在最后一行。(4)當(dāng)上一個(gè)數(shù)的列數(shù)為n時(shí),下一個(gè)數(shù)的列數(shù)應(yīng)為1,行數(shù)減1,如2在第3行最后一列,則3應(yīng)放在第2行第1列。(5)如果按上面規(guī)則確定的位置上已有數(shù),或上一個(gè)數(shù)是第1行第n列時(shí),則把下一個(gè)數(shù)放在上一個(gè)數(shù)的下面。如按規(guī)定4應(yīng)該放在第1行第2列,但該位置上已被1占據(jù),故4放在3的下面。由于6是第1行最后一列,故7放在6的下面。按此方法可以得到任意階的魔方陣(魔方陣的階數(shù)應(yīng)為奇數(shù)階)。05二月202344例8.7程序/*LT8_7.c*/#include<stdio.h>intmain(){inta[16][16],i,j,k,m,n;while(1){printf("Intputn(n=1~15):");

scanf("%d",&n);

if((n>=3)&&(n<=15)&&(n%2)!=0)break;}/*初始化數(shù)組*/

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

a[i][j]=0;/*建立魔方陣*/j=n/2+1;/*中間一列*/a[1][j]=1;/*將1放在中間一列*//*for里面是存放2~n×n所有數(shù)的規(guī)則*/

for(k=2;k<=n*n;k++){i=i-1;/*上行行數(shù)減1成新行*/j=j+1;/*上行列數(shù)加1成新列*/

if((i<1)&&(j>n))/*上一個(gè)數(shù)在第1行,第n列*/{i=i+2;/*上一個(gè)數(shù)的下一行(未減1前加1)*/j=j-1;/*加1后又減1,保持同列*/}else{if(i<1)/*上一個(gè)數(shù)在第1行,下一個(gè)數(shù)就放第n行*/i=n;

if(j>n)/*上一個(gè)數(shù)在第n列,下一個(gè)數(shù)就放第1列*/j=1;}

if(a[i][j]==0)/*該位置無數(shù)時(shí),就填數(shù)*/

a[i][j]=k;else/*該位置有數(shù)時(shí),放在上一個(gè)數(shù)的下行*/{i=i+2;j=j-1;

a[i][j]=k;}}/*輸出魔方陣*/

for(i=1;i<=n;i++){for(j=1;j<=n;j++)

printf("%d\t",a[i][j]);

printf("\n");}return(0);}05二月202345例8.8【例8.8】將一個(gè)5×5的矩陣中最大的元素放在中心,4個(gè)角分別放4個(gè)最小的元素(按從左到右、從上到下的順序,依次從小到大存放),寫一個(gè)函數(shù)實(shí)現(xiàn)之,并用主函數(shù)調(diào)用。分析問題:假定用a[5][5]表示5×5矩陣,則最大值所放的位置為a[2][2]元素的位置,第1最小值應(yīng)放在a[0][0]元素的位置,第2最小值應(yīng)放在a[0][4]元素的位置,第3最小值應(yīng)放在a[4][0]元素的位置,第4最小值應(yīng)放在a[4][4]元素的位置。元素之間的交換順序也是這個(gè)順序。使用自定義函數(shù)實(shí)現(xiàn)元素的交換,函數(shù)參數(shù)可以使用指針完成,也可以使用數(shù)組名。05二月202346例8.8程序#include<stdio.h>voidchange(int*p);intmain(){inta[5][5],*p,i,j;

printf("Input5*5matrix:\n");

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

for(j=0;j<5;j++)

scanf("%d",&a[i][j]);p=&a[0][0];/*列指針p指向二維數(shù)組a的首地址*/

change(p);/*調(diào)用函數(shù),實(shí)現(xiàn)交換*/

printf("Output5*5matrix:\n");

for(i=0;i<5;i++){for(j=0;j<5;j++) printf("%6d",a[i][j]);

printf("\n");}return(0);}05二月202347例8.8程序(續(xù))/*按要求交換矩陣的值*/voidchange(int*p){int

i,j,temp,*pmax,*pmin;

pmax=p;/*給最大值賦初值*/

pmin=p;/*給最小值賦初值*//*查找最大值和最小值的地址*/

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

for(j=0;j<5;j++){if(*pmax<*(p+5*i+j))

pmax=p+5*i+j;if(*pmin>*(p+5*i+j))

pmin=p+5*i+j;}/*將最大值交換給中心位置p+12*/temp=*(p+12);*(p+12)=*pmax;*pmax=temp;/*將最小值交換給左上角元素p+0*/temp=*p;*p=*pmin;*pmin=temp;

/*查找第二最小值的地址*/

pmin=p+1;

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

for(j=0;j<5;j++)if(((p+5*i+j)!=p)&&(*pmin>*

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論