dmx81 Temat założony przez niniejszego użytkownika |
twierdzenie cosinusow - do obliczania katow w dowolnym trojkacie » 2010-08-20 21:10:48 wpisuje ile chce miec trojkatow, pozniej podaje boki... i np dla bokow 1,1,1 oblicza prawidlowo ze po 60st ma kazdy z katow, ale juz dla 2,2,2 powinno byc tak samo, a jest Nan albo inne dziwne rzeczy #include <iostream> #include <math.h>
using namespace std;
double licz_kat( double a, double b, double c ) { double cos_kat; cos_kat =( b * b + c * c - a * a ) / 2 * b * c; return( acos( cos_kat ) * 180 / 3.14159265 ); } int main() { double a, b, c; int N; cin >> N; while( N ) { cin >> a >> b >> c; cout << licz_kat( a, b, c ) << endl; cout << licz_kat( b, a, c ) << endl; cout << licz_kat( c, b, a ) << endl; N--; } return 0; }
gdzie mam blad? |
|
ison |
» 2010-08-20 21:25:30 zły wzór (zapomniałeś nawiasu) zamiast: cos_kat =( b * b + c * c - a * a ) / 2 * b * c;
powinno być cos_kat =( b * b + c * c - a * a ) /( 2 * b * c );
p.s. zamiast while(N) i N-- na końcu pętli możesz zrobić: będzie ten sam efekt ;) |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-08-20 22:03:26 ok dzieki, juz dziala... myslalem ze nawias nie bedzie potrzebny, bo mnozenie ma wiekszy priorytet przed dzieleniem (tak mi sie przynajmniej wydawalo, ale teraz juz smiga jak trzeba |
|
ison |
» 2010-08-20 22:06:55 bo mnozenie ma wiekszy priorytet przed dzieleniem
a jak na kartce masz takie działanie: x=6/2*3 to jak liczysz? :p dokładnie tak samo jest w C++ gdyby mnożenie miało większy priorytet to przeczyłoby to zasadzie kolejności działań... co byłoby bez sensu bo większość wzorów by nie działała |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-08-20 23:17:38 to teraz nastepny problem - dalem warunki : na istnienie trojkata, a pozniej jesli istnieje, to w zaleznosci od tego jakie katy, taki trojkat - jesli wszytskie <90st, ostrokatny, jesli jakikolwiek == 90, prostokatny, jesli jakikolwiek >90, rozwartokatny no i dla przykladu 3,4,5 - pokazuje wyniki katow, ze jeden z nich 90st, a mimo to nie uznaje go jako prostakotny?? wiem, ze moge tez z tw.pitagorasa to sprawdzic, ale mi chodzi o to, dlaczego mimo tych 90st nie uznaje mi tego przypadku? klasyczny przyklad dla 3,4,5 :) #include <iostream> #include <math.h>
using namespace std;
double licz_kat( double a, double b, double c ) { double cos_kat; cos_kat =( b * b + c * c - a * a ) /( 2 * b * c ); return( acos( cos_kat ) * 180 / 3.14159265 ); }
int main() { double tab[ 3 ]; int N; cin >> N; while( N-- ) { cin >> a >> b >> c; if( a >= b + c || b >= a + c || c >= a + b ) cout << "brak" << endl; else if( licz_kat( a, b, c ) == 90 || licz_kat( b, c, a ) == 90 || licz_kat( c, a, b ) == 90 ) cout << "prostokatny" << endl; else if( licz_kat( a, b, c ) > 90 || licz_kat( b, c, a ) > 90 || licz_kat( c, b, a ) > 90 ) cout << "rozwartokatny" << endl; else if( licz_kat( a, b, c ) < 90 && licz_kat( b, c, a ) < 90 && licz_kat( c, a, b ) < 90 ) cout << "ostrokatny" << endl; cout << licz_kat( a, b, c ) << " " << licz_kat( b, c, a ) << " " << licz_kat( c, a, b ) << endl; } return 0; }
|
|
ison |
» 2010-08-20 23:26:24 tak to jest ze stosowaniem operatora == do liczb zmiennoprzecinkowych... pozostaje ci albo skorzystanie z epsilonu (czyli margines błędu, np 0.0001) albo zwykłe rzutowanie na int'a tu masz twój kod przerobiony na porównywanie liczb zmiennoprzecinkowych z wykorzystaniem epsilonu #include <iostream> #include <math.h> #define EPSILON 0.0001 #define FLOAT_EQ(x,v) (((v - EPSILON) < x) && (x <( v + EPSILON)))
using namespace std;
double licz_kat( double a, double b, double c ) { double cos_kat; cos_kat =( b * b + c * c - a * a ) /( 2 * b * c ); return( acos( cos_kat ) * 180 / 3.14159265 ); }
int main() { double tab[ 3 ]; int N; cin >> N; double a, b, c; while( N-- ) { cin >> a >> b >> c; if( a >= b + c || b >= a + c || c >= a + b ) cout << "brak" << endl; else if( FLOAT_EQ( licz_kat( a, b, c ), 90 ) || FLOAT_EQ( licz_kat( b, c, a ), 90 ) || FLOAT_EQ( licz_kat( c, a, b ), 90 ) ) cout << "prostokatny" << endl; else if( licz_kat( a, b, c ) > 90 || licz_kat( b, c, a ) > 90 || licz_kat( c, b, a ) > 90 ) cout << "rozwartokatny" << endl; else if( licz_kat( a, b, c ) < 90 && licz_kat( b, c, a ) < 90 && licz_kat( c, a, b ) < 90 ) cout << "ostrokatny" << endl; cout << licz_kat( a, b, c ) << " " << licz_kat( b, c, a ) << " " << licz_kat( c, a, b ) << endl; } return 0; }
|
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-08-21 00:57:16 dzieki, nawet nie wiedzialem, ze cos takiego istnieje jak epsilony w C++, co prawda juz od dluzszego czasu w paru projektach meczyly mnie te porownywania floatow - to albo sam je sobie zaokraglalem, albo funkcji pana Piotra uzywalem (przez mnozenie aby dodac kilka zer, pozniej zamiana na int,i dzielenie przez pare zer - wiec odpadala niechciana koncowka) jeszcze raz dzieki, pytanie mam jeszcze takie, dlugo juz w C++ programujesz? bo widze, ze radzisz sobie calkiem calkiem :) |
|
ison |
» 2010-08-21 01:00:31 dzieki, nawet nie wiedzialem, ze cos takiego istnieje jak epsilony w C++
nie istnieje :D C++ jest wystarczająco niskopoziomowy żeby móc zakodzić takie coś. To co ci podałem to zwykłe ręcznie zakodzone porównywanie które zwraca operator logiczny true|false. Można było to nawet samymi if'ami zastąpić ale przez define jest krócej i przyzwoiciej ;) pytanie mam jeszcze takie, dlugo juz w C++ programujesz?
prawie 3 lata |
|
« 1 » 2 |