用C++编写一个计算三角形面积的函数,函数的参数为三角形三边边长 a、b、c.可以用 Heron 公式计算,当输入的三边长有负值时,引发标准异常invalidargument;当ab.c不能组成三角形时,引发自定义异常,并在主程序中针对两种异常情况进行处理。
时间: 2024-03-17 14:47:52 浏览: 19
下面是一个使用 C++ 编写的计算三角形面积的函数,同样使用 Heron 公式计算,同时对输入参数进行了检查,如果输入的边长小于等于 0,则抛出 "invalid argument" 异常;如果输入的三边不能组成三角形,则抛出自定义异常。
```c++
#include <iostream>
#include <cmath>
#include <stdexcept>
using namespace std;
class TriangleException : public exception {
public:
const char* what() const throw() {
return "invalid triangle";
}
};
double triangle_area(double a, double b, double c) {
if (a <= 0 || b <= 0 || c <= 0) {
throw invalid_argument("invalid argument");
}
if (a + b <= c || a + c <= b || b + c <= a) {
throw TriangleException();
}
double s = (a + b + c) / 2;
return sqrt(s * (s - a) * (s - b) * (s - c));
}
// 测试函数
int main() {
try {
cout << triangle_area(3, 4, 5) << endl; // 输出 6
cout << triangle_area(4, 4, 4) << endl; // 输出 6.9282
cout << triangle_area(-1, 2, 3) << endl; // 抛出 invalid_argument 异常
cout << triangle_area(1, 2, 4) << endl; // 抛出自定义异常
} catch (const invalid_argument& e) {
cerr << "Error: " << e.what() << endl;
} catch (const TriangleException& e) {
cerr << "Error: " << e.what() << endl;
}
return 0;
}
```
在上面的代码中,我们定义了一个自定义异常类 `TriangleException`,当输入的三边不能组成三角形时,我们抛出该异常。在测试函数中,我们使用了 `try-catch` 语句分别捕获 `invalid_argument` 异常和 `TriangleException` 异常,并输出相应的错误信息。
需要注意的是,由于 `what()` 方法在基类中是虚函数,因此在自定义异常类中需要使用 `virtual` 关键字来声明该方法。