Другие языки программирования и технологии
программа уже готова,но не находит один угол(паскаль)
Задание 3. Вычислить для треугольника ABC все стороны, все углы (в градусной мере), периметр и площадь, если известны: стороны AC, BC и угол BAC. Замечание: Программа должна содержать ввод известных величин с клавиатуры, вычисление неизвестных с использованием раздела Function и вывод результатов вычислений на экран. var AC,BC,BAC,CAB,BCA,AB,ABC:real; function ugol(c,b,gamma:real):real; var u:real; begin u:=b*sin(gamma*PI/180)/c; ugol:=arctan(u/sqrt(1-u*u)) end; function storona(b,c,alfa:real):real; begin storona:=sqrt(c*c+b*b-2*c*b*COS(PI*alfa/180)); end; begin write ('введите AC '); readln(AC); write ('введите BC '); readln(BC); write ('введите BAC '); readln(BAC); CAB:=ugol(AC,BC,BAC); ABC:=PI-CAB-BAC; AB:=storona(AC,BC,BAC); writeln('Строны ',AC:0:3,' ',BC:0:3,' ',AB:0:3); writeln('Углы ',BAC*180/PI,2,' ',CAB*180/PI,2,' ',BCA*180/PI,2); writeln('Периметр ',AC+BC+AB:0:3); writeln('Площадь ',1/2*(AC*AB*sin(ABC))/2:0:3); end.
В функции storona применена теорема косинусов:
storona:=sqrt(c*c+b*b-2*c*b*COS(PI*alfa/180));
где c и b - стороны треугольника, а alfa - угол между ними.
В таком случае:
AB:=storona(AC,BC,BAC); - делается неверный вызов функции!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Короче: переделывать нужно всё!
Как сказал Павло, через теорему синусов было бы проще:
function GrdToRad(angle : Real) : Real;
begin
GrdToRad := angle * Pi / 180;
end;
function RadToGrd(angle : Real) : Real;
begin
RadToGrd := angle * 180 / Pi;
end;
function ArcSin(angle : Real) : Real;
begin
ArcSin := ArcTan(angle / Sqrt(1 - angle*angle));
end;
{ Теорема синусов: a / sin(alpha) = b / sin(betta) = c / sin(gamma) }
function FindAngle(a, alpha, b : Real) : Real;
{ Параметры:
- длина стороны
- значение противолежащего угла
- длина стороны, противолежащей углу, который ищет функция }
begin
FindAngle := ArcSin(b * Sin(alpha) / a);
end;
function FindStorona(a, alpha, betta : Real) : Real;
{ Параметры:
- длина строны
- значение противолежащего угла
- значение угла, противолежащего стороне, длину которой ищет функция }
begin
FindStorona := a * Sin(betta) / Sin(alpha);
end;
var
a, b, c : Real;
alpha, betta, gamma : Real;
P, S : Real;
begin
Write('введите сторону AC = '); ReadLn(b);
Write('введите сторону BC = '); ReadLn(a);
Write('введите угол в градусах BAC = '); ReadLn(alpha);
alpha := GrdToRad(alpha);
betta := FindAngle(a, alpha, b);
gamma := Pi - alpha - betta;
c := FindStorona(a, alpha, gamma);
P := a + b + c;
S := a*b*Sin(gamma)/2;
WriteLn('Строны ', a:0:3, ' ', b:0:3, ' ', c:0:3);
WriteLn('Углы ', RadToGrd(alpha):0:3, ' ', RadToGrd(betta):0:3, ' ', RadToGrd(gamma):0:3);
WriteLn('Периметр ', P:0:3);
WriteLn('Площадь ', S:0:3);
end.
Вот и результат:
введите сторону AC = 3
введите сторону BC = 3
введите угол в градусах BAC = 45
Строны 3.000 3.000 4.243
Углы 45.000 45.000 90.000
Периметр 10.243
Площадь 4.500
storona:=sqrt(c*c+b*b-2*c*b*COS(PI*alfa/180));
где c и b - стороны треугольника, а alfa - угол между ними.
В таком случае:
AB:=storona(AC,BC,BAC); - делается неверный вызов функции!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Короче: переделывать нужно всё!
Как сказал Павло, через теорему синусов было бы проще:
function GrdToRad(angle : Real) : Real;
begin
GrdToRad := angle * Pi / 180;
end;
function RadToGrd(angle : Real) : Real;
begin
RadToGrd := angle * 180 / Pi;
end;
function ArcSin(angle : Real) : Real;
begin
ArcSin := ArcTan(angle / Sqrt(1 - angle*angle));
end;
{ Теорема синусов: a / sin(alpha) = b / sin(betta) = c / sin(gamma) }
function FindAngle(a, alpha, b : Real) : Real;
{ Параметры:
- длина стороны
- значение противолежащего угла
- длина стороны, противолежащей углу, который ищет функция }
begin
FindAngle := ArcSin(b * Sin(alpha) / a);
end;
function FindStorona(a, alpha, betta : Real) : Real;
{ Параметры:
- длина строны
- значение противолежащего угла
- значение угла, противолежащего стороне, длину которой ищет функция }
begin
FindStorona := a * Sin(betta) / Sin(alpha);
end;
var
a, b, c : Real;
alpha, betta, gamma : Real;
P, S : Real;
begin
Write('введите сторону AC = '); ReadLn(b);
Write('введите сторону BC = '); ReadLn(a);
Write('введите угол в градусах BAC = '); ReadLn(alpha);
alpha := GrdToRad(alpha);
betta := FindAngle(a, alpha, b);
gamma := Pi - alpha - betta;
c := FindStorona(a, alpha, gamma);
P := a + b + c;
S := a*b*Sin(gamma)/2;
WriteLn('Строны ', a:0:3, ' ', b:0:3, ' ', c:0:3);
WriteLn('Углы ', RadToGrd(alpha):0:3, ' ', RadToGrd(betta):0:3, ' ', RadToGrd(gamma):0:3);
WriteLn('Периметр ', P:0:3);
WriteLn('Площадь ', S:0:3);
end.
Вот и результат:
введите сторону AC = 3
введите сторону BC = 3
введите угол в градусах BAC = 45
Строны 3.000 3.000 4.243
Углы 45.000 45.000 90.000
Периметр 10.243
Площадь 4.500
1. Решений должно быть 2 (если BCA - не прямой угол) . Нарисуй это - увидишь.
2. BAC и CAB в стандартных обозначениях - один и тот же угол; непонятно, что ты так обозначешь.
3. Углы ты держишь в градусах или в радианах? У тебя выходит, что BAC в градусах, CAB в радианах, а ABC - какая-то дикая смесь. Мой совет: считай все в радианах, а переводи в градусы только при вводе-выводе.
4. Я бы воспользовался для рассчетов теоремой синусов, там все очень быстро выходит (если, конечно, уже учили) . Твою математику мне лень разбирать, особенно с учетом непоняток с радианами; но если после исправления названных ошибок будут проблемы - пиши, завтра поотвечаю.
5. (не тебе) Народ, вы че, оборзели? Человек старается, учит математику и паскаль, пишет проги, задает более-менее конкретные вопросы - а ему никто за 2 часа не помог! Не по-ответовски это.
2. BAC и CAB в стандартных обозначениях - один и тот же угол; непонятно, что ты так обозначешь.
3. Углы ты держишь в градусах или в радианах? У тебя выходит, что BAC в градусах, CAB в радианах, а ABC - какая-то дикая смесь. Мой совет: считай все в радианах, а переводи в градусы только при вводе-выводе.
4. Я бы воспользовался для рассчетов теоремой синусов, там все очень быстро выходит (если, конечно, уже учили) . Твою математику мне лень разбирать, особенно с учетом непоняток с радианами; но если после исправления названных ошибок будут проблемы - пиши, завтра поотвечаю.
5. (не тебе) Народ, вы че, оборзели? Человек старается, учит математику и паскаль, пишет проги, задает более-менее конкретные вопросы - а ему никто за 2 часа не помог! Не по-ответовски это.
Похожие вопросы
- adobe illustrator. как у готового скруглённого прямоугольника изменить радиус углов???
- Нужны программы на языке Паскаль
- нужно создать на паскале программу которая будет находить повторяющиеся слова в массиве
- Программа на паскале! Помогите(бесплатно)
- Нужно написать программы в Паскале! Массивы! Срочно! Помогите!
- Нужно написать программу на паскале
- Написать программу в Паскале для построения графика функций. К программе желательно составить алгоритм.
- Напишите программу на языке Паскаль для решения задачи:
- Программа в Паскале
- Помогите составить программу на паскале!