资源描述
习题 4
一、单项选择题
1. 若有说明 int a[3][4];则a数组元素的非法引用是【 】
A. a[0][2*1]
B. a[1][3]
C. a[4-2][0]
D. a[0][4]
【答案】 D
【解析】数组下标从0开始,a[0][4]的列下标越界。
2. 在C++语言中,引用数组元素时,其数组下标的数据类型允许是【 】
A. 整型常量
B. 整型表达式
C. 整型常量或整型表达式
D. 任何类型的表达式
【答案】 C
3. 以下不正确的定义语句是【 】
A. double x[5]={2.0,4.0,6.0,8.0,10.0};
B. int y[5]={0,1,3,5,7,9};
C. char c1[]={′1′,′2′,′3′,′4′,′5′};
D. char c2[]={′\x10′,′\xa′,′\x8′};
【答案】 B
【解析】初始值的个数大于数组的大小,系统会出现编译错误。
4. 对以下说明语句的正确理解是【 】
int a[10]={6,7,8,9,10};
A. 将5个初值依次赋给a[1]至a[5]
B. 将5个初值依次赋给a[0]至a[4]
C. 将5个初值依次赋给a[6]至a[10]
D. 因为数组长度与初值的个数不相同,所以此语句不正确
【答案】 B
5. 若有说明:int a[ ][4]={0,0};则下面不正确的叙述是【 】
A. 数组a的每个元素都可得到初值0
B. 二维数组a的第一维大小为1
C. 当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小
D. 只有元素a[0][0]与a[0][1]可得到初值,其余元素均得不到确定的初值
【答案】 D
【解析】二维数组初始化时,行大小可以省略,被省略的大小根据初值的个数系统来确定,本题中,有2个初值说明是1行4列,所以第一维为1。元素a[0][0]与a[0][1]赋初值为0 ,其余元素初值系统默认为0。
6. 以下能对二维数组c进行正确的初始化的语句是【 】
A. int c[3][]={{3},{3},{4}};
B. int c[][3]={{3},{3},{4}};
C. int c[3][2]={{3},{3},{4},{5}};
D. int c[][3]={{3},{},{3}};
【答案】 B
【解析】二维数组初始化时,行大小可以省略,列大小不可以省略,所以A答案错误。C答案中初始值行数多于数组大小中的行大小,也是错误的。另外初始化时,初值之间不能有空位置,故D错误。
7. 以下不能对二维数组a进行正确初始化的语句是【 】
A. int a[2][3]={0};
B. int a[][3]={{1,2},{0}};
C. int a[2][3]={{1,2},{3,4},{5,6}};
D. int a[][3]={1,2,3,4,5,6};
【答案】 C
8. 阅读下面程序,则程序段的功能是【 】
#include<iostream>
using namespace std;
int main()
int c[]={23,1,56,234,7,0,34},i,j,t;
for(i=1;i<7;i++)
t=c[i];j=i-1;
while(j>=0 && t>c[j])
{c[j+1]=c[j];j--;}
c[j+1]=t;
for(i=0;i<7;i++)
cout<<c[i]<<'\t';
putchar('\n');
return 0;
A. 对数组元素的升序排列
B. 对数组元素的降序排列
C. 对数组元素的倒序排列
D. 对数组元素的随机排列
【答案】 B
【解析】每层外层for循环结束会增加对一个元素的排序,确定c[0] ,c[1]的大小顺序,如图4-1所示。
图4-1 第一次排序
第二次将c[2]分别与前2两个元素比较,插入最前面,确定c[0] ,c[1], c[2] 的大小顺序,如图4-2所示。
图4-2 第二次排序
以此类推,外层6次循环后,将无序的数组实现大到小的降序排列。
9. 下列选项中错误的说明语句是【 】
A. char a[]={′t′,′o′,′y′,′o′,′u′,′\0′};
B. char a[]={"toyou\0"};
C. char a[]="toyou\0";
D. char a[]=′toyou\0′;
【答案】 D
10. 下述对C++语言字符数组的描述中错误的是【 】
A. 字符数组的下标从0开始
B. 字符数组中的字符串可以进行整体输入/输出
C. 可以在赋值语句中通过赋值运算符“=”对字符数组整体赋值
D. 字符数组可以存放字符串
【答案】 C
11. 以下二维数组c的定义形式正确的是【 】
A. int c[3][]
B. float c[3,4]
C. double c[3][4]
D. float c(3)(4)
【答案】 C
12. 已知:int c[3][4];则对数组元素引用正确的是【 】
A. c[1][4]
B. c[1.5][0]
C. c[1+0][0]
D. 以上表达都错误
【答案】 C
13. 若有以下语句,则正确的描述是【 】
char a[]="toyou";
char b[]={′t′,′o′,′y′,′o′,′u′};
A. a数组与b数组的长度相同
B. a数组长度小于b数组长度
C. a数组长度大于b数组长度
D. a数组等价于b数组
【答案】 C
【解析】 a数组中存放的是字符串,数组大小为6个字节空间,分别存放′t′,′o′,′y′,′o′,′u′与′\0′,b数组的长度为5个字节空间,只存放′t′,′o′,′y′,′o′,′u′,5个字符。
二、填空题
1. 若有说明:int a[][3]={1,2,3,4,5,6,7};则a数组第一维的大小是________。
【答案】 3
2. 设有数组定义: char array[]="China"; 则数组 array所占的空间为________个字节。
【答案】 6
3. 假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是________。
【答案】 20
4. 下面程序的功能是输出数组s中最大元素的下标,请填空。
#include<iostream>
using namespace std;
int main()
{ int k, p,s[]={1, -9, 7, 2, -10, 3};
for(p =0, k =p; p< 6; p++)
if(s[p]>s[k]) ________
cout<< k<<endl;
return 0;}
【答案】 k=p;
5. 下面程序是删除输入的字符串中字符′H′,请填空。
#include<iostream>
using namespace std;
int main()
{ char s[80];
int i,j;
gets(s);
for(i=j=0;s[i]!=′\0′;i++)
if(s[i]!=′H′)
{________}
s[j]=′\0′;
puts(s);
return 0;}
【答案】 s[j++] =s[i];
【解析】 此处相当于补充了2条语句,等价于s[j] =s[i]; j++;。
6. 已知:char a[20]= "abc",b[20]= "defghi";则执行cout<<strlen(strcpy(a,b));语句后的输出结果为________。
【答案】 6
7. 有如下定义语句:int aa[][3]={12,23,34,4,5,6,78,89,45};,则45在数组aa中的行列坐标各为 ________。
【答案】 2与2
8. 若二维数组a有m列,则计算任一元素a[i][j]在数组中相对位置的公式为(假设a[0][0]位于数组的第一个位置上) ________。
【答案】 i*m+j+1
9. 定义如下变量与数组:
int k;
int a[3][3]={9,8,7,6,5,4,3,2,1};
则语句for(k=0;k<3;k++) cout<<a[k][k];的输出结果是________。
【答案】 951
【解析】 定义的二维数组可以描述一个方阵:
9 8 7
6 5 4
3 2 1
语句功能是实现该方阵主对角线上元素的输出。
10. 已知:char a[15],b[15]={"I love china"};则在程序中能将字符串I love china赋给数组a的语句是________。
【答案】 strcpy(a,b);
三、读程序写结果
1. 程序代码如下
#include<iostream>
using namespace std;
int main()
char arr[2][4];
strcpy(arr[0],"you");
strcpy(arr[1],"me");
arr[0][3]='&';
cout<<arr[0]<<endl;
return 0;
【答案】 you&me
2. 程序代码如下:
#include<iostream>
using namespace std;
int main()
char a[]={'a', 'b', 'c', 'd', 'e', 'f', 'g','h','\0'};
int i,j;
i=sizeof(a);
j=strlen(a);
cout<< i <<","<<j<<endl;
return 0;
【答案】 9,8
3. 程序代码如下:
#include<iostream>
using namespace std;
int main()
int i;
int a[3][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++)
cout<<a[2-i][i];
return 0;
【答案】 753
【解析】 程序功能是实现一个方阵次对角线上元素的输出。
4. 程序代码如下:
#include<iostream>
using namespace std;
int main()
char a[30]="nice to meet you!";
strcpy(a+strlen(a)/2,"you");
cout<<a<<endl;
return 0;
【答案】nice to you
5. 程序代码如下:
#include<iostream>
using namespace std;
int main()
int k[30]={12,324,45,6,768,98,21,34,453,456};
int count=0,i=0;
while(k[i])
if(k[i]%2==0||k[i]%5==0)
count++;
i++;
cout<< count <<","<<i<<endl;
return 0;
【答案】8,10
6. 程序代码如下:
#include<iostream>
using namespace std;
int main()
char a[30],b[30];
int k;
gets(a);
gets(b);
k=strcmp(a,b);
if(k>0) puts(a);
else if(k<0) puts(b);
return 0;
输入loveå
Chinaå
输出结果是?
【答案】love
【解析】 strcmp(a,b)函数功能是比较a与b字符串的大小,比较是逐个字符的比较,比较方法是ASCII码值做减法,k='l'-'C'>,所以结果输出字符串a。
四、编程题
1.编程实现功能:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
例如,若一维数组中的数据是:
2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10
删除后,数组中的内容应该是:
2 3 4 5 6 7 8 9 10。
思路:fun函数的2个形式参数,分别接收数组名,即数组的首地址,与数组中存放的原始数据的个数,fun函数对原始数组按题目处理后,在主函数中输出的数组a就是处理后的数组,这里函数之间参数传递属于地址传递。
程序代码如下:
#include<iostream>
using namespace std;
const N=80;
int fun(int a[], int n)
{ int i,j=1;
for(i=1;i<n;i++)
if(a[j-1]!=a[i]) a[j++]=a[i];
return j;
int main()
{ int a[N]={ 2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10}, i, n=19;
cout<<"原始数组中的数据是:"<<endl;
for(i=0;i<19;i++)
cout<<a[i]<<" ";
n=fun(a,n);
cout<<"\n删除后,数组中的数据是:"<<endl;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
2.编程实现功能:从键盘上输入若干个学生的成绩,当输入负数时表示输入结束,计算学生的平均成绩,并输出低于平均分的学生成绩。
思路:使用循环输入学生的成绩,注意循环条件有2个,分别是输入成绩个数大于数组的大小与输入成绩为负数时结束,同时记录输入成绩的个数n。结束输入后,计算平均值与筛选小于60分的成绩并输出。
程序代码如下:
#include<iostream>
using namespace std;
int main( )
{ const N=800;
float x[N],sum=0,ave,a;
int n=0,i;
cout<<"输入学生成绩:"<<endl;
cin>>a;
while (a>=0 && n<N)
{ sum+=a;
x[n]=a;
n++;
cin>>a;
cout<<"输入的"<<n<<"名学生成绩为:";
for (i=0; i<n; i++)
cout<<x[i]<<" ";
cout<<endl;
ave=sum/n;
cout<<"平均分:"<<ave<<endl;
cout<<"低于平均分的成绩:";
for (i=0; i<n; i++)
if (x[i]<ave) cout<<x[i]<<" ";
cout<<endl;
return 0;
3.编程实现功能:对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码值之差。例如:输入的两个字符串分别为abcdefg与abceef,则输出为-1。
思路:题目要求实现的功能,相当于字符串处理函数strcmp的功能,即:
图4-3 字符串比较示意图
使用循环逐个比较两个字符串的每个字符,当字符出现不相等时,跳出循求不相同的两个字符的ASCII码值的差输出。
程序代码如下:
#include<iostream>
using namespace std;
#include "string.h"
int main( )
{ char str1[80], str2[80],c; int i=0,s;
gets (str1);
gets (str2);
while ((str1[i]==str2[i]) && (str1[i]!= '\0'))
i++;
s= str1[i]-str2[i];
cout<<s<<endl;
return 0;
4.编程实现功能:求二维数组周边元素之与。
思路:二维数组中的数据可以看成一个二维矩阵,例如下面的二维数组,输出周边元素之与为:sum=48,用两个并列的for循环实现求累加与。
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
程序代码如下:
#include<iostream>
using namespace std;
#include "string.h"
const M=4;
const N=4;
int main( )
{ int a[M][N],i,j,sum=0;
for (i=0; i<M; i++)
for (j=0; j<N; j++)
cin>>a[i][j];
for (i=0; i<N; i++) /*求第1行与第4行元素与*/
{ sum+=a[0][i];
sum+= a[M-1][i];
for (i=1; i<M-1; i++) /*求第1列与第4列元素与,
但不包括a[0][0], a[3][0], a[0][3], a[3][3]四个角上的元素*/
{ sum+=a[i][0];
sum+= a[i][N-1];
cout<<"二维数组周边元素之与为:"<<sum<<endl;
return 0;
5. 编程求出3阶方阵的两条对角线上元素之与。
程序代码如下:
#include<iostream>
using namespace std;
int main()
{ int arr[3][3]={0,2,2,3,4,4,5,6,6},a=0,b=0,i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++) /*求主对角线上元素与*/
if(i==j)
a=a+arr[i][j];
for(i=0;i<3;i++) /*求次对角线上元素与*/
for(j=2;j>=0;j--)
if(i+j==2 )
b=b+ arr[i][j];
cout<<"主对角线元素与为:"<<a<<endl;
cout<<"次对角线元素与为:"<<b<<endl;
return 0;
6.编程序求Fibonacci数列的前10项,并按每行3个数的格式输出该数列。Fibonacci数列的定义为:
1 (n=1)
1 (n=2)
fn-1+fn-2 (n>2)
fn=
程序代码如下:
#include<iostream>
#include<iomanip>
using namespace std;
int main( )
{ int i;
long f[10]={1,1};
for (i=2; i<30; i++)
f[i]=f[i-2]+f[i-1];
for (i=0; i<10; i++)
{ if(i%3==0) cout<<"\n";
cout<<setw(12)<<f[i];
cout<<endl;
return 0;
第 19 页
展开阅读全文