x2=i;}/*语句11*/
f2(&a[x1],&a[0]);
for(i=0;i<5;i++)printf("%2d",a[i]);
printf("\n");
f1(a[x2],a[1]);
for(i=0;i<5;i++)printf("%2d",a[i]);
printf("\n");
f2(&a[x2],&a[4]);
for(i=0;i<5;i++)printf("%2d",a[i]);
printf("\n");
f1(a[x1],a[3]);
for(i=0;i<5;i++)printf("%2d",a[i]);
printf("\n");
}
voidf1(intx,inty)
{intt;
t=x;x=y;y=t;}
voidf2(int*x,int*y)
{intt;
t=*x;*x=*y;*y=t;}
数组a的原始数据为:
a[5]={1,2,3,4,5}
也就是:
a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5
语句7到语句11实现这样的功能:
在a[1]=2,a[2]=3,a[3]=4,a[4]=5找出最大和最小的数,所以x1=4
但是,没有比a[0]更小的数,所以x2一直没有变,x2=0
注意:
函数f1是传值方式调用,没有实现交换。
详细看课本P138.
注意:
函数f2是传址方式调用,实现交换。
详细看课本P139.
(21)程序运行时,第1行输出(21)。
A、12345B、21345
C、12354D、52341
函数f2是传址方式调用,交换a[4]和a[0]
这时:
a[5]={5,2,3,4,1}
(22)程序运行时,第2行输出(22)。
A、21345B、52341
C、25341D、12345
函数f1是传值方式调用,没有交换
这时:
a[5]={5,2,3,4,1}
(23)程序运行时,第3行输出(23)。
A、12354B、25314
C、12345D、52341
函数f2是传址方式调用,交换a[0]和a[4]
这时:
a[5]={1,2,3,4,5}
(24)程序运行时,第4行输出(24)。
A、52314B、12345
C、12354D、52341
函数f1是传值方式调用,没有交换
这时:
a[5]={1,2,3,4,5}
5)P23
阅读下列程序并回答问题,在每小题提供的若干可选答案中,挑选一个正确答案。
【程序】
#include
intk=1;/*第2行*/
voidFun();
voidmain()
{ intj;
for(j=0;j<2;j++)
Fun();/*第8行*/
printf("k=%d",k);}/*第9行*/
voidFun()
{ intk=1;/*第11行*/
printf("k=%d,",k);/*第12行*/
k++;}
(17)程序的输出是(17)。
A、k=1,k=2,k=3B、k=1,k=2,k=1
C、k=1,k=1,k=2D、k=1,k=1,k=1
(18)将第11行改为“staticintk=1;”后,程序的输出是(18)。
A、k=1,k=1,k=1B、k=1,k=1,k=2
C、k=1,k=2,k=1D、k=1,k=2,k=3
(19)将第11行改为“k=1;”后,程序的输出是(19)。
A、k=1,k=2,k=1B、k=1,k=1,k=1
C、k=1,k=1,k=2D、k=1,k=2,k=3
(20)将第11行改为“;”后,程序的输出是(20)。
A、k=1,k=1,k=2B、k=1,k=2,k=3
C、k=1,k=1,k=1D、k=1,k=2,k=1
阅读下列程序并回答问题,在每小题提供的若干可选答案中,挑选一个正确答案。
【程序】
#include
intk=1;/*第2行*/
voidFun();
voidmain()
{ intj;
for(j=0;j<2;j++)
Fun();/*第8行*/
printf("k=%d",k);}/*第9行*/
voidFun()
{ intk=1;/*第11行*/
printf("k=%d,",k);/*第12行*/
k++;}
(17)程序的输出是(17)。
A、k=1,k=2,k=3B、k=1,k=2,k=1
C、k=1,k=1,k=2D、k=1,k=1,k=1
函数fun()被主程序在第8行调用了2次。
每次结果一样。
第12行2次输出k=1。
然后第9行1次输出k=1。
(18)将第11行改为“staticintk=1;”后,程序的输出是(18)。
A、k=1,k=1,k=1B、k=1,k=1,k=2
C、k=1,k=2,k=1D、k=1,k=2,k=3
Staticintk=1说明k是一个静态变量,其作用在函数fun()一直有效。
当j=0第一次调用fun()时,第12行输出k=1;
然后,K++,k=2,注意,此时K的值被保留。
当j=1第2次调用fun()时,k=2保留,因此第12行输出k=2;
然后,函数fun()关闭,释放。
因此在主函数中,k的值没有变化,第9行1次输出k=1。
注意,在函数fun(),静态变量的值具有保留、继承的特点,但并不会影响主函数。
关于静态变量的详细情况,可查看课本p145到p153。
(19)将第11行改为“k=1;”后,程序的输出是(19)。
A、k=1,k=2,k=1B、k=1,k=1,k=1
C、k=1,k=1,k=2D、k=1,k=2,k=3
当j=0第一次调用fun()时,第12行输出k=1;
当j=1第2次调用fun()时,再次赋值k=1,因此第12行再次输出k=1;
然后,执行,K++,k=2,函数fun()关闭。
但是,因为k是在第2行定义的全局变量,因此,k的值在全局有效,所以此时k=2,第8行1次输出k=2。
本题的关键在于:
原来第11行的intk=1重新定义了变量k,因此在函数fun()中的K不再是第2行定义的全局变量,换句话说,这里的K可以当作一个其他变量,比如n。
但是,当把intk=1换成k=1,则把一个变量定义语句换成了赋值语句,就不是新定义的变量(不能再当作一个其他变量,比如n),只是给了一个新值。
关于全局变量的详细情况,可查看课本p145到p153。
(20)将第11行改为“;”后,程序的输出是(20)。
A、k=1,k=1,k=2B、k=1,k=2,k=3
C、k=1,k=1,k=1D、k=1,k=2,k=1
道理与上题相同,不过把一个变量定义语句换成了空语句。
当j=0第一次调用fun()时,第12行输出k=1;然后,执行,K++,k=2。
当j=1第2次调用fun()时,因此第12行再次输出k=2;然后,执行,K++,k=3。
然后第9行1次输出k=3。
4)P58
intf1(intn)
{if(n==1)return1;
elsereturnf1(n-1)+n;}
intf2(intn)
{switch(n){
case1:
case2:
return1;
default:
returnf2(n-1)+f2(n-2);}}
voidf3(intn)
{printf("%d",n%10);
if(n/10!
=0)f3(n/10);}
voidf4(intn)
{if(n/10!
=0)f4(n/10);
printf("%d",n%10);}
#include
main()
{printf("%d\n",f1(4));
printf("%d\n",f2(4));
f3(123);
printf("\n");
f4(123);
printf("\n");
}
(17)程序运行时,第1行输出(17)。
A.10B.24
C.6D.1
(18)程序运行时,第2行输出(18)。
A.1B.3
C.2D.4
(19)程序运行时,第3行输出(19)。
A.123B.3
C.321D.1
(20)程序运行时,第4行输出(20)。
A.1B.123
C.3D.321
【程序】
intf1(intn)
{if(n==1)return1;
elsereturnf1(n-1)+n;}
intf2(intn)
{switch(n){
case1:
case2:
return1;
default:
returnf2(n-1)+f2(n-2);}}
voidf3(intn)
{printf("%d",n%10);
if(n/10!
=0)f3(n/10);}
voidf4(intn)
{if(n/10!
=0)f4(n/10);
printf("%d",n%10);}
#include
main()
{printf("%d\n",f1(4));
printf("%d\n",f2(4));
f3(123);
printf("\n");
f4(123);
printf("\n");
}
(17)程序运行时,第1行输出(17)。
A.10B.24
C.6D.1
f1(4)=4+f1(3)=4+(3+f1
(2))=4+(3+(2+f1
(1)))=4+3+2+1=10
递归调用
(18)程序运行时,第2行输出(18)。
A.1B.3
C.2D.4
f2(4)=f2
(2)+f2(3)=1+(f2
(1)+f2
(2))=1+1+1=3
(19)程序运行时,第3行输出(19)。
A.123