Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [pascal] вычислить длины!


Автор: xF1x 11.9.2008, 13:09
Всем доброго времени суток! Такая вот школьная задача! Даны 4 точки у каждой точки две координаты(x y)  (всего 8 входных параметров т.е x1 x2 x3 x4 y1 y2 y3 y4) по этим парметрам вычислить длины соединений координат(т.е длины сторон этой фигуры, и диагонали, вообще все длины) и найти наибольшую длину в этой фигуре! только что у нас прошел первый урок по ПОДПРОГРАММАМ! сказали нужно через них( procedure) если можно то как можно проще! очень нужно к субботе! ВСЕМ ЗАРАНЕЕ СПАСИБО!

Автор: xF1x 11.9.2008, 20:39
Блин неужели никто не знает как это сделать?

Автор: mr.Anderson 11.9.2008, 20:50
xF1x, все достаточно просто.

1. Пишешь подпрограмму, принимающую четыре координаты - x1,y1 и x2,y2 - соответственно, координаты первой и второй точек, длину отрезка между которыми надо вычислить. Подпрограмма должна считать длину по известной формуле. Запишу, как это выглядит:
Код

function calcLength( x1, y1, x2, y2: Integer ): Real;
begin
 calcLength := sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
end;

2. Пишешь основную часть, где запрашиваешь все координаты у юзера и читаешь их в переменные. Вычисляешь с помощью вышесозданной функции все... ммм... 6 длин (четыре стороны и две диагонали). Затем сравниваешь шесть полученных значений, находишь максимальное, выводишь его.

Все.

Автор: xF1x 11.9.2008, 21:00
Во первых! я же сказал школьная задача, function calcLength вот этогго я в помине не знаю! я же знаю что для вас програмистов это раз плюнутьб, ну помогите школьнику!

Автор: mr.Anderson 11.9.2008, 21:03
xF1x, так, стоп, ты же сказал, что вы прошли подпрограммы? Function/procedure - это подпрограммы, просто функция возвращает какой-то результат, а процедура нет. Так в чем проблема?

Автор: xF1x 11.9.2008, 21:10
у нас был первый урок подпрограмм! учитель дал попробовать сможем или нет! только слово procedure изучили! 1 ое домашнее задание

Автор: mr.Anderson 11.9.2008, 21:11
xF1x, через процедуры эту задачу решать глупо. Можно, конечно, извратиться с глобальными переменными. Знаешь, что это такое? Если знаешь, сейчас напишу.

Добавлено через 5 минут и 6 секунд
В общем, если извращаться с глобалками, то так. ЭТО ФРАГМЕНТ, не целая программа. Додумай, чего там не хватает.
Код

program YourProgram;
var
 lengths : Array [1..6] of Real; //сюда длины запихаем

procedure calcLength( x1, y1, x2, y2, lenPos: Integer ): Real;
begin
 if (lenPos<1 or lenPos>6) then
  return;
 
 lengths[lenPos] := sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); //считаем длину с номером lenPos (1-4 стороны, 5-6 диагонали, это к примеру)
end;

begin
 //тут сам допишешь, что нужно, т.е. ввод координат, подсчет шести длин, вычисление максимума
end.


Добавлено через 6 минут и 3 секунды
Вообще, мой совет: делай через function и блесни на уроке знаниями. Почитай, кстати, про function, чтобы понять, что делают функции и в чем отличие от процедур (хотя я об этом уже тут говорил). Меньше головной боли.

Автор: xF1x 11.9.2008, 21:18
вообщем она сказала! вот  вам procedure!  и решайте! программа большая получается а глобальные переменные не слышал!  она сказала что по простому вводишь координаты потом формулул для длины отрезков по координатам и вывести наибольшую длину! все! это же ШКОЛА! я програмирование изучаю год от силы! ))

Автор: mr.Anderson 11.9.2008, 21:20
xF1x, делай, как я говорю, хуже не будет, если ты знаешь больше, чем дали в школе. Если, конечно, действительно знаешь. Если про глобалки не слышал, тем более. Ссылочные аргументы процедуры знаешь? Если нет, то я не вижу другого метода делать через процедуры. Вообще, это как в Москву из Иванова через Владивосток ехать.

Автор: xF1x 11.9.2008, 21:42
я плохо знаю програмирование! если бы знал хорошо сюда бы не обращался! поэтому и прошу мне помочь написать программу! она сказала делать через метки label ты об этом?

Автор: Rodman 11.9.2008, 22:33
Цитата(xF1x @  11.9.2008,  21:42 Найти цитируемый пост)
метки label ты об этом? 

не вздумай метки делать

Автор: volvo877 11.9.2008, 22:40
xF1x, понимаешь, в чем засада-то:
Цитата(xF1x @  11.9.2008,  21:18 Найти цитируемый пост)
она сказала что по простому вводишь координаты потом формулул для длины отрезков по координатам
- это функция, о чем тебе было сказано, поскольку формула тебе возвращает какой-то результат (что и делает функция).

А уж вот это:
Цитата(xF1x @  11.9.2008,  21:42 Найти цитируемый пост)
она сказала делать через метки label 
вообще ни в какие ворота... Ты Паскаль изучаешь? Процедуры вам объяснили? И после этого приплести еще метки??? Может нам попробовать еще через Goto переходить внутрь процедуры? Вообще-то нельзя, но может быть получится, раз очень надо...  smile 

Цитата(xF1x @  11.9.2008,  21:00 Найти цитируемый пост)
я же знаю что для вас програмистов это раз плюнуть
Угу... Особенно если на каждый ответ всплывают ограничения: функции не использовать, про глобальные переменные не слышал (можно подумать, ты про какие-то другие слышал. Чем же ты пользовался ДО того, как тебе рассказали про процедуры для хранения значений? Воздухом), вот теперь еще Goto обязательно. Круто...

Нужно с функциями (или с процедурами + Var параметры) - сделаем... А нет - так извиняй...

Автор: xF1x 11.9.2008, 22:49
да да кстати и goto она тоже делала! )) ну уж помогите! а для вас это наоборот лучше! разнообразие! мне к субботе нужно!

Автор: orthrus 12.9.2008, 05:27
Вот, вроде работает, пытался написать по школьному smile function не используется зато используется procedure:
Код

VAR
   lengths : Array [1..6] of Real;
   x1,x2,x3,x4:integer;
   y1,y2,y3,y4:integer;
   i,n:integer;
   max:real;

PROCEDURE CalcLength(in_x1,in_y1,in_x2,in_y2:integer;var length:real);
BEGIN
  length := sqrt((in_x1-in_x2)*(in_x1-in_x2) + (in_y1-in_y2)*(in_y1-in_y2));
END;

BEGIN
  WriteLn('Введите координаты точки 1:');
  Write('x1 = '); ReadLn(x1);
  Write('y1 = '); ReadLn(y1);
  WriteLn('Введите координаты точки 2:');
  Write('x2 = '); ReadLn(x2);
  Write('y2 = '); ReadLn(y2);
  WriteLn('Введите координаты точки 3:');
  Write('x3 = '); ReadLn(x3);
  Write('y3 = '); ReadLn(y3);
  WriteLn('Введите координаты точки 4:');
  Write('x4 = '); ReadLn(x4);
  Write('y4 = '); ReadLn(y4);
  CalcLength(x1,y1,x2,y2,lengths[1]);
  CalcLength(x2,y2,x3,y3,lengths[2]);
  CalcLength(x3,y3,x4,y4,lengths[3]);
  CalcLength(x4,y4,x1,y1,lengths[4]);
  CalcLength(x1,y1,x3,y3,lengths[5]);
  CalcLength(x2,y2,x4,y4,lengths[6]);
  max := lengths[1];
  n := 1;
  for i := 2 to 6 do
  begin
    if max<lengths[i] then
       begin
         max := lengths[i];
         n := i;
       end;
  end;

  WriteLn('максимально длинная прямая');
  case n of
   1 : begin
         WriteLn('Из точки 1 в точку 2');
         Write('её длинна равна'); WriteLn(lengths[1]);
       end;
   2 : begin
         WriteLn('Из точки 2 в точку 3');
         Write('её длинна равна'); WriteLn(lengths[2]);
       end;
   3 : begin
         WriteLn('Из точки 3 в точку 4');
         Write('её длинна равна'); WriteLn(lengths[3]);
       end;
   4 : begin
         WriteLn('Из точки 4 в точку 1');
         Write('её длинна равна'); WriteLn(lengths[4]);
       end;
   5 : begin
         WriteLn('Из точки 1 в точку 3');
         Write('её длинна равна'); WriteLn(lengths[5]);
       end;
   6 : begin
         WriteLn('Из точки 2 в точку 4');
         Write('её длинна равна'); WriteLn(lengths[6]);
       end;
  end;
  ReadLn;
END.

Автор: xF1x 12.9.2008, 06:13
CalcLength не изучали и мы про 3 точки делали без массива! без массива нельзя?case n of тоже не изучали! а так все отлично!

Автор: mr.Anderson 12.9.2008, 15:58
xF1x, вы вообще ну хоть что-то, кроме меток, изучали?! Что значит "calcLength" не изучали, а ничего, что это название процедуры? Или на первом уроке по процедурам ты не был? Кошмар. Без массива долго, нудно и муторно. Можно без case, если понаписать кучу условных операторов, это, надеюсь, учили. Если не учили, то максимум и минимум ты не найдешь. Вообще, код от orthrus можно раза этак в 2-3 сократить всего лишь с использованием дополнительного массива.

Добавлено через 1 минуту и 9 секунд
То есть двух дополнительных, для X и для Y соответственно. Кстати, красивое решение получится. А если еще и записи прикрутить, то вообще супер будет, но я даже не спрашиваю, учили это или нет...

Автор: xF1x 12.9.2008, 16:03
ладно давай я напишу как мы делали для 3 ч точек! и на этом основании ты уже подумаешь ок?

Добавлено через 14 минут и 53 секунды

программа находит существует ли треуголдьник по его заданным координатам тоесть если одна сторона меньше двух других сторон то он существует еслши нет то несуществует! использовали формулу герона где p полупериметр! вот! и теперь нужно по образцу этой задачи сделать то что я написал!вычислить длины соединенй координат четырех точек и найти наибольшую длину! вот
var x1 y1 x2 y2 x3 y3:integer;
var s,p, l12,l21,l23:real;
LABEL1,2;
procedure dlin;
var n,n1,m,m1:integer;
var d:real;
begin d:=sqrt (sqr(n1-n) +sqr(m1-m)) 
end:
begin
writeln ('x','x2','x3');
readln(x1,x2,x3);
writeln ('y1','y2','y3');
readln (y1,y2,y3);
dlin (x1,x2,y1,y2,l12);
dlin (x2,x3,,y2,y3,l23);
dlin(x3,x1,y3,y1,l31);
writeln ('dlin12'l12,'dlin23'l23,'dlin31',l31)
if l12>(l23+l31)or
l23>(l12+l31)or
l31>(l12+l23) then go to 1; else writeln ('существует');
p:=(l12+l23+l31)/2;
s:=sqrt(p*(p-l12)*(p- l23)*(p-l31);
writeln ('площадь's:5:1);go to 2
1:write('ytceo');
2:readln;
end.

Автор: THandle 12.9.2008, 18:08
xF1x, Боже!!! Ужас какой-то. Вообще код у нас принято соответствующей кнопкой выделять, но это даже кодом называть язык не поворачивается smile 

За такое оформление надо расстреливать.

Код

procedure dlin;
var n,n1,m,m1:integer;
var d:real;
begin d:=sqrt (sqr(n1-n) +sqr(m1-m)) 
end:


А вот это вообще зачем, а?
Что оно хоть делает? просто считает локальную переменную не понятно для чего...

Еще и goto эти...

послушай ты народ что тебе говорит, сделай с функциями. Знаниями блеснешь... Если не примут сделаем тебе с goto, хотя это извращения жуткие... Зачем такое преподавание языка нужно...


Если очень грубо - извиняюсь.

Автор: mr.Anderson 12.9.2008, 19:06
xF1x, руки поотрывать тем, кто такой код пишет. THandle тебе правильно сказал насчет стиля и оформления. Да и смысла в коде не особо. Я тебе уже говорил, сделай с функциями и будешь на высоте, репутацию себе поднимешь! Чего через одно место-то все делать, просто потому, что так препод сказал? Не стоит оно этого.

Автор: xF1x 12.9.2008, 20:25
Ну ребят выкладывайте свой код давайте! как можно проще с procedure! блесну знаниями! давайте кидайте а то завтра сдавать

Автор: xF1x 12.9.2008, 20:50
А РЕБЯТААА! ГДЕ ВЫ ВСЕ? smile  НЕ КИДАЙТЕ МЕНЯ МНЕ ЗАВТРА СДАВАТЬ!  smile 

Автор: mr.Anderson 12.9.2008, 21:00
xF1x, наконец-то. Хоть что-то. Лови. Привел максимально короткое решение с процедурами, какое придумал. Перед сдачей советую проверить на работоспособность, у меня компилятора нет.
Код

program YourProgram;
var
 _x : Array [1..4] of Integer; //координаты X каждой точки
 _y : Array [1..4] of Integer; //координаты Y каждой точки
 max : Real; //максимальная длина, глобальная общедоступная переменная

procedure calcLength( x1, y1, x2, y2: Integer );
var
 len : Integer;
begin
 len := sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); //считаем длину

 if (max < len) then //одновременно ищем максимум
  max := len;
end;

begin
 for i:=1 to 4 do
 begin
  WriteLn("Enter coordinates of ", i, " point (x y): ");
  ReadLn(_x[i], _y[i]);
 end;

 max := 0; //пока максимума нет, ставим в 0 как в минимально возможное значение

 calcLength(_x[1], _y[1], _x[2], _y[2]); //считаем длины сторон
 calcLength(_x[2], _y[2], _x[3], _y[3]);
 calcLength(_x[3], _y[3], _x[4], _y[4]);
 calcLength(_x[4], _y[4], _x[1], _y[1]);
 calcLength(_x[1], _y[1], _x[3], _y[3]); //и двух диагоналей
 calcLength(_x[2], _y[2], _x[4], _y[4]);

 WriteLn("Maximum: ", max); //выводим максимум
end.

Кажись, так.

Автор: xF1x 12.9.2008, 21:15
calcLength
len поясни пожалуйста не знаю такого, так нужно же 4 точки! а у тебя 2 
и что то  len := sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) вот эту форумулу не понял зачем две координаты сами на себя перемножать?

Автор: xF1x 12.9.2008, 21:59
ауууу ну где ты?

Автор: THandle 12.9.2008, 22:22
mr.Anderson, тебя плющит!!! Уж извини smile Это надо попутать C++ и Pascal в строках?smile

Цитата(mr.Anderson @  12.9.2008,  22:00 Найти цитируемый пост)
WriteLn("Maximum: ", max);


Так кажись:

Код

WriteLn('Maximum: ', max);


 smile 

И хто есть заюзанная, но не объявленная переменная i? smile  Хоть в Делфе что ль проверяй...
Еще как можно например юзать переменную целого типа для присвоения результата вычислений sqrt?

Вот в общем как-то работающий код, формулы не мои smile Я после празднования ДП плохо соображаю насчет них. Но какой то результат программа даёт smile

Код

program YourProgram;

var
  x: Array [1..4] of Integer; //координаты X каждой точки
  y: Array [1..4] of Integer; //координаты Y каждой точки
  max: Real; //максимальная длина, глобальная общедоступная переменная
  i: Integer; //Переменная-счетчик

procedure CalcLength(x1, y1, x2, y2: Integer);
var
  len: Real;
begin
  len := sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); //считаем длину
  if (max < len) then //одновременно ищем максимум
    max := len;
end;

begin
  for i := 1 to 4 do
    begin
      WriteLn('Enter coordinates of ', i, ' point (x y): ');
      ReadLn(x[i], y[i]);
    end;
  max := 0; //пока максимума нет, ставим в 0 как в минимально возможное значение
  CalcLength(x[1], y[1], x[2], y[2]); //считаем длины сторон
  CalcLength(x[2], y[2], x[3], y[3]);
  CalcLength(x[3], y[3], x[4], y[4]);
  CalcLength(x[4], y[4], x[1], y[1]);
  CalcLength(x[1], y[1], x[3], y[3]); //и двух диагоналей
  CalcLength(x[2], y[2], x[4], y[4]);
  WriteLn('Maximum: ', max); //выводим максимум
  ReadLn;
end.



Добавлено через 1 минуту и 54 секунды
Цитата(xF1x @  12.9.2008,  22:15 Найти цитируемый пост)
calcLength


Процедура считающая длину типа.

Цитата(xF1x @  12.9.2008,  22:15 Найти цитируемый пост)
len поясни пожалуйста не знаю такого, так нужно же 4 точки! а у тебя 2 


4 точки, 4. Ты запусти, посмотри сколько раз надо вводитьsmile

Автор: xF1x 12.9.2008, 22:26
THandle  поясни плиз где мы вводим координаты 4 точек? и почему в начале 2 массива а не 4?

Добавлено @ 22:29
len := sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) длина от точки до точки не так находиться из конечной начальную вроде надо вычитать

Автор: THandle 12.9.2008, 22:31
Цитата(xF1x @  12.9.2008,  23:26 Найти цитируемый пост)
THandle  поясни плиз где мы вводим координаты 4 точек?


Код

  for i := 1 to 4 do
    begin
      WriteLn('Enter coordinates of ', i, ' point (x y): ');
      ReadLn(x[i], y[i]);
    end;


Цитата(xF1x @  12.9.2008,  23:26 Найти цитируемый пост)
и почему в начале 2 массива а не 4? 


Потому что массивы у Андерсена длиной по 4 элемента, в одном [ координаты в другом y. Я бы вообще сделал запись и один массив, ну это мои уже дела smile вы врядли это проходили все.

Еще вопросы?

Автор: xF1x 12.9.2008, 22:32
len := sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) длина от точки до точки не так находиться из конечной начальную вроде надо вычитать

Автор: THandle 12.9.2008, 22:40
xF1x, предъявы  не ко мне, я просто разместил объяву... Смотри, так?

Код

program YourProgram;

var
  x: Array [1..4] of Integer; //координаты X каждой точки
  y: Array [1..4] of Integer; //координаты Y каждой точки
  max: Real; //максимальная длина, глобальная общедоступная переменная
  i: Integer; //Переменная-счетчик

procedure CalcLength(x1, y1, x2, y2: Integer);
var
  len: Real;
begin
  len := sqrt((x2-x1)*(y2-y1)); //считаем длину
  if (max < len) then //одновременно ищем максимум
    max := len;
end;

begin
  for i := 1 to 4 do
    begin
      WriteLn('Enter coordinates of ', i, ' point (x y): ');
      ReadLn(x[i], y[i]);
    end;
  max := 0; //пока максимума нет, ставим в 0 как в минимально возможное значение
  CalcLength(x[1], y[1], x[2], y[2]); //считаем длины сторон
  CalcLength(x[2], y[2], x[3], y[3]);
  CalcLength(x[3], y[3], x[4], y[4]);
  CalcLength(x[4], y[4], x[1], y[1]);
  CalcLength(x[1], y[1], x[3], y[3]); //и двух диагоналей
  CalcLength(x[2], y[2], x[4], y[4]);
  WriteLn('Maximum: ', max); //выводим максимум
  ReadLn;
end.

Автор: xF1x 12.9.2008, 22:44
вот формула для нахождения длины от одной точки до другой len:= sqrt(sqr(x1-x)+sqr(y1-y)) поправь если не так мы в классе так делали

Автор: THandle 12.9.2008, 22:51
xF1x, тчоно smile Забыл. Меньше праздновать надо было smile

Код

program YourProgram;

var
  x: Array [1..4] of Integer;
  y: Array [1..4] of Integer;
  max: Real;
  i: Integer;

procedure CalcLength(x1, y1, x2, y2: Integer);
var
  len: Real;
begin
  len := sqrt(Sqr((x2-x1))*Sqr((y2-y1)));
  if (max < len) then
    max := len;
end;

begin
  for i := 1 to 4 do
    begin
      WriteLn('Enter coordinates of ', i, ' point (x y): ');
      ReadLn(x[i], y[i]);
    end;
  max := 0;
  CalcLength(x[1], y[1], x[2], y[2]);
  CalcLength(x[2], y[2], x[3], y[3]);
  CalcLength(x[3], y[3], x[4], y[4]);
  CalcLength(x[4], y[4], x[1], y[1]);
  CalcLength(x[1], y[1], x[3], y[3]);
  CalcLength(x[2], y[2], x[4], y[4]);
  WriteLn('Maximum: ', max);
  ReadLn;
end.


Так?

Автор: xF1x 12.9.2008, 22:52
вообщем все я разобрался! сам кое где подредактировал! ВСЕМ ОГРОМНОЕ СПАСИБО! smile  ЗАВТРА ОТПИШУСЬ ЧТО МНЕ ПОСТАВИЛИ! 

Автор: THandle 12.9.2008, 22:56
xF1x, если разобрался, то не поленись теме галочку поставить smile Что решена типа smile Удачи завтра smile

Автор: xF1x 12.9.2008, 22:59
спасибо!  smile  ЧТОБЫ Я БЕЗ ВАС ДЕЛАЛ?!!

Автор: mr.Anderson 13.9.2008, 14:44
THandle, ну, вот что бывает, когда пишешь подобные ответы в спящем состоянии + при изучении второго языка попутно... smile

xF1x, учил бы, например. smile Что поставили-то?

Автор: xF1x 16.9.2008, 12:49
5 поставили! СПАСИБО щас еще одна программа будет!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)