教材课后题答案第5章Word文档下载推荐.docx
《教材课后题答案第5章Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《教材课后题答案第5章Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
7.以下选项中,不能正确赋值的是【】。
A)chars1[10];
s1="
China"
B)chars2[]={'
C'
'
h'
i'
n'
a'
};
C)chars3[10]="
D)chars3[10]={"
【答案】A
【解析】因为s1是数组名,代表数组的首地址,是常量,常量不能被赋值。
8.若有定义:
charx[]="
abcdefg"
chary[]={'
b'
c'
d'
e'
f'
g'
则正确的叙述为【】。
A)数组x和数组y等价B)数组x和数组y的长度相同
C)数组x的长度大于数组y的长度D)数组x的长度小于数组y的长度
【解析】因为x数组初始化是用字符串"
,x数组的长度为8,y数组初始化是用7个字符,y数组的长度为7,所以,数组x的长度大于数组y的长度。
9.函数调用:
strcat(strcpy(str1,str2),str3)的功能是【】。
A)将串str1复制到串str2中后再连接到串str3之后
B)将串str1连接到串str2之后再复制到串str3之后
C)将串str2复制到串str1中后再将串str3连接到串str1之后
D)将串str2连接到串str1之后再将串str1复制到串str3中
10.下列程序的输出结果是___________。
#include"
stdio.h"
string.h"
voidmain()
{charst[20]="
\"
hello\"
"
printf("
%d\n"
strlen(st));
}
A)6B)7C)11D)12
二、填空题
1.若有以下定义:
doublem[20];
则m数组元素的最小下标是______,最大下标是______。
【答案】0和19
2.在C语言中,二维数组元素在内存中的存放顺序是按_________存放的。
【答案】行
3.若有以下定义:
inta[3][5]={{0,1,2,3,4},{3,2,1,0},{0}};
则初始化后a[1][[2]的值是________,a[2][1]的值是_________。
【答案】1和0
4.若有以下定义:
chars[100],d[100];
intj=0,i=0;
且s中已赋字符串,请填空以实现字符串复制。
(注意:
不得使用逗号表达式)
while(s[i]){d[j]=_________;
j++;
d[j]=0;
【答案】s[i++]
5.下列程序的输出结果是_____________。
{intk,a[2];
k=a[1]*10;
k);
A)0B)1C)10D)不定值
【解析】定义a数组时没有赋初值,初值不定,因此,a[1]*10是个不定值。
6.下列程序的输出结果是____________。
{inti,a[10];
for(i=9;
i>
=0;
i--)
a[i]=10-i;
%d%d%d\n"
a[2],a[5],a[8]);
A)258B)741C)852D)369
7.下面程序的功能是:
从键盘上输入若干个学生的成绩,当输入负数时表示输入结束,计算每位学生的平均成绩,并输出低于平均分的学生成绩。
请填空。
{floatx[1000],sum=0,ave,a;
intn=0,i;
Entermark:
\n"
);
scanf("
%f"
&
a);
while(a>
=0&
&
n<
=100)
{sum+=【1】_________;
x[n]=【2】_________;
n++;
}
ave=【3】_________;
Output:
ave=%f\n"
ave);
for(i=0;
i<
n;
i++)
if(x[i]<
ave)
%f\n"
x[i]);
【答案】【1】a【2】a【3】sum/n
8.输入一个字符串,判断其是否回文,是输出“Yes!
”,不是输出“No!
”。
请填空。
(所谓回文就是正着读反着读相同。
例如:
ABCDCBA、madam是回文;
ABCDE、China不是回文)
{chars[100];
inti,j,k;
\nPleaseenterstring:
gets(【1】_________);
k=strlen(s)-1;
for(i=0,j=k;
【2】_________;
i++,j--)
if(s[i]【3】_________s[j])break;
if(i>
=j)printf("
Yes!
elseprintf("
No!
【答案】【1】s【2】i<
j或i<
=j【3】!
=
9.下面程序的功能是求二维数组周边元素之和。
二维数组中的数据如下所示,输出结果:
sum=63
12345
23456
34567
45678
#defineM4
#defineN5
{inta[M][N],i,j,sum=0;
M;
for(j=0;
j<
N;
j++)
%d"
【1】_________);
{sum+=a[0][i];
sum+=【2】_________;
for(i=1;
M-1;
{sum+=a[i][0];
sum+=【3】_________;
sum=%d\n"
sum);
【答案】【1】&
a[i][j]【2】a[M-1][i]或a[3][i]【3】a[i][N-1]或a[i][4]
10.以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码值之差。
输入的两个字符串分别为abcdefg和abceef,则输出为-1。
{charstr1[80],str2[80],c;
inti=0,s;
gets(str1);
gets(【1】_________);
while((str1[i]==str2[i])&
(str1[i]!
=【2】_________))
i++;
s=【3】_________;
s);
【答案】【1】str2【2】'
【3】str1[i]-str2[i]
三、阅读下面的程序,写出程序输出结果
1.#include"
{intn[3],i,j,k;
3;
i++)n[i]=0;
k=2;
k;
j++)n[j]=n[i]+1;
n[1]);
【答案】3
【解析】第一个for循环给n数组中各元素赋0值,第二个for循环是循环嵌套,当i等于0时,j等于0求出n[0]等于1,j等于1时求得n[1]等于2,因为此时n[0]=1而不是0了。
当i等于1时,j等于0求出n[0]等于3,j等于1时求得n[1]等于3。
2.#include"
{inta[2][3],i,j,n=1;
2;
a[i][j]=n++;
{for(j=0;
%4d"
a[i][j]);
【答案】123
456
3.#include"
{charch[7]={"
652ab31"
inti,s=0;
ch[i]>
='
0'
&
ch[i]<
9'
i+=2)
s=10*s+ch[i]-'
【答案】62
4.#include"
{charss[10]="
12345"
strcat(ss,"
6789"
gets(ss);
%s\n"
ss);
运行时输入:
ABC,写出输出结果。
【答案】ABC
5.
(1)程序的功能是什么?
(2)写出程序运行的输出结果。
#defineN8
voidmain()
{inti,j,t,min,a[N]={60,67,90,84,40,70,57,78};
for(j=0;
N-1;
for(i=j+1;
if(a[j]>
a[i])
{t=a[j];
a[j]=a[i];
a[i]=t;
for(i=0;
i<
i++)
a[i]);
【答案】
(1)用选择法将N个数从小到大排序
(2)输出结果是:
4057606770788490
四、编程题
1.编程序求Fibonacci数列的前20项,Fibonacci数列的定义为:
要求将数列存放在数组中,并按每行5个数的格式输出该数列。
程序:
{inti;
longf[30]={1,1};
for(i=2;
30;
f[i]=f[i-2]+f[i-1];
{if(i%5==0)printf("
%12ld"
f[i]);
输出结果:
11235
813213455
89144233377610
9871597258441816765
1094617711286574636875025
121393196418317811514229832040
2.用“冒泡法”将输入的10个字符按从小到大顺序排序并输出结果。
{inti,j,t;
charstr[10];
10;
%c"
str[i]);
for(j=1;
10-j;
if(str[i]>
str[i+1])
{t=str[i];
str[i]=str[i+1];
str[i+1]=t;
str[i]);
运行情况如下:
eifjsacrop
acefijoprs
3.已知a数组中的数据已按升序排序,要求从键盘输入一个数后将其插入a数组中,并使该数组中的数据仍然有序。
思路:
这是一个“插入法排序”问题。
若a数组中的数已经按由小到大排好序,现在要将输入的数n按顺序插入到a数组中。
从a[0]开始,将a数组中的每个数与n比较大小,当找到第一个比n大的数时,该位置i就是n要插入的位置,然后将a[i]开始的所有数依次后移一个位置,最后将n插入到a[i]中。
方法1算法如图5-1所示。
{inta[11]={2,4,5,6,8,10,23,36,47,68},n,i,j;
arraya:
%5d"
\nInsertdata:
n);
if(n>
a[9])a[10]=n;
else
{for(i=0;
if(a[i]>
n)
{for(j=9;
j>
=i;
j--)
a[j+1]=a[j];
a[i]=n;
break;
Now,arraya:
11;
运行结果:
245681023364768
Insertdata:
7
2456781023364768
方法2算法如图5-2所示。
{inta[11]={2,4,5,6,8,10,23,36,47,68};
intt1,t2,n,i,j;
\narraya:
a[9])
a[10]=n;
else
{if(a[i]>
{t1=a[i];
for(j=i+1;
{t2=a[j];
a[j]=t1;
t1=t2;
4.分别求N阶方阵的两条对角线上元素之和。
N阶方阵就是N行N列的矩阵,矩阵左对角线上的元素是a[i][i](i=0~N-1),右对角线上的元素是a[i][j](其中:
i=0~N-1,j=N-1-i)。
由于j的值取决于i,因此只要一个for循环即可。
例如三阶方阵
左对角线元素之和是:
1+3+6=10,右对角线上元素之和是3+3+2=8。
{inta[3][3]={1,2,3,1,3,5,2,4,6},sum1,sum2,i;
sum1=sum2=0;
{sum1=sum1+a[i][i];
sum2=sum2+a[i][3-1-i];
sum1=%dsum2=%d\n"
sum1,sum2);
sum1=10sum2=8
5.打印出以下的杨辉三角形(要求打印出6行)。
1
11
121
1331
14641
15101051
算法:
如图5-3所示
#defineN7
{inta[N][N],i,j;
{a[i][i]=1;
a[i][1]=1;
for(i=3;
for(j=2;
i;
a[i][j]=a[i-1][j-1]+a[i-1][j];
{for(j=1;
6.输入一行英文字母,统计其中有多少个单词,单词之间用空格分隔。
设:
变量word作为标志变量,初值为0;
当读到非空格时,word置1,读到空格时,word置0;
变量num作为单词记数变量,读到第一个非空格时,num加1。
因此,当读到非空格字符时首先判断是否是新单词开始,如果word为0即为新单词开始,单词记数变量num加1,单词标志变量word置1,接下来若还是非空格字符,只要word为1就不是新单词开始,接着判断下一字符,当读到空格时,将word置0。
如图5-4所示。
{inti,num=0,word=0;
charstr[80];
gets(str);
str[i]!
if(str[i]=='
'
)word=0;
elseif(word==0)
{word=1;
num++;
num);
ChineseMaterialsResearchSociety
4