题目
从标准输入读入三条边长 a, b, c,首先判定能否构成合法三角形(任意两边之和大于第三边);若能构成,进一步识别是否为等边三角形、等腰三角形、直角三角形(勾股定理容差验证)或普通三角形。
输入格式:一行输入 3 个正浮点数。
输出格式:输出三角形判定结论与具体形态分类。
数据范围与约定:三边为正实数。
思路与算法
1. 三角形两边和条件
必须同时满足:$a+b>c$ 且 $a+c>b$ 且 $b+c>a$。若对边长排序后为 $e_1 \le e_2 \le e_3$,则等价简化为 $e_1 + e_2 > e_3$。
2. 浮点勾股定理容差
判断直角三角形时,检验 $a^2 + b^2 = c^2$ 绝不能用直接等号,应使用 abs(e1^2 + e2^2 - e3^2) < 1e-9。
3. 排序技巧
使用 edges = sort([a, b, c]) 可以极其清晰地直接获取最短边、中间边与最长边。
完整程序
% Octave / MATLAB 第45题:三角形判定与类型识别
[vals, count] = scanf("%f", 3);
if count < 3 || any(vals <= 0)
fprintf("错误:请输入 3 个大于 0 的有效边长。\n");
return;
end
% 升序排序:e(1) <= e(2) <= e(3)
e = sort(vals);
if e(1) + e(2) <= e(3)
fprintf("结论: 无法构成三角形 (两边之和未大于第三边)\n");
return;
end
% 类型细分
if abs(e(1) - e(3)) < 1e-9
fprintf("结论: 构成等边三角形\n");
elseif abs(e(1) - e(2)) < 1e-9 || abs(e(2) - e(3)) < 1e-9
fprintf("结论: 构成等腰三角形\n");
elseif abs(e(1)^2 + e(2)^2 - e(3)^2) < 1e-9
fprintf("结论: 构成直角三角形\n");
else
fprintf("结论: 构成普通不等边三角形\n");
end运行示例
示例 1:
输入:
3 4 5输出:
结论: 构成直角三角形示例 2:
输入:
5 5 5输出:
结论: 构成等边三角形示例 3:
输入:
1 2 3输出:
结论: 无法构成三角形 (两边之和未大于第三边)