Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Pascal

Выпуск № 257
от 24.11.2006, 15:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 221, Экспертов: 50
В номере:Вопросов: 2, Ответов: 4


Вопрос № 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, конечно, плохой пример, но идея, я думаю, ясна.
Я не силен в ассемблере, поэтому я не уверен, что это системная функция. Вполне возможно, что этот вызов вообще компилируется в команду процессора, если оная существует.

Приложение:

---------
Не узнаешь - не попробуешь.

Ответ отправил: Сухомлин Кирилл Владимирович (статус: Практикант)
Ответ отправлен: 19.11.2006, 07:02


Вопрос № 63.165
помогите сделать задачу!

В листопаді мороз формує особливі сніжинки: з кристалів, що мають форму відрізків прямої, у вигляді візерунка, що зображений на малюнку. Радіальні кристали послідовно пронумеровані від 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное