Вопрос № 63143: Эксперты, помогите.
Есть небольшая процедура (в приложении).
Я вообще не могу понять этот процедурный тип. Помогите передавать в эту процедуру параметры через функцию.
И, если можете, дайте линки на учебники Pascal, где описуються эти про...Вопрос № 63165: помогите сделать задачу!
В листопаді мороз формує особливі сніжинки: з кристалів, що мають форму відрізків прямої, у вигляді візерунка, що зображений на малюнку. Радіальні кристали послідовно пронумеровані від 0 до 5 і утворюють кути 60 град...
Вопрос № 63.143
Эксперты, помогите.
Есть небольшая процедура (в приложении).
Я вообще не могу понять этот процедурный тип. Помогите передавать в эту процедуру параметры через функцию.
И, если можете, дайте линки на учебники Pascal, где описуються эти процедурные типы.
Приложение:
Отправлен: 18.11.2006, 14:54
Вопрос задал: *_ViruS_* (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Томша Павел
Здравствуйте, *_ViruS_*!
Все, что находится в скобках перед названием - переменные, которые вы можете использовать в данной процедуре, н-р Cross(1,2,x,y); где 1 - значение переменной k, 2 - значение переменной b, x - переменная, которая несет в себе значение переменной x1, а y несет в себе значение x2. Значение переменных x и y нельзя указывать в вызове процедуре (т.е. нельзя осуществить Cross(1,2,3,4); т.к. перед x1 и x2 стоит слово Var, что значить, что результат процедуры может записываться в них и там обязательно должны стоять именно
переменные
Ответ отправил: Томша Павел (статус: 3-ий класс)
Ответ отправлен: 18.11.2006, 15:06 Оценка за ответ: 3 Комментарий оценки: Я не просил описывать процедуры. Я их понимаю. Меня интересует "Процедурный тип данных"! Почитайте это - http://pascal84.boom.ru/textbook1/8.1.htm и может вы поймете о чём я.
Отвечает: sir henry
Здравствуйте, *_ViruS_*!
О процедурном типе можно прочитать в любом учебнике по Turbo Pascal. Только более-менее осмысленных примеров по применению этого типа я встречал довольно редко.
Процедурный тип объявляется так:
Type
TProc1 = procedure(par1, par2: integer);
т.е. в скобках описываются все параметры, которые должны передаваться в процедуру.
Аналогично делается объявление типа-функции, только с добавлением типа возвращаемого результата.
Для чего этот тип применяется. Бывают ситуации, когда для расчета того или иного значения применяются разные алгоритмы, но с одинаковым набором входных параметров. Тогда объявив тип-процедуру(функцию) мы можем переменной этого типа подставлять ту или иную процедуруфункцию для расчета, в зависимости от условия.
Var
MyProc: TProc1;
x1, x2: Integer;
Procedure p1(a, b: integer);
Begin
{Один алгоритм расчета}
End;
Procedure p2(a, b: integer);
Begin
{Другой алгоритм расчета}
End;
Begin
...
If Условие Then
MyProc:=p1
Else
MyProc:=p2;
MyProc(x1, x2);
...
End.
------------------------------
"Помогите передавать в эту процедуру параметры через функцию." - не совсем понятно, что Вы имели в виду, но преположим, что Вам надо передать в процедуру тип-функцию.
Вы объявляете тип-функцию:
Type
TFunc = Function(a: integer): integer;
Объявляете переменную этого типа:
Var
F: TFunc;
Далее, при описании процедуры указываете в параметрах этот тип:
Procedure MyProc(ff: TFunc);
Begin
End;
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 18.11.2006, 16:02 Оценка за ответ: 5 Комментарий оценки: "Помогите передавать в эту процедуру параметры через функцию" вы поняли правильно. Но я так и не понял, что вы мне обьясняли. Можно более подробно? на примере моей процедуры.
Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, *_ViruS_*!
Гм... вообще-то в ссылке, которую вы указали в комментарии к оценке эксперта Томша Павел, указано достаточно информации - чем не ссылка на учебник? Смотрите использование в приложении.
Просто передать встроенную функцию sqrt без написания дополнительной функции FSqrt у меня не получилось. Давайте поймем, как это реализованно на машинном уровне. Вначале немного определений. Есть система (Windows), в ней системная библиотека, в которой есть функция sqrt.
Передача процедуры в качестве параметра осуществляется через просто через передачу указателся на область памяти. Той, где непосредственно лежит код процедуры (которая передается в качетсве параметра). А если вы используете системную функцию, то она лежит в системной же области памяти, куда доступ обычным программам запрещен. К тому же, надо еще получить этот адрес. Когда вы сами написали процедуру и сам скомпилировали ее, то компилятор (на самом деле компоновщик) знает, где она лежит, а вот с тем же самым, но
в чужой библиотеке - так нельзя. Только если она собрана с debug-информацией. Но такие никогда не поставляются в качестве коммерческого продукта. Библиотека-то системная, а Windows - коммерческий продукт =)
Sqrt, конечно, плохой пример, но идея, я думаю, ясна.
Я не силен в ассемблере, поэтому я не уверен, что это системная функция. Вполне возможно, что этот вызов вообще компилируется в команду процессора, если оная существует.
В листопаді мороз формує особливі сніжинки: з кристалів, що мають форму відрізків прямої, у вигляді візерунка, що зображений на малюнку. Радіальні кристали послідовно пронумеровані від 0 до 5 і утворюють кути 60 градусів. Кристали, що утворюють вкладені шестикутники, нумеруються від центру сніжинки (сам центр має номер 0) і кріпляться до радіальних кристалів з одиничним кроком.
. .
. .
1 /2
\__________/
/ /
/ \______/
/ / /
/ / \__/
/ / / /1 2 3
...0___/____/__/__0___\___\___\____3...
/ / / /
/__/ / /
/ / /
/______/ /
/ /
/__________/
/
/5 4
. .
. .
!!!!!!!!!!!!!!!!!!!!!
ДЛЯ ТОГО, ЩОБ ПРИ ПЕРЕГЛЯДІ СХЕМА ВІДОБРАЖАЛАСЬ ПРАВИЛЬНО, ПОТРІБНО ВСТАНОВИТИ ШРИФТ "FIXEDSYS" АБО "Lucida Console"
!!!!!!!!!!!!!!!!!!!!!
Координати вузла сніжинки задають двома числами (R, N), де R – номер радіального кристалу, а N – номер шестикутника (0 <= N <= 30000). Кожна сніжинка має рівно два особливих – платинових – вузли. Кристалічний чоловічок знаходиться у вузлі з координатами (a,b) і мусить відвідати обидва платинові вузли. Він може рухатись лише вздовж кристалів сніжинки. Написати програму, яка за координатами стартового і двох платинових вузлів визначає довжину найкоротшого шляху кристалічного чоловічка, який він проходить
зі свого стартового вузла до одного з платинових, обов’язково проходячи перед цим через інший платиновий вузол.
Формат вхідних даних: зі стандартного вхідного потоку вводяться шість чисел по два, відокремлені пропусками, в рядку – координати стартового вузла чоловічка, першого і другого платинових вузлів сніжинки відповідно.
Формат вихідних даних: у стандартний вихідний потік вивести одне число – довжину найкоротшого шляху кристалічного чоловічка між цими вузлами.
Приклад
Вхідні дані:
3 1
1 3
2 2
Вихідні дані:
5
Отправлен: 18.11.2006, 18:03
Вопрос задал: Shef (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Олег Владимирович
Здравствуйте, Shef!
Для начала, по приведённому примеру. Либо вы нечётко описали задачу, либо в ответе ошибка - есть способ добраться за 4 хода: (3,1)->(2,1)->(2,2)->(2,3)->(1,3)!
С учётом такой поправки, программа с комментариями - в приложении. Стандартный поток ввода - клавиатура (переделать на ввод из файла несложно), вывода - экран.
Идея:
За 1 ход можно изменить одну координату человечка на единицу, причём первая координата берётся по модулю 6, т.е. 6=0, 7=1 и т.д.. Кроме того, когда N=0, R неопределена. Так что выделяется отдельный случай, когда искомый путь проходит через центр.
Искомая длина пути L есть min{кратчайший путь до 1 особой точки, затем до второй; кратчайший путь до 2 точки, а затем до первой}. Кратчайший путь из одного узла в другой находится как минимум из пути, не проходящего через центр, и проходящего. Второй случай имеет смысл учитывать только когда нужные узлы находятся на одной радиальной прямой по разные стороны от центра или собственно в центре, т.е. например, R1=1 и R2=4 или N1=0.
В первом случае кратчайший путь = |N1-N2|+кол-во ходов для перехода с луча R1 на R2. Во втором случае он = N1+N2.
Удачи!
Приложение:
--------- Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: 6-ой класс)
Ответ отправлен: 18.11.2006, 21:22