Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

twierdzenie cosinusow - do obliczania katow w dowolnym trojkacie

Ostatnio zmodyfikowano 2010-08-21 01:39
Autor Wiadomość
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
C/C++
#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; // a*a=b*b+c*c-2*b*c*cos(kat) wzor na obliczanie katow //
    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?
P-21044
ison
» 2010-08-20 21:25:30
zły wzór (zapomniałeś nawiasu)
zamiast:
C/C++
cos_kat =( b * b + c * c - a * a ) / 2 * b * c;
powinno być
C/C++
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ć:
C/C++
while( N-- )
będzie ten sam efekt ;)
P-21045
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
P-21048
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
P-21049
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 :)
C/C++
#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 ); // a*a=b*b+c*c-2*b*c*cos(kat) wzor na obliczanie katow //
    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;
}
P-21050
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
C/C++
#include <iostream>
#include <math.h>
#define EPSILON 0.0001 //tu margines błędu
#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 ); // a*a=b*b+c*c-2*b*c*cos(kat) wzor na obliczanie katow //
    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;
}
P-21051
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 :)
P-21052
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
P-21053
« 1 » 2
  Strona 1 z 2 Następna strona