Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2010, 10:27   #1
Raphael
Пользователь
 
Регистрация: 01.10.2010
Сообщений: 21
По умолчанию Периметр n-угольника

Даны натуральное число n, действительные числа x1,y2,...,xn,yn. Найти периметр n-угольника, вершины которого имеют координаты (x1,y2,...,xn,yn).

Код:
var
 count,i:integer;
 P:real;
 gx1,gx2,gy1,gy2,x0,y0:integer;
 
procedure Next(x1,y1,x2,y2:integer);
var s:real;
begin
 s:=sqrt(sqr(x2-x1)+sqr(y2-y1));
 P:=P+s;
end;
 
begin
 writeln('Введите количество вершин');
 readln(count);
 writeln('Введите координаты вершины номер "1"');
 readln(gx1,gy1);
 x0:=gx1;
 y0:=gx2;
 for i:=2 to count do
 begin
  writeln('Введите координаты вершины номер "',i,'"');
  readln(gx2,gy2);
  Next(gx1,gy1,gx2,gy2);
  gx1:=gx2;
  gy1:=gy2;
 end;
 next(x0,y0,gx1,gy1);
 writeln;
 writeln('Периметр равен ',P:0:5);
 readln;
 end.
Почему когда я нахожу периметр треугольника, у меня не сходится результат с этой программой:
Код:
uses crt; 
    var 
     a:real;    
     b:real;     
    c:real;    
     x1,x2,x3:integer;    
     y1,y2,y3:integer;     
     p:real;     
    begin 
     clrscr; 
       writeln('введите первую координату х '); 
       readln(x1); 
       writeln('введите вторую координату х '); 
       readln(x2); 
       writeln('введите третью координату х '); 
       readln(x3); 
       writeln('введите первую координату y '); 
       readln(y1); 
       writeln('введите вторую координату y '); 
       readln(y2); 
       writeln('введите третью координату y '); 
       readln(y3); 
       a:=sqrt(sqr(x2-x1)+sqr(y2-y1));     
       b:=sqrt(sqr(x3-x2)+sqr(y3-y2));     
       c:=sqrt(sqr(x3-x1)+sqr(y3-y1)); 
       p:=a+b+c;                                 
       writeln('периметр равен = ',p:2:0); 
       readln; 
    end.
Raphael вне форума Ответить с цитированием
Старый 17.10.2010, 12:06   #2
vlad_light
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 95
По умолчанию

Нужно иницилизировать переменную P перед вызовом процедуры значением 0.
И правильнее будет писать:
Код:
function Next(/*variables*/):real
begin
/*code*/
Next:=P;
end;
И ещё, если я не ошибаюсь, переменная Р должна быть статическая. Не знаю, как это на паскале, ибо я его особо не учил.
vlad_light вне форума Ответить с цитированием
Старый 17.10.2010, 12:48   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
И ещё, если я не ошибаюсь, переменная Р должна быть статическая.
Нет в Паскале такого, и не надо. В Си классическом по-моему тоже нет. Это только в ООП такие финты.
Цитата:
И правильнее будет писать:
Что за ерунда? Чего это?
Цитата:
for i:=2 to count do
А почему первую вершину пропускаешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.10.2010, 14:14   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Что за ерунда? Чего это?
Наверное, имелось в виду, чтобы прога, вызывающая функцию, не использовала напрямую глобальную переменную, типа:
Код:
var
  P: Real;

function First(x1, y1, x2, y2: Integer): Real;
begin
  P := sqrt(sqr(x2 - x1) + sqr(y2 - y1));
  First := P;
end;

function Next(x1, y1, x2, y2: Integer): Real;
begin
   P := P + sqrt(sqr(x2 - x1) + sqr(y2 - y1));
   Next := P;
end;
Цитата:
Сообщение от vlad_light Посмотреть сообщение
И ещё, если я не ошибаюсь, переменная Р должна быть статическая. Не знаю, как это на паскале, ибо я его особо не учил.
В Паскале нет статических переменных. Если она будет статическая в функции, то её будет проблематично занулить. В Си было бы можно сделать её статической, если эта функция в отдельном файле, чтобы к переменной нельзя было получить доступ извне.

Последний раз редактировалось Somebody; 17.10.2010 в 14:22.
Somebody вне форума Ответить с цитированием
Старый 17.10.2010, 16:21   #5
Orakul89
Пользователь
 
Регистрация: 12.11.2009
Сообщений: 20
По умолчанию

попробуй исправить строку
Код:
y0:=gx2;
на
Код:
y0:=gy1;
Orakul89 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
периметр shelest Помощь студентам 1 28.11.2009 23:47
Вращение 5-угольника на рабочем столе Ratte Помощь студентам 7 21.04.2008 18:41
Вращение 5-угольника..? Roberto Помощь студентам 4 17.04.2008 09:38