《浙工大C语言课本习题答案》 联系客服

发布时间 : 星期日 文章《浙工大C语言课本习题答案》更新完毕开始阅读8d8b0035f111f18583d05a31

void main(} { int i;

for(i=1;i<=1000;i++) if(f(i)) printf(\ }

⑸ 定义函数,形参为两个int类型变量,功能是显示这两个数的最大公约数和最小公倍数。

解答: void f(int x,int y) { int a=x;

while(a%y!=0) a+=x;

printf(\最小公倍数%d,最大公约数%d\\n\ }

⑹ 多项式p(n,x)定义如下,编写递归函数求该多项式的值。

解答: double p(int n,double x) { if(n==0) return 1;

else if(n==1) return x;

else return((2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x))/n; }

习 题 六

1. 单项选择题

⑴ 程序中调用了库函数exit,必须包含头文件【D】

A、math.h B、string.h C、ctype.h D、stdlib.h ⑵ 程序中调用了库函数strcmp,必须包含头文件【B】

A、math.h B、string.h C、ctype.h D、stdlib.h ⑶ 下列宏定义命令中,哪一个格式是正确的【C】

A、#define pi=3.14159; B、define pi=3.14159 C、#define pi 3.14159 D、#define pi(3.14159); ⑷ 定义带参数的宏计算两个表达式的乘积,下列定义中正确的是【C】 A、#define muit(u,v) u*v B、#define muit(u,v) u*v; C、#define muit(u,v) (u)*(v) D、#define muit(u,v)=(u)*(v) ⑸ 宏定义为“#define div(a,b) a/b”,对语句

“printf(\”作宏替换后为【A】 A、printf(\、printf(\ C

printf(\

D

printf(\

2. 填空题

⑴ 定义一个带参数的宏,若变量中的字符为大写字母则转换成小写字母 #define utol(ch) ch=ch>='A'&& ch<='Z' ? ch+'a'-'A':ch

17

⑵ 定义一个带参数的宏,将两个参数的值交换 #define swap(a,b) { double t; t=a;a=b;b=t; }

⑶ 函数f定义如下,执行语句“m=f(5);”后,m的值应为 8 。 int f(int k)

{ if(k==0||k==1) return 1; else return f(k-1)+f(k-2); }

⑷ 函数f定义如下,执行语句“sum=f(3)+f(3);”后,sum的值应为 6 。 int f(int m)

{ static int i=0; int s=0;

for(;i<=m;i++) s+=i; return s; }

⑸ 对下列函数f,f(f(4))的值是 5 。 int f(int x)

{ static int k=0; x+=k++; return x; }

3. 写出下列程序的输出结果

程序⑴ #include #define S x=y=z

#define P3(x,y,z) printf(\ void main() { int x,y,z;

S=1; ++x||++y||++z; P3(x,y,z); S=1; ++x&&++y||++z; P3(x,y,z); S=-1; ++x||++y&&++z; P3(x,y,z); S=-1; ++x&&++y&&++z; P3(x,y,z); }

输出结果为 x=2 y=1 z=1 x=2 y=2 z=1

x=0 y=0 z=-1 x=0 y=-1 z=-1

程序⑵ #include

int func1()

{ static int s=1; s+=2; return s; }

int func2()

{ int s=1; s+=2; return s; } void main() { int i;

for(i=0;i<2;i++) printf(\

18

printf(\ }

输出结果为 func1=3 func1=5 func2=3 func2=3

程序⑶ #include

int i=1,reset(),next(int),last(int),New(int); void main() { int i,j; i=reset();

for(j=1;j<=3;j++) {

printf(\

printf(\ printf(\

printf(\ } }

int reset() 输出结果为 i=1,j=1 { return i; } next(1)=1 int next(int j) last(1)=10 { return j=i++; } new(1+1)=12 int last(int j) i=1,j=3 { static int i=10; next(1)=2 return j=i--; last(1)=9 } new(1+2)=13 int New(int i) i=1,j=3 { int j=10; next(1)=3 return i=j+=i; last(1)=8 } new(1+3)=14

4.根据下列各小题题意编程。

⑴ 编程,输入3个数后输出其中绝对值最小的数。要求定义带参数的宏,计算两个数中绝对值最小的数。

解答: #include #include

#define min(a,b) fabs(a)

{ float a1,a2,a3,x;

scanf(\

x=min(a1,a2); x=min(x,a3); printf(\ }

⑵ 编程,用梯形公式求函数 f(x)=x-sinx在[0,1]区间的定积分,要求用带参数的宏定义函数f(x)的计算公式。

解答: #include #include

#define f(x) (x)*(x)-asin(x)

2

-1

19

void main()

{ double x=0,y=0;

for(int i=1;i<=10;i++) { y=y+(f(x)+f(x+0.1))/20; x=x+0.1;} printf(\ }

习 题 七

1. 单项选择题

⑴ 下列数组声明语句中,正确的是【C】

A、int a[]={1,2,,4,5}; B、char a[5]={A,B,C,D,E}; C、int a[5]={1,2}; D、char a[5]=\

⑵ 数组声明语句为“int a[6];”,输入数组所有元素的语句应为【B】 A、scanf(\

B、for(int i=0;i<6;i++) scanf(\ C、for(int i=0;i<6;i++) scanf(\ D、for(int i=0;i<6;i++) scanf(\

⑶ 数组声明语句为“float a[3][4];”,引用第3行第1列的元素写作【A】 A、**(a+2) B、*(*a+2) C、a[3][1] D、*(a[3]+1) ⑷ 初始化多维数组的语句中,可以缺省的是【B】

A、最后1个下标界 B、第1个下标界 C、第2个下标界 D、以上都不对 ⑸ 数组声明为“int y[4][3];”,表达式“*(y+2)+2-*y”的值为【D】 A、10 B、20 C、16 D、8 ⑹ 数组声明为“char str1[20]=\”, 调用函数“strcpy(str1,str2);”后,字符串str1的串长是【C】 A、13 B、15 C、6 D、7 ⑺ 数组声明为“char str1[20]=\”, 调用函数“strcat(str1,str2);”后,字符串str1的串长是【A】 A、13 B、15 C、6 D、7 ⑻ 表达式“strcmp(\”的值为【C】 A、0 B、3 C、1 D、-3

2. 填空题。

⑴ 未初始化的int类型数组,其各元素的值是 0 。

⑵ 初始化时没有被赋值的字符类型数组元素,它们的值为 '\\0' 。 ⑶ 数组声明为“int a[6];”,数组元素a[1]是否又可以写作“*(a++)”? 原因是 不可以,数组名(地址常量)不可改变 。

⑷ 引用二维数组a第i行、j 列的元素(i、j为0表示第1行、第1列),可以写 作 *(*(a+i-1)+j-1) 或 a[i-1][j-1] 。

⑸ 数组声明为“int a[6][6];”,表达式“*a+i”是指 第1行第i+1个元素的地址、 “*(a+i)”是指 第i+1行第1个元素的地址、“**a”又是指a[0][0]。 ⑹ 数组声明为“float x[7][5];”,若x[6][4]是内存中从x[0][0]数起的第35个 元素,则x[4][4]是第 25 个元素。

20