Grzegorz16 napisał(a)
Primo
Napisałem ci inny prawidłowy wzór na obliczanie R >> źródło
Secundo
Nie powiedziałem, że źle obliczasz sinusy, tylko, że tam występuje błąd i program od razu kończy prace (w przypadku podania 1, 2, 3 lub zmienienia wzoru).
źle przepisałeś wzór... mój wzór jest ok ;]
w Twoim źródle jest napisane:
P = ( abc ) / 4R, gdzie:
a,b,c - boki trójkąta
R - promień okręgu opisanego na tym trójkącie
przekształcając wzór otrzymujemy:
P = (abc)/4R | R
P * R = (abc)/4 | :P
R = (ab*c)/4P
u mnie w kodzie wygląda to następująco:
R := (A * B * C) / (4 * Pole_Trojkata);
czyli jednakowo tak jak jest zapisane we wzorze powyżej...
pobawiłem się trochę ze sprawdzaniem wraz z koleżanką, która od dziś jest moim guru matematycznym i doszliśmy do wniosku, że błąd jest taki, że oblicza sinus kąta i z niego wartość kąta. Jednakże sinus kąta jest taki sam dla par kątów np. 30 i 160, 60 i 120. Dodałem sprawdzanie czy dany trójkąt jest rozwartokątny czy nie. I w zależności od wyniku dwa sposoby obliczania kąta gamma ;]
ukończony kod programu zamieszczam poniżej:
program trojkaty;
{$APPTYPE CONSOLE}
uses
SysUtils, math;
const
Min_val = 1;
Max_val = 250;
var
A, B, C, X, Code : integer;
Bok : string;
Trojkat : boolean;
P, Pole_Trojkata, Pole_Kola, R : Real;
Sin_Alpha, Sin_Beta, Sin_Gama, Alpha, Beta, Gama, suma : Real;
begin
repeat
repeat
Write('Podaj dlugosc boku A: ');
Readln(Bok);
Val(Bok, A, Code);
if (Code > 0) then
Writeln('Podano nieprawidlowy typ danych.');
if (A < Min_val) or (A > Max_val) then
Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
until (Code = 0) and (A >= Min_val) and (A <= Max_val);
repeat
Write('Podaj dlugosc boku B: ');
Readln(Bok);
Val(Bok, B, Code);
if (Code > 0) then
Writeln('Podano nieprawidlowy typ danych.');
if (B < Min_val) or (B > Max_val) then
Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
until (Code = 0) and (B >= Min_val) and (B <= Max_val);
repeat
Write('Podaj dlugosc boku C: ');
readln(Bok);
Val(Bok, C, Code);
if (Code > 0) then
Writeln('Podano nieprawidlowy typ danych.');
if (C < Min_val) or (C > Max_val) then
Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
until (Code = 0) and (C >= Min_val) and (C <= Max_val);
if ((Abs(B-C) < A) AND (A < (B + C))) then
begin
Trojkat := True;
end
else
begin
Trojkat := False;
Writeln('Podane dlugosci nie moga byc dlugosciami bokow trojkata.');
end;
until Trojkat = True;
Writeln('Podane dlugosci moga byc dlugosciami trojkata');
P := (A + B + C) / 2;
Pole_Trojkata := Sqrt(P * (P - A) * (P - B) * (P - C));
R := (A * B * C) / (4 * Pole_Trojkata);
Writeln('Dlugosc promienia opisanego na tym trojkacie wynosi: ', R:0:4);
Pole_kola := PI * R * R;
Writeln('Pole okregu opisanego na tym trojkacie wynosi: ', Pole_Kola:0:4);
if (A > B) then
begin
X := A;
A := B;
B := X;
end;
if(B > C) then
begin
X := B;
B := C;
C := X;
end;
Sin_Alpha := A / (2 * R);
Sin_Beta := B / (2 * R);
Sin_Gama := C / (2 * R);
Alpha := RadToDeg(ArcSin(Sin_Alpha));
Beta := RadToDeg(ArcSin(Sin_Beta));
if ((sqr(A) + sqr(B)) < sqr(C)) then Gama := 180-(RadToDeg(ArcSin(Sin_Gama)))
else Gama := RadToDeg(ArcSin(Sin_Gama));
suma := Alpha + Beta + Gama;
if (Alpha > 90) or (Beta > 90) or (Gama > 90) then
Writeln('Jest to trojkat rozwartokatny.')
else
begin
if (Alpha = 90) or (Beta = 90) or (Gama = 90) then
Writeln('Jest to trojkat prostokatny.')
else
Writeln('Jest to trojkat ostrokatny.');
end;
Writeln('Wartosc kata Alpha: ', Alpha:0:2);
Writeln('Wartosc kata Beta: ', Beta:0:2);
Writeln('Wartosc kata Gamma: ', Gama:0:2);
Writeln('Suma katow wynosi: ', suma:0:2);
Readln();
end.
Proszę, abyście jeszcze sobie go trochę przetestowali i dali znać w razie jakby występowały jakieś błędy... ;]