第6章 数组Word文件下载.docx
《第6章 数组Word文件下载.docx》由会员分享,可在线阅读,更多相关《第6章 数组Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
二维数组的一般形式为:
类型说明符`数组名[变量表达式][常量表达式];
intc[3][4];
定义c为3×
4(3行4列)的数组。
注意:
不能写成c[3,4]。
C语言对二维数组采用这样的定义方式:
我们可以把二维数组当做是一种特殊的一维数组。
例如:
可以把c看成一个一维数组,它有3个元素c[0]、c[1]、c[2],每个元素又是一个包含4个元素的一维数组。
可以把c[0]、c[1]、c[2]看破做是3个一维数组的名字。
2.二维数组的引用
二维数组的表示形式为:
数组名[下标][下标]
数组的下标可以是整型表达式,如c[3-1][3×
2-2];
数组元素可以出现在表达式,也可以被赋值。
小提示:
定义数组时用的c[3][4]和引用元素时的c[3][4]的区别:
前者用来定义数组的维数和各维的大小,共有3行4列;
后者中的3和4是下标值,c[3][4]代表数组中的一个元素。
如果a[3][4]是二维数组中最后一个元素,那么该数组共有4行5列。
3.二维数组的初始化
可以在定义二维数组的同时给二维数组的各元素赋初值。
floatm[2][2]={{1.5,3.2},{0.8}};
全部初值放在一对花括号中,每一行的初值又分别括在一对花括号中,之间用逗号隔开。
当某行一对花括号内的初值个数少于该行中元素的个数时,系统将自动地给后面的元素补初值0。
同样,不能跳过每行前面的元素而给后面的元素赋初值。
4.通过赋初值定义二维数组的大小
对于一维数组,可以在数组定义语句中省略方括号中的常量表达式,通过所赋初值勤的个数来确定数组的大小;
对于二维数组,只可以省略第一个方括号中的常量表达式,而不能省略第二个方括号中的常量表达式。
inta[][3]={{1,2,3},{4,5},{6},{8}};
a数组的第一维方括号中的常量表达式省略,在所赋初值中,含有4个花括号,则第一维的大小由花括号的个数来决定。
因此,该数组其实是与a[4][3]等价的。
当用以下形式赋初值时:
intc[][3]={1,2,3,4,5};
第一维的大小按以下规则决定:
⑴当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小。
⑵当初值的个数不能被第二维的常量表达式的值除尽时,则:
第一维的大小=所得商数+1。
因此,按此规则,以上c数组第一维的大小应该是2,也就是说语句等同于intc[2][3]={1,2,3,4,5};
。
6.3字符数组
1.字符数组的定义
字符数组就是数组中的每个元素都是字符,定义方法同普通数组的定义相同,即逐个对数组元素赋值。
charc[11];
c为该数组名,该数组共有11个元素,并且每个元素都为字符型。
2.字符数组的初始化及引用
对字符数组的初始化,可逐个元素的赋值,即把字符逐个赋给数组元素。
chara[9]={‘t’,’h’,’a’,’n’,’k’,’’,’y’,’o’,’u’};
如果花括号中提供的初值个数(即字符个数)大于数组长度,则按语法错误处理。
如果初值个数小于数组长度,则将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(‘\0’)。
charc[6]{‘G’,’o’,’o’,’d’};
数组元素在内存中的存储状态如图6-1所示:
c[0]
c[1]
c[2]
c[3]
c[4]
c[5]
G
o
d
\0
字符数组的引用形式与其他数组的引用形式相同,采用下标引用,即数组名[下标]。
#include<
stdio.h>
main()
{
charc[9]={‘T’,’h’,’a’,’n’,k’’,’’,’y’,’o’,’u’};
inti;
for(i=0;
i<
9;
i++)
printf(“%c”,c[i]);
}
输出的结果为:
Thankyou。
3.字符串和字符串结束标志
C语言中,将字符串作为字符数组来处理。
为了测定字符串的实际长度,C语言规定了一个字符串结束标志,以字符‘\0’代表。
就是说,在遇到字符‘\0’时,表示字符串结束,由它前面的字符组成字符串。
系统对字符串常量也自动加一个‘\0’作为结束符。
charc[]=”cprogram”;
数组c共有9个字符,但在内存中占10个字节,最后一个字节‘\0’是由系统自动加上的。
有了结束标志‘\0’后,在程序中往往依靠检测‘\0’的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。
说明:
‘\0’代表ASCII码为0的字符,是一个“空操作符”,它什么也不干。
在输出时也不输出‘\0’,它只是一个结束的标志。
4.字符数组的输入输出
字符数组的输入输出可以有以下两种方法:
⑴用“%c”格式符将字符逐个输入或输出。
⑵用“%s”格式符,将整个字符串一次输入或输出。
charc[]=”program”;
printf(“%s”,c);
用格式符“%s”输出字符串时,printf()函数中的输出项应该是数组名,而不是数组中的某个元素,如“printf(“%s”,c[0]);
”是不对的,应改为“printf(“%s”,c);
”。
当数组中的字符串的实际长度小于数组定义的实际长度时,在输出时也是遇到‘\0’就结束;
当数组中有多个‘\0’时,遇到第一个‘\0’就结束输出。
结束符‘\0’不被输出。
在使用scanf()函数中,输入项是字符数组名。
输入项为字符数组名时,不用再加地址符“&
因为在C语言中,数组名代表该数组的起始地址,如“scanf(“%s”,str);
5.字符串处理函数
C语言没有提供对字符串进行整体操作的运算符。
但在C语言的函数库中提供了一些用来处理字符串的函数,可以通过调用这些库函数来实现字符串的赋值、合并和比较运算。
使用这些函数时,必须在程序前面的命令行包含标准头文件“string.h”,具体内容见表6-2:
表6-2字符串处理函数
函数名称
调用形式
作用
说明
puts()
puts(字符数组)
将一个字符吕(以‘\0’结束)输出到终端设备
用度该函数输出的字符串中可以包含转义字符
gets()
gets(字符数组)
从终端输入一个字符串到字符数组中,并且得到一个函数值
puts()和gets()函数一次只能输入或输出一个字符串,不能写成puts(字符数组1,字符数组2)或gets(字符数组1,字符数组2)
strcpy()
strcpy(字符数组1,字符数组2)
把字符数组2所指字符串的内容复制到字符数组1所指存储空间中。
函数返回字符数组1的值,即目的串的首地址
为保证复制的合法性,字符数组1必须指向一个足够容纳字符数组2的存储空间
strcat()
strcat(字符数组1,字符数组2)
该函数将字符数组2所指字符串的内容连接到字符数组1所指的字符串后面,并自动覆盖字符数组1串末尾的‘\0’。
该函数返回字符数组1的地址
字符数组1所指定字符串应有足够的空间容纳两串合并后的内容
strlen()
strlen(字符数组)
此函数计算出以字符数组为起始地址的字符串长度并作为函数值返回
这一长度不包括串尾的结束标志’\0’
strcmp()
strcmp(字符数组1,字符数组2)
该函数用来比较字符数组1和字符数组2所指字符吕的大小。
若字符数组1>
字符数组2,函数值大于0(正数);
若字符数组1=字符数组2,函数值等于0;
字符数组1<
字符数组2,函数值小于0(负数)
根据字符的ASCII码值依次对字符数组1和字符数组2所指字符串对应位置上的字符两两进行比较,当出现第一一对不同的字符时,即由这两个字符决定所在串的大小
一.选择题
1.以下程序的输出结果是()。
intn[2]={0},i,j,k=2;
k;
for(j=0;
j<
j++)
n[j]=n[i]+1;
printf(“%d\n”,n[k]);
A.不确定值B.3C.2D.1
2.若有说明:
inta[10];
则对数组元素的正确引用是()。
A.a[10]B.a[3.5]C.a(5)D.a[10-10]
3.合法的数组说明语句是()
A.inta[]=”string”;
B.inta[5]={0,1,2,3,4,5};
C.chara=”string”;
D.chara[]={0,1,2,3,4,5};
4.调用strlen(”abcd\0ef\0g”)的返回值为()
A.4B.5C.8D.9
5.若有以下语句,则正确的描述是()。
charx[]=”12345”;
chary[]={‘1’,’2’,’3’,’4’,’5’};
A.x数组和y数组的长度相同B.x数组和度大于y数组长度
C.x数组和度小于y数组长度D.x数组等价于y数组
6.已知inta[][3]={1,2,3,4,5,6,7};
则数组a的第一维的大小是()。
A.2B.3C.4D.无确定值
7.若二维数组
a行m列,则在a[i][j]之前的元素个数为()。
A.j*m+iB.i*m+jC.i*m+j-1D.i*m+j+1
8.设有数组定义:
chararry[]=”china”;
则数组arry所占的空间为()。
A.4个字节B.5个字节C.6个字节D.7个字节
9.下列程序执行后的输出结果是()。
chararr[2][4];
strcpy(arr,”you”);
strcpy(arr[1],”me”);
arr[0][3]=’&
’;
printf(“%s\n”,arr);
A.you&
meB.youC.meD.err
10.有如下程序:
intn[5]={0,0,0},i,k=2;
i++)n[i]=n[i]+1;
printf(“%d\n”,n[k]);
该程序的输出结果是()。
A.不定值B.2C.1D.0
11.如下程序的输出结果是()。
{inta[3][3]={{1,2},{3,4},{5,6}},i,j,s=0;
for(i=1;
3;
i;
j++)s+=a[i][j];
printf(“%d\n”,s);
A.14B.19C.20D.21
12.当执行下面的程序时,如果ABC,则输出结果是()。
string.h>
{charss[10]=”1,2,3,4,5”;
gets(ss);
strcat(ss,”6789”);
printf(“%s\n”,ss);
A.ABC6789B.ABC67C.12345ABC6D.ABC456789
6.以下程序的输出结果是()。
f(intb[],intm,intn)
inti,s=0;
for(i=m;
n;
i=i+2)s=s+b[i];
returns;
intx,a[]={1,2,3,4,5,6,7,8,9};
x=f(a,3,7);
printf(“%d\n”,x);
A.10B.18C.8D.15
7.以下程序中函数sort()的功能是对数组a中的数据进行由大到小的排序。
voidsort(inta[],intn);
inti,j,t;
n-1;
for(j=i+1;
if(a[i]<
a[j]){t=a[i];
a[i]=a[j];
a[j]=t;
intaa[10]={1,2,3,4,5,6,7,8,9,20},i;
sort(&
aa[3],5);
10;
i++)printf(“%d,”,aa[i]);
printf(“\n”);
程序运行后的输出结果是()。
A.1,2,3,4,5,6,7,8,9,10
B.10,9,8,7,6,5,4,3,2,1
C.1,2,3,8,7,6,5,4,9,10
D.1,2,10,9,8,7,6,5,4,3
8.有以下程序:
{chara[]={‘a’,’b’,’c’,’d’,,’e’,’f’,’g’,’h’,’\0’};
inti,j;
i=sizeof(a);
j=strlen(a);
printf(“%d,%d\n”,i,j);
A.9,9B.8,9C.1,8D.9,8
9.以下程序中函数reverse()的功能是将a所指数组中的内容进行逆置。
voidreverse(inta[],intn)
inti,t;
n/2;
{t=a[i];
a[i]=a[n-1-i];
a[n-1-i]=t;
intb[10]={1,2,3,4,5,6,7,8,9,10};
reverse(b,8);
for(i=6;
i++)s+=b[i];
A.22B.10C.34D.30
10.以下程序的输出结果是()。
charstr[12]={‘s’,’t’,’r’,’i’,’n’,’g’};
printf(“%d\n”,strlen(str));
A.6B.7C.11D.12
11.在语言中,一维数组的定义方式为:
类型说明符数组名()。
A.[常量表达式]B.[整型表达式]
C.[整型常量]或[整型表达式]D.[整型常量]
12.若有说明:
inta[3][4];
则对a数组元素的非法引用是()。
A.a[0][2*1]B.a[1][3]C.a[4-2][0]D.a[0][4]
13.若有说明:
inta[][4]={0,0};
则下面不正确的叙述是()。
A.数组a的每个元素都可得到初值0
B.二维数组a的第一维大小为1
C.因为二维数组a中初值的个数不能被第二维大小的值整除,则第一维的大小等于所得商数再加1,故数组a的行数为1
D.只有元素a[0][0]和a[0][1]可得到初值0,其余元素均得不到初值0
14.下面程序中有错误的行是()。
(1)main()
(2){
(3)inta[3]={1};
(4)inti;
(5)scanf(“%d”,&
a);
(6)for(i=1;
i++)a[0]=a[0]+a[i];
(7)printf(“%f\n”,a[0]);
(8)}
A.3B.6C.7D.5
15.若有说明:
inta[][3]={1,2,3,4,5,6,7};
则a数组第一维的大小是()。
16.对两个数组a和b时行如下初始化
chara[]=”ABCDEF”;
charb[]={‘A’,’B’,’C’,’D’,’E’,’F’};
则以下叙述正确的是()。
A.数组a与数组b完全相同B.数组a与数组b长度相同
C.数组a与数组b中都存放字符串D.数组a比数组b长度长
17.有下面的程序段
chara[],b[]=”china”;
a=b;
printf(“%s”,a);
则()。
A.运行后将输出chinaB.运行后将输出ch
C.运行后将输出chiD.编译出错
18.判断字符串s1是否大于字符串s2,应当使用()。
A.if(s1>
s2)B.if(strcmp(s1,s2))
C.if(strcmp(s2,s1)>
0)D.if(strcmp(s1,s2)>
0)
19.下面程序的运行结果是()。
charch[7]={“12ab56”};
ch[i]>
=’0’&
&
ch[i]<
=’9’;
i+=2)
s=10*s+ch[i]-‘0’;
1
2
5
6
A.1B.1256C.12ab56D.
20.当运行以下程序时,从键盘输入:
AhaMA[空格]Aha<
回车>
,则下面程序的运行结果是()。
chars[80],c=’a’;
inti=0;
scanf(“%s”,s);
while(s[i]!
=’\0’)
{
if(s[i]==c)s[i]=s[i]-32;
elseif(s[i]==c-32)s[i]=s[i]+32;
i++;
puts(s);
A.ahAMaB.AbAMaC.AhAMaahAD.ahAMaahA
二、填空题
1.下面程序的功能是:
将字符数组a中下标值为偶数的元素从小到大排列,其他元素不变,请填空。
chara[]=”language”,t;
inti,j,k;
k=strlen(a);
=k-2;
for(j=i+2;
j+=2)
if(a[i]>
a[j])
{t=a[i];
puts(a);
2.以下程序的输出结果是abc。
chars[]=”abcdef”;
s[3]=’\0’;
printf(“%s\n”,s);
3.若有以下定义:
doublew[10];
则w数组元素下标的上限为9,下限为0。
4.在C语言中,二维数组元素在内存中的存放顺序是先行后列。
5.若有定义:
inta[3][4]={{1,2},{0},{4,6,8,10}};
则初始化后,a[1][2]得到的初值是0。
6.以下程序可求出所有水仙花数(提示:
所谓水仙花数是指一个3位正整数,其各位数字的立方之和等于该正整数。
如407=4*4*4+0*0*0+7*7*7,故407是一个水仙花数)。
请真空。
intx,y,z,a[8],m,i=0;
printf(“Thespecialnumbersare(inthearrangeof1000):
\n”);
for(m=100;
m<
1000;
m++)
x=m/100;
y=m/10%10(m/10-x*10);
z=m%10;
if(x*100+y*10+z==x*x*x+y*y*y+z*z*z)
{a[i]=m;
for(x=0;
x<
x++)
printf(“%6d”,a[x]);
1123
581321
3455
7.下面程序的运行结果是。
inti,f[10];
f[0]=f[1]=1;
for(i=2;
f[i]=f[i-2]+f[i-1];
{if(i%4==0)printf(“\n”);
printf(“%3d”,f[i]);
8.下面程序的功能是将二维数组a中每个元素向右移一列,最右一列换到最左一列,移后的数组存到另一个二维数组b中,并按矩阵形式输出a和b,请填空。
inta[2][3]={4,5,6,1,2,3},b[2][3];
printf(“arraya:
=1;
{for(j=0;
{printf(“%5d”,a[i][j]);
b[i][j+1]=a[i][j];
printf(“\