(c语法百题14)判断直角三角形

本文介绍了一个简单的算法,用于判断三个输入数值是否能构成直角三角形。通过比较三边长度并应用勾股定理,程序能够准确地判断并输出结果。此外,还涉及了基本的逻辑表达式用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



知识点:

逻辑表达式的用法

&&       ||       !     注意优先级。

 

内容:

输入三角形的三边,判断它是否是直角三角形,是输出Yes,不是输出No,连三角形都不是,输出Error

输入说明:

一行,输入3个整数

输出说明:

Yes! 或者 No!或者 Error! (注意大小写,标点前无空格)

 

输入样例:

3 4 5

输出样例 :

Yes!


答案代码请参考我的技术博客:http://www.cnblogs.com/hlwyfeng

<think>好的,我需要帮助用户用TypeScript编写判断三个边长是否构成直角三角形的代码。首先,我得回忆一下直角三角形的条件。根据勾股定理,直角三角形满足$a^2 + b^2 = c^2$,其中c是斜边,也就是最长的边。所以,我需要先确定三个边长中的最大值作为斜边,然后验证这个等式。 接下来,用户提到使用TypeScript,所以代码要符合TypeScript的语法,比如类型标注。可能需要写一个函数,接收三个参数,这三个参数是边长。然后,函数内部进行处理。 首先,处理输入。用户可能传入三个数值,我需要确保它们是正数,并且能构成三角形。因为即使满足勾股定理,如果三个数不能构成三角形也不行。比如,边长必须都大于0,且任意两边之和大于第三边。不过用户的问可能已经假设输入的是有效的三角形,但为了严谨,可能还是需要先判断是否能构成三角形,再检查是否是直角三角形。 然后,针对直角三角形的情况,正确的步骤应该是: 1. 将三个边长排序,找到最大的作为可能的斜边。 2. 计算较小的两个边的平方和是否等于斜边的平方。 3. 另外,还需要考虑浮点数计算的精度问,比如用近似比较而不是严格相等。 另外,用户提供的引用[3]中的代码里有计算三个点之间距离平方的部分,这可能和用户之前的代码有关联。但当前问只需要三个边长,不需要坐标点。所以可能不需要处理坐标,直接处理数值即可。 然后,我需要考虑函数的返回值,应该是布尔值,表示是否构成直角三角形。同时,函数需要处理可能的0或者负数输入,返回false。 现在,代码结构大概如下: function isRightTriangle(a: number, b: number, c: number): boolean { // 检查边长是否合法 if (a <= 0 || b <= 0 || c <= 0) return false; // 先判断是否能构成三角形 if (a + b <= c || a + c <= b || b + c <= a) return false; // 找到最大的边作为斜边 const [x, y, z] = [a, b, c].sort((x, y) => x - y); return Math.abs(x*x + y*y - z*z) < 1e-6; // 处理浮点精度问 } 这里需要注意,排序后,z是最大的,所以x和y是较小的两个边。然后检查x² + y²是否等于z²。但由于浮点数计算可能有精度损失,所以用近似比较。 用户提供的引用[2]中提到了直角三角形判断,可能还需要考虑是否为等腰直角三角形,但目只要求判断是否为直角三角形,所以不需要考虑等腰的情况。 另外,引用[3]中的代码在处理三个点的时候,计算了三个边的平方,并检查是否有两条边的平方和等于第三条边的平方,同时还有边长相等的判断。这可能是因为在正方形的验证中需要同时满足多个条件。但当前问只需要三个边满足勾股定理,所以可以简化处理。 可能还需要测试用例,比如输入3,4,5应该返回true,输入1,1,1返回false,以及处理浮点数如1,1,√2的情况。 总结下来,步骤是:验证输入有效性,判断是否为三角形,排序边长,应用勾股定理,并处理精度问。</think>以下是用TypeScript实现直角三角形判断的分步解决方案: ### 分步实现方案 1. **验证输入有效性** ```typescript function isRightTriangle(a: number, b: number, c: number): boolean { // 排除非正数边长 if ([a, b, c].some(n => n <= 0)) return false; // 验证三角形基本性质(两边之和大于第三边) if (a + b <= c || a + c <= b || b + c <= a) return false; ``` 2. **排序边并应用勾股定理** ```typescript // 将边按升序排列,z为最长边(潜在斜边) const [x, y, z] = [a, b, c].sort((m, n) => m - n); // 使用误差范围处理浮点数精度问 return Math.abs(x**2 + y**2 - z**2) < 1e-6; } ``` ### 完整函数代码 ```typescript function isRightTriangle(a: number, b: number, c: number): boolean { if ([a, b, c].some(n => n <= 0)) return false; if (a + b <= c || a + c <= b || b + c <= a) return false; const [x, y, z] = [a, b, c].sort((m, n) => m - n); return Math.abs(x**2 + y**2 - z**2) < 1e-6; } ``` ### 测试用例 ```typescript console.log(isRightTriangle(3, 4, 5)); // true console.log(isRightTriangle(5, 3, 4)); // true(验证无序输入) console.log(isRightTriangle(1, 1, Math.sqrt(2))); // true(等腰直角三角形) console.log(isRightTriangle(2, 3, 4)); // false console.log(isRightTriangle(0, 1, 1)); // false(非法输入) ``` ### 关键点说明 1. **输入验证**:排除零或负数的边长,验证三角形基本性质 2. **浮点精度处理**:使用误差范围`1e-6`代替严格相等判断 3. **排序技巧**:通过排序自动确定潜在斜边,避免手动比较 4. **勾股定理应用**:$a^2 + b^2 = c^2$ 是直角三角形的充要条件[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值