Процедуры и функции.
Работа с файлами.
Как уже говорилось выше в пособии рассматривается работа только с текстовыми файлами. Для организации текстового файла прежде всего необходимо в разделе описаний объявить соответствующую файловую переменную оператором:
VAR имя файловой переменной: TEXT;
Далее в программе надо осуществить связывание файловой переменной с именем файла на диске процедурой ASSIGN:
ASSIGN (имя файловой переменной, имя файла на диске);
Далее файл необходимо открыть одной из следующих процедур:
REWRITE(имя файловой переменной);
RESET(имя файловой переменной);
APPEND(имя файловой переменной);
Процедура REWRITE открывает файл для чтения из него данных, RESET – для записи данных в файл, APPEND для дозаписи данных в файл.
Для обработки текстовых файлов используются процедура READ, READLN и WRITE, WRITELN, обеспечивающие соответственно чтение и запись величин в текстовый файл. Общий формат этих процедур при работе с текстовым файлом:
READ(имя файловой переменной; переменная1, переменная2,…переменнаяN);
WRITE(имя файловой переменной; переменная1, переменная2,…переменнаяN);
Процедура READ обеспечивает ввод данных общим потоком из одной строки, а READLN приводит к обязательному переходу к следующей строке текстового файла. Все вышесказанное в равной мере относится и к операциям записи с помощью процедур WRITE и WRITELN.
После работы с файлом его необходимо закрыть командой:
CLOSE(имя файловой переменной);
В Паскале для обработки признака конце файла используется логическая функция EOF, аргументом которой является имя файловой переменной и которая принимает значение истина тогда, когда достигнут конец файла.
Созданный файл с данными можно открыть в какой-либо программе, например в Excel, и работать там с ним.
Пример 14. Программа расчета функции y=sin(2x)/x и вывода значений х и y в файл REZULT.DAT на диске D: и на экран монитора.
PROGRAM RASCHET;
USES CRT;
VAR I:INTEGER;
Y,X:REAL;
FF:TEXT;
BEGIN
{установка связи файловой переменной FF с дисковым именем файла REZULT.DAT}
ASSIGN(FF,'D:\REZULT.DAT');
{открытие файла для записи в него данных}
REWRITE(FF);
CLRSCR;
X:=0.3;
FOR I:=1 TO 20 DO BEGIN
Y:=SIN(2*X)/X;
{вывод результатов в файл}
WRITELN(FF,' ',X:4:2,Y:8:3);
{вывод результатов на экран}
WRITE(' ',X:4:2,' ',Y:6:2);
X:=X+0.05;
END;
{закрытие файла}
CLOSE (FF);
END.
Подпрограммой называется именованная логически законченная группа операторов языка программирования, которую можно вызвать по имени для выполнения любое количество раз из различных мест программы. В Паскале для организации подпрограмм используются процедуры и функции.
Процедура – это независимая поименованная часть программы, предназначенная для выполнения определенных действий. Она состоит из заголовка и тела. Процедуру вызывается оператором вызова процедуры (см. Простые операторы), после выполнения процедуры, программы продолжает работу с оператора, следующего непосредственно за оператором вызова процедуры. Имя процедуры не может входит в выражения в качестве операнда.
Функцияаналогична процедуре, но она передает в точку вызова скалярное значение (результат своей работы) и имя функции может входит в выражение как операнд.
Процедуры и функции могут быть встроенными (или стандартными), т.е. являющимися частью языка, и пользовательскими, т.е. организованные самим программистом.
Наиболее часто используемые арифметические встроенные функции:
ABS(X) – вычисление абсолютной величины Х;
ARСTAN(X) – вычисление угла, тангенс которого равен Х, значение угла представляется в радианах;
COS(X) – вычисление косинуса Х, параметр задает значение угла в радианах;
SIN(X) - вычисление косинуса Х, параметр задает значение угла в радианах;
EXP(X) – вычисления значения еХ;
INT(X) – вычисление целой части Х;
LN(X) – вычисление натурального логарифма Х;
SQR(X) – возведение значения Х в квадрат;
SQRT(X) – извлечение квадратного корня из Х;
PI – функция возвращает значение числа p;
RANDOM(N) – генерирует значение случайного числа в диапазоне от 0 до N, тип результата целочисленный;
RANDOM – генерирует значение случайного числа в диапазоне от 0 до 0,99, тип результата вещественный.
При необходимости вычисления других тригонометрических функций пользуются формулами:
tg(x)=sin(x)/cos(x); ctg(x)=cos(x)/sin(x);
lg(x)»0,43429ln(x); ;
;
.
В Паскале нет функции возведения в степень, поэтому для вычисления ZX необходимо записать EXP(X*LN(Z)), причем число Z должно быть больше нуля.
Встроенные процедуры ввода-вывода (WRITE, WRITELN, READ, READLN) были рассмотрены ранее.
Функция, определенная пользователем, состоит из заголовка и тела функции и имеет формат:
FUNCTION имя функции[(формальные параметры)]:тип результата;
Разделы описаний
BEGIN
Раздел операторов
END;
Тип результата – тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе. В разделе операторов должен находится по крайней мере один оператор, присваивающий идентификатору функции значение.
Обращение к функции осуществляется по имени с указанием списка аргументов. Каждый аргумент должен соответствовать формальным параметрам, указанным в заголовке функции, и иметь тот же тип. Формат обращения к функции:
имя функции [(фактические параметры)];
Процедуры пользователя.Описание такой процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова PROCEDURE, имени процедуры и необязательного заключенного в круглые скобки списка формальных параметров с указанием типа каждого параметра. Имя процедуры – идентификатор, уникальный в пределах программы, тело процедуры – локальный блок по структуре аналогичный программе на Паскале. Формат записи процедуры:
PROCEDURE имя процедуры[(формальные параметры)];
Разделы описаний
BEGIN
Раздел операторов
END;
Для обращения к процедуре используется оператор вызова процедуры:
имя процедуры[(фактические параметры)];
Список фактических параметров заключается в круглые скобки, параметры отделяются друг от друга запятыми. Список параметров может отсутствовать, если процедуре не передается никаких значений. Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в заголовке описания процедуры устанавливается взаимно-однозначное соответствие: количество и тип формальных параметров равны количеству и типу фактических параметров.
Если процедура возвращает в программу какие-либо значения, то соответствующие переменные должны быть описаны в разделе описаний переменных. [10, 11]
Пример 15. Программы нахождения факториала:
а) с использованием функции.
PROGRAM FAKT1;
USES CRT;
VAR N,M,F1,F2: integer;
FUNCTION F(K: integer): integer;
VAR FAKT,I : integer;
BEGIN
FAKT:=1
FOR I:=1 TO K DO FAKT:=FAKT*I;
F:=FAKT;
END;
BEGIN {основная программа}
CLRSCR;
READ (N,M);
F1:=F(N); F2:=F(M); {обращение к функции}
WRITELN(‘ ‘,N:3,’!=’,F1:7);
WRITELN(‘ ‘,N:3,’!=’,F2:7);
END.
б) с использованием рекурсивной функции.
PROGRAM FAKT3;
USES CRT;
VAR N: integer;
FUNTION FACT(I: integer):longint;
BEGIN
IF I=1 THEN FACT:=1
ELSE FACT:=I*FACT(I-1)
END;
BEGIN {основная программа}
CLRSCR;
READ (N);
F1:=FACT(N); {обращение к функции}
WRITELN(‘ ‘,N:3,’!=’,F1:7);
END.
в) с использованием процедуры.
PROGRAM FAKT2;
USES CRT;
VAR N,M: integer;
PROCEDURE F(K: integer);
VAR FAKT,I : integer;
BEGIN
FAKT:=1
FOR I:=1 TO K DO FAKT:=FAKT*I;
WRITELN(‘ ‘,K:3,’!=’,FAKT:7);
END;
BEGIN {основная программа}
CLRSCR;
READ (N,M);
F(N); F(M); {обращение к процедуре}
END.