求三角形面积

题目

对于给出的任意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);
	}
}

运行结果

在这里插入图片描述

在这里插入图片描述

参考资料

参考代码
开方方法
三角形面积在线计算器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值