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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2014, 18:42   #1
LancerRiker
Пользователь
 
Регистрация: 20.10.2014
Сообщений: 18
Печаль Подпрограмма КУМИР

Здравствуйте товарищи программисты. Пожалуйста помогите мне разделить эту программу на два алгоритма(ну проще говоря используя подпрограмму). Сколько думал так и нечего не смог сделать
Код:
алг коорд
нач вещ a1,a2,a3,a4,b1,b2,b3,b4,AB,BC,AC,AD,BD,CD,a,b,c,p,p1,p2,p3,s,s1,s2,s3
вывод "Введите координаты первой точки A: "
ввод a1,b1
вывод "Введите координаты второй точки B: "
ввод a2,b2
вывод "Введите координаты первой точки C: "
ввод a3,b3
вывод "Введите координаты четвертой точки D: "
ввод a4,b4
AB:=sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2))
BC:=sqrt((a2-a3)*(a2-a3)+(b2-b3)*(b2-b3))
AC:=sqrt((a1-a3)*(a1-a3)+(b1-b3)*(b1-b3))
AD:=sqrt((a1-a4)*(a1-a4)+(b1-b4)*(b1-b4))
BD:=sqrt((a2-a4)*(a2-a4)+(b2-b4)*(b2-b4))
CD:=sqrt((a3-a4)*(a3-a4)+(b3-b4)*(b3-b4))
p:=(AB+BC+AC)/2;
p1:=(AB+BD+AD)/2;
p2:=(BD+CD+BC)/2;
p3:=(CD+AD+AC)/2;
s:=sqrt(p*(p-AB)*(p-BC)*(p-AC));
s1:=sqrt(p1*(p1-AB)*(p1-BD)*(p1-AD));
s2:=sqrt(p2*(p2-BD)*(p2-CD)*(p2-BC));
s3:=sqrt(p3*(p3-CD)*(p3-AD)*(p3-AC));
если (s-s1-s2-s3)<0 то
вывод "Точка D является внутренней точкой треугольника ABC"
иначе вывод "Точка D не является внутренней точкой треугольника ABC"
все
кон
LancerRiker вне форума Ответить с цитированием
Старый 20.10.2014, 23:18   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Как пример:
Код:
function Distans(x1, y1, x2, y2) : real;
begin
   Distans := sqrt(sqr(x2-x1) + sqr(y2-y1));
end;
Тогда:
Код:
AB:= Distans(a1, b1, a2, b2);
И т.д. и т.п. ...


Как-то так, ...
PS: Вот только как в КУМИРе описать функцию ...
Как-то так, ...

Последний раз редактировалось ViktorR; 20.10.2014 в 23:49.
ViktorR вне форума Ответить с цитированием
Старый 21.10.2014, 13:08   #3
LancerRiker
Пользователь
 
Регистрация: 20.10.2014
Сообщений: 18
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Как пример:
Код:
function Distans(x1, y1, x2, y2) : real;
begin
   Distans := sqrt(sqr(x2-x1) + sqr(y2-y1));
end;
Тогда:
Код:
AB:= Distans(a1, b1, a2, b2);
И т.д. и т.п. ...


Как-то так, ...
PS: Вот только как в КУМИРе описать функцию ...
напиши пожалуйста пример кумиром. Я не понимаю как вообще происходит это, откуда x2-x1 и т.п. просто один пример и там я сделаю сам.
Попытался. Ошибку выдает что это алгоритм а не функция

Последний раз редактировалось LancerRiker; 21.10.2014 в 13:13.
LancerRiker вне форума Ответить с цитированием
Старый 21.10.2014, 13:50   #4
abit
Пользователь
 
Регистрация: 21.10.2014
Сообщений: 43
По умолчанию

можно через процедуру, это так выглядит:
Код:
...
расстояние(a1,b1,a2,b2,AB);
...
алг расстояние(арг вещ x1,y1,x2,y2, рез вещ dist)
нач
dist := sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
кон
но более естественно через функцию:
Код:
...
AB:=расстояние(a1,b1,a2,b2);
...
алг вещ расстояние(арг вещ x1,y1,x2,y2)
нач
знач := sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
кон
если же посмотреть шире, то нахождение p и s тоже лучше запихнуть по аналогии и вообще избавиться от кучи переменных активно пользуясь передачей параметров там по сути всего штук пять переменных за глаза хватит вместо этого леса

Последний раз редактировалось abit; 21.10.2014 в 13:57.
abit вне форума Ответить с цитированием
Старый 21.10.2014, 14:51   #5
LancerRiker
Пользователь
 
Регистрация: 20.10.2014
Сообщений: 18
По умолчанию

Спасибо большое вам. Программу написал
А там правильно написано? Ну имею в виду правильно расчитано точка D является или нет?

Последний раз редактировалось LancerRiker; 21.10.2014 в 14:54.
LancerRiker вне форума Ответить с цитированием
Старый 21.10.2014, 23:33   #6
abit
Пользователь
 
Регистрация: 21.10.2014
Сообщений: 43
По умолчанию

Цитата:
Сообщение от LancerRiker Посмотреть сообщение
Спасибо большое вам. Программу написал
А там правильно написано? Ну имею в виду правильно расчитано точка D является или нет?
Я никогда не писал на кумире, всех нюансов не знаю, но ваш код, скажу честно избыточно насыщен и лень вникать, исходя из логики вижу тут формулы герона - значит вы сравниваете площади треугольников и по ним судите о нахождении точки в/вне исходного треугольника, метод имеет право на жизнь, но во первых я сомневаюсь в этом условии
Код:
если (s-s1-s2-s3)<0 то
дело в том, что в тех языках, которыми я владею, разве что haskell может подобное провернуть за счёт бета-редукций, в Pascal/C++ необходимо учитывать небольшую погрешность при приведении вещественных чисел к точному значению 0, которое указано справа от <, по хорошему надо вместо <0 писать <=eps (где eps - допустимая ошибка вычисления, хотя бы 0e-4)
во вторых я бы всё же воспользовался векторным методом, а не сравнением площадей, это проще и быстрее...
ну и в третьих, о чём я уже говорил - этот лес переменных меня пугает ) это всё тут ни к чему...

впервые скачал себе кумир) до этой темы - думал это вообще мёртвый язык, оказалось нет, что-то там ваяют, даже на мой линукс встал))) написал на нём метод по сравнению площадей:

Код:
алг коорд
нач вещ Ax,Ay,Bx,By,Cx,Cy,Dx,Dy,S
вывод "Введите координаты первой точки A: "
ввод Ax,Ay
вывод "Введите координаты второй точки B: "
ввод Bx,By
вывод "Введите координаты первой точки C: "
ввод Cx,Cy
вывод "Введите координаты четвертой точки D: "
ввод Dx,Dy

S := площадь(Dx,Dy,Ax,Ay,Bx,By)+площадь(Dx,Dy,Bx,By,Cx,Cy)+площадь(Dx,Dy,Cx,Cy,Ax,Ay);

если abs(площадь(Ax,Ay,Bx,By,Cx,Cy)-S)<=0.001 то
вывод "Точка D является внутренней точкой треугольника ABC"
иначе вывод "Точка D не является внутренней точкой треугольника ABC"
все
кон

алг вещ площадь(арг вещ Ax,Ay,Bx,By,Cx,Cy)
нач
знач := abs(Bx*Cy-Cx*By-Ax*Cy+Cx*Ay+Ax*By-Bx*Ay);
кон
наслаждайтесь...
abit вне форума Ответить с цитированием
Старый 22.10.2014, 21:23   #7
LancerRiker
Пользователь
 
Регистрация: 20.10.2014
Сообщений: 18
По умолчанию

Цитата:
Сообщение от abit Посмотреть сообщение
Я никогда не писал на кумире, всех нюансов не знаю, но ваш код, скажу честно избыточно насыщен и лень вникать, исходя из логики вижу тут формулы герона - значит вы сравниваете площади треугольников и по ним судите о нахождении точки в/вне исходного треугольника, метод имеет право на жизнь, но во первых я сомневаюсь в этом условии
Код:
если (s-s1-s2-s3)<0 то
дело в том, что в тех языках, которыми я владею, разве что haskell может подобное провернуть за счёт бета-редукций, в Pascal/C++ необходимо учитывать небольшую погрешность при приведении вещественных чисел к точному значению 0, которое указано справа от <, по хорошему надо вместо <0 писать <=eps (где eps - допустимая ошибка вычисления, хотя бы 0e-4)
во вторых я бы всё же воспользовался векторным методом, а не сравнением площадей, это проще и быстрее...
ну и в третьих, о чём я уже говорил - этот лес переменных меня пугает ) это всё тут ни к чему...

впервые скачал себе кумир) до этой темы - думал это вообще мёртвый язык, оказалось нет, что-то там ваяют, даже на мой линукс встал))) написал на нём метод по сравнению площадей:

Код:
алг коорд
нач вещ Ax,Ay,Bx,By,Cx,Cy,Dx,Dy,S
вывод "Введите координаты первой точки A: "
ввод Ax,Ay
вывод "Введите координаты второй точки B: "
ввод Bx,By
вывод "Введите координаты первой точки C: "
ввод Cx,Cy
вывод "Введите координаты четвертой точки D: "
ввод Dx,Dy

S := площадь(Dx,Dy,Ax,Ay,Bx,By)+площадь(Dx,Dy,Bx,By,Cx,Cy)+площадь(Dx,Dy,Cx,Cy,Ax,Ay);

если abs(площадь(Ax,Ay,Bx,By,Cx,Cy)-S)<=0.001 то
вывод "Точка D является внутренней точкой треугольника ABC"
иначе вывод "Точка D не является внутренней точкой треугольника ABC"
все
кон

алг вещ площадь(арг вещ Ax,Ay,Bx,By,Cx,Cy)
нач
знач := abs(Bx*Cy-Cx*By-Ax*Cy+Cx*Ay+Ax*By-Bx*Ay);
кон
наслаждайтесь...
спасибо большое )
LancerRiker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа Кумир Extazzy_Oksi Помощь студентам 13 19.12.2016 18:08
Кумир треугольник Dagestanov Помощь студентам 2 08.11.2012 20:18
поиск источника радиации ( КуМиР ), советы по поиску литературы. kynew Помощь студентам 8 03.11.2012 00:01
кумир student11 Помощь студентам 1 24.10.2011 17:39
массивы в системе КуМир Belich Помощь студентам 3 10.02.2011 21:38