4.2 KiB
第3课:自定义函数(教学拓展)
等级说明:本课用于拓展代码分解能力,不属于 GESP 一级、二级必考内容。
教学目标
- 掌握函数的定义、调用与声明
- 理解形参与实参、返回值、void函数
- 理解函数重载(同名不同参)
- 理解局部变量与全局变量的作用域
核心考点:函数的参数、返回值与调用过程
考什么
补全函数定义,区分________与________,并根据函数调用过程判断输出。
必须理解
定义函数时括号里的变量叫________;调用时传入的值叫________。执行到 return 时,函数会________________。普通值传递中,形参得到的是实参的________。
核心写法
int maxValue(int a, int b) {
if (a > b) return ________;
return ________;
}
int ans = maxValue(________, ________);
常见错误
- 返回类型不是
void,却忘记:________________ - 修改普通形参是否一定改变外部实参?________________
- 局部变量可以在哪个范围使用?________________
判断是否掌握
- 我能区分形参和实参。
- 我能说清函数调用与返回的执行顺序。
- 我能独立编写有参数、有返回值的函数。
课堂编程题
课堂1:三个数的最大公约数【适中】
题目描述: 编写函数 gcd(a,b),使用辗转相除法求两个正整数的最大公约数。在 main 前写函数声明、main 后写函数定义,连续调用两次求三个数的最大公约数。
输入格式: 输入三个正整数。
输出格式: 三个数的最大公约数。
数据范围: 1≤a,b,c≤10^9。
输入样例:
12 18 30
输出样例:
6
解题思路: 先求 gcd(a,b),再把结果与 c 求最大公约数,体会函数声明、定义和多次调用。
易错提醒: 函数声明必须与定义的返回类型、函数名和参数列表一致。
课堂2:统计区间内的素数【适中】
题目描述: 编写有参数、有返回值的函数 isPrime(n)。输入 L 和 R,输出闭区间 [L,R] 中素数的个数。
输入格式: 输入区间的左端点和右端点。
输出格式: 素数个数。
数据范围: 1≤L≤R≤10000。
输入样例:
10 20
输出样例:
4
解题思路: 每个实参传入函数后复制给形参 n;找到因数时提前返回 false,全部检查后返回 true。
易错提醒: 1 不是素数;普通值传递不会修改主函数中的实参。
课堂3:统一格式输出【适中】
题目描述: 重载函数 printLine:一个版本接收一个整数并输出由该整数重复 5 次组成的一行;另一个版本接收一个字符和次数,输出指定长度的一行。两个函数都没有返回值。
输入格式: 依次输入一个整数、一个字符和字符的重复次数。
输出格式: 第一行输出 5 个 x;第二行输出 n 个字符 c。
数据范围: 0≤x≤9,1≤n≤50。
输入样例:
7 * 4
输出样例:
77777
****
解题思路: 两个函数同名但参数列表不同,构成函数重载;只负责输出,因此返回类型为 void。
易错提醒: 重载依据参数数量或类型区分,不能只靠返回类型区分。
课堂4:全班累计加分【适中】
题目描述: 全局变量 total 表示全班累计加分。编写 addScore(x) 修改它;函数内部再定义同名局部变量 total,演示局部变量优先。每次调用后输出全局累计值。
输入格式: 第一行输入加分次数;第二行输入每次的加分值。
输出格式: 输出每次加分后的全局累计值。
数据范围: 1≤n≤20,每次加分 1~10。
输入样例:
3
2 5 1
输出样例:
2 7 8
解题思路: 用 ::total 指明全局变量;局部变量仅在函数的大括号内有效。
易错提醒: 局部变量会遮住同名全局变量;实际编程应尽量避免故意重名,本题只用于理解作用域。