题目

从标准输入读入三条边长 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

输出:

结论: 无法构成三角形 (两边之和未大于第三边)