Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по информатике.doc
Скачиваний:
581
Добавлен:
17.03.2015
Размер:
3.59 Mб
Скачать

43. Процедуры.

Помните функцию ClrScr - так вот тайна её рождения состоит в том, что это ПРОЦЕДУРА. Процедуры и функции очень похожи друг на друга. Основное отличие состоит в том, что функция может нам что-то возвратить, а процедура нет. ClrScr - ничего нам не возвращает => процедура, Round - возвращает => функция. В некоторых языках (самый яркий пример - С/С++) вообще нет понятия процедуры - там только функции. При этом в качестве процедур используются функции которые ничего не возвращают. В Паскале же процедуры и функции разделили между собой. Итак давайте научимся писать свои собственные процедуры и функции. Описание процедуры начинается со следующего заголовка:

procedure ИМЯ ( СПИСОК_ПАРАМЕТРОВ );

Список параметров может отсутствовать (например всё та же ClrScr - нет параметров). В остальном процедура очень похожа на программу. Кстате процедуры и функции вместе называют - под-программы! Сегодня мы поговорим о процедурах. Плюсы в использовании процедур очевидны - не надо много раз повторять один и тот же код - достаточно просто указать имя процедуры. Давайте напишем такой пример:

procedure DisplayString;

var

i : integer;

begin

ClrScr;

for i := 0 to 10 do

writeLn ('Write something ....' )

end;

Как видите у процедуры есть своя секция переменных, секция меток, констант и секция выполняемых инструкций (секция кода). Код процедуры начинается соответственно со слова begin и кончается словом end. Обратите внимание, что после end мы поставили точку с запятой! Как вы помните точка - это признак конца программы, а программа не заканчивается процедурой! Можно сказать, что до этого наша программа и была одной процедурой. Только без имени. Например в том же С - у этой фунции есть имя main. Процедуры являются под-программами, поэтому они могут в свою очередь содержать под-под-программы, которые тоже могут содержать под-под-под-программы :) и так далее. Например структура нашей программы выглядела так (слева для наглядности нарисована схема, а справа написан текст программы):

Program ...;

begin

........

end.

Если мы добавим две под программы, то она изменится в такую:

Под-программа А

Program ...;

procedure A;

begin

.......

end;

Под-программа B

procedure B;

begin

........

end;

begin

........

end.

Если мы к под-программе А добавим две под-программы, то структура изменится в следующую строну:

ПРОГРАММА

Program ...;

begin

........

end.

Под-программа А

procedure A;

begin

.......

end;

под-программа А1

procedure A1;

begin

........

end;

под-программа А2

procedure A2;

begin

..........

end;

Под-программа B

procedure B;

begin

........

end;

Program Day_of_week;

uses CRT;

procedure GetDay (var d, m, y : integer);

var

correct : byte;

begin

correct := 1;

repeat

writeLn ('Введите дату.');

write ('День - ');

readLn (d);

write ('Месяц - ');

readLn (m);

write ('Год - ');

readLn (y);

{ Проверим правильность года. Если год не "правильный", то попросим ввести дату ещё раз }

if y <= 4903 then

if y >= 1582 then

correct := 0;

until correct = 0

end;

procedure CountDay (d, m, y : integer);

var

week : array [0 .. 6] of string[11];

c, w : integer;

begin

week [0] := 'воскресенье';

week [1] := 'понедельник';

week [2] := 'вторник';

week [3] := 'среда';

week [4] := 'четверг';

week [5] := 'пятница';

week [6] := 'суббота';

{ Месяц январь или февраль = > нужно преобразовать }

if m < 3 then

begin

m := m + 10;

y := y - 1

end

else

m := m - 2;

c := y div 100;

y := y mod 100;

w := abs (trunc (2.6 * m -0.2) + d + y div 4 + y + c div 4 - 2 * c) mod 7;

writeLn ('соответствует день недели - ', week [w])

end;

var

d, y, m : integer;

begin

ClrScr;

GetDay (d, m, y);

CountDay (d, m, y)

end.

Программа работает по принципу "спросил-ответил". Пользователь вводит дату, программа выдаёт день недели. Думаю вам понятно как построить на основе этих данных "вечный" календарь. Комментировать особенно нечего, кроме того, что я пренебрёг собственными рекомендациями и назвал параметры в процедурах и глобальные переменные одинаково :) Обратите внимание на следующее - в процедуре получения даты (GetDay) мы передаём адресса переменных => при выходе из процедуры их значения изменятся. А в процедуре вычисления дня недели (CountDay) мы передаём просто значения переменных => после выхода из процедуры они не изменятся. Неплохо бы исселдовать программу в отладчике. До этого мы для пошагового исполнения использовали клавишу F8. Однако что бы заходить в функции и процедуры нам подребуется нажимать клавишу F7. Используя F8 (пошагово без захода в функции и процедуры) мы увидим исполнение 3-х строчек. А что б увидеть исполнение всех процедур и функций программы нам нужно использовать пошаговый режим с заходом в функции F7. Ещё можно обратить внимание на объявление массива строк. String это такой же тип как и integer поэтому мы вполне можем объявить массив типа String. Так же можно добавить проверку на корректность введённого дня и месяца.