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