Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 16.05.2012, 16:38   #1 (permalink)
Juliet
Member
 
Регистрация: 16.12.2011
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Программа на Паскале

Помогите пожалуйста с написанием программы на Паскале)

Разработка программы «Треугольник и точка»
Дана точка А(х, у). Определить, принадлежит ли она треугольнику с вершинами в точках (х1,у1), (х2, у2), (х3,у3). Сделать рисунок.
Juliet вне форума   Ответить с цитированием

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

Содержимое этих обсуждений может помочь вам решить проблему

Программа вычисления интеграла на Паскале
Программа на паскале
Программа в паскале, помогите, пожалуйста, исправить программу

Старый 16.05.2012, 17:36   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,347
Сказал(а) спасибо: 288
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Цитата:
Сообщение от Juliet Посмотреть сообщение
Помогите пожалуйста с написанием программы на Паскале)

Разработка программы «Треугольник и точка»
Дана точка А(х, у). Определить, принадлежит ли она треугольнику с вершинами в точках (х1,у1), (х2, у2), (х3,у3). Сделать рисунок.
Извольте. Правда, сколь я припоминаю, у Вас АВС, и потому с графикой помочь не могу, ну а само решение - вот (обозначения приведены на рисунке):
Код:
Var
 x1,x2,x3,y1,y2,y3,x,y,a,b,c,c1,c2,c3:Real;
 Sum:Integer;

Function ArcCos(z:Real):Real;
begin
 if Round(z*10000000)=10000000 then ArcCos:=0 else
 if Round(z*10000000)=-10000000 then ArcCos:=Pi else
    ArcCos:=(Pi/2)-ArcTan(z/SQRT(1-z*z));
end;

Function RadGr(t:Real):Real;
begin
  RadGr:=(t/Pi)*180;
end;

Function Angle(d1,d2,d3:Real):Real;
begin
 Angle:=ArcCos((Sqr(d1)+Sqr(d2)-Sqr(d3))/(d1*d2*2));
end;

Begin
 Write('x1 = ');
 Readln(x1);
 Write('y1 = ');
 Readln(y1);
 Write('x2 = ');
 Readln(x2);
 Write('y2 = ');
 Readln(y2);
 Write('x3 = ');
 Readln(x3);
 Write('y3 = ');
 Readln(y3);
 a:=Sqrt(Sqr(x2-x3)+Sqr(y2-y3));
 b:=Sqrt(Sqr(x1-x3)+Sqr(y1-y3));
 c:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
 Writeln('Point:');
 Write('x = ');
 Readln(x);
 Write('y = ');
 Readln(y);
 Writeln;
 c1:=Sqrt(Sqr(x-x1)+Sqr(y-y1));
 c2:=Sqrt(Sqr(x-x2)+Sqr(y-y2));
 c3:=Sqrt(Sqr(x-x3)+Sqr(y-y3));
 Sum:=Round(RadGr(Angle(c1,c2,c)+Angle(c2,c3,a)+Angle(c1,c3,b)));
 Writeln(Sum=360);
 Readln;
End.
Миниатюры
triang.jpg  
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 16.05.2012, 17:52   #3 (permalink)
Juliet
Member
 
Регистрация: 16.12.2011
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Извольте. Правда, сколь я припоминаю, у Вас АВС, и потому с графикой помочь не могу, ну а само решение - вот
О, спасибо огромное) да я уже ABC поменяла на free pascal - невозможно прям, то одно он не понимает, то другое не распознает)
Juliet вне форума   Ответить с цитированием
Старый 16.05.2012, 18:03   #4 (permalink)
Juliet
Member
 
Регистрация: 16.12.2011
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Только вот с рисунком теперь не могу разобраться, как бы правильно сделать(((
Juliet вне форума   Ответить с цитированием
Старый 16.05.2012, 20:32   #5 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,347
Сказал(а) спасибо: 288
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Цитата:
Сообщение от Juliet Посмотреть сообщение
О, спасибо огромное) да я уже ABC поменяла на free pascal - невозможно прям, то одно он не понимает, то другое не распознает)
Очень правильное решение!
Цитата:
Сообщение от Juliet Посмотреть сообщение
Только вот с рисунком теперь не могу разобраться, как бы правильно сделать(((
Постараюсь помочь, но быстро не обещаю: с графикой возни много.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 17.05.2012, 14:20   #6 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,347
Сказал(а) спасибо: 288
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Ну вот, как-то так. Только уж извините - с координатной сеткой возиться не стал. Очень много мороки.
Код:
Uses Graph, CRT;
Var
 x1,x2,x3,y1,y2,y3,x,y,a,b,c,c1,c2,c3:Real;
 Sum:Integer;
 Xmax,Ymax,Xmin,Ymin,Kx,Ky:Real;

Function ArcCos(z:Real):Real;
begin
 if Round(z*10000000)=10000000 then ArcCos:=0 else
 if Round(z*10000000)=-10000000 then ArcCos:=Pi else
    ArcCos:=(Pi/2)-ArcTan(z/SQRT(1-z*z));
end;

Function RadGr(t:Real):Real;
begin
  RadGr:=(t/Pi)*180;
end;

Function Angle(d1,d2,d3:Real):Real;
begin
 Angle:=ArcCos((Sqr(d1)+Sqr(d2)-Sqr(d3))/(d1*d2*2));
end;

Procedure Search_MinMax(v1,v2,v3,v4:real; var Vmin:real; var Vmax:real);
begin
 Vmin:=v1;
 if v2<Vmin then Vmin:=v2;
 if v3<Vmin then Vmin:=v3;
 if v4<Vmin then Vmin:=v4;
 Vmax:=v1;
 if v2>Vmax then Vmax:=v2;
 if v3>Vmax then Vmax:=v3;
 if v4>Vmax then Vmax:=v4;
end;

Begin
 Write('x1 = ');
 Readln(x1);
 Write('y1 = ');
 Readln(y1);
 Write('x2 = ');
 Readln(x2);
 Write('y2 = ');
 Readln(y2);
 Write('x3 = ');
 Readln(x3);
 Write('y3 = ');
 Readln(y3);
 a:=Sqrt(Sqr(x2-x3)+Sqr(y2-y3));
 b:=Sqrt(Sqr(x1-x3)+Sqr(y1-y3));
 c:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
 Writeln('Point:');
 Write('x = ');
 Readln(x);
 Write('y = ');
 Readln(y);
 Writeln;
 c1:=Sqrt(Sqr(x-x1)+Sqr(y-y1));
 c2:=Sqrt(Sqr(x-x2)+Sqr(y-y2));
 c3:=Sqrt(Sqr(x-x3)+Sqr(y-y3));
 Sum:=Round(RadGr(Angle(c1,c2,c)+Angle(c2,c3,a)+Angle(c1,c3,b)));
 Writeln(Sum=360);
 Writeln('Press "Enter" to show the picture...');
 Readln;
 Search_MinMax(x1,x2,x3,x,Xmin,Xmax);
 Search_MinMax(y1,y2,y3,y,Ymin,Ymax);
 InitGraph(...); {ТУТ УЖ ВЫ САМИ}
 Kx:=0.8*GetMaxX/(Xmax-Xmin);
 Ky:=0.8*GetMaxY/(Ymax-Ymin);
 SetLineStyle(SolidLn,0,ThickWidth);
 MoveTo(Round(0.1*GetMaxX+(x1-Xmin)*Kx),Round(0.9*GetMaxY-(y1-Ymin)*Ky));
 LineTo(Round(0.1*GetMaxX+(x2-Xmin)*Kx),Round(0.9*GetMaxY-(y2-Ymin)*Ky));
 LineTo(Round(0.1*GetMaxX+(x3-Xmin)*Kx),Round(0.9*GetMaxY-(y3-Ymin)*Ky));
 LineTo(Round(0.1*GetMaxX+(x1-Xmin)*Kx),Round(0.9*GetMaxY-(y1-Ymin)*Ky));
 Circle(Round(0.1*GetMaxX+(x-Xmin)*Kx),Round(0.9*GetMaxY-(y-Ymin)*Ky),2);
 ReadKey;
 CloseGraph;
End.
Миниатюры
tr_1.jpg   tr_2.jpg  
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 18.05.2012, 07:13   #7 (permalink)
Juliet
Member
 
Регистрация: 16.12.2011
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Ну вот, как-то так. Только уж извините - с координатной сеткой возиться не стал. Очень много мороки.
Код:
Uses Graph, CRT;
Var
 x1,x2,x3,y1,y2,y3,x,y,a,b,c,c1,c2,c3:Real;
 Sum:Integer;
 Xmax,Ymax,Xmin,Ymin,Kx,Ky:Real;

Function ArcCos(z:Real):Real;
begin
 if Round(z*10000000)=10000000 then ArcCos:=0 else
 if Round(z*10000000)=-10000000 then ArcCos:=Pi else
    ArcCos:=(Pi/2)-ArcTan(z/SQRT(1-z*z));
end;

Function RadGr(t:Real):Real;
begin
  RadGr:=(t/Pi)*180;
end;

Function Angle(d1,d2,d3:Real):Real;
begin
 Angle:=ArcCos((Sqr(d1)+Sqr(d2)-Sqr(d3))/(d1*d2*2));
end;

Procedure Search_MinMax(v1,v2,v3,v4:real; var Vmin:real; var Vmax:real);
begin
 Vmin:=v1;
 if v2<Vmin then Vmin:=v2;
 if v3<Vmin then Vmin:=v3;
 if v4<Vmin then Vmin:=v4;
 Vmax:=v1;
 if v2>Vmax then Vmax:=v2;
 if v3>Vmax then Vmax:=v3;
 if v4>Vmax then Vmax:=v4;
end;

Begin
 Write('x1 = ');
 Readln(x1);
 Write('y1 = ');
 Readln(y1);
 Write('x2 = ');
 Readln(x2);
 Write('y2 = ');
 Readln(y2);
 Write('x3 = ');
 Readln(x3);
 Write('y3 = ');
 Readln(y3);
 a:=Sqrt(Sqr(x2-x3)+Sqr(y2-y3));
 b:=Sqrt(Sqr(x1-x3)+Sqr(y1-y3));
 c:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
 Writeln('Point:');
 Write('x = ');
 Readln(x);
 Write('y = ');
 Readln(y);
 Writeln;
 c1:=Sqrt(Sqr(x-x1)+Sqr(y-y1));
 c2:=Sqrt(Sqr(x-x2)+Sqr(y-y2));
 c3:=Sqrt(Sqr(x-x3)+Sqr(y-y3));
 Sum:=Round(RadGr(Angle(c1,c2,c)+Angle(c2,c3,a)+Angle(c1,c3,b)));
 Writeln(Sum=360);
 Writeln('Press "Enter" to show the picture...');
 Readln;
 Search_MinMax(x1,x2,x3,x,Xmin,Xmax);
 Search_MinMax(y1,y2,y3,y,Ymin,Ymax);
 InitGraph(...); {ТУТ УЖ ВЫ САМИ}
 Kx:=0.8*GetMaxX/(Xmax-Xmin);
 Ky:=0.8*GetMaxY/(Ymax-Ymin);
 SetLineStyle(SolidLn,0,ThickWidth);
 MoveTo(Round(0.1*GetMaxX+(x1-Xmin)*Kx),Round(0.9*GetMaxY-(y1-Ymin)*Ky));
 LineTo(Round(0.1*GetMaxX+(x2-Xmin)*Kx),Round(0.9*GetMaxY-(y2-Ymin)*Ky));
 LineTo(Round(0.1*GetMaxX+(x3-Xmin)*Kx),Round(0.9*GetMaxY-(y3-Ymin)*Ky));
 LineTo(Round(0.1*GetMaxX+(x1-Xmin)*Kx),Round(0.9*GetMaxY-(y1-Ymin)*Ky));
 Circle(Round(0.1*GetMaxX+(x-Xmin)*Kx),Round(0.9*GetMaxY-(y-Ymin)*Ky),2);
 ReadKey;
 CloseGraph;
End.
Спасибо)) вы меня спасли))
Juliet вне форума   Ответить с цитированием
Старый 02.06.2012, 12:24   #8 (permalink)
Juliet
Member
 
Регистрация: 16.12.2011
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Function ArcCos(z:Real):Real;
begin
if Round(z*10000000)=10000000 then ArcCos:=0 else
if Round(z*10000000)=-10000000 then ArcCos:=Pi else
ArcCos:=(Pi/2)-ArcTan(z/SQRT(1-z*z));
end;

Function RadGr(t:Real):Real;
begin
RadGr:=(t/Pi)*180;
end;

Function Angle(d1,d2,d3:Real):Real;
begin
Angle:=ArcCos((Sqr(d1)+Sqr(d2)-Sqr(d3))/(d1*d2*2));
end;

Procedure Search_MinMax(v1,v2,v3,v4:real; var Vmin:real; var Vmax:real);
begin
Vmin:=v1;
if v2<Vmin then Vmin:=v2;
if v3<Vmin then Vmin:=v3;
if v4<Vmin then Vmin:=v4;
Vmax:=v1;
if v2>Vmax then Vmax:=v2;
if v3>Vmax then Vmax:=v3;
if v4>Vmax then Vmax:=v4;
end;
А можно хотя бы вкратце пояснить, что в каком действии выполняется? я запуталась совсем)
Juliet вне форума   Ответить с цитированием
Старый 02.06.2012, 16:48   #9 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,347
Сказал(а) спасибо: 288
Поблагодарили 507 раз(а) в 165 сообщениях
Репутация: 91953
По умолчанию

Цитата:
Сообщение от Juliet Посмотреть сообщение
А можно хотя бы вкратце пояснить, что в каком действии выполняется? я запуталась совсем)
Можно. Как я понимаю, только в приведенном фрагменте? Ну пожалуйста.
Прежде всего, на чем основан алгоритм? А вот: соединим, как показано на рисунке в сообщении #2, проблемную точку (обозначим ее т.0) со всеми тремя вершинами треугольника. Теперь если т.0 находится внутри треугольника, то сумма углов с вершиной в т.0 составит 360°, если же вне - то меньше. Вот это и проверяется. Углы ищем по теореме косинусов. Но для этого нужно иметь функцию арккосинус, в списке стандартных функций Паскаля отсутствующую.
Function ArcCos(z:real):Real; восполняет этот пробел.
Проверять условие равенства суммы углов 360° удобнее, если углы выражены в градусах, а не в радианах. Перевод из радианов в градусы осуществляет функция
Function RadGr(t:real):Real;
Функция
Function Angle(d1,d2,d3:real)Real;
решает задачу нахождения значения угла между сторонами треугольника d1 и d2 по значению этих сторон, а также третьей d3, по теореме косинусов.
И, наконец, о процедуре
Procedure Search_MinMax(v1,v2,v3,v4:real; var Vmin:real; var Vmax:real);
Смысл ее прост: из четырех чисел она находит наименьшее и наибольшее. Нужна она исключительно для оптимального размещения треугольника и точки т.0 на графическом экране, так, чтобы всё это во-первых, поместилось, а во-вторых, чтобы изображение не было мелким, смещенным в сторону и т.п., для чего и надо из координат трех вершин треугольника и точки т.0 найти наибольшую и наименьшую горизонтальные и вертикальные координаты, и уже исходя из них поставить "рамки" и определить масштабный коэффициент для построения изображения.

Вот как-то так. Если еще вопросы появятся, задавайте.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 03.06.2012, 09:03   #10 (permalink)
Juliet
Member
 
Регистрация: 16.12.2011
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Можно. Как я понимаю, только в приведенном фрагменте? Ну пожалуйста.
Прежде всего, на чем основан алгоритм? А вот: соединим, как показано на рисунке в сообщении #2, проблемную точку (обозначим ее т.0) со всеми тремя вершинами треугольника. Теперь если т.0 находится внутри треугольника, то сумма углов с вершиной в т.0 составит 360°, если же вне - то меньше. Вот это и проверяется. Углы ищем по теореме косинусов. Но для этого нужно иметь функцию арккосинус, в списке стандартных функций Паскаля отсутствующую.
Function ArcCos(z:real):Real; восполняет этот пробел.
Проверять условие равенства суммы углов 360° удобнее, если углы выражены в градусах, а не в радианах. Перевод из радианов в градусы осуществляет функция
Function RadGr(t:real):Real;
Функция
Function Angle(d1,d2,d3:real)Real;
решает задачу нахождения значения угла между сторонами треугольника d1 и d2 по значению этих сторон, а также третьей d3, по теореме косинусов.
И, наконец, о процедуре
Procedure Search_MinMax(v1,v2,v3,v4:real; var Vmin:real; var Vmax:real);
Смысл ее прост: из четырех чисел она находит наименьшее и наибольшее. Нужна она исключительно для оптимального размещения треугольника и точки т.0 на графическом экране, так, чтобы всё это во-первых, поместилось, а во-вторых, чтобы изображение не было мелким, смещенным в сторону и т.п., для чего и надо из координат трех вершин треугольника и точки т.0 найти наибольшую и наименьшую горизонтальные и вертикальные координаты, и уже исходя из них поставить "рамки" и определить масштабный коэффициент для построения изображения.
Теперь все понятно, спасибо))
Juliet вне форума   Ответить с цитированием
Ads

Яндекс

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

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

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

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




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

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