2010-07-23 178 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; 
    }