4.conv(b)
int b;
{ if(b>=2)conv(b/2);
printf("%d",b%2);
return;
}
main()
{ int d;
scanf("%d",&d);
conv(d);
}
说明:本程序执行时从键盘上输入:22后跟回车键。
【解析】主函数中输入整数22存入变量d中,然后调用函数。conv()。此时将把实参d中的22传递给形参b。然后再执行函数体,函数体中前面一条语句是单分支语句,当b>=2时再用“b/2”调用自己,显然这是一个递归调用的函数。下面我们来详细分析递归调用的过程:
第1次调用函数(b=22),满足条件,引起第2次调用自己(b/2=11)
第2次调用函数(b=11),满足条件,引起第3次调用自己(b/2=5)
第3次调用函数(b=5),满足条件,引起第4次调用自己(b/2=2)
第4次调用函数(b=2),满足条件,引起第2次调用自己(b/2=1)
第5次调用函数(b=1),不满足条件,执行输出语句,输出结果为 b%2=1%2=1
执行第5次调用的返回,执行第今次调用时的输出语句,输出结果为b%2=2%2=0
执行第4次调用的返回,执行第3次调用时的输出语句,输出结果为b%2=5%2=1
执行第3次调用的返回,执行第2次调用时的输出语句,输出结果为b%2=11%2=1
执行第2次调用的返回,执行第1次调用时的输出语句,输出结果为b%2=22%2=0
执行第1次调用的返回,将返回主函数,结束程序的运行。
所以程序运行的输出结果是:10110。
【参考答案】10110。
5.void f(p1,p2)
int *p1,*p2;
{ int i,j;
*p2=0;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
*p2+=*(pl+i*3+j);
return;
}
main()
{ int a[3][3]={{1,2},{3,4},{5,6}};
int s;
f(a,&s);
printf("%d",s);
}
【解析】本程序是由一个无返回值的函数f()和主函数组成的。先看主函数,定义了一个3行3列的二维数组a,并且给a赋了初值,初值如下:
a[0][0]=1 a[0][1]=2 a[0][2]=0
a[1][0]=3 a[1][1]=4 a[1][2]=0
a[2][0]=5 a[2][1]=6 a[2][2]=0
接着调用无返回值的函数f(),然后输出变量s中的值,显然这个s中的值是在函数f()中获得的。
接下来分析函数f()。该函数有两个形参,第1个形参是指针变量p1,对应的实际参数是数组a的首地址,即调用该函数后,指针变量p1是指向二维数组a的首地址。第2个形参也是指针变量p2,对应的实参是变量s的地址,即函数调用后指针变量p2是指向变量s的。再来分析函数体。前面定义了两个变量i和j,从后面的循环语句中看出是二重循环的控制变量。接着,通过“*p2=0”,给变量s赋值0。二重for循环的循环体是“*p2+=*(p1+i*3+j)”,其中的“*p2”是代表变量s的,“*(p1+i*3+j)”是代表数组元素a[i][j],这个赋值语句是把a[i][j]加到变量s中(即求数组元素的和)。现在只要分析清楚二重循环是对哪些数组元素进行求和的就可以得出变量s的值了。
下面是对二重循环的执行记录:
i=0 j=0 对应a[0][0],其值为1
j=1 对应a[0][1],其值为2
j=2 对应a[0][2],其值为0
i=1 j=1 对应a[1][1],其值为4
j=2 对应a[1][2],其值为0
i=2 j=2 对应a[2][2],其值为0
所以,s=a[0][0]+a[0][l]+a[0][2]+a[1][1]+a[2][2]+a[2][2]= 1+2+0+4+0+0=7。
【参考答案】7。
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |