内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第25练,内容是6.2-6.3 函数的嵌套调用、递归调用、数组作函数参数。
《C语言》(第五版)一课一练 第25练
6.2-6.3 函数的嵌套调用、递归调用、数组作函数参数
一、单选题
1. 关于C语言函数的嵌套调用,下列说法正确的是( )
A. 函数嵌套调用是指一个函数调用另一个函数
B. 函数嵌套调用是指在函数内部定义另一个函数
C. C语言不允许函数嵌套调用
D. main函数不能调用其他函数,所以不存在嵌套调用
2. 关于C语言的递归调用,以下描述正确的是( )
A. 递归调用是指一个函数调用其他函数的过程
B. 任何函数都可以安全地调用自身,不需要特殊处理
C. 递归调用是指函数直接调用自身的过程
D. C语言不支持递归调用
3. 以下递归函数中,缺少的关键要素是
int fact(int n)
{
return n * fact(n-1);
}( )
A. 缺少参数类型声明
B. 缺少返回值语句
C. 缺少函数原型声明
D. 缺少递归终止条件
4. 已知函数定义 void printNum(int x) { printf("%d ", x); }
在main中有 int a[5]={10,20,30,40,50}; 调用 printNum(a[2]); 输出( )
A. 20
B. 数组a的全部内容
C. 30
D. a[2]的地址值
5. 已知函数 void change(int b[]) { b[0]=100; }
在main中 int a[3]={1,2,3}; change(a); 后a[0]的值是( )
A. 100(数组名作参数传递的是地址)
B. 1(数组的值传递不会改变实参)
C. 编译错误(数组不能作参数)
D. 0(被初始化为默认值)
6. int fib(int n)
{
if (n==1 || n==2) return 1;
else return fib(n-1)+fib(n-2);
}
调用 fib(4) 的返回值是( )
A. 2
B. 5
C. 4
D. 3
7. 已知以下程序段:
void f(int x[])
{ x[0]=2; x=x+1; x[0]=3; }
main() { int a[3]={1,1,1}; f(a); }
执行后a[0]的值是( )
A. 3
B. 2
C. 1
D. 编译错误(数组名不能参与算术运算)
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
int sum(int n)
{
if (n == 1)
return 1;
else
return n + sum(n - 1);
}
main()
{
printf("%d
", sum(5));
}
三、案例分析题
9. 以下程序的功能是定义函数求数组的平均值,在main中调用并输出。请填空。
#include <stdio.h>
float average(int 【1】, int n)
{
int i, sum = 0;
for (i = 0; i < n; i++)
sum += arr[i];
return (【2】)sum / n;
}
main()
{
int a[6] = {78, 85, 92, 65, 88, 96};
printf("平均分=%.2f
", average(【3】, 6));
}
四、综合应用题
10. 编写一个C程序:使用递归方法求两个正整数的最大公约数(辗转相除法)。
要求:
(1) 定义递归函数 int gcd(int m, int n),返回m和n的最大公约数
(2) 递归公式:若n==0返回m,否则返回gcd(n, m%n)
(3) 在main函数中输入两个正整数,调用gcd函数并输出结果
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第25练,内容是6.2-6.3 函数的嵌套调用、递归调用、数组作函数参数。
《C语言》(第五版)一课一练 第25练
6.2-6.3 函数的嵌套调用、递归调用、数组作函数参数
一、单选题
1. 关于C语言函数的嵌套调用,下列说法正确的是( )
A. 函数嵌套调用是指一个函数调用另一个函数
B. 函数嵌套调用是指在函数内部定义另一个函数
C. C语言不允许函数嵌套调用
D. main函数不能调用其他函数,所以不存在嵌套调用
【答案】A
【解析】嵌套调用是指在一个函数体内调用另一个函数(被调用函数又可以调用其他函数),调用关系层层展开。这与嵌套定义(在函数内部定义函数)是完全不同的概念。C语言支持嵌套调用(函数之间互相调用),但不支持嵌套定义(不能在函数体内再定义函数)。
2. 关于C语言的递归调用,以下描述正确的是( )
A. 递归调用是指一个函数调用其他函数的过程
B. 任何函数都可以安全地调用自身,不需要特殊处理
C. 递归调用是指函数直接调用自身的过程
D. C语言不支持递归调用
【答案】C
【解析】递归调用是指函数在运行过程中直接调用自身。递归必须包含终止条件(递归基),避免无限递归导致栈溢出。在课本中,求阶乘、斐波那契数列等经典问题常使用递归方式解决,递归可以使程序逻辑更加简洁清晰。
3. 以下递归函数中,缺少的关键要素是
int fact(int n)
{
return n * fact(n-1);
}( )
A. 缺少参数类型声明
B. 缺少返回值语句
C. 缺少函数原型声明
D. 缺少递归终止条件
【答案】D
【解析】递归函数必须包含终止条件(递归基),否则会无限递归下去。上述fact函数没有判断n何时停止,每次调用fact都会继续调用fact(n-1),最终导致栈溢出。正确的写法应该加上if(n==0||n==1) return 1;作为终止条件,其余情况才执行return n*fact(n-1)。
4. 已知函数定义 void printNum(int x) { printf("%d ", x); }
在main中有 int a[5]={10,20,30,40,50}; 调用 printNum(a[2]); 输出( )
A. 20
B. 数组a的全部内容
C. 30
D. a[2]的地址值
【答案】C
【解析】a[2]是数组的单个元素,值为30。调用printNum(a[2])时将30作为实参传给形参x(值传递),函数内输出30。数组元素作实参时与普通变量用法相同,传递的是元素的值。如果要传递整个数组,需要使用数组名作为参数。
5. 已知函数 void change(int b[]) { b[0]=100; }
在main中 int a[3]={1,2,3}; change(a); 后a[0]的值是( )
A. 100(数组名作参数传递的是地址)
B. 1(数组的值传递不会改变实参)
C. 编译错误(数组不能作参数)
D. 0(被初始化为默认值)
【答案】A
【解析】数组名作为函数参数时,传递的是数组首元素的地址(传地址),不是值的复制。函数体内通过形参数组名访问的就是实参数组本身,因此修改b[0]实际修改的是a[0]。这不同于普通变量的值传递方式。二维数组名作参数也有类似的传地址特性。
6. int fib(int n)
{
if (n==1 || n==2) return 1;
else return fib(n-1)+fib(n-2);
}
调用 fib(4) 的返回值是( )
A. 2
B. 5
C. 4
D. 3
【答案】D
【解析】fib(4)=fib(3)+fib(2)。fib(3)=fib(2)+fib(1)=1+1=2,fib(2)=1。因此fib(4)=2+1=3。这是计算斐波那契数列的递归实现。递归过程从fib(4)逐步分解到fib(1)和fib(2)的终止条件,然后逐层向上返回结果完成计算。
7. 已知以下程序段:
void f(int x[])
{ x[0]=2; x=x+1; x[0]=3; }
main() { int a[3]={1,1,1}; f(a); }
执行后a[0]的值是( )
A. 3
B. 2
C. 1
D. 编译错误(数组名不能参与算术运算)
【答案】B
【解析】形参x是局部变量(指针),初始指向数组a的首地址。x[0]=2修改了a[0]为2。x=x+1使x指向a[1],x[0]=3修改了a[1]为3。注意形参x作为指针变量可以修改指向,而实参数组名a始终指向首地址。最终a[0]=2,a[1]=3,a[2]保持1。
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
int sum(int n)
{
if (n == 1)
return 1;
else
return n + sum(n - 1);
}
main()
{
printf("%d
", sum(5));
}
【答案】15
【解析】sum函数用递归计算1到n的累加和。sum(5)=5+sum(4)=5+10=15。递推展开:sum(5)=5+sum(4)=5+4+sum(3)=5+4+3+sum(2)=5+4+3+2+sum(1)=5+4+3+2+1=15。终止条件n==1返回1,此后逐层向上返回。该递归函数简洁实现了等差数列求和的功能。
三、案例分析题
9. 以下程序的功能是定义函数求数组的平均值,在main中调用并输出。请填空。
#include <stdio.h>
float average(int 【1】, int n)
{
int i, sum = 0;
for (i = 0; i < n; i++)
sum += arr[i];
return (【2】)sum / n;
}
main()
{
int a[6] = {78, 85, 92, 65, 88, 96};
printf("平均分=%.2f
", average(【3】, 6));
}
【答案】【1】arr[]
【2】float
【3】a
【解析】第一空形参写成int arr[]接收一个整型数组。第二空用(float)sum将整型sum强制转为浮点型再进行除法运算,确保得出正确的小数平均值而非整数截断。第三空average(a,6)将数组名a(地址)和元素个数6作为实参传入函数。
四、综合应用题
10. 编写一个C程序:使用递归方法求两个正整数的最大公约数(辗转相除法)。
要求:
(1) 定义递归函数 int gcd(int m, int n),返回m和n的最大公约数
(2) 递归公式:若n==0返回m,否则返回gcd(n, m%n)
(3) 在main函数中输入两个正整数,调用gcd函数并输出结果
【答案】#include <stdio.h>
int gcd(int m, int n)
{
if (n == 0)
return m;
else
return gcd(n, m % n);
}
main()
{
int a, b;
printf("请输入两个正整数:");
scanf("%d%d", &a, &b);
printf("%d和%d的最大公约数=%d
", a, b, gcd(a, b));
}
【解析】gcd函数实现辗转相除的递归版本:递归终止条件为n==0时返回m作为结果。递归步是gcd(n,m%n),每次将除数变为被除数,余数变为除数,不断缩小问题规模。例如gcd(24,18):gcd(18,24%18=6)→gcd(6,18%6=0)→返回6。递归方式使代码简洁直观。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$