判断输入的三条边是否能组成三角形

练习题:编写一个程序根据输入的三角形的三条边判断是否能组成三角形,如果可以 则输出它的面积和三角形类型(等边、等腰、直角三角形)。

题目分析

  1. 这道题查了一些网上的参考,大多使用if(...)else if(...)对不同类型的三角形进行划分,但实际上,直角三角形和等腰三角形有一部分重合的三角形:等腰直角三角形。也就是在输入等腰直角三角形时,会根据“等腰三角形”或“直角三角形”两个条件,谁在前面就显示哪个三角形,不会进一步判断
  2. 其次,许多范例使用float类型进行运算,考虑到输入时根号下的数只能通过小数表示,如果直角的判断条件为(a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a)时,输入边长(1 1 1.414),因为1.414*1.414≈1.96,只能判断为等腰三角形

针对以上两个问题,对参考范例进行了优化。

优化思路

  1. 将直角三角形的判断中增加一个等腰判断,同时符合“等腰”和“直角”条件的三角形会输出为“等腰直角三角形”;
  2. 使用double进行计算,并使用round函数对边长的平方进行四舍五入,解决输入端无法精确输入根号边长,导致无法判断某些直角三角形的问题

代码

点击查看代码
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

void timu_8() {
	double a, b, c;
	double s, area;
	printf("请输入三角形的三条边(空格分开):");
	scanf("%lf %lf %lf", &a, &b, &c);
	double A = round(a * a);
	double B = round(b * b);
	double C = round(c * c);
	
	if (a + b > c && a + c > b && b + c > a) {
		s = (a + b + c) / 2;
		area = sqrt(s * (s - a) * (s - b) * (s - c));
		printf("面积是:%.2lf\n", area);
		if (a == b && a == c) {
			printf("等边三角形。\n");
		}
		else if (A + B == C || A + C == B || B + C == A) {
			if (a == b || a == c || b == c) {
				printf("等腰直角三角形。\n");
			}
			else {
				printf("直角三角形\n");
			}
		}
		else if (a == b || a == c || b == c) {
			printf("等腰三角形。\n");
		}
		else {
			printf("普通三角形。\n");
		}
	}
	else {
		printf("不能构成三角形。\n");
	}
}

int main() {
	printf("hallo world\n"); //确认终端是否正常启动
	timu_8();
	return 0;
}
posted @ 2022-03-01 21:57  star酱酱  阅读(1351)  评论(0编辑  收藏  举报