2010-07-23 145 views
-1

我一直在研究这个源代码,但没有任何东西似乎正确。修改后的源代码将非常感谢,或者至少是我的错误的可视化解决方案。三角形C++边缘计算

以下是以下问题:编写一个读取三角形三条边的程序,并确定输入是否有效。如果任何两个边的总和大于第三个边,则输入有效。下面是该程序的示例运行: 输入三条边线1,2.5,1 [Enter] 边线1,2.5和1是否可以形成三角形?假

这里是我迄今为止的源代码“:

#include <iostream> 
using namespace std; 

bool Valid (int tri_a, int tri_b, int tri_c); 
bool triangle; 


int main() 
{ 
int a; 
int b; 
int c; 
cout << "Enter three edges: "; 
double edge1, edge2, edge3; 
cin >> edge1 >> edge2 >> edge3; 

bool isValid = (edge1 + edge2 > edge3) && 
(edge1 + edge3 > edge2) && (edge3 + edge2 > edge1); 
cout << " Enter the 1st value: "; 
cin >> a; 
cout << " Enter the 2nd value: "; 
cin >> b; 
cout << " Enter the 3rd value: "; 
cin >> c; 




bool triangle = Valid (a, b, c); 

{ 
if (triangle == true) 
cout << "valid" << endl; 
else 
cout << "invalid" << endl; 
} 

system ("pause"); 

return 0; 

} 
+4

“但似乎没有任何向右走” 的说法太含糊。你有什么问题?什么不能正常工作? – 2010-07-23 17:23:10

+1

没有冒犯。你的代码有严重的问题,你需要更多的帮助,而不是告诉你如何在互联网上完成你的任务。看起来你需要写一个名为Valid的函数,而你没有这么做。此外,你似乎做了两次输入/输出。 – 2010-07-23 17:27:15

+6

如果你坚持用'true'来比较布尔值,那么请记住比较的结果也是一个布尔值。所以测试应该读取'if((triangle == true)== true)'。 – 2010-07-23 17:36:58

回答

4

编辑:这些问题的答案,在这里评论开始听起来很疯狂就像我说的,在一个三角形中,每两个边缘的总和必须小于第三大1+1>sqrt(2)1+sqrt(2)>1sqrt(2)+1>1作为一个90度的三角形具有两个1长度的边缘的一例的isValid所述逻辑FINE

下面是来自Wikipedia article报价:。。

一个三角形的任何两边的长度总和总是超过第三边的长度,这个原理称为三角不等式。由于三角形的顶点被假定为非共线,所以两边长度的总和不可能等于第三边的长度。


好了,你没有定义的有效方法。另外,为什么你一起阅读3个值,然后一个接一个地读取3个值?

这里有一个快速解决方案,看看它是否工作(没有测试过):

#include <iostream> 
using namespace std; 


int main() { 
    cout << "Enter three edges: "; 
    double edge1, edge2, edge3; 
    cin >> edge1 >> edge2 >> edge3; 

    bool isValid = (edge1 + edge2 > edge3) && 
    (edge1 + edge3 > edge2) && (edge3 + edge2 > edge1); 

    if (isValid) 
     cout << "valid" << endl; 
    else 
     cout << "invalid" << endl; 

    system ("pause"); //not sure if this is right, so I left it here. 
    return 0; 
} 
+0

检查isValid行的逻辑 – Woot4Moo 2010-07-23 17:33:27

+2

这完全没错!在三角形中,每两个边的总和必须大于第三个! 1 + sqrt(2)','1 + sqrt(2)> 1','sqrt(2)+1> 1'作为具有两个'1'长边的90度三角形的示例。 – 2010-07-23 17:35:32

+0

+1除了(现有的)'system'调用有问题外,这看起来应该解决所有显而易见的问题。 – 2010-07-23 17:46:56

1

由阿米尔Rachum提出的解决方案是一个很好的教科书的解决方案。然而,它有三个实际问题:

  1. 它不验证输入(3个正数字)

  2. 如果(edgeX +埃奇> edgeZ)可以导致溢出。如果(edgeX> edgeZ-edgeY)(在验证数字是正数之后)会得到更好的检查。

  3. 如果输入边缘的尺寸不同,它可能会返回false而不是true。例如:1,1e300,1e300。

这里是我的建议解决方案:

#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std; 

    int main() 
    { 
     cout << "Enter three edges: "; 

     string edges; 
     getline (cin, edges); 

     stringstream sstream; 
     sstream << edges.c_str(); 

     double edge1= 0., edge2= 0., edge3= 0.; 
     string extra= ""; 
     sstream >> edge1 >> edge2 >> edge3 >> extra; 

     if (edge1>0. && edge2>0. && edge3>0. && extra=="") 
     { 
      // e.g. 1e300-1 == 1e300 
      bool bValid1= (edge3-edge2 == edge3) ? edge1>=edge3 : edge1 > edge3 - edge2; 
      bool bValid2= (edge2-edge3 == edge2) ? edge1>=edge2 : edge1 > edge2 - edge3; 
      bool bValid3= (edge1-edge2 == edge1) ? edge3>=edge1 : edge3 > edge1 - edge2; 

      bool isValid= bValid1 && bValid2 && bValid3; 

      if (isValid) 
       cout << "valid" << endl; 
      else 
       cout << "invalid" << endl; 
     } 
     else 
      cout << "invalid input" << endl; 

     system ("pause"); 
     return 0; 
    }