Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 608

/ вопрос решён /

Здравствуйте, эксперты!
Не могурешить такую задачу. надо опредеоить периметр многоугольника с координатами, используя ПРОЦЕДУРУ вычисленя расстояния между двумя точками. Подскажите пожалуйста, как вот сделать? Заранее спасибо.

I{ () T Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: I{ () T (статус: Посетитель)
Вопрос отправлен: 7 апреля 2009, 19:18
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Ну раз именно ПРОЦЕДУРУ, то стоит начать с её написания. Странно, почему не функцию? Ну да ладно...

procedure LengthBetweenPoints(const x1, y1, x2, y2: Extended;
                              var Result: Extended);
begin
  //                                         ______________________
  //                                        /         2           2|
  // Формула расстояния между точками: S = V (x1 - x2) + (y1 - y2)
  Result:= Sqrt(Sqr(x1 - x2) + Sqr(y1 - y2));
end;

Ну а теперь поочерёдно берём координаты точек и подставляем в эту функцию процедуру, плюсуя её результат к общей сумме. Ну и всё.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 7 апреля 2009, 19:46
Оценка за ответ: 5

Комментарий к оценке: я просто только процедуры прохожу)))) поэтому про функции не знаю пока

Ответ #2. Отвечает эксперт: DNK

Здравствуйте, I{ () T!
Длина отрезка по координатам вершин - это из курса школьной математики.

Приложение:
  1. const
  2. n = 10;
  3.  
  4. coor: array [1..n] of TPoint =
  5. (
  6. (X: 0; Y: 0),
  7. (X: 0; Y: 0),
  8. (X: 0; Y: 0),
  9. (X: 0; Y: 0),
  10. (X: 0; Y: 0),
  11. (X: 0; Y: 0),
  12. (X: 0; Y: 0),
  13. (X: 0; Y: 0),
  14. (X: 0; Y: 0),
  15. (X: 0; Y: 0)
  16. );
  17. var
  18. i: byte;
  19. s: real;
  20. begin
  21. s := sqrt(sqr(coor[1].X - coor[n].X) + sqr(coor[1].Y - coor[n].Y));
  22. for i := 1 to n-1 do
  23. s := sqrt(sqr(coor[i].X - coor[i+1].X) + sqr(coor[i].Y - coor[i+1].Y));
  24. writeln('s=', s);
  25. readln;
  26. end;


Ответ отправил: DNK (статус: Студент)
Время отправки: 7 апреля 2009, 19:58
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 8 апреля 2009, 17:26; участников в обсуждении: 3.
I{ () T

I{ () T (статус: Посетитель), 7 апреля 2009, 20:03 [#1]:

Ершов Денис. к сожалению массивы еще не прошел(((
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
I{ () T

I{ () T (статус: Посетитель), 7 апреля 2009, 20:07 [#2]:

А Extended-это типа таких точек может быть много?) а саму процедуру в вашей программе, min@y™, надо вставлять перед формулой?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
I{ () T

I{ () T (статус: Посетитель), 7 апреля 2009, 20:12 [#3]:

получается что в главной части проги будет идти вычисление расстояния, а что в процедуре? извините, если вопрос глупый, только осваиваю тему.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
min@y™

min@y™ (статус: Доктор наук), 7 апреля 2009, 20:19 [#4]:

Extended - это вещественный 10-байтный тип. Похож на Real, только точность больше. Если тебя Extended смущает, замени его на Real.

Цитата:


получается что в главной части проги будет идти вычисление расстояния, а что в процедуре?


В процедуре будет идти вычисление расстояния между ДВУМЯ задаными точками. А в главной части проги – перебор точек, поочерёдная подстановка их координат в процедуру и суммирование результата, который и есть искомый периметр.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
I{ () T

I{ () T (статус: Посетитель), 7 апреля 2009, 20:21 [#5]:

то есть перебор будет идти автоматически? какой командой это надо сделать?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
I{ () T

I{ () T (статус: Посетитель), 7 апреля 2009, 20:25 [#6]:

uses
SysUtils;
var x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,dl,p:integer;
procedure pr1;
const x1, y1, x2, y2: Extended; var pr:real
begin
pr:=p;dl1:=dl;

end;
begin
write('koordinaty=');read(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5);
pr1;

end.

запутался((((( подскажите пожалуйста, как ее закончить?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
min@y™

min@y™ (статус: Доктор наук), 7 апреля 2009, 20:47 [#7]:

program p2608;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
// ============ Процедура вычисления расстояния между 2-мя точками =============
//                                         ______________________
//                                        /         2           2|
// Формула расстояния между точками: S = V (x1 - x2) + (y1 - y2)
procedure LengthBetweenPoints(const x1, y1, x2, y2: Real;
                              var Result: Real);
begin
 
  Result:= Sqrt(Sqr(x1 - x2) + Sqr(y1 - y2));
  WriteLn('  Length between (', x1: 2: 2, ', ', y1: 2: 2, ') and (', x2: 2: 2, ', ', y2: 2: 2, ') = ', Result: 4: 4);
end;
 
const
  N = 6; 
  // Координаты точек (не знаю, какая фигура там получится, писал от балды)
  X: array[0..N - 1] of Real = (0.0, 5.5, 7.2, 3.8, -11.1, -3.4);
  Y: array[0..N - 1] of Real = (8.5, -6.0, -10.7, 4.8, 5.3, 9.3);
 
var
  Index: Integer;        
  Perimeter: Real = 0.0; 
  Len: Real; 
 
begin
 
  for Index:= 0 to N - 1 do
    begin
      if Index <> N - 1
        then LengthBetweenPoints(X[Index], Y[Index], X[Index + 1], Y[Index + 1], Len)
        else LengthBetweenPoints(X[Index], Y[Index], X[0], Y[0], Len);
 
      Perimeter:= Perimeter + Len;
    end;
 
  WriteLn(#13#10' Perimeter: ', Perimeter: 4: 4);
  ReadLn;
end.

Писал без комментариев, чтоб ты сам разобрался, что тут к чему.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 8 апреля 2009, 10:33 [#8]:

Если уж задумали ввод координат, то их тоже нужно через цикл вводить.

const n=10;
var coor: array [1..n] of TPoint;
i: byte;
begin
for i:=1 to n do begin
write('Введите координты точки № ', i, ': ');
readln(coor[i].X, coor[i].Y);
end;
{
Вычисление периметра!
}
end.
"Digital Networked Knight"
I{ () T

I{ () T (статус: Посетитель), 8 апреля 2009, 17:26 [#9]:

СПАСИБО!
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......

31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:28
Выполнено за 0.02 сек.