C语言程序设计教程 清华大学出版社 陈明主编 第4章答案Word格式文档下载.docx
《C语言程序设计教程 清华大学出版社 陈明主编 第4章答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言程序设计教程 清华大学出版社 陈明主编 第4章答案Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
y?
x:
y;
}
intf2(intx,inty){returnx>
y:
x;
intmain(void)/*主函数main()*/
{
inta=4,b=3,c=5,d=2,e,f,g;
/*定义变量*/
e=f2(f1(a,b),f1(c,d));
f=f1(f2(a,b),f2(c,d));
/*调用函数*/
g=a+b+c+d-e-f;
/*算术运算*/
printf("
%d,%d,%d\n"
e,f,g);
/*输出e,f,g*/
return0;
/*返回值0,返回操作系统*/
}
程序运行后的输出结果是。
A)4,3,7B)3,4,7C)5,2,7D)2,5,7
函数f1用于求两个数中的最大数,而函数f2用于求两个数中的最小数。
因此有:
e=f2(f1(a,b),f1(c,d))=f2(f1(4,3),f1(5,2))=f2(4,5)=4;
f=f1(f2(a,b),f2(c,d))=f1(f2(4,3),f2(5,2))=f1(3,2)=3;
g=a+b+c+d-e-f=4+3+5+2-4-3=7。
4.若函数调用时的实参为变量,以下关于函数形参和实参的叙述中正确的是。
A)函数的实参和其对应的形参共占同一存储单元
B)形参只是形式上的存在,不会占用具体存储单元
C)同名的实参和形参占同一存储单元
D)函数的形参和实参分别占用不同的存储单元
在C语言中,函数的形参和实参是分别占用不同的存储单元的,因此,选项D是正确的。
5.有以下程序:
e4_1_5\main.c*/
/*标准输入/输出头文件*/
inta=1;
/*全局变量*/
intf(intc)/*定义函数*/
staticinta=2;
/*静态变量*/
c++;
/*c自加1*/
return(a++)+c;
/*返回函数值*/
intmain(void)/*主函数main()*/
inti,k=0;
/*定义变量*/
for(i=0;
i<
2;
i++)
{inta=3;
k+=f(a);
}/*循环调用f()函数*/
k+=a;
/*将全局变量a的值加到k*/
%d\n"
k);
/*输出k*/
/*返回值0,返回操作系统*/
程序的运行结果是。
A)14B)15C)16D)17
题中“staticinta=2”定义了一个static局部变量,编译程序为其生成永久存储单元,在调用函数f()时,值一直都保存着,在主函数中,for循环进行两次,第一次循环得f(3)=2+3+1=6,从而k+=f(3)=6,第二次循环由于static局部变量a变成了3,从而f(3)=3+3+1=7,故k+=f(3)=13,最后执行k+=a时,此时a的值为全局变量,其值为1,所以k的值为14,选项A是正确的。
6.有以下程序:
e4_1_6\main.c*/
inta=4;
intf(intn)/*定义函数*/
intt=0;
/*局部变量*/
staticinta=5;
if(n%2){inta=6;
t+=a++;
else{inta=7;
returnt+a++;
/*返回函数值*/
ints=a,i;
i++)s+=f(i);
/*循环调用f()函数*/
s);
/*输出s*/
A)24B)28C)32D)36
main()函数在开始时,s=a=4,其中的a为全局变量。
第1次循环时,i=0,f(i)=f(0),将0传递给形参n,首先执行if语句中的条件“n%2”;
条件为假,则执行else下的复合语句“{inta=7;
}”,可知t=0+7=7,使用return返回t=7+(a++)=7+5=12,a运算完后自增1,变为6,这里的a为函数f()内,复合语句之外的a,返回主函数后s=4+12=16。
第2次循环时,当i=1时,f(i)=f
(1),将1传递给形参n,首先执行if语句中的条件“n%2”;
条件为真,则执行if下的得合语句“{inta=6;
}”,可知t=0+6=6,使用return返回t=6+(a++)=6+6=12,这里的a为函数f()内,复合语句之外的a,返回主函数后s=16+12=28。
B
7.有以下程序:
e4_1_7\main.c*/
/*标准输入/输出头文件*/
Fun(intx,inty)
staticintm=0,i=2;
/*静态变量*/
i+=m+1;
m=i+x+y;
/*对静态变量作赋值运算*/
returnm;
intmain(void)/*主函数main()*/
intj=1,m=1,k;
k=Fun(j,m);
/*调用函数Fun()*/
%d,"
/*输出k*/
/*返回值0,返回操作系统*/
执行后的输出结果是。
A)5,5B)5,11C)11,11D)11,5
在第1次调用Fun()函数时,x=1,y=1,函数Fun()的静态变量i=2+0+1=3,m=3+1+1=5,返回m=5。
在第2次调用Fun()函数时,x=1,y=1,函数Fun()的静态变量i=3+5+1=9,m=9+1+1=11,返回m=11。
8.在一个C源程序文件中所定义的全局变量,其作用域为。
A)所在文件的全部范围B)所在程序的全部范围
C)所在函数的全部范围D)由具体定义位置和extern说明来决定范围
全局变量的作用域不但从具体定义位置开始,直到文件结束为止,而且还可用extern声明来扩大作用域围,所以此选项D正确。
9.在C语言中,函数的隐含存储类别是。
A)autoB)staticC)externD)无存储类别
C语言规定,函数的隐含存储类别为外部类型,即extern类型,允许其他文件中的函数调用。
C
10.有以下程序:
ex4_1_10\main.c*/
intFun(intx)
if(x==0||x==1)return3;
/*递归结束*/
elsereturnx-Fun(x-2);
/*递归调用*/
Fun(7));
/*输了Fun(7)*/
A)7B)3C)2D)0
x=7,通过递归调用Fun()函数后得到Fun(7)=7-Fun(5)=7-(5-Fun(3))=2+3-Fun
(1)=2。
*11.下面选项中不属于面向对象程序设计特征的是。
A)继承性B)多态性C)类比性D)封装性
面向对象技术有三个重要特性:
封装性、继承性和多态性;
而类比性不属于面向对象的特征。
12.对于一个正常运行的C程序,以下叙述中正确的是。
A)程序的执行总是从main函数开始,在main函数结束
B)程序的执行总是从程序的第一个函数开始,在main函数结束
C)程序的执行总是从main函数开始,在程序的最后一个函数中结束
D)程序的执行总是从程序的第一个函数开始,在程序的最后一个函数中结束
C程序的执行总是从main函数开始,完成对其他函数的调用后返回到main函数,最后由main函数结束整个程序。
一个C源程序有且公有一个main函数。
二、填空题
1.以下程序中,函数Fun()的功能是计算x2-2x+6,主函数中将调用Fun()函数计算:
y1=(x+8)2-2(x+8)+6
y2=sin2(x)-2sin(x)+6
请填空。
e4_2_1\main.c*/
math.h>
/*数学函数首部文件*/
doubleFun(doublex){returnx*x-2*x+6;
doublex,y1,y2;
输入x:
"
);
/*输入提示*/
scanf("
%lf"
&
x);
/*输入x*/
y1=Fun(【1】);
/*调用函数Fun()*/
y2=Fun(【2】);
y1=%lf,y2=%lf\n"
y1,y2);
/*输出y1,y2*/
函数的一般调用形式为:
函数名(实在参数表),在调用时将实参的值赋给形参,实参可以是常量、变量或表达式。
【1】x+8【2】sin(x)
2.有以下程序:
e4_2_2\main.c*/
intsub(intn){returnn/10+n%10;
intx,y;
/*定义变量*/
%d"
y=sub(sub(sub(x)));
/*调用函数*/
y);
/*输出y*/
若运行时输入:
1234<
回车>
,程序的输出结果是。
1234作为实参传递给形参n,sub(x)值为1234/10+1234%10=123+4=127,sub(sub(x)=sub(127)=127%10+127%10=12+7=19,sub(sub(sub(x)))=sub(19)=9/10+19%10=10,所以将输出10。
10
3.以下程序运行后的输出结果是。
e4_2_3\main.c*/
voidswap(intx,inty)
intt=x;
x=y;
y=t;
/*交换x,y*/
%d%d"
x,y);
/*输出x,y*/
inta=3,b=4;
/*定义变量*/
swap(a,b);
/*调用函数*/
%d%d\n"
a,b);
/*输出a,b*/
C函数的参数传递都是传值的,因此swap(a,b)调用将a和b的值3和4传递给swap的形参x和y,x和y通过t交换值,printf输出x和y结果是“43“。
swap函数调用结束后,a和b的值并没有交换,printf输出a和b结果是“34”。
4334
4.以下程序运行后的输出结果是。
e4_1\main.c*/
Fun(inta)
intb=0;
staticintc=3;
b++;
/*b,c自加1*/
returna+b+c;
intmain(void)/*主函数main(void)*/
inti,a=5;
3;
i++)
printf("
i,Fun(a));
/*输出i,Fun(a)*/
\n"
/*换行*/
第1次调用Fun()函数时,a=5,“b++;
”执行后,b=1,c=4,返回5+1+4=10;
第2次调用Fun()函数时,a=5,“b++;
”执行后,b=1,c=5,返回5+1+5=11;
第3次调用Fun()函数时,a=5,“b++;
”执行后,b=1,c=6,返回5+1+6=12。
010111212
5.以下程序运行后的输出结果是。
ex4_2_5\main.c*/
intf(inta[],intn)
if(n>
=1)returnf(a,n-1)+a[n-1];
/*递归调用*/
elsereturn0;
/*递归结束*/
inta[]={1,2,3,4,5},s;
/*定义数组与变量*/
s=f(a,5);
/*调用函数f()*/
/*输出s*/
通过递归调用f函数实现了数组各元素之和,即a[0]+a[1]+a[2]+a[3]+a[4]=15。
15
*6.在面向对象方法中,类的实例称为。
将属性、操作相似的对象归为类,类是具有共同属性、共同方法的对象的集合。
所以,类是对象的抽象,而一个对象则是其对应类的一个实例。
对象
三、编程题
1.编写一个函数,其功能是判断输入的三个边是否能组成三角形,要求编写测试程序。
参考程序:
ex4_3_1\main.c*/
/*包含库函数printf()所需要的信息*/
stdlib.h>
/*包含库函数system()所需要的信息*/
intIsTriangle(floata,floatb,floatc)/*a,b,c能组成三角形,返回1,否则返回0*/
if(a>
0&
&
b>
c>
a+b>
c&
a+c>
b&
b+c>
a)
{/*能组成三角形*/
return1;
/*返回1*/
else
{/*不能组成三角形*/
return0;
/*返回0*/
floata,b,c;
输入三边长:
/*输入提示*/
%f%f%f"
a,&
b,&
c);
/*输入a,b,c*/
if(IsTriangle(a,b,c))
{/*能组成三错角形*/
%f,%f,%f能组成三角形\n"
a,b,c);
{/*不能组成三错角形*/
%f,%f,%f不能组成三角形\n"
system("
PAUSE"
/*调用库函数system(),输出系统提示信息*/
2.编写一个函数,其功能是输入n个数,返回这些数的最大值,要求编写测试程序。
ex4_3_2\main.c*/
intMax(intn)/*求输入的n个数的最大值*/
intm,i,tem;
输入%d个数:
n);
/*输入提示*/
m);
/*先假设输入的第1个数就是最大值*/
for(i=1;
n;
{/*依次输入其它各数,比较求最大值*/
scanf("
tem);
/*输入输入其它各数*/
if(tem>
m)m=tem;
/*比较求最大值*/
/*返回最大值*/
intn,m;
输入个数n:
:
n);
/*输入n*/
m=Max(n);
/*求输入的n个数的最大值*/
输入的%d个数的最大值为%d\n"
n,m);
/*输出结果*/
3.编写一个函数,其功能是输入n个数,返回这些数的最小值,要求编写测试程序。
ex4_3_3\main.c*/
intMin(intn)/*求输入的n个数的最小值*/
/*先假设输入的第1个数就是最小值*/
{/*依次输入其它各数,比较求最小值*/
if(tem<
/*比较求最小值*/
m=Min(n);
/*求输入的n个数的最小值*/
输入的%d个数的最小值为%d\n"
re