null第七章 数组第七章 数组教学目的要求:
1、掌握一维、二维数组的定义、存储与初始化
2、熟练掌握一维、二维数组元素的引用
3、理解并熟练掌握数组的应用(选择法及折半查找算法)
4 、掌握字符数组与字符串
5、掌握字符串处理函数
6、灵活掌握数组作为函数的参数的应用
7、理解并熟练掌握冒泡法及杨辉三角
重点·难点:
1、一维、二维数组的引用与存储
2、数组的应用(选择法及折半查找算法进行排序)
3、字符数组与字符串处理函数
4、数组作为函数的参数
5、冒泡法及杨辉三角
概述概述除基本类型之外,C语言还提供了构造类型的数据,它们有:
数组类型、结构体类型、共用体类型。构造类型数据是由基本
类型数据按一定规则组成的,因此也可以称之为“导出类型”。数组是有序数据的集合。
(a)数组中的每一个元素都属于同一个数据类型。
(b)用一个统一的数组名和下标,唯一的确定数组中的元素。一维数组的定义一维数组的定义一、定义方式:
类型说明符 数组名 [ 常量
达式 ] ;二、说明:
(1) 数组名定名规则和变量名相同,遵循标识符定名规则。例如: int a [ 10 ];
表示数组名为a , 且有10个元素,每个元素为整型数据.(2)数组名后是用方括弧括起来的常量表达式,不能用圆括弧。下面的用法是错误的: int a(10);(3)常量表达式表示元素的个数,即数组长度。 例如: 在a[10]中,10表示a数组中有10个元素,下标从0开
始,这10个元素是:a[0], a[1], a[2], a[3], a[4], a[5],
a[6], a[7], a[8], a[9]注意:不能使用数组元素a[10];一维数组的定义(4)常量表达式可以包括常量和符号常量,不能包含变量。C不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。 例如:下面这样定义数组是不行的:
int n;
scanf(“%d”,&n);
int a[n];更准确的说法是
整型常量表达式一维数组的定义null例 int i=15;
int data[i]; (不能用变量定义数组维数)合法标识符表示元素个数
下标从0开始编译时分配连续内存
内存字节数=数组维数*
sizeof(元素数据类型)数组名表示内存首地址,
是地址常量int a[10];数组在内存的存放形式一维数组元素的引用 一、规则:
(1)数组必须先定义,后使用。一维数组元素的引用(2)数组元素的使用形式为:
数组名 [ 下标 ] 下标可以是整型常量或整型表达式,
例如: a[0]=a[5]+a[7]-a[2*3];注意:
C语言规定只能逐个引用数组元素,不能一次引用整个数组. main()
{
int i ,a[10];
for( i =0; i<=9; i ++)
a[ i ]= i ;
for(i=0;i<=9;i++)
printf(“%d,”,a[i]) ;
}程序使a[0]到a[9]的值为0-9,
然后按顺序输出如果按逆序输出运行结果:
0, 1, 2, 3, 4, 5, 6,7,8,9,for(i=9;i>=0;i--)
printf(“%d”,a[i]);运行结果:
9,8,7,6,5,4,3,2,1,0,一维数组的初始化1、在定义数组时对数组元素赋以初值。一维数组的初始化例如:int a[10]={ 0,1,2,3,4,5,6,7,8,9 };初始化之后:a[0]=0,a[1]=1,……a[8]=8,a[9]=9。2、可以只给一部分元素赋值.例如:int a[10]={0,1,2,3,4};
只给前五个元素赋值,后五个元素为0。
初始化之后:a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,
a[5]=0,……,a[8]=0,a[9]=0。3、如果想使一个数组中全部元素值为0,可以写成 int a[10]={0,0,0,0,0,0,0,0,0,0};不能写成 int a[10]={0*10};一维数组的初始化4、对全部数组元素赋初值时,可以不指定数组长度。一维数组的初始化例如:int a[]={1,2,3,4,5};上面的写法中,{ }中只有五个数,系统会据此自动定义数组的长度为5。
初始化之后:a[0]=1,a[1]=2,a[2]=3,a[4]=4,a[5]=5。如果被定义的数组长度与提供初值的个数不同,则数组长度不能省略。例如:想定义数组长度为10,就不能省略数组长度的定义。而必须写成 int a[10]={ 1,2,3,4,5};
只初始化前面5个元素,后5个元素为0。不能写成 int a[ ]={1,2,3,4,5};注意:对部分元素赋初值时,长度不能省。一维数组的程序举例一维数组的程序举例例: 用数组来处理Fibonacci数列问题。程序如下:/*行号1*/ main( )
/*行号2*/ { int i;
/*行号3*/ int f[20]={1,1};
/*行号4*/ for(i=2,i<=20;i++)
/*行号5*/ f [ i ]=f [ i -1]+f [ i -2];
/*行号6*/ for(i=0,i<20;i++)
/*行号7*/ {
/*行号8*/ if( i %5= =0) printf(“\n”);
/*控制换行,每行输出五个数*/
/*行号9*/ printf(“%12d”,f [ i ]);
/*行号10*/ }}F(n)= F(n-1)+ F(n-2)运行结果:
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765 例: 输入10个数并从中找出最大者.main( )
{
int a[10] ,i , j , max ;
printf( “ input 10 numbers: \n ” ) ;
for( i = 0 ; i < 10 ; i + + )
scanf( “ %d ” , & a [ i ] ) ;
printf( “ \n ” ) ;
max = a [ 0 ] ; i = 1 ;
for( ; i < 10 ; )
{ if ( max < a [ i ] ) max = a [ i ] ;
i + + ; }
printf(“\nmax=%d”,max); } 例: 输入10个数并从中找出最大者.一维数组的程序举例一维数组的程序举例例 : 用起泡法对n个数排序(由小到大)。起泡法的思路是:将相邻两个数比较,将小的调到前头。例如:对一个这样的序列排序:9,8,5,4,2,0(一共有6个数)(1) 9 8 5 4 2 0 /*9>8,交换*/(2) 8 9 5 4 2 0 /*9>5,交换*/(3) 8 5 9 4 2 0 /*9>4,交换*/(4) 8 5 4 9 2 0 /*9>2,交换*/(5) 8 5 4 2 9 0 /*9>0,交换*/第一轮结束 8 5 4 2 0 9那么第一轮进行了 n-1=6-1=5 次比较即循环了5次一维数组的程序举例一维数组的程序举例第二轮交换:(1) 8 5 4 2 0 9 /*8>5,交换*/(2) 5 8 4 2 0 9 /*8>4,交换*/(3) 5 4 8 2 0 9 /*8>2交换*/(4) 5 4 2 8 0 9 /*8>0,交换*/第二轮结束 5 4 2 0 8 9那么第二轮进行了 n-2=6-2=4 次比较即循环了4次总结:第 i 轮进行了 n- i 比较即循环了n- i 次.一共要n-1轮比较即外围循环n-1次一维数组的程序举例一维数组的程序举例算法的N-S结构流程图如下: a[ i]>a[ i+1]for i =0 to n-j-1for j=1 to n-1输入n个数给a[0]到a[n-1] 真假t=a[i];
a[ i]=a[i+1];
a[i+1]=t;输出a[0]到a[n-1]源程序如下:
main()
{int a[10], i,j,t; for(i=0;i<10;i++)
scanf(“%d”,&a[i]);for(j=0;j<10;j++)
for(i=0;i<=10-j-1;j++)
if(a[i]>a[i+1])
{t=a[i];
a[i]=a[i+1];
a[i+1]=t;}
for(i=0;i<10;i++)
printf(“%d”,a[i]);
}null求2-100以内的素数
题目
:首先定义一个int型数组b[100],将b当作一个筛子,并规定当b[i]的值为非0时,表示整数i在筛中。2为素数,将2输出,然后将筛中2的倍数筛去,即将下标为2的倍数的元素清零。此时,筛中下一个非零元素为b[3],说明3为素数将其输出,然后再将下标为3的倍数的元素清零(筛去3的倍数)。这样,在下一个元素为b[5],将5输出并筛去5的倍数,……,直到筛中无非零元素为止。源程序:
main()
{int b[100],i,j;
b[0]=b[1]=0;
for(i=2;i<100;i++)
b[i]=i;
for(i=2;i<100;i++)
if(b[i]!=0)
{printf(“%4d”,i);
for(j=i;j<100;j+=i)
b[j]=0;}}二维数组的定义二维数组的定义1、一般形式:
类型说明符 数组名[常量表达式][常量表达式]例如:int a[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]
定义了一个3*4(3行4列)的数组.注意: 不能写成 int a[3,4];二维数组的定义二维数组的定义可以把二维数组看作是
一种特殊的一维数组:它的元素又是一个一维数组.例如:
int a[3][4]; /*定义了一个3*4(3行4列)的数组. */我们可以将a看成一个一维数组:a[0]、 a[1]、 a[2],
每个元素又是包含4个元素的一维数组。 a[0]----- a[1]-----a[2]-----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二维数组的存放二维数组的存放 2、存放顺序:
按行存放,即在内存中先顺序存放第一行的元素,再存放
第二行的元素。int a[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]二维数组的引用1、数组元素的表示形式:
数组名[下标][下标] 二维数组的引用例如:a[3][4]
区分在定义数组时用的a[3][4]和引用元素a[3][4]下标可以是整型表达式
例如:a[2-1][2*2-1]数组元素可以出现在表达式中,也可以被赋值。
例如:b[1][2]=a[2][3]/2;2、注意:使用数组元素时,下标值应该在定义的数组大小的范围内。不要出现这样的错误:
例如:int a[3][4];
a[3][4]=3;二维数组的初始化1、分行给二维数组赋初值。二维数组的初始化例如:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};2、可以将所有数据写在一个花括弧内,按数组排列的顺
序对各元素赋初值。例如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};二维数组的初始化二维数组的初始化3、可以对部分数据赋初值。例如:
int a[3][4]={{1},{5},{9}};例如:
int a[3][4]={{1},{0,6},{0,0,11}};例如:
int a[3][4]={{1},{5,6}};例如:
int a[3][4]={{1},{},{0,0,11}};二维数组的初始化二维数组的初始化4、如果对全部元素赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。例如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
等价于:int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};如果定义时也可以只对部分元素赋初值而省略第一维的长度,但应该分行赋初值:例如:int a[][4]={{0,0,3},{},{0,10}};null例 7.4 有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号. a[i][j]>maxfor j =0 to 3for i=0 to 2max=a[0][0] 真max=a[ i][j];
row=i;
colum=j;假输出:max,row,colummain()
{
int i,j,row=0,colum=0,max;
int a[3][4]={{1,2,3,4},{9,8,7,6},
{-10,10,-5,2}};
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
if(a[i][j]>max)
{max=a[i][j];row=i;colum=j;}
printf(“%d,%d,%d”,max,row,colum);
}null06.4-16以下数组定义中错误的是 A) int x[][3]={0};
B) int x[2][3]={{l,2},{3,4},{5,6}}; C) int x[][3]={{l,2,3},{4,5,6}};
D) int x[2][3]={l,2,3,4,5,6};
06.4-8以下程序的输出结果是 。 main() { int a[3][3]={{1,2,9},{3,4,8},{5,6,7}},i,s=0; for(i=0;i<3;i++) s+=a[i][i]+a[i][3-i-1]; printf(“%d\n”,s); } 等 考 实 例(B)3006.4-34有以下程序 main() { int i,t[][3]={9,8,7,6,5,4,3,2,1}; for(i=0;i<3;i++) printf(“%d”,t[2-i][i]); } 程序执行后的输出结果是 A)7 5 3 B)3 5 7 C)3 6 9 D)7 5 1(B)字符数组定义字符数组定义用来存放字符数据的是字符数组.
字符数组中的一个元素存放一个字符.1、定义方式:字符数组的定义方法与前面介绍的数值数
组相同。例如:
(1)char c[5]={‘c’,’h’,’i’,’n’,’a'};
c[0]=‘c’;c[1]=‘h‘;c[2]=‘i’;c[3]=‘n’;c[4]=‘a’;当数组中的元素全部初始化,定义时数组的长度可以省略,
注意不同的初始化方式会导致数组长度的不同c[](2)char c[6]={“china”}; 或 char c[6]=“china”
c[0]=‘c’;c[1]=‘h‘;c[2]=‘i’;c[3]=‘n’;c[4]=‘a’;c[5]=‘\0’;c[]c[]字符数组定义字符数组定义2.说明:
(1)由于字符型和整型通用,也可以定义为int c[10]。
但这时每个数组元素占2个字节的内存单元。
char c[10];占1个字节int c[10];占两个字节字符数组定义字符数组定义(2)字符数组也可以是二维或多维数组。char a[3][4]={{‘I’,’a’},{‘ ’,’d’}};例如:char c[5][10];即为二维字符数组。 char a[3][4]={“Ia”,” d”};当数组中各个串的内容被初始化,
定义时可以省略数组的第一维大小字符数组的初始化 1、字符数组允许在类型说明时作初始化赋值,逐个对数组 元素进行初始化。例如:
char c[10]={‘I’,’ ‘,’a’,’m’,’ ’,’h’,’a’,’p’,’p’,’y’};字符数组的初始化(1)初值个数等于数组元素长度时,依次赋值。(2)初值个数大于数组元素长度时,做语法错误处理。例如:
char c[10]={‘I’,’ ’,’a’,’m’,’ ’,’h’,’a’,’p’,’p’,’y’,’!’};字符数组的初始化字符数组的初始化例如:static char c[10]={`w`,` h `,`o`,` `,’a’,m`, ‘’,`I`};
赋值后各元素的值为:(3)初值个数小于数组元素长度时,则后面的元素自动置
为空字符(也就是‘\0’)。其中c[8] 、c[9]未赋值,由系统自动赋予\0值。(4)当对全体元素赋初值时也可以省去长度说明。例如:static char c[ ]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`};
这时C数组的长度自动定为9。字符数组的引用输出结果:
BASIC
dBASE字符数组的引用1、输出一个字符串例: 写出下面程序的运行结果。
main( )
{ int i,j;
char a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};
for(i=0;i<=1;i++)
{
for(j=0;j<=4;j++) printf("%c",a[i][j]);
printf("\n");
}
}字符数组的引用(2)字符数组的引用(2)2、输出一个钻石图形例: 写出下面程序的运行结果。
main( )
{ int i,j;
char diamond[][5]={{‘ ’,’ ‘,’*’},
{’ ’,’*’,’ ‘,’*’},
{‘*’,’ ’,’ ’,’*’},
{‘ ’,’*’,’ ’,’*’},
{‘ ’,’ ’,’*’}};
for(i=0;i<5;i++)
{
for(j=0;j<5;j++) printf("%c",diamond[i][j]);
printf("\n");
}
} *
* *
* *
* *
*字符串和字符串结束标志 1.总领:
(1)在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串和字符串结束标志字符串总是以‘\0’作为串的结束符。因此当把一个字符串存入一个数组时, 也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。(2)`\0`代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。字符数组的输入输出(1)字符数组的输入输出方法:
(1)逐个字符输入输出。用格式符“%c”输入或输出一个字符。字符数组的输入输出(1)(2)将整个字符串一次输入或输出。用“%s”格式符,意思是
输出字符串(String)。例如:static char c[10]={`w`,` h `,`o`,` `,’a’,m`, ‘’,`I`,’!’};printf(“%s”,c);字符数组的输入输出(3)字符数组的输入输出(3)注意:
1、输出字符不包括结束符`\0`。4、如果一个字符数组中包含一个以上`\0`,则遇第一个
`\0`时输出就结束。2、用“%s”格式符输出字符串时,printf函数中的输出
项是字符数组名,而不是数组元素名。3、如果数组长度大于字符串实际长度,也只输出到遇
`\0`结束。例如:printf(”%s”,c[0]);如果利用一个scanf函数对数组输入一个字符串
scanf(“%s”,c);
scanf函数中的输入项是字符数组名,而不是数组元素名null例: 写出下面程序的输出结果:
main( )
{
static char c[]="BASIC\ndBASE";
printf("%s\n",c);
}输出结果:
BASIC
dBASE例: 写出下面程序的输出结果:
main( )
{
static char c[]="BASIC\0dBASE";
printf("%s\n",c);
}输出结果:
BASICnull 例: 写出下列程序的功能:
main( )
{
char st[15];
printf("input string:\n");
scanf("%s",st);
printf("%s\n",st);
}
注意:当用scanf函数输入字符串时,字符串中不能含有空格,否
则将以空格作为串的结束符。
例如:当输入的字符串中含有空格时,运行情况如下。
input string:
this is a book
this从输出结果可以看出空格以后的字符都未能输出。
为了避免这种情况,可多设几个字符数组分段存放含空格的串。
main( )
{ char st1[6],st2[6],st3[6],st4[6];
printf("input string:\n");
scanf("%s%s%s%s",st1,st2,st3,st4);
printf("%s %s %s %s\n",st1,st2,st3,st4);
}null 5.在前面介绍过,scanf的各输入项必须以地址方式出现,如 &a,&b等。但在上例中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了该数组的首地址。 整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c[10],在内存中设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在字符数组c前面不能再加地址运算符&。如写作scanf("%s",&c);则是错误的。在执行函数printf("%s",c) 时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。
null字符串处理函数:
1. 字符输出函数puts
(1)格式:puts(字符数组名)
(2)作用:将一个字符串(以`\0`结束的字符序列)输出到终端。
例:
#include"stdio.h"
main()
{
static char c[]="BASIC\ndBASE";
puts(c);
}
从程序中可以看出puts函数中可以使用转义字符, 因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。
null 2.gets(字符数组)
(1)格式:gets(字符数组名)
(2)作用:从终端输入一个字符串到字符数组,并且得到一
个函数值。该函数值是字符数组的首地址。
例:
#include"stdio.h"
main( )
{
char st[15];
printf("input string:\n");
gets(st);
puts(st);
}
可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志, 而只以回车作为输入结束。
注意:puts和 gets函数只能输入或输出一个字符串。null3.字符串连接函数strcat
(1)格式:strcat(字符数组名1,字符数组名2)
(2)作用:连接两个字符数组中的字符串,把字符串2接到字符
串1 的后面,结果放在字符数组1中,函数调用后得
到一个函数值——字符数组1的地址。
例: #include"string.h"
main( )
{ static char st1[30]="My name is ";
int st2[10];
printf("input your name:\n");
gets(st2);
strcat(st1,st2);
puts(st1);
}
本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。
说明:1.字符数组1必须足够大,以便容纳连接后的新字符串。
2.连接前两个字符串的后面都有一个`\0`,连接时将字符串1
后面的`\0`取消,只在新串最后保留一个`\0`。null4.字符串复制函数strcpy
(1)格式:strcpy(字符数组名1,字符数组名2)
(2)作用:将字符串2复制到字符串1中。字符数名2也可以是一个字符串常量,相当于把一个字符串赋予一个字符数组。
例: #include"string.h"
main( )
{ static char st1[15],st2[]="C Language";
strcpy(st1,st2);
puts(st1);
printf("\n");
}
说明:
1.字符数组1必须定义的足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。
2.“字符数组1”必须写成数组名形式(如str1),“字符串2” 可以是字符数组名,也可以是一个字符串常量。
3.复制时连同字符串后面的`\0`一起复制到字符数组1中。
4.不能用赋值语句将一字符串常量或字符数组直接给一字符数组。null5.字符串比较函数strcmp
(1)格式:strcmp(字符数组名1,字符数组名2)
(2)作用:比较字符串1和字符串2。
(3)规则:
A:对两个字符串自左至右逐个字符相比(按照ASCII码值大小比较),直到出现不同的字符或遇到`\0`为止。如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。并由函数返回值返回比较结果。
B.比较的结果由函数值带回。
(I)如果字符串1==字符串2,函数值为0;
(II)如果字符串1>字符串2,函数值为一正整数;
(III)如果字符串1<字符串2,函数值为一负整数。
注意:对两个字符串比较时的书写格式。
例如:if (str1=str2) printf("yes"); 是不行的; 而应该使用
if (strcmp(str1,str2)==0) printf("yes");
null例:
#include"string.h"
main( )
{
int k;
static char st1[15],st2[]="C Language";
printf("input a string:\n");
gets(st1);
k=strcmp(st1,st2);
if(k==0) printf("st1=st2\n");
if(k>0) printf("st1>st2\n");
if(k<0) printf("st1
st2”。null 6.测试字符串长度函数strlen
(1)格式:strlen(字符数组名)
(2)作用:测试字符串的长度。函数的值为字符串中的实际长
度,不包括`\0`在内。
例:
#include"string.h"
main()
{
int k;
static char st[]="C language";
k=strlen(st);
printf("The lenth of the string is %d\n",k);
}
null05.9-41有以下程序 #include main() { char p[]={’a’, ’b’, ’c’}, q[10]={’a’, ’b’, ’c’}; printf(“%d %d\n”, strlen(p), strlen(q)); } 以下叙述中正确的是 A)在给p和q数组置初值时,系统会自动添加字符串结束符,故输出的长度都为3 B)由于p数组中没有字符串结束符,长度不能确定;但q数组中字符串长度为3 C)由于q数组中没有字符串结束符,长度不能确定;但p数组中字符串长度为3 D)由于p和q数组中没有字符串结束符,故长度都不能确定
05.9-32有以下程序 main() { char p[]={’a’, ’b’, ’c’}, q[]="abc"; printf("%d %d\n", sizeof(p),sizeof(q)); }; 程序运行后的输出结果是 A)4 4 B)3 3 C)3 4 D)4 3 (C)等 考 实 例(A)null06.4-15以下能正确定义字符串的语句是 A)char str[]={′\064′}; B)char str=“kx43”; C)char str=“; D)char str[]=”\0“;
06.4-9运行以下程序,输入abcd,程序的输出结果是: 。
insert(char str[])
{ int i;
i=strlen(str);
/*printf("i=%d",i);*/
while(i>0)
{ str[2*i]=str[i];str[2*i-1]='*';i--;}
printf("%s\n",str);
}
main()
{ char str[40];
scanf("%s",str);insert(str);
}等 考 实 例(D)a*b*c*d*数 组 作 为 函 数 参 数(1)数 组 作 为 函 数 参 数(1)1、数组元素作函数实参
与用变量作用一样,是单向传递,即“值传送”方式。例10 有两个数组a、b,各人10个元素,将它们对应地逐个
相比(即a[0]与b[0]比,a[1]与b[1]比……)。如果a数组中的
元素大于b数组中的相应元素的数目多于b数组中相应的元素的
数目(例如,a[i]>b[i]6次,b[i]>a[i]3次,其中i每次为不同
的值),则认为a数组大于b数组,并分别统计出两个数组相应元
素大于、等于、小于的次数。 数 组 作 为 函 数 参 数(1)数 组 作 为 函 数 参 数(1)int large(int x,int y)
{
int flag;
if(x>y) flag=1;
else if(xk)printf(“a>b”);
else if(n设计中可以有意识地利用这一特点改变实参数组元素的值
(如排序)null下面以5个数为例说明选择法的步骤。
a[0]a[1]a[2]a[3]a[4]3 6 1 9 4未排序时的情况1 6 3 9 4将5个数中最小的数1与a[0]对换1 3 6 9 4将余下的4个数中最小的数3与a[1]对换1 3 4 9 6将余下的3个数中最小的数4与a[2]对换1 3 4 6 9将余下的2个数中最小的数6与a[3]对换,至此完成排序用选择法对数组中10个整数按由小到大排序。
选择法 : 先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换…… 每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。数 组 作 为 函 数 参 数数 组 作 为 函 数 参 数3、用多维数组名作函数参数 可以用多维数组名作为实参和形参,在被调用函数中对形参数组定义时可以省略第一维的大小说明。
如 int array[3][10]; 或 array[][10]; 从实参传送来的是数组起始地址,在内存中各元素是一行接一行地顺序存放的,而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列。不能只指定第一维而省略第二维,下面写法是错误的: int array[3][];null 总结
1.数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组以及后面将要介绍的指针数组,结构数组等。
2.数组可以是一维的,二维的或多维的。
3.数组类型说明由类型说明符、数组名、数组长度 (数组元素个数)
三部分组成。数组元素又称为下标变量。 数组的类型是指下标变
量取值的类型。
4.对数组的赋值可以用数组初始化赋值, 输入函数动态赋值和赋值
语句赋值三种方法实现。 对数值数组不能用赋值语句整体赋值、
输入或输出,而必须用循环语句逐个对数组元素进行操作。null05.9-15以下程序运行后的输出结果是 。 int f(int a[], int n) { if (n >= 1) return f(a, n-1)+a[n-1]; else return 0; } main() { int aa[5]={1,2,3,4,5}, s; s=f(aa, 5); printf("%d\n", s); }
05.9-18以下函数rotate的功能是:将a所指N行N列的二维数组中的
最后一行放到b所指二维数组的第0列中,把a所指二维数组中
的第0行放到b所指二维数组的最后一列中,b所指二维数组中
其他数据不变。 # define N 4 void rotate(int a[][N], int b[][N]) { int i, j; for (i=0; i