2010-07-23 5 views
-1

J'ai travaillé sur ce code source, mais rien ne semble fonctionner. Un code source révisé serait extrêmement apprécié, ou au moins une solution visuelle à mes erreurs.Calcul de bord triangulaire C++

Voici le problème suivant: Écrivez un programme qui lit trois arêtes pour un triangle et détermine si l'entrée est valide. L'entrée est valide si la somme de deux arêtes quelconques est supérieure au troisième arête. Voici les exemples d'exécutions de ce programme: Entrez trois arêtes 1, 2.5, 1 [Entrée] Les arêtes 1, 2.5 et 1 peuvent-elles former un triangle? faux

Voici ce que j'ai jusqu'à présent pour le code source ":

#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

"mais rien ne semble aller à droite" est trop vague. Quels problèmes avez-vous? Qu'est-ce qui ne fonctionne pas correctement? –

+1

Aucune infraction. Votre code a de sérieux problèmes et vous avez besoin de plus d'aide que les gens qui vous disent comment faire votre travail sur Internet. Il semble que vous deviez écrire une fonction appelée Valid, ce que vous n'avez pas fait. En outre, vous semblez faire des entrées/sorties deux fois. –

+6

Si vous insistez pour comparer les booléens avec 'true' comme ça, alors rappelez-vous que le résultat de la comparaison est aussi un booléen. Donc le test devrait lire 'if ((triangle == true) == true)'. –

Répondre

4

Modifier. Comme je l'ai dit que les réponses et les commentaires ici commencent à sonner vraiment fou, dans un triangle, la somme de tous les deux bords doit être plus grand que le troisième 1+1>sqrt(2), 1+sqrt(2)>1, sqrt(2)+1>1 comme un exemple pour un triangle de 90 degrés avec deux 1 arêtes de longueur la logique de isValid est FINE

Voici une citation du Wikipedia article:..

La somme des longueurs des deux côtés d'un triangle dépasse toujours la longueur du troisième côté, un principe connu sous le nom d'inégalité triangulaire. Puisque les sommets d'un triangle sont supposés non colinéaires, il n'est pas possible que la somme de la longueur des deux côtés soit égale à la longueur du troisième côté.


Eh bien, vous ne définit pas la méthode valide. Aussi, pourquoi lisez-vous 3 valeurs ensemble, puis 3 valeurs une par une?

Voici une solution rapide, voir si cela fonctionne (ont pas testé):

#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

vérifier la logique de la ligne isValid – Woot4Moo

+2

C'est tout à fait bien! Dans un triangle, la somme de tous les deux bords doit être plus grande que la troisième! '1 + 1> sqrt (2)', '1 + sqrt (2)> 1',' sqrt (2) +1> 1' à titre d'exemple pour un triangle de 90 degrés avec deux arêtes de longueur '1'. –

+0

+1 Autre que l'appel 'system' (existant) étant discutable, cela semble devoir résoudre tous les problèmes évidents. –

1

La solution proposée par Amir Rachum est une bonne solution de manuel. Cependant, il a trois problèmes pratiques:

  1. Il ne valident pas l'entrée (3 numerics positifs)

  2. si (edgeX + Edgey> edgeZ) peut provoquer un débordement. Une meilleure vérification serait si (edgeX> edgeZ-edgeY) (après avoir vérifié que les nombres sont positifs).

  3. si les arêtes d'entrée ont des échelles différentes, il peut retourner false au lieu de vrai. par exemple: 1, 1e300, 1e300.

Voici ma solution proposée:

#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; 
    }