游洪跃的程序设计第5章 习题解答Word文档下载推荐.docx
《游洪跃的程序设计第5章 习题解答Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《游洪跃的程序设计第5章 习题解答Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
![游洪跃的程序设计第5章 习题解答Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/8/d13f56de-ba8f-42c7-9a5a-ef52382ccf75/d13f56de-ba8f-42c7-9a5a-ef52382ccf751.gif)
C)输出字符cD)程序出错
数组s[]的首地址值s是不可改变的,故该程序编译时会出错。
D
3.有以下程序:
ex5_1_3\main.c*/
/*标准输入/出头文件*/
intmain(void)/*主函数main()*/
inta[10]={1,2,3,4,5,6,7,8,9,10},*p=&
a[3],*q=p+2;
/*定义数组及变量*/
*p+*q);
/*输出*p+*q之值*/
/*返回值0,返回操作系统*/
程序运行后的输出结果是。
A)16B)10C)8D)6
数组a各元素a[0]-a[9]的值依次为1~10,语句“*p=&
a[3]”把指针变量p初始化为&
a[3],即*p的值为4,指针变量q初始化为“*q=p+2”,所以*q的值为6,从而*p+*q=l0。
B
4.有以下程序:
ex5_1_4\main.c*/
voidSort(inta[],intn)/*将a中元素从大到小进行排序*/
inti,j,t;
/*定义变量*/
for(i=0;
i<
n-1;
i++)
for(j=i+1;
j<
n;
j++)
if(a[i]<
a[j])
{t=a[i];
a[i]=a[j];
a[j]=t;
}
inta[10]={1,2,3,4,5,6,7,8,9,10},i;
Sort(a+2,5);
10;
printf("
%d,"
a[i]);
/*输出a[i]*/
\n"
);
/*换行*/
A)1,2,3,4,5,6,7,8,9,10B)1,2,7,6,3,4,5,8,9,10,
C)1,2,7,6,5,4,3,8,9,10D)1,2,9,8,7,6,5,4,3,10,
函数Sort()的功能是将数组a中的元素按照从大到小的顺序排列。
但主函数调用Sort()时,实参是a+2和5,即是将数组a中a[2]-a[6]共5个元素进行从大到小的排序。
所以得到的输出结果应该是1,2,7,6,5,4,3,8,9,10。
5.以下数组定义中错误的是。
A)intx[][3]={0};
B)intx[2][3]={{1,2},{3,4},{5,6}};
C)intx[][3]={1,2,3},{4,5,6}};
D)intx[2][3]={1,2,3,4,5,6};
二维数组赋初值时,第一个维数,即行数可以省略,但是列数不能省略。
因此选项A,C正确。
选项D是按数据在二维数组中的顺序初始化。
在选项B中,行维数的初始化格式跟定义的维数不一致,为错误选项。
6.有以下程序:
ex5_1_6\main.c*/
inti,t[][3]={9,8,7,6,5,4,3,2,1};
/*定义变量及数组*/
3;
%d"
t[2-i][i]);
/*输出元素值*/
程序的执行后的输出结果是。
A)753B)357C)369D)751
定义二维数组时第一维的长度可以不指定,该程序中t[][3]通过赋初值等价于t[3][3],并且其数组按行进行赋值,通过for循环输出的分别是t[2][0]、t[1][1]和t[0][2]。
7.若有语句“char*line[5];
”,以下叙述中正确的是。
A)定义line是一个数组,每个数组元素是一个基类型为char的指针变量
B)定义line是一个指针变量,该变量可以指向一个长度为5的字符型数组
C)定义line是一个指针数组,语句中的*号称为取址运算符
D)定义line是一个指向字符型函数的指针
在语句“char*line[5];
”中,遵照运算符的优先级,[]的优先级高于*号,因此line先与[]结合,构成一个数组,数组的基类型为“char*”,所以line为指针数组,它的每个元素都是基类型为char的指针。
所以选项A叙述正确。
A
8.有以下程序:
ex5_1_8\main.c*/
inta[3][3],*p,i;
/*定义数组及变量*/
p=&
a[0][0];
/*p指向数组a的首元素*/
9;
i++)
p[i]=i;
/*为p[i]赋值*/
%d"
a[1][i]);
/*输出a[1][i]*/
/*换行*/
A)012B)123C)234D)345
p指向二维数组a的首元素,而二维数组是按行存放的。
因此“for(i=0;
i<
9;
i++)p[i]=i;
”的结果是等价于a[3][3]={0,1,2,3,4,5,6,7,8},也就是a[3][3]={{10,1,2},{3,4,5},{16.7,8}}。
因此a[1][i](i=0,1,2)的结果是3,4,5。
9.若有定义语句“inta[2][3],*p[3];
”,则以下语句中正确的是。
A)p[0]=a;
B)p[0]=a;
C)p[0]=&
a[1][2];
D)p[1]=&
a
因为*p[3]定义成指针数组,指针数组中的任何元素都是基类型为int的指针,只有选项B是正确的。
10.设已有定义“floatx;
”,则以下对指针变量p进行定义且赋初值的语句中正确的是。
A)float*p=1024;
B)int*p=(float)x;
C)floatp=&
x;
D)float*p=&
指针的值是变量的地址而不能是数值常量,所以选项A错;
选项B同样是将float类型的值赋给指针而不是地址,所以选项B也错。
定义指针变量前面必须有星号(*),所以选项C不正确。
11.若有定义“shortinta[]={10,20,30},*p=&
a;
”,当执行“p++;
”后,下列说法错误的是。
A)p向高地址移了一个字节B)p向高地址移了一个存储单元
C)p向高地址移了两个字节D)p与a+l等价
“*p=&
a”将数组a[]的首地址赋给指针p,通过对指针变量加上一个整数可以移动指针,移动的单位为存储单元,shortint型变量在存储器中占两个字节。
12.有以下程序:
e5_1_12\main.c*/
/*标准输入/输出头文件*/
inta=1,b=3,c=5;
/*定义变量*/
int*p1=&
a,*p2=&
b,*p=&
c;
/*为指针变量赋值*/
*p=*p1*(*p2);
/*修改p2指向的变量的值*/
c);
/*输出c*/
执行后的输出结果是。
A)1B)2C)3D)4
指针p1指向变量a,指针p2指向变量b,指针p指向变量c,“*p=*p1*(*p2);
”等价于“c=a*b”,故正确选项为C。
13.己定义以下函数:
intf(int*p)
{return*p;
f()函数返回值是。
A)不确定的值B)一个整数
C)形参p中存放的值D)形参p的地址值
p中存放的是地址值,*p间接引用了p指向的整数值。
因此返回一个整数。
14.己有定义“chara[]="
xyz"
b[]={'
x'
'
y'
z'
};
A)数组a和b的长度相同B)a数组长度小于b数组长度
C)a数组长度大于b数组长度D)上述说法都不对
对于定义“chara[]="
”,由于字符串"
串长为3,连同隐含的结束符'
\0'
,占4个字节,所以a数组的长度为4。
而b数组由单个字符赋初值,个数是3,因此b数组长度为3。
15.有以下程序:
ex5_1_15\main.c*/
charch[]="
uvwxyz"
*pc;
/*定义字符数组与字符指针*/
pc=ch;
/*pc指向字符数组ch的首字符*/
%c\n"
*(pc+5));
/*输出*(pc+5)*/
A)zB)0C)元素ch[5]地址D)字符y的地址
字符指针pc指向字符串数组ch的的首字符,*(pc+5)就是pcI5l的值。
16.有以下程序:
ex5_1_16\main.c*/
159"
*p;
/*定义数组与指针*/
p=s;
/*p指向s的首字符*/
%c"
*p++);
/*输出*p++*/
A)15B)16C)12D)59
数组s中存放字符串"
p指向s的首字符。
因此语句"
printf("
*p++);
”输出的是字符'
1'
,输出后p加1指向下一个字符'
5'
,下一个“peintf(.1%c"
。
17.若要求从键盘读入含有空格字符的字符串,应使用函数。
A)puts()B)gets()C)getchar()D)scanf()
函数puts()是从屏幕输出一个字符。
getchar()从键盘读入一个字符。
scanf()是格式化输入函数,空格字符被用于多个数据输入的分隔符,含有空格的字符串会被截断。
gets()用于字符串的输入,并且以回车键为结束符。
*18.对于长度为n的查找表进行顺序查找,在最坏情况下所需要的比较次数为。
A)log2nB)n/2C)nD)n+l
如果查找表中的第一个元素就是要查找元素,则只需做一次比较就查找成功;
如果被查找的元素是查找表中的最后一个元素,或者被查找的元素根本就不在查找表中,则需要与查找表中所有的元素进行比较,可知对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。
*19.冒泡排序在最坏情况下的比较次数是。
A)n(n+l)/2B)nlog2nC)n(n-1)/2D)n/2
如果查找表的长度为n,则在最坏情况下,冒泡排序需要经过n-1趟从前往后扫描,每趟扫描需要的比较次数依次是n-1,n-2,…,1,需要总比较次数为n(n-1)/2。
二、填空题
1.设有定义语句“inta[][3]={{0},{1},{2}};
”,则数组元素a[1][2]的值为。
二维数组中当某行一对花括号内的初值个数小于该行中元素的个数时,系统将自动给该行后面的元素补初值0,由此可见数组a[1][2]=0。
2.以下程序中,LineMax()函数的功能是求3行4列二维数组每行元素中的最大值,请填空。
ex5_2_2\main.c*/
/*标准输入/输出头文件*/
voidLineMax(intm,intn,inta[][4],int*bar)
inti,j,x;
/*定义变量*/
m;
{
x=a[i][0];
/*第i行的首元素*/
for(j=0;
if(x<
a[i][j])/*如果x小于第i行的j号元素a[i][j]*/
x=a[i][j];
/*则将a[i][j]赋给x*/
=x;
/*x为第i行的最大值*/
intmain(void)/*主函数main()*/
inta[3][4]={{12,41,36,28},{19,33,15,27},{3,27,19,1}},b[3],i;
LineMax(3,4,a,b);
/*调用LineMax()函数求每行的最大值*/
%4d"
b[i]);
/*输出每行的最大值*/
/*换行*/
/*返回值0,返回操作系统*/
函数LineMax()的功能是求出二维数组每行元素中的最大值。
对于3行4列的二维数组将有3个最大值存放到数组bar[]中。
x存放的是每行的最大值,求出每行的最大值x后,应该将x赋值给bar[i]。
因此此处填空应该是:
bar[i]。
bar[i]
3.己知“inta=3;
”,a的地址为1001,&
a=。
变量的地址可以通过运算符&来得到,而a的存储单元地址是1001,所以&
a=1001。
1001
4.以下程序的功能是:
利用指针指向三个整型变量,并通过指针运算找出三个数中的最大值,输出到屏幕,请填空。
ex5_2_4\main.c*/
intx,y,z,max,*px=&
x,*py=&
y,*pz=&
z,*pmax=&
max;
/*定义变量*/
scanf("
%d%d%d"
&
x,&
y,&
z);
/*输入x,y,z*/
;
if(*pmax<
*py)/*如果*py更大*/
*pmax=*py;
/*则将*py赋给*pmax*/
*pz)/*如果*pz更大*/
*pmax=*pz;
/*则将*pz赋给*pmax*/
max=%d\n"
max);
/*输出最大值*/
程序中定义了4个指针变量,px指向x,py指向y,pz指向z,pmax指向max,if语句将pmax指向的存储单元的值与*py与*pz两个数值比较,可知*px代表x的值,可知初始时假设x中的值最大,就让pmax指向x。
*pmax=*px或*pmax=x或max=*px或max=x
5.以下程序的输出结果是。
ex5_2_5\main.c*/
string.h>
/*字符串头文件*/
strlen("
IBM\n012\1\\"
));
/*输出字符串的长度*/
转义符'
\n'
、'
\1'
和'
\\'
都会别只算一个字符,所以"
的字符数为9。
9
6.以下程序的输出结果是。
e5_2_6\main.c*/
chara[]={'
\2'
\3'
\4'
\0'
%d,%d\n"
sizeof(a),strlen(a));
/*输出字符串所占空间大小与长度*/
strlen()求字符串的实际长度,不包括'
,sizeof()是求数组a所占的字节,包括'
5,4
*7.对长度为10的查找表表进行冒泡排序,最坏情况下需要比较的次数为。
如果查找表的长度为10,则在最坏情况下,冒泡排序需要经过n-1趟从前往后扫描,每趟扫描需要的比较次数依次是9,8,…,1,需要总比较次数为36。
45
三、编程题
1.求一个4×
4整型矩阵对角线元素之和。
参考程序:
ex5_3_1\main.c*/
/*包含库函数printf()所需要的信息*/
stdlib.h>
/*包含库函数system()所需要的信息*/
intSum(inta[4][4])/*返回二维数组a对角线元素之和*/
ints=0,i;
4;
{/*求对角线元素之和*/
s=s+a[i][i];
/*累加主对角线*/
s=s+a[i][3-i];
/*累加副对角线*/
returns;
/*返回对角线元素之和*/
}
inta[4][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}
};
/*定义二维数组*/
对角线元素之和为%d\n"
Sum(a));
/*输出二维数组a对角线元素之和*/
system("
PAUSE"
/*调用库函数system(),输出系统提示信息*/
/*返回值0,返回操作系统*/
2.将一个数组中的值按逆序重新存放,例如,原来的顺序为6,8,5,2,9。
要求重排为9,2,5,8,6。
ex5_3_2\main.c*/
voidReverse(