函数与模块化思维-知识总结 函数的概念 函数的本质是教计算机做一件事,也就是把一组指令进行捆绑,并且给这组指令起一个名字。函数可以有输入和输出,增加了函数的普适性。
函数思维是一种模块化的思维方式,帮助我们把一个功能独立出来,增加了代码的复用性,并且大大简化了代码编写。
函数创建 函数的创建包括函数声明和函数定义。
函数声明 函数的声明只需要写明函数的返回值类型、函数名和参数即可,要写在调用和定义之前,一般把函数声明写在主程序之前。如果在声明函数的时候将函数的定义补全,这样则无需再单独写函数的定义。
函数的声明必须包括: 函数的返回值类型 函数的名称(可以是空) 函数的参数(可以没有)
函数声明示例:
// 函数的声明
返回值类型 函数名(参数1类型 参数1,参数2类型 参数2, ……);函数声明代码示例:
int my_max(int a, int b);函数定义 函数定义需要写明函数的具体执行内容。如果在函数声明中写明了函数的具体执行内容,则不需要再写函数的定义。
函数的定义包括: 函数的声明,即函数的返回值类型、函数的名称和函数的参数 函数的主体内容 返回语句(void函数可以没有返回语句)
函数定义示例:
// 函数的声明
返回值类型 函数名(参数1类型 参数1,参数2类型 参数2, ……);
// 函数的定义返回值类型 函数名(参数1类型 参数1,参数2类型 参数2, ……) { 函数具体执行的代码
return 返回值
}函数定义代码示例:
1// 函数声明
2int my_max(int a, int b);
3
4// 函数定义
5int my_max(int a, int b) {
6 if (a > b) {
7 return a;
8 }
9 return b;
10}特别注意 函数返回值类型 函数的返回值类型可以是: 基础数据类型:整数型、浮点型、字符型、布尔型 复杂的数据类型:string等复杂数据 空(void),即过程类函数
void函数 函数可以没有返回值,没有返回值的函数请用void表示。
函数名 函数的命名规则与变量相同。一般情况下函数不能重名,除非是完成同一功能且参数不同(参数数量不同、参数类型不同)时才可以重名,此时这些函数被称为对某个函数名称的重载。
返回语句 函数使用return语句进行返回,一旦运行return语句后,return语句后面的代码将不再执行。
void函数写return语句时,直接写return;j即可,同时void函数可以不写return语句,如果不写return语句编译器会自动补全一句return;
函数调用 调用函数时可直接使用函数名加括号的形式进行调用,对于有参数的函数,需要在括号内填写上实际的参数。
1#include <bits/stdc++.h>
2using namespace std;
3
4// 函数声明
5int my_max(int a, int b);
6
7int main() {
8 int num1, num2;
9 cin >> num1 >> num2;
10 int max_number = my_max(num1, num2);
11 cout << max_number << endl;
12}
13
14// 函数定义
15int my_max(int a, int b) {
16 if (a > b) {
17 return a;
18 }
19 return b;
20}函数重载 如果几个函数的函数名称相同,但是参数(参数数量不同、参数类型不同)不同,那么这些函数被称为对某个函数名称的重载。
示例 以下两个函数都是返回两个数中较小的那个数,但是第一个函数是用来比较int型数据的,而第二个函数则是用来比较double数据的。
1#include <iostream>
2//#include <bits/stdc++.h>
3using namespace std;
4
5double min(int num1, int num2);
6double min(double num1, double num2);
7
8int main() {
9 cout << min(2, 4) << endl;
10 cout << 3 / min(2, 4) << endl;
11 cout << min(0.2, 0.8) << endl;
12// cout << min(0.2, 2) << endl;
13 return 0;
14}
15
16double min(int num1, int num2) {
17 if (num1 < num2) {
18 return num1;
19 }
20 return double(num2);
21}
22
23double min(double num1, double num2) {
24 if (num1 < num2) {
25 return num1;
26 }
27 return num2;
28}错误的题目要弄懂,不会的千万要来问老师⚠️
总结作业非常重要,请务必认真完成✔️
考试只有一次提交机会,请务必本地检查正确后再提交❇️
请在AC后或者思考15分钟没有进展后查看,不可抄代码❇️
函数与模块化思维-选择题 下列关于C++语言中函数的叙述 ,正确的是( )。 A. 函数调用前必须定义。 B. 函数调用时必须提供足够的实际参数。 C. 函数定义前必须声明。 D. 函数声明只能写在函数调用前。
下列关于C++语言中函数的叙述 ,不正确的是( )。 A. 两个函数的声明可以相同。 B. 两个函数的局部变量可以重名。 C. 两个函数的参数可以重名。 D. 两个函数可以重名。
下列关于 C++语言中函数的叙述,正确的是( )。 A. 函数必须有名字。 B. 函数必须有参数。 C. 函数必须有返回值。 D. 函数定义必须写在函数调用前。
在 C++语言中,函数的参数默认以引用的传递方式进行传递。 A. 正确 B. 错误
在 C++语言中,一个函数没有被调用时,它的参数不占用内存。 A. 正确 B. 错误
若函数声明为:int f(int &x){ x+=3; return x; } ,则对声明的变量int a=3,下面哪个调用能够改变a的值( )。
A. f(&a);
B. f(*a);
C. f(a);
D. f(a-3);以下哪种情况下应该使用函数? A. 当需要重复执行相同的代码 B. 当程序太长需要分解 C. 当需要提高代码的可读性和可维护性 D. 所有上述情况
如何正确调用一个返回类型为 void、名为compute_sum()的函数?
A. computeSum();
B. void result = computeSum();
C. computeSum(int);
D. void computeSum();如果在C++中声明一个函数但没有定义它,也没有调用它,会发生什么? A. 程序将无法编译 B. 程序将编译,但运行时失败 C. 程序将正常编译和运行 D. 函数将被自动定义
在C++中,void函数定义的正确格式是什么? A. void 函数名() { 函数主体 } B. 函数名() void { 函数主体 } C. void { 函数主体 } 函数名 () D. 函数名 { 函数主体 } void ()
函数与模块化思维-选择题答案 B A选项:此选项歧义较大,函数必须定义了才能调用,它这里的函数定义必须在调用前,是指函数的定义部分是否可以放在调用的语言后面,还是必须在调用语句前就定义函数主体 B选项,函数调用时如果缺少实参将不能正确运行。 C选项:函数的声明和定义可以写在一起,有些人把这种写法称为函数的定义,因此就不需要声明了。(本题为真题,此选项有略有歧义) D选项:函数的声明可以在任意地方,只要在函数调用之前就可以了,并不是必须写在函数调用的代码块前面。(本题为真题,此选项有略有歧义) 选项歧义很大的一题,选择没有歧义的正确项B A 解析:两个的函数声明不能相同。另外若两个函数的函数名相同时,其参数一定不同。 A 解析:函数的声明必须写在调用前,但是定义可以写在调用后。 B 解析:函数默认是按值传递。 A 解析:函数的参数只有在函数被调用时才会在调 用栈上分配对应内存,并在函数返回时回收,这也形成了函数参数的生命周期。 因此,函数的参数在没有被调用时不会占用内存,本题正确。 C 解析:函数f的参数x是按照引用传递的参数,所以实参只要写变量a的名字即可使得在函数内修改x的值,可修改函数外a的值。 D 解析:所有给出的选项都是使用函数的合理场景。 A 解析: C 解析:如果声明了一个函数但没有定义它,并且也没有在代码中调用它,那么程序可以正常编译和运行。编译器不会因为一个未使用的函数声明而报错。 A 解析:定义函数的常规语法:返回类型、函数名、参数列表(如果有的话,这里为空)以及函数体。
L2084题解+参考代码 题目链接 七平数:L2084
题解 题目要求我们在给定范围 [x, y] 内找到所有的七平数。七平数的定义是其平方结果是一个7位数,并且这7位数字互不相同。我们需要使用函数来实现这一任务。
算法步骤 读取输入: 读取两个整数 x 和 y,表示范围的起始和结束。 定义函数: isUniqueDigits:判断一个数的所有位是否互不相同。 初始化一个布尔数组 digits[10],用来记录每个数字是否出现过。 对于输入的数字 num,逐位检查其每一位数字: 使用 num % 10 得到当前位数字 digit。 检查 digits[digit] 是否为 true。如果是,则返回 false。 否则,将 digits[digit] 设为 true,并将 num 除以 10 去掉当前位。 如果所有位数字都不同,则返回 true。 isSevenSquare:判断一个数是否为七平数。 计算输入的数字 num 的平方 square。 检查 square 是否是7位数(即 1000000 <= square <= 9999999)。 如果是,调用 isUniqueDigits 检查 square 的所有位是否互不相同。 如果 square 满足以上条件,则返回 true,否则返回 false。 遍历范围: 使用一个循环从 x 遍历到 y,逐个检查每个数: 对于当前数字 i,调用 isSevenSquare 检查是否为七平数。 如果是七平数,则输出该数字。 输出结果:输出所有符合条件的七平数。
示例代码 这里是使用 C++ 实现的示例代码:
1#include <iostream>
2using namespace std;
3
4// 判断一个数的所有位是否互不相同
5bool isUniqueDigits(int num) {
6 bool digits[10] = {false}; // 用于标记0-9的数字是否出现过
7 while (num > 0) {
8 int digit = num % 10;
9 if (digits[digit]) {
10 return false;
11 }
12 digits[digit] = true;
13 num /= 10;
14 }
15 return true;
16}
17
18// 判断一个数是否为七平数
19bool isSevenSquare(int num) {
20 int square = num * num;
21 if (square < 1000000 || square > 9999999) {
22 return false; // 不是7位数
23 }
24 return isUniqueDigits(square);
25}
26
27int main() {
28 // 读取输入
29 int x, y;
30 cin >> x >> y;
31
32 // 遍历范围,输出所有的七平数
33 for (int i = x; i <= y; ++i) {
34 if (isSevenSquare(i)) {
35 cout << i << endl;
36 }
37 }
38
39 return 0;
40}L2085题解+参考代码 题目链接 乘方计算:L2085
题解 题目要求我们计算一个整数 a 的 n 次方,即 n 个 a 相乘的结果。我们可以通过循环逐次相乘的方法来实现这一任务,并使用一个函数来实现计算。
算法步骤 定义函数 power: 参数:两个整数 a 和 n。 返回值:一个整数,表示 a 的 n 次方。 初始化一个结果变量 result 为 1。 使用 for 循环从 1 到 n,每次将 result 乘以 a。 返回结果 result。 读取输入:读取两个整数 a 和 n。 调用函数 power:使用输入的 a 和 n 作为参数调用函数 power。 输出结果:输出函数 power 的返回值。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <iostream>
2using namespace std;
3
4// 定义计算乘方的函数
5long long power(int a, int n) {
6 long long result = 1;
7 for (int i = 0; i < n; ++i) {
8 result *= a;
9 }
10 return result;
11}
12
13int main() {
14 // 读取输入
15 int a, n;
16 cin >> a >> n;
17
18 // 调用函数计算乘方结果
19 long long result = power(a, n);
20
21 // 输出结果
22 cout << result << endl;
23
24 return 0;
25}L2086题解+参考代码 题目链接 求丑数:L2086
题解 我们需要定义一个函数来判断一个数是否是丑数,然后使用该函数输出1到100之间所有的丑数,并统计出个数。
算法步骤 定义函数 isUgly: 参数:一个整数 num。 返回值:布尔值,表示 num 是否为丑数。 如果 num 小于等于 0,返回 false。 对于 num,不断除以2、3和5,直到不能再被这些数整除。 如果最后的结果是1,返回 true,否则返回 false。 查找和输出丑数: 遍历1到100之间的所有整数,使用 isUgly 函数判断是否为丑数。 如果是丑数,将其存入一个数组,并增加计数器。 输出所有丑数,每行10个,每个数字占6个字符。 输出丑数的总个数。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4// 判断一个数是否为丑数
5bool isUgly(int num) {
6 if (num <= 0) return false;
7 while (num % 2 == 0) num /= 2;
8 while (num % 3 == 0) num /= 3;
9 while (num % 5 == 0) num /= 5;
10 return num == 1;
11}
12
13int main() {
14 int uglyNumbers[100]; // 用于存储1到100之间的所有丑数
15 int count = 0;
16
17 // 查找1到100之间的所有丑数
18 for (int i = 1; i <= 100; ++i) {
19 if (isUgly(i)) {
20 uglyNumbers[count] = i;
21 count++;
22 }
23 }
24
25 // 输出丑数,每行10个,每个数字占6个字符
26 for (int i = 0; i < count; ++i) {
27 cout << setw(6) << uglyNumbers[i];
28 if ((i + 1) % 10 == 0) {
29 cout << endl;
30 }
31 }
32 if (count % 10 != 0) {
33 cout << endl;
34 }
35
36 // 输出丑数的总个数
37 cout << count << endl;
38
39 return 0;
40}