Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 05.12.2012, 20:30   #1 (permalink)
Ирина
Новичок
 
Регистрация: 05.12.2012
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Post Помогите написать программу в Pascal

Написать программу, которая по заданным трем точкам А(x1,y1), B(x2,y2), C(x3,y3) определяет - будут ли они расположены на одной прямой; если это не так, то вычислить угол ABC.
Ирина вне форума   Ответить с цитированием

Старый 05.12.2012, 20:30
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Содержание данных топиков схоже с вашим

Помогите написать программу в Pascal
Помогите написать программу в Turbo Pascal и составить блок-схему
Помогите написать программу в Delphi Pascal
Помогите пожалуйста написать программу "гусеница" на Turbo Pascal 7.0
Написать программу в Pascal ABC
Пожалуйста, помогите написать программу Pascal Free

Старый 06.12.2012, 00:58   #2 (permalink)
Léon
С# - learn or die
 
Аватар для Léon
 
Регистрация: 17.12.2011
Сообщений: 2,438
Записей в дневнике: 8
Сказал(а) спасибо: 21
Поблагодарили 49 раз(а) в 11 сообщениях
Репутация: 19701
По умолчанию

Цитата:
Сообщение от Ирина Посмотреть сообщение
Написать программу, которая по заданным трем точкам А(x1,y1), B(x2,y2), C(x3,y3) определяет - будут ли они расположены на одной прямой; если это не так, то вычислить угол ABC.
Код:
Program Irina;
Uses crt;
Label 1;
var x1,x2,x3,y1,y2,y3: Real;
ab,ac,bc,ug: Real;
Begin
Clrscr;
Write ('x1,y1,x2,y2,x3,y3=');
Read(x1,y1,x2,y2,x3,y3);
ab:=sqrt(sqr(x2-x1)+sqr(y2-y1));
ac:=sqrt(sqr(x1-x3)+sqr(y1-y3));
bc:=sqrt(sqr(x2-x3)+sqr(y2-y3));
if (ab+ac<=bc) or (ab+bc<=ac) or (ac+bc<=ab) then
Write('точки расположены на одной прямой') else
Begin
Write(' <ABC=');
ug:=(sqr(ab)+sqr(bc)-sqr(ac))/(2*ab*bc);
If ug<=0 then  begin ug:=90; goto 1; end;
ug:=arctan(sqrt(1+1/ug))*180/pi;
1: Write(ug:3:3,' град.');
end;
Readkey;
end.
Léon вне форума   Ответить с цитированием
Старый 06.12.2012, 10:59   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Анжелика, Вы уж не обижайтесь, но я вынужден Вас немного поправить. Проверка принадлежности точек прямой выполнена правильно и оптимально, а вот вычисление угла - увы... Давайте разбираться.
Итак, Вы получили значение величины ug=Cos(B). Вопрос: как из него вытащить В? В математике - просто: B=arccos(ug). Но в Паскале нет функции arccos, есть только arctan, поэтому, как и сделано (к сожалению, неправильно) в Вашей программе, нужно выразить арккосинус через арктангенс, но тут есть подводный камень: дело в том, что эти функции имеют РАЗНЫЕ области изменения:
v = arccos(z): 0 ≤ v ≤ π
w = arctg(z): -π/2 ≤ w ≤ π/2

Для острых углов это значения не имеет, а вот если искомый угол - тупой, то Ваша программа выдаст неверный результат. Проверьте:
x1=-5 y1=1 x2=0 y2=0 x3=5 y3=0.
Обходится эта неприятность так: переходим от арккосинуса к арксинусу (благо у арксинуса и арктангенса области изменения совпадают), и уже арксинус выражаем через арктангенс.
Вычисляя угол, учтем еще один момент: этот угол не может быть ни нулевым, ни развернутым: оба соответствуют принадлежности трех точек одной прямой. Поэтому ветвление (да еще с - о, ужас! - меткой и goto, хотя можно обойтись обычным else) там абсолютно лишнее.
Вот исправленный листинг:
Код:
Program Irina;
Uses crt;
Var
 x1,x2,x3,y1,y2,y3: Real;
 ab,ac,bc,ug: Real;
Begin
 Clrscr;
 Write ('x1,y1,x2,y2,x3,y3= ');
 Read(x1,y1,x2,y2,x3,y3);
 ab:=sqrt(sqr(x2-x1)+sqr(y2-y1));
 ac:=sqrt(sqr(x1-x3)+sqr(y1-y3));
 bc:=sqrt(sqr(x2-x3)+sqr(y2-y3));
 if (ab+ac<=bc) or (ab+bc<=ac) or (ac+bc<=ab) then
  Write('Points belong to one straight line') else
 begin
  ug:=(sqr(ab)+sqr(bc)-sqr(ac))/(2*ab*bc);
  ug:=((Pi/2)-ArcTan(ug/SQRT(1-ug*ug)))*180/Pi;
  Write(' <ABC= ',ug:0:1,' deg');
 end;
 Readkey;
End.
Vladimir_S вне форума   Ответить с цитированием
Старый 06.12.2012, 15:59   #4 (permalink)
Léon
С# - learn or die
 
Аватар для Léon
 
Регистрация: 17.12.2011
Сообщений: 2,438
Записей в дневнике: 8
Сказал(а) спасибо: 21
Поблагодарили 49 раз(а) в 11 сообщениях
Репутация: 19701
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Анжелика, Вы уж не обижайтесь, но я вынужден Вас немного поправить...
Владимир, не обижаюсь. Наоборот, хорошо что исправили и Ирина получит правильно работающую программу, а я научилась вычислять угол.
Léon вне форума   Ответить с цитированием
Старый 07.12.2012, 08:33   #5 (permalink)
Ирина
Новичок
 
Регистрация: 05.12.2012
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Ребята спасибо вам огромное)))
Ирина вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 08:42.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.