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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言程序設計第8章二維數組及其指針第8章內容二維數組二維數組的定義與初始化二維數組的引用指向二維數組的指針二維數組的地址列指針行指針二維數組及其指針作函數參數二維數組作函數參數指向二維數組的指針作函數參數課堂練習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]);}

程序執行過后,輸出的結果是什么?

課堂練習1的問題數組a包含多少個元素?數組元素的下標范圍是多少?程序中的for循環體能被執行幾次?循環控制變量i的值是怎樣變化的?在循環過程中,數組a的哪些元素的值被輸出了?課堂練習2voidmain(){ intn=10; while(n--) printf("%d",--n);}程序執行過程中,輸出的結果是什么?課堂練習2的問題n--與--n的區別是什么?程序中的while循環體能執行幾次?程序執行過后,n的值是多少?課堂練習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);}程序執行后,屏幕上輸出的結果是什么?課堂練習3的問題break的作用是什么?在switch結構中,用于退出當前分支結構在循環結構中,用于退出當前層次的循環8.2多維數組的概念在C語言中,若數組元素又是數組,這種數組就是多維數組。具有相同數據類型的二維表格數據,可以使用二維數組來表示,這種數據結構又稱為矩陣。在C語言中,還可以使用三維或多維數組,但很少出現。在計算機中,多維數組只是一個邏輯概念,在內存中,多維數組元素的排列順序“按行優先”存放,其排列順序為:第一維的下標變化最慢,最右邊的下標變化最快。最后形成一個就像一維數組一樣的序列。8.2.1二維數組的定義在C語言中,二維數組定義的一般形式為:

數據類型數組名[整型常量表達式1][整型常量表達式2];二維數組的元素個數為

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

數據類型數組名[行數][列數];二維數組實例執行inta[3][4];表示定義了一個3行4列的二維數組,共12個元素,每個元素均是int型數據。二維數組元素在矩陣中的位置如下: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列二維數組可看成若干元素的一維數組定義二維數組inta[3][4];可以看成具有三個元素的一維數組: a[3]==>{a[0],a[1],a[2]};一維數組的每個元素又是一個一維數組: 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];

相當于定義:int

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

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]=二維數組的初始化二維數組與一維數組一樣,可以在定義二維數組時對其各元素進行初始化賦值。按行賦初值:

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

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

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

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

for(i=0;i<2;i++) /*先循環行下標*/

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

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

for(j=0;j<3;j++) /*先循環列下標*/

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

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

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變量中*/求二維數組各元素最小值:

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指向二維數組的指針指針變量可以指向一維數組中的元素,同時也可以指向二維數組中的元素。從使用上而言,指向二維數組的指針比指向一維數組的指針要復雜得多,但在很多情況下,指針的使用可以幫助程序更好地實現。8.3.1二維數組的地址二維數組可以按行看成具有多個元素的一維數組,而它的每個元素(即每個行)又是一個具有多個元素的一維數組。如:

int

a[4][3]={{1,2,3},{3,5,4},{7,5,9},{6,11,7}};二維數組名a代表整個二維數組的首地址,也是二維數組第0行的首地址,還是二維數組第0個元素a[0][0]的地址。二維數組的地址(續)為了幫助理解,把a數組看成具有4個元素a[0]、a[1]、a[2]、a[3]的一維數組,而一維數組名a[i]表示第i行一維數組中第0列元素的地址(即&a[i][0]),同理a[i]+j表示第i行一維數組中第j列元素的地址(即&a[i][j])。二維數組地址示意圖如下:{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二維數組名,表示第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列元素的值二維數組地址和元素值的表示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]的形式。二維數組名的行列指向示意圖二維數組名a是指向行的,因此,a+i中的i代表一行中全部元素所占的字節數。一維數組名a[i]是指向列元素的,a[i]+j中的j代表一個元素所占的字節數。指向二維數組行的指針稱之為行指針,指向二維數組元素的指針稱之為列指針。二維數組名的行列指向如下圖所示:6022760201160186601696014560127601046008560063600436002260001a[0]a[0]+1a[0]+2aa+1a+2a+3行列二維數組地址說明如果a是一維數組名,則a[i]代表數組a第i個元素所占的內存單元的值,a[i]是有物理地址的,是占內存單元的;如果a是二維數組名,則a[i]代表一維數組名,它本身并不占實際的內存單元,也不存放數組a中各個元素的值,它只是一個地址。在行指針前面加一個*就轉換為列指針,若a和a+1是行指針,則*a和*(a+1)就成了列指針,分別指向數組a的第0行第0列的元素和第1行第0列的元素。反之,在列指針前面加&就成為行指針,若a[0]是指向第0行第0列的元素的列指針,則&a[0]就指向二維數組的第0行(由于a[0]與*(a+0)等價,因此,&a[0]與&*a等價)。不要把&a[i]簡單地理解為a[i]的物理地址,因為并不存在a[i]這個變量。它只是一種地址的計算方法,能得到第i行的地址。雖然&a[i]和a[i]的值是一樣的,但它的含義卻不同。&a[i]或a+i指向行,而a[i]或*(a+i)指向列。指向二維數組的列指針假設定義有int

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

數據類型*指針變量名;05二月202327例8.2【例8.2】用列指針變量輸出二維數組各元素的值。分析問題:首先定義一個二維數組inta[3][4]并初始化,然后再定義一個列指針變量int*p,并采用p=&a[0][0]或p=*a語句使該列指針變量指向二維數組的首元素,這時p指向的是a[0][0]元素,*p表示a[0][0]的值。執行p++后p就指向a[0][1]元素了,這時*p就是a[0][1]的值。二維數組a具有12個元素,&a[0][0]是第0個元素的地址,&a[0][0]+11是最后一個元素的地址。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); /*輸出二維數組中的元素*/}}指向二維數組的行指針指向二維數組中某一行的指針變量稱之為行指針變量。行指針所指向的行可以看成一個由m個元素組成的一維數組,其定義的一般形式為:

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

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

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

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

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)元素值描述地址描述地址描述元素值描述指向二維數組的指針與二維數組元素的關系行指針p列指針q05二月202332例8.3【例8.3】用行指針變量輸出二維數組各元素的值。分析問題:先定義一個二維數組inta[3][4]并初始化,再定義一個行指針變量int(*p)[4],并采用p=a語句使該行指針變量指向二維數組的首行。這時p指向a[0]行,如果要讀取a[0]行的第2個元素a[0][2]的話,只需要用*(*(p+0)+2)表示,依次類推。使用二重循環輸出二維數組各元素。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二維數組及其指針作函數參數二維數組元素作函數參數的方法與一維數組元素作函數參數的方法一樣,就像單個的一般數據類型的變量作函數參數一樣。二維數組名作函數參數的方法與一維數組名作函數參數的方法一樣。二維數組名作參數時,是地址傳遞方式,在被調函數中對數組元素的改變,會影響到主調函數,對二維數組而言,在主調函數和被調函數中使用數組的方法都一樣。二維數組作實參時,只需要將數組名帶入即可。在定義二維數組作形參的函數時,二維數組的定義必須與主調函數相應的二維數組列元素個數一致。在被調函數中定義形參為二維數組的方法就像定義二維數組本身一樣,可以省略第一維的大小,而不能省略第二維的大小。二維數組形參與實參的內存關系如果在主調函數中定義:

inta[3][4];

而在被調函數中定義intx[2][6]的話,同樣是12個元素,但在兩個函數中的實參與形參的內存對應關系則不一樣,具體如右圖所示:第1行第2行第3行實參數組形參數組第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列矩陣中所有元素的最小值。分析問題:使用循環語句對3×4數組的全部元素逐一比較,輸出最小元素的值。在主函數中輸入數組各元素的值,然后在自定義函數中求得最小值返回給主函數并輸出。例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]);/*輸入數組元素*/}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++)/*循環行*/

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

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

return(min);}8.4.2指向二維數組的指針作函數參數指向二維數組的指針作函數參數的方法與指向一維數組的指針作函數參數的方法類似。在用指針變量作形參,接收實參數組名傳遞的地址時,既可以用指向變量的指針變量,也可以用指向一維數組的指針變量。作為二維數組的列指針和行指針變量,既可以在主調函數中使用,也可以在被調函數中使用,并兩個地方的使用方法是一致的。指針變量與二維數組名,可以作為實參或形參,其使用方法都一樣。05二月202339例8.5【例8.5】求二維數組中最大值及其下標值。分析問題:本程序使用二維數組的列指針實現。在主調函數中采用二維數組方式訪問,列指針在被調函數中相當于采用一維數組方式訪問二維數組各元素。二維數組a[i][j]元素對應列指針的地址為p+i*N+j。其中N為二維數組的列長度。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);}/*求矩陣的最大值及其行列下標號*/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個元素值賦給max*/*x=i;/*最大值的行號*/*y=j;/*最大值的列號*/}}

return(max);/*返回最大值*/}05二月202341例8.6【例8.6】求方陣兩對角線元素之和。分析問題:方陣的兩個對角線包括主對角線(二維數組的行和列號相等)、次對角線(二維數組的行和列號之和等于方陣的階數)。假定定義了二維數組inta[3][3];則a[i][i]+a[i][3-i-1]就是我們所要的值。本例將在主調函數中輸入二維數組的元素值,在被調函數中求和,并使用行指針方式實現。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);/*調用求和函數*/

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);}/*計算矩陣兩對角線之和形參int(*p)[3]為二維數組行指針*/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應用實例【例8.7】打印n×n魔方矩陣。分析問題:魔方矩陣的每一行、每一列和對角線之和均相等。魔方陣中各數的排列規律如下。(1)將1放在第一行中間一列。(2)從2~n×n的各數依次按下列規則存放:每一個數存放的行比前一個數的行數減1,列數加1,如3階魔方陣,5在4的上一行后一列。(3)如果上一數的行數為1,則下一個數的行數為n,列數加1,如1在第1行,則2在最后一行。(4)當上一個數的列數為n時,下一個數的列數應為1,行數減1,如2在第3行最后一列,則3應放在第2行第1列。(5)如果按上面規則確定的位置上已有數,或上一個數是第1行第n列時,則把下一個數放在上一個數的下面。如按規定4應該放在第1行第2列,但該位置上已被1占據,故4放在3的下面。由于6是第1行最后一列,故7放在6的下面。按此方法可以得到任意階的魔方陣(魔方陣的階數應為奇數階)。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;}/*初始化數組*/

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所有數的規則*/

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

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

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

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

a[i][j]=k;else/*該位置有數時,放在上一個數的下行*/{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】將一個5×5的矩陣中最大的元素放在中心,4個角分別放4個最小的元素(按從左到右、從上到下的順序,依次從小到大存放),寫一個函數實現之,并用主函數調用。分析問題:假定用a[5][5]表示5×5矩陣,則最大值所放的位置為a[2][2]元素的位置,第1最小值應放在a[0][0]元素的位置,第2最小值應放在a[0][4]元素的位置,第3最小值應放在a[4][0]元素的位置,第4最小值應放在a[4][4]元素的位置。元素之間的交換順序也是這個順序。使用自定義函數實現元素的交換,函數參數可以使用指針完成,也可以使用數組名。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指向二維數組a的首地址*/

change(p);/*調用函數,實現交換*/

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程序(續)/*按要求交換矩陣的值*/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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論