题目
对于给出的任意3个值(精度最多为小数点后2位),请确认以这3个值为三角形边长是否可以形成一个三角形;如果可以形成一个三角形,请算出该三角形的面积。
注意:只能调用加减乘除运算,不能使用其它运算.
解题思路
- 使用海伦公式计算
- 使用牛顿发开平方
源码
#define _CRT_SECURE_NO_WARNINGS //处理scanf报错问题
#include <stdio.h>
#define DEBUG_SWITCH 1
#if DEBUG_SWITCH
#define DEBUG_INFO(format, ...) printf("LINE: %d: "format"\n", __LINE__, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif
#define TRUE 1
#define FALSE 0
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned long int uint32_t;
typedef unsigned long long int uint64_t;
typedef struct {
double a;
double b;
double c;
double s;
double area;
}triangle_def;
triangle_def triangle = { 0 };
uint8_t triangle_init(triangle_def *triangle_p)
{
uint8_t ret = FALSE;
if (triangle_p != NULL)
{
triangle_p->a = (double)0;
triangle_p->b = (double)0;
triangle_p->c = (double)0;
triangle_p->s = (double)0;
triangle_p->area = (double)0;
ret = TRUE;
}
else
{
DEBUG_INFO("function input parameter abnormal");
ret = FALSE;
}
return ret;
}
uint8_t triangle_edge_input(triangle_def *triangle_p)
{
uint8_t triangle_buf[16] = { 0 };
uint8_t ret = TRUE;
if (triangle_p != NULL)
{
printf("enter the three sides of the triangle\r\n");
ret &= scanf("%lf", &triangle_p->a);
ret &= scanf("%lf", &triangle_p->b);
ret &= scanf("%lf", &triangle_p->c);
if (ret == TRUE)
{
printf("you input is \r\na = %f \r\nb = %f \r\nc = %f", triangle_p->a, triangle_p->b, triangle_p->c);
}
else
{
printf("triangle input parameter abnormal");
}
}
else
{
DEBUG_INFO("function input parameter abnormal");
ret = FALSE;
}
return ret;
}
const double min_value = 1e-7; //定义最小的浮点数数误差
uint8_t equal_double(double num1, double num2)
{
if ((num1 - num2 > -min_value) && (num1 - num2 < min_value))
return TRUE;
else
return FALSE;
}
double sqrt_newton(double square)
{
double ret = (double)1.0;
if (square < min_value)
{
ret = (double)-1;
}
else
{
while (!equal_double(ret*ret, square))
{
ret = (ret + square / ret) * 0.5;
}
}
return ret;
}
uint8_t triangle_area(triangle_def *triangle_p)
{
uint8_t ret = FALSE;
if (triangle_p != NULL)
{
triangle_p->s = (triangle_p->a + triangle_p->b + triangle_p->c) * (double)0.5;
//if (((triangle_p->a + triangle_p->b) > triangle_p->c) && ((triangle_p->a - triangle_p->b) < triangle_p->c))
if (triangle_p->s > (double)0.0)
{
triangle_p->area = triangle_p->s * (triangle_p->s - triangle_p->a) * (triangle_p->s - triangle_p->b) * (triangle_p->s - triangle_p->c);
triangle_p->area = sqrt_newton(triangle_p->area);
if (triangle_p->area > (double)0.0)
{
printf("the area of a triangle is %0.2lf\r\n", triangle_p->area);
ret = TRUE;
}
else
{
printf("sqrt_newton error : %lf", triangle_p->area);
ret = FALSE;
}
}
else
{
printf("it's not a triangle");
ret = FALSE;
}
}
else
{
DEBUG_INFO("function input parameter abnormal");
ret = FALSE;
}
return ret;
}
int main()
{
uint8_t ret = FALSE;
ret = triangle_init(&triangle);
ret = ((ret == TRUE) && (triangle_edge_input(&triangle))) ? TRUE : FALSE;
ret = ((ret == TRUE) && (triangle_area(&triangle))) ? TRUE : FALSE;
if (ret == TRUE)
{
exit(0);
}
else
{
exit(1);
}
}