Вступление
Добрый день! |
||||||||||||||||||||||||
ТеорияСегодня перед вами откроется страшная тайна.... всё это время мы вас беспощадно обманывали !!!!!!!!!
:) Помните функцию ClrScr - так вот тайна её рождения состоит в том, что это ПРОЦЕДУРА. Процедуры и функции очень похожи друг на друга. Основное отличие состоит в том, что функция может нам что-то возвратить, а процедура нет. ClrScr - ничего нам не возвращает => процедура, Round - возвращает => функция. В некоторых языках (самый яркий пример - С/С++) вообще нет понятия процедуры - там только функции. При этом в качестве процедур используются функции которые ничего не возвращают. В Паскале же процедуры и функции разделили между собой. Итак давайте научимся писать свои собственные процедуры и функции. Описание процедуры начинается со следующего заголовка: procedure ИМЯ ( СПИСОК_ПАРАМЕТРОВ );Список параметров может отсутствовать (например всё та же ClrScr - нет параметров). В остальном процедура очень похожа на программу. Кстате процедуры и функции вместе называют - под-программы!
Сегодня мы поговорим о процедурах. Плюсы в использовании процедур очевидны - не надо много раз повторять один и тот же код - достаточно просто указать имя процедуры. Давайте напишем такой пример:
Можно сказать, что до этого наша программа и была одной процедурой. Только без имени. Например в том же С - у этой фунции есть имя main. Процедуры являются под-программами, поэтому они могут в свою очередь содержать под-под-программы, которые тоже могут содержать под-под-под-программы :) и так далее. Например структура нашей программы выглядела так (слева для наглядности нарисована схема, а справа написан текст программы):
Если мы к под-программе А добавим две под-программы, то структура изменится в следующую строну:
А если мы теперь к под-программе А2 добавим ещё пару под-программ, то структура превратится в следующее:
А если мы ещё к под-программе А21 добавим три под-программы, то ....... впрочем хватит. Нужно знать меру :) Существует так называемая видимость под-программ. Мы назваем под-программу видимой если можем её вызвать в противном случае она для нас невидима. Например для основной программы видимы только 2 под-программы А и В. То что находится внутри их является "чёрным ящиком". Мы не знаем что там внутри А. Однако для под-программ А1 и А2 под-программа А является как бы родительской поэтому мы можем вызывать А1 и А2. Точно так же мы можем вызывать А21 и А22 только из А2. При компиляции программы её текст просматривается компмлятором только один раз. Поэтому что бы вызвать процедру мы должны сначала её описать. Так в нашем примере из А нельзя вызвать В, т.к. читая сверху вниз мы не знаем что это такое. Но из В можно вызвать А. Давайте теперь рассмотрим процедуру с параметрами : для объявления параметра мы должны указать его имя и тип. Параметры разных типов отделяются друг от друга точкой с запятой. Например: procecure PrintString (x, y : integer; st : String);Здесь в процедуру передаётся 3 параметра - X, Y, ST. Первые 2 типа integer и 3-ий типа string. Однако нам может понадобится изменять параметры. При способе описанном выше переменные XS и YS не изменятся при выходе из процедуры, даже если добавим внутрь её что-то типа этого XS := 3; Этот метод передачи парамеров называется передача значения. В процедуру передаётся только значение XS и YS.
Существует и другой способ передачи параметров - адрессный. Тогда передаётся адресс переменной! Адресс - это точное указание места переменной в памяти (как например ваш почтовый адресс точно указывает где вы живёте). Так вот мы передаём этот самый адресс. И процедура может менять значение по этому адрессу. Т.е. мы поменяем значение переменой! Для этой цели нужно указать перед переменной слово var. Например:
procedure SQUARE ( x : integer);то тогда на экране появилась бы 2, т.к. мы не меняем значение параметра. Давайте мы рассмотрим ещё один пример: в позапрошлом выпуске мы говорили о том как поменять значения двух переменных (помните A = 5, B = 6 а надо A = 6, B = 5). Напишем такую проостую процедуру:
Теперь её можно вызывать например так:
X := 3;после этого X=5, а Y=3.
Вернёмся к области видимости. Теперь поговорим об области видимости переменных. Например что выведет такая программа:
Поэтому нужно быть аккуратнее с именами. Иначе может случится казус :) при этом вы не всегда сможете быстро сообразить почему программа работает не правильно. Предпочтительнее давать глобальным и локальным переменным разные имена. Кстати всё выше сказанное относится и к константам и к меткам.
В Турбо Паскале допускается произвольная последовательность описания переменных, констант, меток, под-программ. Например мы можем несколько раз объявитеть секцию var (const, label) внутри под-программы. Например:
|
||||||||||||||||||||||||
Программа
-- Ну,-- сказала Сова,-- обычная процедура в таких случаях нижеследующая... Вы никогда не задумывались над следующими фактами:
Итак задача. Дано: дата (день, месяц, год). Найти: день недели. Решение: Вряд ли вас заинтересует откуда взялась формула. Я по крайней мере за время отведённое на подготовку этого выпуска отыскать её не смог (хотя не очень то и старался :). Так вот она эта чудестная формула: день недели = остаток от деления Х на 7В записи формулы я использовал 2 функии: abs (Х) (absolute - абсолютный) возвращает модуль числа Х, trunc (X) (truncate - усекать) "усекает" значение Х до целой части. Например abs (-3) = 3, abs (3) = 3. trunc(1.4) = 1, trunc (1.7) = 1 Однако не зря я выделил слово вечный в кавычки: эта формула действительна только для григорианского календаря нового стиля (от 1582 до 4903). Так же следует учесть несколько другой порядок следования месяцов - март имеет номер 1, апрель номер 2 ... декабрь - 10, январь - 11, февраль - 12. При этом февраль и январь следует отнести к предыдущему году. Т.е. для n-ого февраля 2002 месяц должен быть равен 12, а год 2001. Результат вычисления получается от 0 до 6, при этом 0 - соответствует воскресенью, 1 - понедельнику .... 6 - субботе.
Программа работает по принципу "спросил-ответил". Пользователь вводит дату, программа выдаёт день недели. Думаю вам понятно как построить на основе этих данных "вечный" календарь.Комментировать особенно нечего, кроме того, что я пренебрёг собственными рекомендациями и назвал параметры в процедурах и глобальные переменные одинаково :) Обратите внимание на следующее - в процедуре получения даты (GetDay) мы передаём адресса переменных => при выходе из процедуры их значения изменятся. А в процедуре вычисления дня недели (CountDay) мы передаём просто значения переменных => после выхода из процедуры они не изменятся. Неплохо бы исселдовать программу в отладчике. До этого мы для пошагового исполнения использовали клавишу F8. Однако что бы заходить в функции и процедуры нам подребуется нажимать клавишу F7. Используя F8 (пошагово без захода в функции и процедуры) мы увидим исполнение 3-х строчек. А что б увидеть исполнение всех процедур и функций программы нам нужно использовать пошаговый режим с заходом в функции F7. Ещё можно обратить внимание на объявление массива строк. String это такой же тип как и integer поэтому мы вполне можем объявить массив типа String. Так же можно добавить проверку на корректность введённого дня и месяца. |
||||||||||||||||||||||||
ГолосованиеОпрос по поводу объяснения материала в рассылке всё ещё доступен - http://narod.yandex.ru/survey/?id=79839. |
||||||||||||||||||||||||
ПослесловиеВот и всё. Тема довольно сложная, так что если появились вопросы - пишите. |