【问题标题】:How to know whether the triangle is valid or not by angles?如何通过角度知道三角形是否有效?
【发布时间】:2017-12-04 12:20:10
【问题描述】:

我想编写一个 C++ 程序来判断三角形是否有效
这是我的代码:

#include <iostream>
using namespace std;
int main () {
    int a,b,c;
    cin>>a>>b>>c;
    if (a+b+c==180)
    cout <<"Yes";
    else
    cout <<"No";
    return 0;
}

用户将输入 3 个角度,例如 50 30 100 它将打印有效 Yes,但如果他输入了会怎样
0 0 180 只输入一个角度就会打印yes。那不是三角形,我的程序将打印是。我应该怎么做才能解决这个问题?

【问题讨论】:

  • 是否将0 0 180 视为三角形是相当随意的,因此您必须使用额外的分支来处理这种情况
  • 顺便说一句,我会更担心用户输入类似-20 -10 210....
  • @tobi303,是的,这些情况我该怎么办?
  • 在这种情况下该怎么做取决于您。如果你不想有负角,使用无符号类型将是一个开始
  • 除了检查总和之外,您还应该对每个角度进行一些有效的范围检查(例如 1

标签: c++ math


【解决方案1】:

从某种意义上说,你是对的;如果您有足够的信息来确定三角形无效,则继续该程序是没有意义的。因此,在我下面建议的代码 sn-p 中,您可以看到,一旦用户输入了一个 180 的值,程序就会以适当的错误消息终止。同样,一旦运行总和超过 180,程序也会提前终止。

最后,一旦输入了所有三个角度的值,所有这些值都独立地是三角形的有效角度,检查它们的总和。

int main() 
{
    // assuming angles must be integers:
    int angle, sum = 0;
    for (int i = 0; i < 3; i++) {
        cin >> angle;
        if (angle <= 0 || angle >= 180) {
            cout << "Error: Angle must be between 0 and 180\n";
            return 0;
        }

        sum += angle;

        if (sum > 180) {
            cout << "Error: angles too large\n";
            return 0;
        }
    }

    if (sum == 180) {
        cout << "Valid Triangle!\n";
    } else {
        cout << "Error: angles must add up to 180\n";
    }
    return 0;
}

【讨论】:

  • 反对者,请解释一下?这个答案是正确的,并且解决了问题中提出的所有案例
  • 仅代码的答案从长远来看很少有用(即除了 OP 复制和粘贴此代码之外的任何内容)
  • @tobi303 够公平的。添加说明
  • @Caleth 它允许在这样的脚本中更简单地使用程序:echo "10 20 50" | is_triangle &amp;&amp; do_something_with_triangles
  • 第一个 if 语句应该是 if (angle &lt;= 0 || angle &gt;= 180) - 如果任何角度为 0 或 180,您已经敬酒了。
【解决方案2】:

在此代码中您必须考虑两个问题。首先:用户输入的角度是否有效(即,不为负,不超过 180 度,也可能不为 0)。其次,一旦你确定了这些角度是有效的,确定这三个角度是否可以成为一个三角形的一部分。

所以编写两个函数:一个通过提示输入来获取角度,检查角度是否有效,如果不是则循环返回;一个决定三个有效角度是否是三角形。然后用适当的胶水将它们固定在一起。

【讨论】:

  • 我明白了,我写了 if (a+b+c == 180 && a>0 && b>0 &&c>0) else cout
  • @AdamEve — 酷!只是个人风格提示:我会反过来编写测试,首先测试需求,然后是“真正的”测试:if (a&gt;0 &amp;&amp; b&gt;0 &amp;&amp; c&gt;0 &amp;&amp; a+b+c==180)。你的是正确的,但在其他情况下,顺序很重要。例如:int *ip = 0; if (ip &amp;&amp; *ip)... — 在这里,首先测试指针的有效性,以防止解除对无效指针的引用。
猜你喜欢
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 2014-02-12
  • 2018-04-08
相关资源
最近更新 更多