【题目】
【问题描述】
输入一个三角形的三条边长,求此三角形的面积。
【输入格式】
一行三个整数 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,注意结果会四舍五入。