05.12.2012, 20:30 | #1 (permalink) |
Новичок
Регистрация: 05.12.2012
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите написать программу в Pascal
|
05.12.2012, 20:30 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Содержание данных топиков схоже с вашим Помогите написать программу в Pascal Помогите написать программу в Turbo Pascal и составить блок-схему Помогите написать программу в Delphi Pascal Помогите пожалуйста написать программу "гусеница" на Turbo Pascal 7.0 Написать программу в Pascal ABC Пожалуйста, помогите написать программу Pascal Free |
06.12.2012, 00:58 | #2 (permalink) | |
С# - learn or die
Регистрация: 17.12.2011
Сообщений: 2,438
Записей в дневнике: 8
Сказал(а) спасибо: 21
Поблагодарили 49 раз(а) в 11 сообщениях
Репутация: 19701
|
Цитата:
Код:
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. |
|
06.12.2012, 10:59 | #3 (permalink) |
Специалист
Регистрация: 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. |
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
|
|
|