目录
一、实验要求
二、实验原理
1.函数头
2.函数体
3.函数的定义及使用
三、实验内容
1. sum函数
代码
截图
分析
2. sum函数
代码
截图
分析
3. rank_grade函数
代码
截图
分析
4. rank_grade函数
代码
截图
分析
5. 函数的嵌套使用
代码
截图
分析
6. inputt函数
代码
截图
分析
7.函数的递归
代码
截图
分析
一、实验要求
- 熟悉定义函数的方法。
- 熟悉声明函数的方法。
- 熟悉调用函数时实参与形参的对应关系,以及“值传递”的方式。
- 学习对多文件的程序的编译运行。
二、实验原理
在C语言中,函数是一种可重复使用的代码块,用于执行特定的任务。函数的定义包括函数头和函数体两部分。
1.函数头
函数头包含以下信息:
1.返回类型:指定函数返回的数据类型,如int、float、void等。
2.函数名:函数的标识符,用于在程序中调用该函数。
3.参数列表:函数接受的输入参数,可以包含零个或多个参数,每个参数都有自己的数据类型和名称。
2.函数体
函数体是函数的具体实现部分,包含一系列要执行的语句。在函数体中,可以定义局部变量、执行操作和控制流语句等。函数体内的代码在函数调用时被执行。
3.函数的定义及使用
函数的定义原理如下:
1.在程序中声明函数,包括函数头和函数体。
2.在需要调用函数的地方使用函数名和合适的参数列表进行函数调用。
3.程序执行到函数调用语句时,会跳转到函数定义的位置,并将控制权转移到函数体中。
4.在函数体中,执行函数内部的代码,包括变量的初始化、操作和控制流语句等。
5.函数执行完毕后,将返回值(如果有)返回给函数调用处,并将控制权返回给函数调用处继续执行。
函数的定义和使用可以将程序分解为更小的模块,提高代码的可读性和可维护性。通过函数的参数和返回值,可以在函数之间传递数据和结果。这样的模块化设计使得程序更易于理解、调试和修改。
三、实验内容
1. sum函数
定义一个函数,功能为返回两个整型数字的和。
代码
#include<iostream>
using namespace std;
int sum(int a,int b) {return a + b;
}
int main() {int input1, input2,answer;cin >> input1 >> input2;answer = sum(input1, input2);cout << answer;return 0;
}
截图
分析
上述代码定义了一个int型函数,叫做sum,会返回一个int型值。
在定义函数名时,不能随便定义,不能定义库中已有的函数,会发生函数重定义的错误。函数重定义错误通常会导致编译失败,并生成相应的错误消息。
由于需要输入两个数,则参数列表(即括号内部)应包含两个参数,分别为a和b,等于定义了a和b,在函数内部就可以使用a和b。
int型一定只会返回一个值,而且是int型。sum(int a,int b)相当于一个int型的值。
在函数的使用中,只需把要使用的数填补到函数中,如上述代码,将input1和input2放入。
2. sum函数
定义一个函数,功能为返回两个float型数字的和。
代码
#include<iostream>
using namespace std;
float sum(float a,float b) { return a+b;
}
int main() {float a,b,ans;cin >> a >> b;ans = sum(a, b);cout << ans;return 0;
}
截图
分析
因为要求返回float型数字的和,只需把int改为float即可
3. rank_grade函数
定义一个函数,分数低于60评级为4,位于60-80分评级为3,位于80-90分评级为2,位于90-100分评级为1
代码
#include<iostream>
using namespace std;
int rank_grade(int a) {if (a < 60) {return 4;}else if (a < 80) {return 3;}else if (a < 90) {return 2;}else if (a < 100) {return 1;}
}
int main() {int grade,rank;cout << "请输入你的分数:";cin >> grade;rank = rank_grade(grade);cout << "你的等级为:"<<rank;return 0;
}
截图
分析
这个函数只需要一个输入参数,即分数,但是可能会返回不同的值
利用if来判断最后返回哪个评级,但是这个函数有一个问题,当输入比100大的数字,即输入不规范的情况下,它会返回1,这是因为这个函数在运行过程中最后运行到return 1
在函数的最后加入一个 return 0,就会返回0
因为函数会在运行到符合条件的return处结束
4. rank_grade函数
定义一个函数,分数低于60评级为D,位于60-80分评级为C,位于80-90分评级为B,位于90-100分评级为A
代码
#include<iostream>
using namespace std;
char rank_grade(int a) {if (a < 60) {return 'D';}else if (a < 80) {return 'C';}else if (a < 90) {return 'B';}else if (a < 100) {return 'A';}
}
int main() {int grade;char rank;cout << "请输入你的分数:";cin >> grade;rank = rank_grade(grade);cout << "你的等级为:" << rank;return 0;
}
截图
分析
由于要返回字符,要将int型改为char型,且一个函数不可能返回不同类型的数。
5. 函数的嵌套使用
实现函数的加减乘除,共输入三个数,返回一个数字,前两个数字是需要参加运算的数,第三个数代表运算符,输入1代表加法,输入2代表减法,输入3代表乘法,输入4代表除法。
代码
#include<iostream>
using namespace std;
int addd(int a,int b) { return a+b;
}
int decc(int a, int b) {return a - b;
}
int mull(int a, int b) {return a * b;
}
int divv(int a, int b) {return a / b;
}
int sortt(int a,int b,int c) {if (c == 1) {return addd(a, b);}else if (c == 2) {return decc(a, b);}else if (c == 3) {return mull(a, b);}else if (c == 4) {return divv(a, b);}
}
int main() {int a,b,c,ans;cout << "请输入两个数字:";cin >> a>>b;cout << "请输入运算规则:";cin >> c;ans = sortt(a, b, c);cout << "答案为:"<<ans;return 0;
}
截图
分析
定义了五个函数,前四个函数是实现加减乘除的功能,第五个函数是判断实现什么运算符的功能,第五个函数会用到前四个函数,所以定义时放在它们的后面定义,否则会报错
如下
所以要注意函数定义顺序
6. inputt函数
定义一个函数,可以实现输入输出功能
代码
#include<iostream>
using namespace std;
void inputt() {string s;cin >> s;
}
int main() {inputt();return 0;
}
截图
分析
函数不需要返回任何东西,则使用void声明函数即可,void不会返回任何东西,但这不意味着void定义的函数没什么作用,上述所有函数实现的功能都可以用void函数实现,有兴趣的同学可以试一下(全局变量)。
7.函数的递归
兔子数列问题,也称为斐波那契数列(Fibonacci sequence),是一个经典的数学问题,起源于公元13世纪的意大利数学家斐波那契(Leonardo Fibonacci)的著作《算盘书》(Liber Abaci)。
在《算盘书》中,斐波那契提出了一个理想化的问题:假设有一对刚出生的兔子,从第三个月起,每个月都会生一对新兔子(一雄一雌),而新生的兔子在出生后第三个月也开始生兔子。假设所有的兔子都不会死亡,问在第n个月时,共有多少对兔子?
斐波那契数列的定义如下:
第0个月:0对兔子
第1个月:1对兔子
第2个月:1对兔子
第3个月及以后:前两个月的兔子总数之和
用数学符号表示为:
F(0) = 0
F(1) = 1
F(2) = 1
F(n) = F(n-1) + F(n-2),其中 n ≥ 3
斐波那契数列的前几个数字为:0, 1, 1, 2, 3, 5, 8, 13, 21, ...
代码
#include<iostream>
using namespace std;
int fac(int n)
{if (n == 0) {return 0;}else if (n == 1) {return 1;}else if (n == 2) {return 1;}else {return fac(n - 1) + fac(n - 2);}
}
int main() {int n;cin >> n;cout << fac(n);return 0;
}
截图
分析
当n大于等于3时,不能直接得到结果,得通过fac(n-1)和fac(n-2),一直推,直到可以直接从函数中得知fac的值,会不断调用fac,原理是栈(数据结构会学到)。