参考答案•数组' 字符数组
【学习要点】
1.掌握一维数组的逻辑结构和物理结构。
2.掌握一维数组的定义、初始化及其使用。
3.掌握函数参数为数组时,函数参数的正确传递。
4.掌握数组应用的常用算法——选择排序、冒泡排序、顺序查、折半查
5.掌握二维数组的逻辑结构和物理结构。
6.掌握二维数组的定义、初始化及其使用。
7.掌握字符数组的特点、定义、初始化及其使用,掌握字符数组的整体输入/输出。
8.掌握字符串处理的基本函数。
【例题分析】
1.关于数组,下面描述中正确的是____ 。
A.与普通变量没什么区别
B.其元素的数据类型可相同,也可不同
C.可用数组名标识其元素
D.数组元素的数据类型是相同的
【答案】D
【解析】数组是一组具有线性关系且类型相同变量的集合体,用一个统一的数组名来命名,组成数组的变量称为数组元素,用数组名、方括号和下标来共同标识数组中的一个元素,下标代表该元素在数组中的位置(从0开始),数组元素也称为下标变量。
2.下面合法的数组定义是____ 。
A.int a[] = { "A", 'B', "C };
B.int a[ 5 ] = ( 0, 1, 2, 3, 4, 5 );
C.int a = ( TV, 'B', 'C* };
D.int a[ ] = { 0, 1, 2, 3, 4, 5 };
【答案】D
【解析】根据数组定义和初始化情况,数组类型与所赋初始数据的类型应一致。指定的数组长度应大于或等于花括号中的初始数据个数。定义数组时,可以不直接指定数组的长度,编译器会根据初值表中数据的个数来自动确定数组元素的个数。3,若有定义int a[ 2 ][ 4 ],则下面描述中不正确的是 _______ 。
A.数组a可以看成是由a[ 0 ]、a[ 1 ]两个元素组成的一维数组
B.a[0]代表一个地址常量
C.元素a[ 0 ]是由4个整型元素组成的一维数组
D.可用a[ 0 ]=5的形式给数组元素赋值
【答案】D
【解析】C++对二维数组的处理是将其看作一个特殊的一维数组,即这个数组中每个元素又是一个一维
数组。所以二维数组a可认为是由两个元素a[。]、a[ 1 ]组成的一维数组,而数组元素a[ 0 ]和2[ 1 ]又是由4个int 型元素组成的一维数组。C++规定了数组名代表地址常量,但数组名的值是不可改变的,故赋值语句a[ 0 ]=5是非法的。
4.若有定义int a[3][4 ],则对数组a的元素非法引用是__________ 。
A.a[ 0 ][ 2*1 ]
B a[ 0 ][ 4 ]
C.a[ 4-2 ][ 0 ]
D.a[ 1 ][ 3 ]
【答案】B
【解析】引用二维数组元素的格式为:数组名[下标表达式  1 ][下标表达式2],而下标表达式可以是常量、变量,但其值必须是确定的整数且在该数组的定义范围之内,在程序执行过程中,C++对下标表达式的取值范围不作合法性检查,非法引用可能产生不可预知的运行时错误。
5.下面程序的运行结果是____ o
#include<iostream.h>
void main() { char s[ 10 ]; s="abcd” ; cout«s«endl ; }
A.abed
B.不确定的值
C.数组s的首地址
D.编译出错
【答案】D
【解析】字符数组的赋值,不能通过赋值语句实现,可通过初始化或strcpy()函数来实现,即:可在程序前面加上#include<string.h> ,并将s="abcd";改为strcpy( s , “abed");后程序的运彳亍结果是abed。
6.若有定义char s1[ 10], s2[ 10 ],能判断字符串s1是否大于字符串s2的是 ____ 。
A.if ( s1>s2 )
B.if ( strcmp( s1, s2 ))
C.if ( strcmp( s1, s2 ) > 0 )
D.if ( (s1-s2) > 0 )
【答案】C
【解析】两个字符串比较必须使用字符串比较函数strcmp(字符串1,字符串2),比较的结果:相等时返回0;大于时返回正整数;小于时返回负整数。
7.^int a[3][4]={{1,2},{0},{4,6,8,10});则a[1][2]v a[2][1]得到的初值分别是______ 。
【答案】0、6
【解析】在定义数组时,可对所有元素赋初值,也可只对前面部分的元素赋初值,而后面部分未给初值的元素,系统自动赋初值为。。二维数组中元素排列的顺序是以行为单位进行存放,按初值表中的{ }作为行元素进行赋初值。
8.语句cout «strlen( "\t\\\n\,\065\08AW" ) «'\n';的输出结果是_________ 。
【答案】5
【解析】按照C++中转义字符的规定,在字符串"\t\\\n\,\065\08AW”中,含有\t、\\、\n、\・、\065转义字符, 分别表示单个字符; '。也是转义字符,是字符串结束标志(\。不算在字符串长度之内),系统认为字符串到此结束,不计其后的8、A、Wo注意:若将8改为7,而\07却是一个字符,加上A、W,此时字符串的长度是8。
9.下面程序的运行结果是____ o
#include<iostream.h> #include<string.h> void main() { char str[ 40 ]= "xyz", p1[ 20 ]= "abed", p2[ ]= "ABCD"; strcpy( str+2 , strcat( p1+2 , p2+1 )); cout « str « '\n';
}
【答案】输出:xycdBCD
【解析】由于字符数组名str、p1、p2表示地址,同理表达式str+2x p1+2、p2+1的值也是地址,str+2表示字符串"xyz,,中字符2■的地址,p1+2表示字符串"abed"中,c,的地址,p2+1表示字符串"ABCD"中字符,B・的地址,分别代表的字符串为"N"、"cd*\ "BCD”。调用函数strcat(p1+2,p2+1)得到字符串"cdBCD",调用strcpy()后,将刚才”cdBCD■,拷贝到str中以2■为起始地址的存储单元中,因此覆盖了str中从■开始的存储单元中的数据。
10.完善下面程序,功能是将十进制数转换为某个指定进制的数。#include<iostream.h>
void main() { int num[ 50 ] , i=0 , base ; long n ; cout « "请输入一个十进制数:n ; cin » n ;
cout « n请输入要转换进制的基数:”;
cin » base ;
do
(  __________ ©_________ ;
i++ ;
n = n / base ;
} while (②);
for ( ; i>=0 ; i-)
cout « num[ i ];
cout « endl ;
)
【答案】①num[ i ] = n % base
【答案】②n
【答案】
【解析】将十进制转换为其他进制的方法通常是“除基取余法”。若要将十进制数n转换为base进制,只要反复用n去除base,每次记录下余数,一直除到商为零为止,最后反过来输出余数即可。
11.编写程序:设字符串a中的字符已按其ASCII码递增排好序,从键盘输入一个字符,用折半查法出该
字符在a中的位置,若该字符不在a中,贝I]输出“未到!气
【提示】
折半查方法:折半的前提条件是数组必须有序。
%1设置查区间:定义两个指针low、high分别指向数组的首、尾两个元素;
%1折半取区间中点:若查区间存在,即low <= high,贝U: mid = (low+ high) / 2
%1查并缩小查区间:
♦若所要的元素==mid所指的元素,
贝U:表示已到,查成功,结束!
♦若所要的元素 > mid所指的元素,
贝U:取low = mid+1, high不变,继续查,重复②;
♦若所要的元素v mid所指的元素,
贝U:取high = mid-1, low不变,继续查,重复②;
%1查失败:当low > high仍未查到,贝U:表示不到,查失败,停止!
【答案】编写程序如下:
#include<iostream.h>
#include<string.h>
void main()
( char a[ ] = "1468ACEGIKNPRTadfgikmnprs" , c ;
int low , high , mid ;
cout « "原先已排序的字符串:,• vv a vv・\n,;
cout « -请输入要查的字符:・.;
cin » c ;
for ( low=0, high=strlen(a)-1 ; low<=high ;)
{ mid = ( low + high )/2;
if ( c == a[ mid ])
{ cout « “字符” vv c « ”已到,位置是第"«mid+1 «“个字符!\n M ;
break ; }
if ( c > a[ mid ] ) low = mid+1 ;
else high = mid-1 ;
if ( low > high ) cout «“字符” vv c « ,,未到!\n";
【思考题】
㈠选择题
1.对数组初始化,以下不正确的是____ 。
A.static char word[ ] = *Turbo\0';
B.static char word[ ] = ( 'T' , 'u* , *r' , 'b, , 'o' , *\0' };
C.static char word[ ] = ( H Turbo\0M );
D.static char word[ ] = "Turbo\0";
【答案】A
2.对数组初始化,以下正确的是______ o
A.inta[2][3] = ({1,2} , {3,4) , {5,6} );
B.inta[][3] = (1,2,3,4,5,6};
C.int a[ 2 ][ ] = ( 1,2,3,4,5,6 };
D.inta[2][] = {{1,2},{3,4}};
【答案】B
3.对数组进行定义,以下正确的是____ o
A.int x=10; int num[x];
【答案】B ㈡完善程序题
1.函数find()用来判断数组a中的数据是升序' 降序或无序。若为升序返回1,若为降序返回2,若为无序返回3。形参n为数组a中有效整数的个数。
# include < iostream.h >
int find ( int a[ ] , int n )
( int s, i;
if ( a[0] < a[1] )©;
else s = 2 ;
iff ( s == 1 )
数组类型字符串转数组
( i = 1 ;
while ( i v n-1 )
( if () ( s = 3 ; break ; }
________ ③________ ; }
}
if ( s == 2 )
for ( i = 1 ; @; i++ )
if ( a[i] v a[i+1] ) { ⑤; break; } return s ;
}
void main ()
( int a[ 10 ] , k ;
for ( k=0 ; k<10 ; k++ ) a[ k ] = 2*k;
k = find( ⑥, 10 );
switch ( k )
( case 1 : cout vv "升序\n” ;break ;
case 2 : cout « "降序\n” ; break ;
case 3 : cout « "无序\n” ;}
【答案】①S=1
【答案】②a[i]>a[i+1]
【答案】③i++
【答案】④i<n-1
【答案】⑤s=3
【答案】⑥a
2.下面函数inverse的功能是使一个字符串按逆序存放,请填空。
#include < iostream.h >
#include v string.h >
void inverse ( char str[])
( char m ;
int i , j ;
for ( i=0 , j=strlen(str)-1 ; i<①; i++ ,®
( m = str[ i ];
str[ i ] =③;
________ __________ ; }
}
void main ()
( char s[ 100 ];
cout « M请输入一行字符:,,;
cout vv "调用前字符串:n«s « endl ;
inverse( s );
cout « "调用后字符串:"«s « endl ;
}
【答案】①j
【答案】® j-
【答案】③str[j]
【答案】④str[j]=m ㈢写出下列程序的输出结果
1.下面程序的运行结果是_____ O
#include<iostream.h>
void main()
{ int i , j ;
int a[10]= {1,1,1,1,1,1,1,1,1,1 );
for ( i=0 ; i<10 ; i++ )
for ( j=0 ; j<i ; j++ ) a[ i ] = a[ i ] + a[ j];
for ( i=0 ; i<10 ; i++ ) cout « a[ i ] « u u;
cout « endl ;
)
【答案】输出:1 2 4 8 16 32 64 128 256 512
2.下面程序的运行结果是_____ o
#include<iostream.h>
void main()
( int a[ 10 ] = { 1,3,5,2,4,11,22,33,44,55 );
int b[ 10 ];
int i , m=0 , n=9 , s=1 ;
cout vv ••第"vv s++ «••次打印:"; for ( i=0; i<10; i++ ) { cout « a[ i ] vv u u ;
if ( a[i]%2 != 0 ) b[ m++ ] = a[ i ]; else b[ n- ] = a[ i ];
}
cout « endl ;
cout « ,,第"vv s++ «•.次打印:■■;
for ( i=9 ; i>=0 ; i- ) cout « b[ i ] « " M ;
cout « endl ;
cout « W « s « endl ;
}
【答案】第1行输出:第1次打印:1 3 5 2 4 11 22 33 44 55 第2行输出:第2次打印:2 4 22 44 55
33 11 5 3 1 第3行输出:s=3
3.下面程序的运行结果是____ o
#include<iostream.h>
void main()
{ int a[4][4] = {1,2,3,4,2,2,5,6,3,5,2,7,4,6,7,4}; int i , j , flag=O ;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。