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

提交评论