
Процедуры
Структура процедуры имеет следующий вид:
Procedure <имя процедуры>{(формальные параметры : их тип)}; {Var (локальные переменные)} begin . . . end;
Процедура вызывается по имени:
<имя процедуры> {(фактические параметры)};
Процедура может быть с параметрами, а может быть без параметров.
Процедура-это поименованный составной оператор, где имя задается служебным словом Procedure.
Связь процедуры другими операторами программы осуществляется через переменные. Эти переменные используются как в программе, так и в процедуре, а описаны в самой программе. Такие переменные называются глобальными.
Глобальными переменными называются переменные, которые описаны в самой программе, а используются как в программе так и в процедуре (функции).
Глобальные переменные, которые не были инициализированы явным образом, перед началом выполнения программы обнуляются. Время жизни глобальных переменных - с начала программы и до ее завершения. Глобальные переменные доступны в любом месте программы или подпрограммы, кроме тех подпрограмм, в которых описаны локальные переменные с такими же именами.
Локальными переменными называются переменные, описанные внутри процедуры (функции) и используемые только внутри процедуры (функции).
Формальными параметрами называются переменные описанные в заголовке программы и используемые только внутри процедуры (функции).
Формальные параметры указывают, с какими параметрами следует обращаться к этой процедуре (функции), т.е. их количество, последовательность, тип. Они задаются в заголовке процедуры (функции) в виде списка параметров, разбитого на группы (секции) однотипных параметров, разделенных ‘;’. Порядок следования групп (секций) произвольный.
Для каждого формального параметра следует указать имя и тип. Имена параметров могут быть любыми, они могут совпадать с глобальными именами программы. Необходимо лишь помнить, что в этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Но формальные имена не могут совпадать с локальными переменными, т.к. они располагаются в одном стековом сегменте памяти. Тип формального параметра может быть практически любым, однако в заголовке процедуры (функции) нельзя вводить новый тип.
Рассмотрим пример: необходимо создать 3 массива случайных чисел, создать массив суммы всех элементов и организовать вывод всех массивов в виде таблицы.
Если писать эту программу не используя процедуры, то код программы будет выглядеть следующим образом (комментариями код не сопровождается, потому что все элементы рассматривались ранее):
var a1: array [1..10] of integer;
a2: array [1..10] of integer;
a3: array [1..10] of integer;
Asum: array [1..10] of integer;
i: integer;
begin
for i:= 1 to 10 do begin
a1[i]:=random(10);
a2[i]:=random(10);
a3[i]:=random(10);
end;
writeln ('1 massiv');
writeln ('_____________________');
writeln ('| i | a[i] |');
for i:=0 to 9 do
writeln ('| ',i:3, ' | ', a1[i]:4, ' |');
writeln('______________________');
writeln ('2 massiv');
writeln ('_____________________');
writeln ('| i | a[i] |');
for i:=0 to 9 do
writeln ('| ',i:3, ' | ', a2[i]:4, ' |');
writeln('______________________');
writeln ('3 massiv');
writeln ('_____________________');
writeln ('| i | a[i] |');
for i:=0 to 9 do
writeln ('| ',i:3, ' | ', a3[i]:4, ' |');
writeln('______________________');
for i:= 1 to 10 do Asum[i]:=a1[i]+a2[i]+a3[i];
writeln('summarnii massiv');
writeln ('_____________________');
writeln ('| i | a[i] |');
for i:=0 to 9 do
writeln ('| ',i:3, ' | ', Asum[i]:4, ' |');
writeln('______________________');
readln();
end.
Код получился большим и громоздким, в придачу при выводе массивов в виде таблицы, оформление придется корректировать в каждом массиве отдельно, что приведет к большим временным затратам. Видно, что процесс вывод массива повторяется для всех массивов. Введем процедуру, которая будет выводить массив на экран в виде таблицы.
Блок-схема для этой программы:
var a1: array [1..10] of integer;
a2: array [1..10] of integer;
a3: array [1..10] of integer;
Asum: array [1..10] of integer;
i: integer;
procedure print (var x: array of integer); {название процедуры и формальный элемент, на который будет ссылаться основная программа}
var i:integer; {локальная переменная, которая используется только в процедуре}
begin
writeln ('_____________________');
writeln ('| i | a[i] |');
for i:=0 to 9 do
writeln ('| ',i:3, ' | ', x[i]:4, ' |');
writeln('______________________');
end;
begin
for i:= 1 to 10 do begin
a1[i]:=random(10);
a2[i]:=random(10);
a3[i]:=random(10);
end;
writeln ('1 massiv'); print(a1); {вызов процедуры}
writeln ('2 massiv'); print(a2);
writeln ('3 massiv'); print(a3);
for i:= 1 to 10 do Asum[i]:=a1[i]+a2[i]+a3[i];
writeln('summarnii massiv'); print(Asum);
readln();
end.
Видно, что количество строк в коде уменьшилось, и правка кода стала значительно легче. Теперь в основной программе можно создавать сколь угодно много массивов целых чисел и каждый можно будет выводить на экран в виде таблицы, используя лишь одну строчку кода.
ФУНКЦИИ
Иногда функций, которые заложены в среде Turbo Pascal не хватает для выполнения сложных математических задач, в таких случаях можно написать собственную функцию.
Функция, в отличии от процедуры, возвращает в вызывающую программу значение, т.е. результат ее работы. Это значение можно:
присвоить переменной
использовать в выражении
передать в качестве параметра в процедуру или функцию.
Из этого следуют отличия в структуре функции, т.е. надо знать тип возвращаемого функцией результата и должен быть указан механизм возвращения этого результата.
Структура функции имеет следующий вид:
Function <имя функции>{(формальные параметры : их тип)}: <тип функции>; {Var (локальные переменные)} begin . . .
<имя функции>: =<выражение> end;
Где:
Тип функции – простой порядковый тип, исключение - тип string. Если тип не стандартный, то его надо предварительно описать в разделе Type программы.
<имя функции>: =<выражение> - оператор, который осуществляет механизм возврата значения.
В остальном структура функции полностью повторяет структуру процедуры. Она так же может быть с параметрами, а может быть без параметров.
Функция -это поименованный составной оператор, возвращающий единственное значение, имя которой задается служебным словом Function.
Рассмотрим пример использования функции: посчитать сумму факториалов чисел, введенных с клавиатуры. Из условия задачи видно, что целесообразно написать функцию вычисления факториала числа. Блок-схема алгоритма:
Код будет выглядеть следующим образом:
var a:array[1..100] of integer;
i,n:integer;
sum:longint;
function fact(x:integer):longint; {название процедуры, описание формальных переменных и тип, который примет функция}
var i,f:integer; {описание локальных переменных}
begin
f:=1;
for i:=1 to x do
f:=f*i;
fact:=f; {присвоение значения, которое примет функция}
end;
begin
sum:=0;
writeln('Vvedite 4islo elementov');
readln(n);
for i:=1 to n do
begin writeln('vvedite ', i, '-oe 4islo');
readln(a[i]);
end;
for i :=1 to n do sum:=sum+fact(a[i]); {вызов функции из основной программы}
write('factorial summi 4isel ');
for i := 1 to n do
write(a[i], ' ' );
writeln(' raven ', sum);
readln;
end.
Модуль CRT
В этом модуле сосредоточены процедуры и функции, обеспечивающие управление текстовым режимом работы экрана. С помощью модуля, можно перемещать курсор в произвольную позицию экрана, менять цвет выводимых символов и окружающего фона, создавать окна.
Стандартные процедуры и функции управления текстовым экраном:
Процедура TEXTCOLOR(цвет)- устанавливает цвет для выводимых символов.
Процедура TEXTBACKGROUND(цвет)- устанавливает цвет фона на который выводятся символы.
Процедура GOTOXY(X,Y)- выводит курсор в требуемое положение на экране
X – горизонтальная координата;
Y - вертикальная координата.
Процедура WINDOW(x1,y1,x2,y2) – устанавливает границы активного окна для вывода данных.
x1,y1 – координаты верхнего левого угла окна;
x2,y2 - координаты нижнего правого угла окна.
Процедура CLRSCR – очищает экран или активное окно.
Пример:
Вывести 10 значений y=sin(x) начав с х=0 с шагом dx= 0.15 в таблице в центре экрана.
Переменные:
y- функция тип real;
x – аргумент тип real;
dx – шаг аргумента тип real;
i,kn- параметры цикла тип integer.
Пишем код программы, используя блок-схему: пояснений мы решили приводить не для каждой строки, т.к., в процессе изучения TP, вы уже усвоили основные моменты в написании программного кода.
uses crt; используем модуль СRT
var x,dx,y:real; описываем переменные, которые будут использованы
i,kn:integer;
begin
clrscr; используем функцию для очистки экрана
writeln('vv.kn,x,dx');
readln(kn,x,dx);
gotoxy(33,6); используем эту процедуру для вывода курсора на экран в центре
writeln('--------------');
gotoxy(33,7);
writeln('| x | y |');
gotoxy(33,8);
writeln('--------------');
for i:=1 to kn do
begin
y:=sin(x);
gotoxy(33,i+);writeln('|',x:4:2,'|',y:7:4,'|');
x:=x+dx; табулируем функцию
end;
gotoxy(33,i+);
writeln('--------------');
readln;
end.
Примечание: рисунок
Модуль GRAPH
Графические возможности языка Турбо-Паскаля реализованы с помощью ряда графических подпрограмм (их более 50), содержащихся в модуле Graph (файл GRAPH.TPU). Кроме того, существует ряд графических драйверов, обеспечивающих работу программы с тем или иным видеоадаптером. Для реализации графических драйверов (BGI-файлов) выделяется некоторый небольшой набор базовых графических операций и именно эти операции “привязываются” к конкретному драйверу устройства. Для каждого драйвера обеспечивается стандартный интерфейс, а все остальные операции реализуются библиотечными подпрограмммами на основе набора базовых операций. Таким образом удается обеспечить почти полную независимость программ от типа установленного видеоадаптера.
Для работы в графическом режиме программа должна выполнить его инициализацию. Инициализация графического режима выполняется с помощью вызова библиотечной процедуры InitGraph(var GraphDriver, GraphMode :integer; PathToDriver : string), которая отыскивает на диске указанный в вызове драйвер, загружает его в память и подготавливает экран к работе в графическом режиме.