C语言判断三角形类型并输出面积(使用宏定义输出类型、海伦公式计算面积)

题目说明:根据输入的三角形的边长判断三角形的类型并输出它的面积和类型。
解题说明:组成三角形的条件是:任意两边之和大于第三边。类型可根据各个三角形特征进行分辨。

面积求解:利用海伦公式S=\sqrt{p(p-a)(p-b)(p-c)} 计算

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

S=\sqrt{p(p-a)(p-b)(p-c)}而公式里的p为半周长(周长的一半):p=\frac{a+b+c}{2}

C语言代码实现:

#include<stdio.h>
#include<math.h>

#define TYPE_CASE(x) case(x):return (#x);
void Calculate(int a, int b, int c);
void PutResult(enum TYPE type, double area);
static inline const char *typetostring(enum TYPE type);

enum TYPE
{
	普通三角形,
	等腰三角形,
	等边三角形,
	直角三角形,
	等腰直角三角形,
	不能构成三角形!
};

int main() {
	int a, b, c;
	printf("输入三角形三边\n");
	scanf_s("%d%d%d", &a, &b, &c);
	Calculate(a, b, c);
}
//计算过程
void Calculate(int a, int b, int c) {
	int p = (a + b + c) / 2;
	if (a + b > c && a + c > b&&b + c > a)
	{
		if (a == b || a == c || b == c)
		{
			if (a == b && a == b && b == c)
				PutResult((TYPE)2, sqrt(p*(p - a)*(p - b)*(p - c)));
			else
				PutResult((TYPE)1, sqrt(p*(p - a)*(p - b)*(p - c)));
			if (a*a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a)
				PutResult((TYPE)4, sqrt(p*(p - a)*(p - b)*(p - c)));
		}
		else if (a*a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a)
			PutResult((TYPE)3, sqrt(p*(p - a)*(p - b)*(p - c)));
		else
			PutResult((TYPE)0, sqrt(p*(p - a)*(p - b)*(p - c)));
	}
	else
		PutResult((TYPE)5, 0);
}
//获取枚举类型名称
static inline const char *typetostring(enum TYPE type) {
	switch (type)
	{
		TYPE_CASE(普通三角形)
			TYPE_CASE(等腰三角形)
			TYPE_CASE(等边三角形)
			TYPE_CASE(直角三角形)
			TYPE_CASE(等腰直角三角形)
			TYPE_CASE(不能构成三角形!)
	}
	return NULL;
}
//输出结果
void PutResult(enum TYPE type, double area) {
	printf("%s\n面积%f\n", typetostring(type), area);
}

代码解析:

  • 函数声明:在C语言中定义函数后,在使用前,需要在main函数前进行声明,否则会报错。或者将需要调用的函数写在Main函数前,但是依旧建议编写C语言代码的时候能够养成书写函数声明的习惯。
void Calculate(int a, int b, int c);
void PutResult(enum TYPE type, double area);
static inline const char *typetostring(enum TYPE type);
  • 枚举类型:枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。
enum TYPE
{
	普通三角形,
	等腰三角形,
	等边三角形,
	直角三角形,
	等腰直角三角形,
	不能构成三角形!
};
  • 宏定义:定义宏函数,获取枚举类型的枚举子(默认情况下无法直接答应枚举子,只能打印枚举子的值[详情可参考枚举类型])。
#define TYPE_CASE(x) case(x):return (#x);

枚举类型:

  • 枚举类型的定义:一般形式   enum 枚举名 {枚举元素1,枚举元素2,……};
enum Season {spring, summer, autumn, winter};  
  • 枚举变量的定义:
  1. 先定义枚举类型,再定义枚举变量
    enum Season {spring, summer, autumn, winter};
    enum Season s;

     

  2. 定义枚举类型的同时定义枚举变量
     enum Season {spring, summer, autumn, winter} s;

     

  3. 省略枚举名称,直接定义枚举变量
     enum {spring, summer, autumn, winter} s;

     

  • 使用枚举的注意事项:
  1. C语言编译器会将枚举元素(spring、summer等)作为整型常量处理,称为枚举常量。
  2. 枚举元素的值取决于定义时各枚举元素排列的先后顺序。默认情况下,第一个枚举元素的值为0,第二个为1,依次顺序加1。

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋洋脚踝的金铃响了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值