Анжелика, Вы уж не обижайтесь, но я вынужден Вас немного поправить. Проверка принадлежности точек прямой выполнена правильно и оптимально, а вот вычисление угла - увы... Давайте разбираться.
Итак, Вы получили значение величины 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.