#CPP6. 【Level 0】函数
【Level 0】函数
初识函数
函数包含一组语句。我们所用到的程序入口main()就是一个函数。
int main() {
}
当我们的程序运行时,会从main()内的第一行代码开始依次执行,直到程序末尾或者中途打断。
我们不妨从最简单的函数看起:
void hello() {
cout << "hello" << endl;
}
该函数的唯一作用就是输出hello
字符串,调用的方法也很简单,只需要函数名()
即可
hello();
需要注意的是它摆放的位置,用这样的形式定义的函数,需要与同样定义方式的函数并列定义,比如main函数,换言之,我们无法在花括号内部再定义一个其它的函数。
void hello() {
cout << "hello" << endl;
}
int main() {
hello();
}
这样的操作是合法的,而下述的操作是不能通过编译的,因为函数内部不能像这样再定义一个函数。当然,想要实现这样的效果也并不难做到,我们将在后面的章节学习到。
int main() {
void hello() {
cout << "hello" << endl;
}
hello();
}
带参数的函数
假设我们需要一个函数,根据我们的输入,输出对应的内容,例如欢迎功能:
void hello(string name) {
cout << "hello, " << name << endl;
}
与之前的hello
函数有什么不同?可以看到在小括号内多了一个变量(回顾声明一个变量的格式:类型 名称
,在这里就是string name
)。
不难看出,这个函数的功能是对于给定的名字xxx
,输出hello, xxx
。
对于这样的函数的调用方式也很简单,只需要在小括号内加入一个字符串即可,例如
hello("Alice");
或者传入某个string
变量的值
string s = "Alice";
hello(s);
s = "Bob";
hello(s);
小括号内的部分我们称为参数列表
,其可以容纳多个变量,尝试下述两种定义:
void hello(string namea, string nameb) {
cout << "hello, " << namea << " " << nameb << endl;
}
void hello(vector<string> names) {
cout << "hello, ";
for (int i = 0; i < names.size(); i++) {
cout << names[i] << " ";
}
cout << endl;
}
请尝试它们应当如何调用
函数的返回值
对于一个小功能,我们想要的并不仅仅是输出,而是输入数据-计算-得到结果,因此,对于这一类函数,我们需要接受它的返回值。用return
来表示返回的值
int add(int a, int b) {
return a + b;
}
调用时,只需要将函数调用的结果赋值给接受的变量即可,如:
int ans, a, b;
cin >> a >> b;
ans = add(a, b);
此时,ans
的值就变为从控制台输入的a
与b
的值之和。
返回值自然也可以参与到表达式的运算中
int ans, a, b, c;
cin >> a >> b >> c;
ans1 = add(a, b) + add(a, c);
ans2 = add(a, add(b, c));
这时ans1
的结果是2a + b + c
,而ans2
的结果是a + b + c
库函数
所谓库函数,其实就是C++对于常用的一些功能,将其实现,从而不需要我们自己实现,直接调用即可。
容易理解的是一些数学函数,如sin
, cos
, log
, pow
等(需要引入<cmath>
),以fabs
为例,它的作用是计算一个浮点数的绝对值:
#include <cmath>
#include <iostream>
using namespace std;
int main() {
double f = -34.55;
cout << fabs(f) << endl;
}
我们可以得到34.55
的结果
下面我们来看一个稍微复杂一些的例子:在<numeric>
头文件中,有一个函数为accumulate()
,其作用是计算容器(vector
就是一种容器)内元素的和,它需要三个参数,前两个指定需要累加的范围,第三个指定累加初值。这里只需理解accumulate()
的作用即可:
#include <numeric>
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 10};
int sum = accumulate(nums.begin(), nums.end(), 0);
cout << sum << endl;
}
我们可以得到结果为46
,就是从头到尾所有元素的和。
Description
给出平面坐标上不在一条直线上三个点坐标 ,坐标值是实数,且绝对值不超过 100.00,求围成的三角形面积。精确到小数点后3位。
对于平面上的两个点 ,则这两个点之间的距离
对于三角形的三条边已知的情况下,面积可由海伦公式得到
提示:上述的两个计算可以写成两个函数,这样就可以减少很多重复代码的编写
Format
Input
输入三行,第 行表示坐标 ,以一个空格隔开。
Output
输出一个浮点数,表示由这三个坐标围成的三角形的面积,精确到小数点后3位。
Samples
0 0
0 3
4 0
6.000