G. 【Level 0】函数

    Type: Default 1000ms 256MiB

【Level 0】函数

You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.

初识函数

  函数包含一组语句。我们所用到的程序入口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的值就变为从控制台输入的ab的值之和。

  返回值自然也可以参与到表达式的运算中

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

  给出平面坐标上不在一条直线上三个点坐标 (x1,y1),(x2,y2),(x3,y3)(x_1,y_1),(x_2,y_2),(x_3,y_3),坐标值是实数,且绝对值不超过 100.00,求围成的三角形面积。精确到小数点后3位。

  对于平面上的两个点 (x1,y1),(x2,y2)(x_1,y_1),(x_2,y_2),则这两个点之间的距离 dis=(x2x1)2+(y2y1)2dis=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}

  对于三角形的三条边已知的情况下,面积可由海伦公式得到S=p(pa)(pb)(pc),p=a+b+c2S=\sqrt{p(p-a)(p-b)(p-c)}, p=\frac{a+b+c}{2}

  提示:上述的两个计算可以写成两个函数,这样就可以减少很多重复代码的编写

Format

Input

  输入三行,第 ii 行表示坐标 (xi,yi)(x_i,y_i),以一个空格隔开。

Output

  输出一个浮点数,表示由这三个坐标围成的三角形的面积,精确到小数点后3位。

Samples

0 0
0 3
4 0
6.000

C++入门

Not Attended
Status
Done
Rule
IOI
Problem
8
Start at
2023-12-14 0:00
End at
2024-1-24 16:00
Duration
1000 hour(s)
Host
Partic.
24