Obliczanie miary kątów trójkąta prostokątnego

smurfs
2013-12-02 14:15
smurfs
0

Poniższy program najpierw wylicza długość przeciwprostokątnej, po czym oblicza jego dwa pozostałe kąty i wypisuje n razy w jednej lini zaokrągloną wartość przyprostokątnej i wartość mniejszego kąta. Nie wiem dlaczego, ale dla przykładowych danych wejściowych mam złe wyniki, podaje przykład:

Wejśćie

2 2
3 4
9 8

Wyjście:

3 45
5 37
13 42

jednak u mnie na wyjściu tylko zgadza się z przykłądem pierwsza linia. Widzi ktoś tu gdzieś błąd?

#include <iostream>
#include <cmath>
using namespace std;

float licz_kat( double a, double b)
{
    float kat=0, trzeci=0;
    kat=atan(a/b);
    kat=kat * 180 / M_PI;
    trzeci = 90 - kat;
    if (kat<trzeci) return round(kat);
    else return round(trzeci);
    kat=0;
    trzeci=0;

}  

int main() {
    double x,a,b;
    double c=0;
    cin>>x;
    for (int i=0;i<x;i++)
    {
        cin>>a;
        cin>>b;
        a=a*a;
        b=b*b;
        c=sqrt(a+b);
        c=ceil(c);

        cout<<c<<" "<<licz_kat(a,b)<<endl;

    }
    return 0;
}

poprawienie tytułu wątku + dodanie znaczników <code> dla treści wejścia i wyjścia - fp

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2013-12-02 14:36
Moderator

Rejestracja: 16 lat temu

Ostatnio: 41 minut temu

1

No bląd ewidentnie jest, bo proste obliczenia pokazują że liczy ci to źle. Źle korzystasz z definicji sinusa, bo używasz dwóch przyprostokątnych zamiast przyprostokątnej i przeciwprostokątnej...
Jak nie umiesz zapamiętać to korzystaj z twierdzenia sinusów -> stosunek (bok / sin przeciwległego kąta) dla każdego z 3 katów jest jednakowy, więc jeśli
a = 3
b = 4
c = sqrt(9+16) = 5
to
c/sin(90) = a/sin(alfa) = b/sin(beta)
sin(90) = 1 więc:

5/1 = 3/sin(alfa) = 4/sin(beta)


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

smurfs
2013-12-02 15:01
smurfs
0

Wie ktoś jak zaimplementować to do mojego programu?

Pozostało 580 znaków

2013-12-02 15:07
Moderator

Rejestracja: 16 lat temu

Ostatnio: 41 minut temu

1

o_O ty tak poważnie? Ale co tu chcesz implementować? Przeciwprostokątną umiesz policzyć. c/sin(90) zawsze będzie wynosiło po prostu c. Oznacza to że dwa szukane kąty to zawsze będzie arrcos(a/c) i arccos(b/c).


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

smurfs
2013-12-02 16:59
smurfs
0

Pojawia się błąd/komunikat NAN


float licz_kat( double a, double b, double c)
{
    float alfa=0, beta=0;
    alfa=acos(a/c);
    beta=acos(b/c);
    if (alfa<beta) return alfa;
    else return beta;

Pozostało 580 znaków

2013-12-02 17:13
Moderator

Rejestracja: 16 lat temu

Ostatnio: 41 minut temu

0

Znaczy ze robisz coś głupiego. Odpal to pod debugerem to zobacz jakie argumenty lecą ci w tej funkcji.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2013-12-02 17:20
Moderator

Rejestracja: 14 lat temu

Ostatnio: 28 sekund temu

1
float licz_kat( double a, double b) { return 180*atan2(a,b)/M_PI; }

Ma to być wywołane oczywiście przed a=a*a;


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0