Сегодня перед вами откроется страшная тайна.... всё это время мы вас беспощадно обманывали !!!!!!!!!
:)
На самом деле всё не так плохо, просто решили, что не стоит сначала загружать народ не понятными терминами. Сегодня всё встанет на свои законные места.
Помните функцию 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. Так же можно добавить проверку на корректность введённого дня и месяца.

