c#编写三角形面积公式_三角形面积的公式,这2种“割补”、4种“拼组”推导,你了解么?...

前面介绍了“平行四边形的面积”公式推导,用的是“割补法”转化为长方形,用长方形和平行四边形之间的联系推导出:平行四边形的面积=底×高。而今天要介绍的是“三角形的面积”,其公式推导比平行四边形面积的公式推导方法要多,除了2种“割补法”,还有4种“拼组法”。

dbb5925e65d53c562addb046b69c5f21.png

同样的,提出问题还是得从“解决问题”开始:“4名同学要算出红领巾的面积(红领巾是三角形),可以怎么做呢?”首先想到的是,能不能像推导平行四边形的面积公式一样,把“三角形”也转化成学过的图形呢?

有了这个思路,顺其自然的就可以先用“割补法”进行尝试:

1.把“三角形”转化为“平行四边形”。

任意三角形,把一个顶角对折到对面的底边,保证“折痕”与这个顶点到这条底边上的“高”相互垂直,然后沿折痕剪开,将这个大三角形分成了一个小三角形和一个梯形。再把剪下的小三角形拼摆到下面的梯形的左边或右边,组成一个平行四边形,但这个平行四边形的高,是原大三角形高的一半,即:高÷2。

因此,根据“平行四边形的面积=底×高”推导出“三角形的面积=底×(高÷2)=底×高÷2”

34bb6b38c19cf9c61af577571c6ff030.png

2.把“三角形”转化为“长方形”。

还是任意三角形,把一个顶角对折到对面的底边,保证“折痕”与这个顶点到这条底边上的“高”相互垂直,然后沿折痕剪开,将这个大三角形分成了一个小三角形和一个梯形,再把小三角形沿“高”剪开,分成两个直角三角形。最后将这两个直角三角形分别拼摆到下面梯形的左右两边,组成一个长方形。但这个长方形的宽,也是原大三角形高的一半,即:高÷2。

因此,根据“长方形的面积=长×宽”推导出“三角形的面积=底×(高÷2)=底×高÷2”。

bbf831e585b23bc81ba69e9412e07e04.png

接下来,进行思考,除了“割补法”,还有其他方法把三角形转化成学过的图形么?可以拿两个完全一样的三角形来拼一拼,也就是“拼组法”:

1.用两个完全一样的锐角三角形拼摆

把两个完全一样的三角形标上“底”,再画出“高”。然后把3条一样长的边分别进行拼组,调整成一个平行四边形,这样,2个完全一样的“锐角三角形”就可以拼组成3种“等底等高的平行四边形”。既然一个平行四边形是由两个完全一样的三角形拼组成的,那么其面积就是一个三角形的2倍,即1个三角形的面积就是“平行四边形的面积÷2”,即:三角形的面积=底×高÷2

2.用两个完全一样的钝角三角形拼摆

同样,用两个完全一样的钝角三角形拼摆,也可以摆出3种“等底等高的平行四边形”,所以,一样可以推导出:三角形的面积是即:三角形的面积=底×高÷2

78f00cf153e2a74a2219f1abd9a866e1.png

3.用两个完全一样的直角三角形拼摆

直角三角形比较特殊,两条直角边就互为“底”和“高”,有2组。另一组“底”是最长的斜边,“高”是直角上的顶点到斜边的垂直距离。由于直角三角形有一个角是直角,因此在拼组的图形中,能拼出一个“长方形”和两个“平行四边形”(等底,等高)。同样,三角形的面积是“平行四边形的面积÷2”或“长方形的面积÷2”,即:三角形的面积=底×高÷2

4.用两个完全一样的等腰直角三角形拼摆

在直角三角形中,当两条直角边相等的时候就成了“等腰直角三角形”。这时,将两个三角形斜边拼摆到一起,就拼成了一个“等底等高的正方形”,另外两种拼摆方法仍然能拼组成两个“等底等高的平行四边形”。所以,三角形的面积是“平行四边形的面积÷2”或“正方形的面积÷2”,即:三角形的面积=底×高÷2

063534be9b3c4b6d50906ae362e2ee4e.png

亲们,三角形的面积公式,推导方法除了以上的几种之外,你还有没有其他方法呢?欢迎您的分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用以下代码实现: #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *next; } Node; Node *mergeLists(Node *list1, Node *list2) { Node *head = NULL; Node **tail = &head; while (list1 && list2) { if (list1->data < list2->data) { *tail = list1; list1 = list1->next; } else { *tail = list2; list2 = list2->next; } tail = &((*tail)->next); } *tail = (list1 ? list1 : list2); return head; } int main() { Node *list1 = NULL; Node *list2 = NULL; int score; printf("请输入学生成绩(输入-1为结束标志):\n"); while (1) { scanf("%d", &score); if (score == -1) { break; } Node *node = (Node *)malloc(sizeof(Node)); node->data = score; node->next = NULL; if (!list1 || score < list1->data) { node->next = list1; list1 = node; } else { Node *prev = list1; Node *cur = list1->next; while (cur && score >= cur->data) { prev = cur; cur = cur->next; } node->next = cur; prev->next = node; } } printf("第一个链表为:\n"); Node *cur = list1; while (cur) { printf("%d ", cur->data); cur = cur->next; } printf("\n"); printf("请输入学生成绩(输入-1为结束标志):\n"); while (1) { scanf("%d", &score); if (score == -1) { break; } Node *node = (Node *)malloc(sizeof(Node)); node->data = score; node->next = NULL; if (!list2 || score < list2->data) { node->next = list2; list2 = node; } else { Node *prev = list2; Node *cur = list2->next; while (cur && score >= cur->data) { prev = cur; cur = cur->next; } node->next = cur; prev->next = node; } } printf("第二个链表为:\n"); cur = list2; while (cur) { printf("%d ", cur->data); cur = cur->next; } printf("\n"); Node *mergedList = mergeLists(list1, list2); printf("合并后的链表为:\n"); cur = mergedList; while (cur) { printf("%d ", cur->data); cur = cur->next; } printf("\n"); return 0; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值