rechtwinkliges dreieck in c++

Lemonhead

Commodore Special
Mitglied seit
28.10.2004
Beiträge
434
Renomée
2
Standort
Salzwedel/Magdeburg
hallo allerseits,
ich hab da ein kleines problem... als absoluter neuling in sachen c++ hab ich da ein kleines problem.
die bestimmung ob das dreieck rechtwinklig ist oder nicht funktioniert, nur kommt eine fehlerhafte ausgabe.
hier mal der quelltext:

#include <iostream.h>
int main()
{ double a, b, c;

cout<<"Bitte Seite a eingeben: ";
cin>>a;
cout<<"Bitte Seite b eingeben: ";
cin>>b;
cout<<"Bitte Seite c eingeben: ";
cin>>c;

if( (c*c)==(a*a)+(b*b) ) // Bedingung
{ cout<<"rechwinklig" ; // wahr-Block
}
else { cout<<"nicht rechtwinklig" ; // falsch-Block
}


if( (a*a)==(b*b)+(c*c) ) // Bedingung
{ cout<<"rechwinklig" ; // wahr-Block
}
else
{ cout<<"nicht rechtwinklig" ; // falsch-Block
}


if( (b*b)==(a*a)+(c*c) ) // Bedingung
{ cout<<"rechwinklig" ; // wahr-Block
}
else
{ cout<<"nicht rechtwinklig" ; // falsch-Block
}

getchar();
return 0;
}



ich hoffe es kannmir jemand ´nen tip gebe´n
 
Das ist kein Problem mit C++, sondern ein Logikproblem. Dein Dreieck ist immer sowohl rechtwinklig, als auch nicht rechtwinklig. Schau dir nochmal deinen Algorithmus an, und überleg ganz genau was er macht. Wann und unter welcher Bedingung gibt er was aus?
 
habs schon gemerkt...
funktioniert jetzt

#include <iostream.h>
int main()
{ double a, b, c;

cout<<"Bitte Seite a eingeben: ";
cin>>a;
cout<<"Bitte Seite b eingeben: ";
cin>>b;
cout<<"Bitte Seite c eingeben: ";
cin>>c;

if( (c*c)==(a*a)+(b*b) )
{ cout<<"rechwinklig" ;
}
else
if( (a*a)==(b*b)+(c*c) )
{ cout<<"rechwinklig" ;
}
else
if( (b*b)==(a*a)+(c*c) )
{ cout<<"rechwinklig" ;
}
else
{ cout<<"nicht rechtwinklig" ;
}

getchar();
return 0;
}
 
Das ist eine Möglichkeit, wird bei größeren Entscheidungen aber sehr schnell unübersichtlich. Eine Möglichkeit das zu lösen wäre die switch-Anweisung, eine andere geht über condition-variables. Bekommst du bestimmt noch sauberer hin. ;)
 
Wie wäre es mit (c^2==abs(a^2-b^2) || c^2==a^2+b^2)? (müsst nur mal jemand nach c++ übersetzen, kann C++ zwar einigermaßen lesen, aber nur PHP schreiben)
 
Das wär auch ne Möglichkeit:

Code:
double side[3]={a, b, c};

int main()
{
  int i;
  for(i=0;i<3;i++)
  {    
    double t=0;
    for(int j=0;j<2;j++) t+=side[(i+j)%3]*side[(i+j)%3];  
    if(t==side[i]*side[i]) break;
  }

  if(i<3) cout << endl << "rechtwinklig";
  else    cout << endl << "nicht rechtwinklig";

  return 0;
}

oder das ginge auch:

Code:
double side[3]={a, b, c};

int main()
{
  int i;
  double sideSqr=0;
  for(i=0;i<3;i++) sideSqr+=side[i]*side[i];

  for(i=0;i<3;i++) if(2*side[i]*side[i]==sideSqr) break;
  if(i<3) cout << "rechtwinklig";
  else   cout << "nicht rechtwinklig";

  return 0;
}

und für die ganz schlimmen:

Code:
double side[3]={a, b, c};

#define SQR1(x) side[x]*side[x]
#define CHK(x, y) (SQR1(x)==SQR1((x+1)%y)+SQR1((x+2)%y) )

int main()
{
  if(CHK(0,3)||CHK(1,3)||CHK(2,3)) cout << endl << "rechtwinklig";
  else cout << "nicht rechtwinklig";
  return 0;
}

Ist natürlich mal wieder die kürzeste Variante, ist aber wie die von Antarctica unflexibel.
 
Zuletzt bearbeitet:
Man sollte erwägen das Quadrat nur einmal zu berechnen und dann die Krit zu überprüfen. Man könnte auch gucken, was die längste Seite ist, denn diese kann nur Hypothenuse sein...

Vorschlag:

Code:
h1 = a > b ? a : b;
s1 = h1 ^ a ^ b;
h = c > h1 ? c : h1;
s2 = h ^ h1 ^ c;

if (h*h - s1*s1 - s2*s2 <= eps) printf("rechtwinklig");

Man bemerke, daß man floats vergleicht, also sollte man ein eps definieren.
 
Zuletzt bearbeitet:
Man sollte erwägen das Quadrat nur einmal zu berechnen und dann die Krit zu überprüfen.
Das wäre möglich, am besten direkt bei der Eingabe

Man könnte auch gucken, was die längste Seite ist, denn diese kann nur Hypothenuse sein...
Das macht der Mensch, weil Rechnen bei ihm länger dauert als Vergleichen. Beim Computer ist das aber nicht so... der würde dafür eventuell sogar länger brauchen...
 
Das macht der Mensch, weil Rechnen bei ihm länger dauert als Vergleichen. Beim Computer ist das aber nicht so... der würde dafür eventuell sogar länger brauchen...

Was wird wohl schneller sein? Zwei Vergleiche + Zuweisungen (oder xors, müßte man gegenchecken,. was schneller ist, obiger code wird auf Athlons ohne branches wegen cmov übersetzt) oder Drei Vertgleiche + Summen bilden? Im Zweifelsfall benchen...
 
Die ganzen Branches brauchen eine kleine Ewigkeit. Was soll eigentlich das ^ sein? Logisches XOR auf floats? ;)
 
Die ganzen Branches brauchen eine kleine Ewigkeit. Was soll eigentlich das ^ sein? Logisches XOR auf floats? ;)

Oh, richitg, das klappt natürlich nicht. Oder evlt doch. Warum nicht? Das xor ist nicht entschiedend, sondern nur wie binär gespeichert wird, und das ist eindeutig bei Normalisierung. Naja, müßte man mal ausprobieren, evtl mit casting, so daß die Sachen in den integer registernlanden (klappt nur bei 32 bit float dann). nur wird dann sicher langsamer als Zuweisung sein. Also doch eher etwas für eine integer Routine.
 
Zuletzt bearbeitet:
Naja, das geht dann als ziemlich übler Hack durch ;). Ich glaub der C-Compiler lässt auf Floats aber auch keine binären Operationen durch, müsstest du vorher casten (bessser gesagt einen Zeiger darauf casten).

Also ungefähr so:

*((float*) &s2) = *((float*) (&h)) ^ *((float*) (&h1)) ^ *((float*) (&c));

Ob das funktioniert ist aber wieder eine ganz andere Frage, Inhaltlich müsste das Müll ergeben.
 
Zuletzt bearbeitet:
Naja, das geht dann als ziemlich übler Hack durch ;). Ich glaub der C-Compiler lässt auf Floats aber auch keine binären Operationen durch, müsstest du vorher casten (bessser gesagt einen Zeiger darauf casten).

Also ungefähr so:

*((float*) &s2) = *((float*) (&h)) ^ *((float*) (&h1)) ^ *((float*) (&c));

Ob das funktioniert ist aber wieder eine ganz andere Frage, Inhaltlich müsste das Müll ergeben.

Jein, statt float müßte es int heißen, sonst landet's in den falschen Registern und überhaupt ist das wie du meintest eher ein hack und nicht empfehlenswert. ;)
 
Na auf FPU Register kann er keine logischen Operationen machen, geht net ;). Das muss er vorher schon in ein GPR lesen.
Aber mir ist net klar, was das XOR bringen soll.
 
Zurück
Oben Unten