输入一个三角形的三条边长,求此三角形的面积。

2021年9月1日 | 分类: 【编程】

【题目】

【问题描述】
输入一个三角形的三条边长,求此三角形的面积。
【输入格式】
一行三个整数 a、b、c,中间用一个空格隔开,表示三条边的边长。
【输出格式】
一行一个实数,表示三角形的面积。结果保留到小数点后两位。
【输入样例】
3 4 5
【输出样例】
6.00

【代码】

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath> //调用函数cmath支持sqrt
using namespace std;
int main()
{
	int a,b,c;
	float p,S;
	cout<<"请输入三角形的三条边长,用空格隔开。"<<endl;
	cin>>a>>b>>c;
	if(a+b>c && b+c>a && a+c>b) //判断三角形是否成立
	{
	p=(a+b+c)/2;
	S=sqrt(p*(p-a)*(p-b)*(p-c));
	printf("%.2lf\n", S);
	}
	else
		cout<<"该三条边长不构成三角形。"<<endl;
    return 0;
}

参考:https://blog.csdn.net/qq_33290233/article/details/102082682
参考:https://blog.csdn.net/LQlqnifeng/article/details/50867095

【解析】

可用“海伦公式”求解三角形的面积。

假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积\(S\)可由海伦公式求得:

\(S=\sqrt{p(p-a)(p-b)(p-c)}\)

公式里的\(p\) 为半周长(周长的一半),即:

\(p=\dfrac{a+b+c}{2}\)

【扩展】

将\(p\)代入公式:

\(S=\sqrt{p(p-a)(p-b)(p-c)}\)
\(S=\sqrt{{\frac{1}{16}}(a+b+c)(a+b-c)(a+c-b)(b+c-a)}\)
\(S=\frac{1}{4}\sqrt{(a+b+c)(a+b-c)(a+c-b)(b+c-a)}\)

扩展1:设三角形三边分别为a、b、c,内切圆半径为\(r\),则三角形面积:

\(S=\dfrac{a+b+c}{2}\cdot{r}\)

可因此求内切圆半径\(r\):

例:a=3 b=4 c=5 p=6 S=6 r=1

\(6=\dfrac{3+4+5}{2}\cdot{r}\)
\(r=1\)

扩展2:设三角形三边分别为a、b、c,外接圆半径为\(R\),则三角形面积:

\(S=\dfrac{{a}\cdot{b}\cdot{c}}{{4}\cdot{R}}\)

可因此求外切圆半径\(R\):

例:a=3 b=4 c=5 p=6 S=6 R=2.5

\(6=\dfrac{{3}\cdot{4}\cdot{5}}{{4}\cdot{R}}\)
\(R=2.5\)

扩展3:已知三角形底a,高h,则三角形面积:

\(S=\dfrac{{a}\cdot{h}}{2}\)

扩展4:设三角形已知两条边分别为a、b,这两条边夹角C,则三角形面积等于两夹边之积乘夹角的正弦值:

\(S=\dfrac{{a}\cdot{b}}{2}\cdot\sin{C}\)

参考:https://zhidao.baidu.com/question/807942624977395372.html

【扩展】

结果保留到小数点后两位。

参考:https://blog.csdn.net/weixin_30068377/article/details/117101750

C语言中常用的小数有两种类型,分别是 float 或 double;float 称为单精度浮点型,double 称为双精度浮点型。不像整数,小数没有那么多幺蛾子,小数的长度是固定的,float 始终占用4个字节,double 始终占用8个字节。

c语言double类型默认输出几位小数?

C语言中,输出double类型(双精度实型)以及float类型(单精度实型)时,默认输出6位小数(不足六位以 0 补齐,超过六位按四舍五入截断)。double a = 1;

printf("%lf\n", a);

输出会是:1.000000

但是有时六位会显得很长,没必要。比如计算平均分,一到两位小数就足够了。可是有时六位又不够,需要更多位小数,比如计算高精度平方根。这时可以用printf的格式控制。如果要输出n位小数,那么可以用%.nlf的格式。其中n为数字。

如要输出10位小数,那么:

printf("%.10lf\n", a);

小数也可以使用 printf 函数输出,包括十进制形式和指数形式,它们对应的格式控制符分别是:%f 以十进制形式输出 float 类型;

%lf 以十进制形式输出 double 类型;

%e 以指数形式输出 float 类型,输出结果中的 e 小写;

%E 以指数形式输出 float 类型,输出结果中的 E 大写;

%le 以指数形式输出 double 类型,输出结果中的 e 小写;

%lE 以指数形式输出 double 类型,输出结果中的 E 大写。

【扩展】

保留两位小数输出:

#include <iomanip>
double res = 3.1415926;
cout << fixed << setprecision(2) << res << endl;

输出结果为3.14

保留2个有效数字输出:

#include <iomanip>
double res = 3.1415926;
cout << setprecision(2) << res << endl;

输出结果为3.1,注意结果会四舍五入。

参考:http://www.cnblogs.com/stacktrace/p/5142470.html