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

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

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)

0

Wie ktoś jak zaimplementować to do mojego programu?

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).

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;
0

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

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;

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