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 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
#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 #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