【C语言】输入4个点,计算4个点组成的图形的面积。讨论4点构成直线(没有面积)、三角形、四边形的情况。

一、实验思路 

  1. 可以使用向量积来计算组成的图形面积,因为对于任意四边形,它们的面积等于两条对角线向量叉乘的绝对值的1/2,但是,本题四个点并不一定会组成四边形,所以我们可以对公式进行一点小变形来计算组成的图形面积
  2. 因为任意三角形的面积对于任意两边向量叉乘的绝对值的1/2,任意四边形也可以通过对角线来分为两个三角形,而当三点共线时,三点组成的任意两个向量的叉乘的绝对值为0,我们可以通过这个来判断四点构成的各种情况,并计算组成图形的面积
  3. 对于ABCD,可以以BC为对角线,化为ABC和DBC,设S1为ABC的面积值,S2为DBC的面积值,则总面积S为S1+S2,当S1和S2都为0时,ABCD构成直线,当S1和S2中有且仅一个为0时,ABCD构成三角形,当S1和S2都不为0时,ABCD构成四边形,这就是判断形状和计算面积的大致思路
  4. 上面的思路看起来很正确,但实际上有一个小漏洞,就是判断三角形时,它只能判断有一条边端点为BC的三角形,一旦三角形有一边以AD为端点时,此时B和C一点为端点,一点在AD中间时,此时的S1与S2都不为0,相当于以BC把三角形分成了两个三角形,这显然是可以做到的,所以在这种情况下的三角形通过上面的思路,会被判定为四边形,而面积值依旧正确,那么就需要加一点东西来让这种情况能被判定为三角形
  5. 这时我们可以增加两个量为S3、 S4,类似于S1和S2,对于ABCD,可以以AD为对角线,化为BAD和CAD,设S3为BAD的面积值,S4为CAD的面积值 ,于是当S1、S2、S3、S4中任意一个值为0时,此时ABCD构成的图形一定为三角形,这样就可以正确判断出各种情况下的图形形状了

 二、代码

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

int main()
{
	float S1, S2, S3, S4, S;
	float x1, x2, x3, x4;
	float y1, y2, y3, y4;

	printf("请依次输入A、B、C、D点的坐标,以(x,y)的形式输入,中间用一个空格隔开:\n");
	scanf("(%f,%f) (%f,%f) (%f,%f) (%f,%f)", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);//输入A、B、C、D点坐标

	S1 = fabs(((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)) / 2.0);//ABC构成的面积
	S2 = fabs(((x2 - x4) * (y3 - y4) - (x3 - x4) * (y2 - y4)) / 2.0);//DBC构成的面积
	S3 = fabs(((x1 - x2) * (y4 - y2) - (x4 - x2) * (y1 - y2)) / 2.0);//BAD构成的面积
	S4 = fabs(((x1 - x3) * (y4 - y3) - (x4 - x3) * (y1 - y3)) / 2.0);//CAD构成的面积
	S = S1 + S2;//计算总面积

	if (S1 == 0 && S2 == 0)//判断形状并输出面积的值
		printf("A、B、C、D点构成直线,没有面积。\n");
	else if (S1 == 0 || S2 == 0 || S3 == 0 || S4 == 0)
		printf("A、B、C、D点构成三角形,该三角形的面积为:%f\n", S);
	else
		printf("A、B、C、D点构成四边形,该四边形的面积为:%f\n", S);

	return 0;
}

三、总结

这道题目涉及了多分支选择结构以及逻辑运算符的使用,难点主要是面积值的计算方法和判断条件怎么设置

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值