App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
rechtwinkliges dreieck in c++
- Ersteller Lemonhead
- Erstellt am
Lemonhead
Commodore Special
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
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
PuckPoltergeist
Grand Admiral Special
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?
Lemonhead
Commodore Special
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;
}
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;
}
PuckPoltergeist
Grand Admiral Special
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.
Antarctica
Grand Admiral Special
- Mitglied seit
- 11.09.2004
- Beiträge
- 2.444
- Renomée
- 34
- Standort
- Kupferstadt Stolberg
- Mein Laptop
- HP 625, V140, 4GB RAM, 32GB SSD, Ubuntu 15.04 (WT279EA)
- Prozessor
- Intel Core i5-4690, 4x 3.50GHz, boxed (BX80646I54690)
- Mainboard
- ASRock H97M Pro4 (90-MXGTA0-A0UAYZ)
- Kühlung
- Scythe Big Shuriken 2 Rev. B (SCBSK-2100)
- Speicher
- 2x Exceleram Black and White 8GB PC3-12800 DDR3-1600 Kit (EBW301A)
- Grafikprozessor
- Gigabyte GeForce GTX 750 Ti OC low profile, 2GB GDDR5, DVI, 2x HDMI, DisplayPort (GV-N75TOC-2GL)
- Display
- Samsung SyncMaster T24A350, 24" (LT24A350EW)
- SSD
- Samsung SSD 960 EVO 500GB, PCIe (MZ-V6E500BW)
- HDD
- 2x Seagate GoFlex Desk 3TB, USB 3.0 (STAC3000201/STAC3000202)
- Optisches Laufwerk
- Samsung SH-224BB schwarz, SATA, retail (SH-224BB/RSMS)
- Soundkarte
- on-board
- Gehäuse
- Inter-Tech IT-5908
- Netzteil
- be quiet! System Power S6 80Plus 300W ATX 2.2 (S6-SYS-UA-300W/BN080)
- Betriebssystem
- Microsoft: Windows 10 Pro 64Bit, DSP/SB (deutsch) (PC) (FQC-08922)
- Webbrowser
- Mozilla Firefox
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:
oder das ginge auch:
und für die ganz schlimmen:
Ist natürlich mal wieder die kürzeste Variante, ist aber wie die von Antarctica unflexibel.
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:
PrakashP
Captain Special
- Mitglied seit
- 18.02.2005
- Beiträge
- 207
- Renomée
- 1
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:
Man bemerke, daß man floats vergleicht, also sollte man ein eps definieren.
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:
Antarctica
Grand Admiral Special
- Mitglied seit
- 11.09.2004
- Beiträge
- 2.444
- Renomée
- 34
- Standort
- Kupferstadt Stolberg
- Mein Laptop
- HP 625, V140, 4GB RAM, 32GB SSD, Ubuntu 15.04 (WT279EA)
- Prozessor
- Intel Core i5-4690, 4x 3.50GHz, boxed (BX80646I54690)
- Mainboard
- ASRock H97M Pro4 (90-MXGTA0-A0UAYZ)
- Kühlung
- Scythe Big Shuriken 2 Rev. B (SCBSK-2100)
- Speicher
- 2x Exceleram Black and White 8GB PC3-12800 DDR3-1600 Kit (EBW301A)
- Grafikprozessor
- Gigabyte GeForce GTX 750 Ti OC low profile, 2GB GDDR5, DVI, 2x HDMI, DisplayPort (GV-N75TOC-2GL)
- Display
- Samsung SyncMaster T24A350, 24" (LT24A350EW)
- SSD
- Samsung SSD 960 EVO 500GB, PCIe (MZ-V6E500BW)
- HDD
- 2x Seagate GoFlex Desk 3TB, USB 3.0 (STAC3000201/STAC3000202)
- Optisches Laufwerk
- Samsung SH-224BB schwarz, SATA, retail (SH-224BB/RSMS)
- Soundkarte
- on-board
- Gehäuse
- Inter-Tech IT-5908
- Netzteil
- be quiet! System Power S6 80Plus 300W ATX 2.2 (S6-SYS-UA-300W/BN080)
- Betriebssystem
- Microsoft: Windows 10 Pro 64Bit, DSP/SB (deutsch) (PC) (FQC-08922)
- Webbrowser
- Mozilla Firefox
Das wäre möglich, am besten direkt bei der EingabeMan sollte erwägen das Quadrat nur einmal zu berechnen und dann die Krit zu überprüfen.
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...Man könnte auch gucken, was die längste Seite ist, denn diese kann nur Hypothenuse sein...
PrakashP
Captain Special
- Mitglied seit
- 18.02.2005
- Beiträge
- 207
- Renomée
- 1
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...
PrakashP
Captain Special
- Mitglied seit
- 18.02.2005
- Beiträge
- 207
- Renomée
- 1
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.
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:
PrakashP
Captain Special
- Mitglied seit
- 18.02.2005
- Beiträge
- 207
- Renomée
- 1
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.
PuckPoltergeist
Grand Admiral Special
Eine Möglichkeit das zu lösen wäre die switch-Anweisung,
Argh, ich Held! Wieso sagt mir eigentlich niemand, dass ich hier reichlich Blödsinn geschrieben hab? Ein switch funktioniert hier natürlich nicht.
Ähnliche Themen
- Antworten
- 0
- Aufrufe
- 186
- Antworten
- 1
- Aufrufe
- 539
- Antworten
- 0
- Aufrufe
- 345