Воробьева А.П., Соппа М.С. - Система программирования Турбо Паскаль 7.0 (1092189), страница 12
Текст из файла (страница 12)
Program P2;
Var
x: integer;
Procedure Z (var y: integer);
begin
y := 1;
end;
Begin
x := 0;
Z(x);
writeln (‘x=’, x);
End.
В данной процедуре Z формальный параметр y является параметром-переменной, поэтому его значение после выполнения процедуры присваивается фактическому параметру x. На экран будет выведено: x = 1.
8.3. Функции
Функция отличается от процедуры тем, что результат ее работы возвращается в основную программу в виде значения функции. Поэтому для функции необходимо указать тип результата, а в теле функции должен присутствовать оператор присваивания, в левой части которого записывается имя функции.
Общий вид описания функции
Обращение к функции
Поскольку результат выполнения функции возвращается в основную программу через имя функции, то обращение к функции можно записать, аналогично стандартным функциям, в виде операнда в выражении:
При вычислении выражения операнд обращения к функции заменяется значением функции.
Связь формальных параметров с фактическими параметрами осуществляется по тем же правилам, что и в процедуре. Разница заключается лишь в том, что имени функции может быть присвоено только одно значение. Если в функции вычисляются несколько выходных переменных, то они могут возвращаться в основную программу через списки параметров.
Для функции, аналогично процедуре, справедливы понятия глобальных и локальных переменных.
Пример программы с функцией
Решить предыдущую задачу (см. параграф 8.2) с использованием функции.
Program Primer_2;
Var
a, Z: real;
Function ST (x: real; n: integer): real;
var
i: integer;
P: real;
begin
P := 1;
for i := 1 to n do P := P x;
ST := P;
end;
Begin {начало основной программы}
writeln(‘Введите число а’);
read(a);
Z := (ST(a, 5) + ST(1/a, 5)) / (2 ST(a, 7));
writeln(‘Z=’, Z:6:2);
End.
В данной программе обращение к функции осуществляется с помощью трех операндов, записанных в выражении для вычисления Z.
8.4. Параметры-массивы
Раздел типов
Если мы хотим передать в подпрограмму отдельный элемент
массива, то в качестве соответствующего ему формального параметра указывается переменная того же типа.
Проблемы возникают, если в подпрограмму необходимо передать весь массив, так как структурный тип массива нельзя указывать в списке формальных параметров. В этом случае тип массива объявляется заранее с помощью раздела TYPE. Например, определим имена типов для вектора и матрицы
.
Type
Vect = array[1..10] of real;
Matr = array[1..5,1..8] of real;
В дальнейшем имена типов Vect и Matr можно использовать в разделе описания переменных, например:
Var
X: Vect;
A: Matr;
Объявленные типы указываются также в списке формальных параметров, например:
Function (X: Vect; A: Matr): real;
Если по условию задачи в подпрограмме требуется при разных обращениях обрабатывать массивы с разными размерами, то в разделе TYPE объявляется тип массива с наибольшим размером. Например, при передаче в подпрограмму массивов и
в разделе TYPE надо записать:
Type
Vect = array[1..15] of real;
Тогда по описанию
Var
X, Y: Vect;
в памяти компьютера выделяется максимальная область из 15 ячеек для каждого массива. При обработке массива с меньшим размером, часть выделенной памяти остается неиспользованной. В обращнии к подпрограмме в этом случае необходимо указать размер массива.
Примеры программирования задач с использованием подпрограмм
В приведенных ниже примерах для каждой задачи составим два варианта программы: с использованием процедуры и с использованием функции. На практике выбор того или иного варианта зависит от опыта программиста.
Задача 1
максимальные компоненты векторов
и
соответственно;
средние значения компонент векторов
и
соответственно.
Вариант 1. Использование процедуры.
Program P1_P;
Type
Vect = array[1..20) of real;
Var
X, Y: Vect;
i: integer;
Dx, Dy, D: real;
Procedure Mod_Otkl (A: Vect; n: integer; var Da: real);
var
ma, sa: real;
i: integer;
begin
ma := -1E6;
sa := 0;
for i := 1 to n do
begin
if a[i]>ma then ma := a[i];
sa := sa + a[i];
end;
sa := sa/n;
Da := abs(ma - sa);
end;
Begin {начало основной программы}
writeln(‘Введите массив X’);
for i :=1 to 8 do read(x[i]);
writeln(‘Введите массив Y’);
for i := 1 to 20 do read(y[i]);
Mod_Otkl(X, 8, Dx);
Mod_Otkl(Y, 20, Dy);
D := Dx / Dy;
writeln(‘D=’, D:6:2);
End.
Вариант 2. Использование функции.
Program P1_F;
Type
Vect = array[1..20) of real;
Var
X, Y: Vect;
i: integer;
Dx, Dy, D:real;
Function Mod_Otkl (A: Vect; n: integer): real;
var
ma, sa, Da: real;
i: integer;
begin
ma := -1E6;
sa:=0;
for i :=1 to n do
begin
if a[i]>ma then ma := a[i];
sa := sa +a i];
end;
sa := sa / n;
Da := abs(ma - sa);
Mod_Otkl := Da;
end;
Begin {начало основной программы}
writeln(‘Введите массив X’);
for i := 1 to 8 do read(x[i]);
writeln(‘Введите массив Y’);
for i := 1 to 20 do read(y[i]);
Dx := Mod_Otkl(X, 8);
Dy := Mod_Otkl(Y, 20);
D := Dx / Dy;
writeln(‘D=’, D:6:2);
End.
Задача 2
Даны две матрицы:
где и
- количество положительных элементов в матрице A и B соответственно.
Вариант 1. Использование процедуры.
Program P2_P;
Type
Matr = array[1..5, 1..7) of real;
Var
A, B: Matr;
i, j, KA, KB, C: integer;
Procedure CP(D: Matr; m, n: integer; Var KD: integer);
var
i, j: integer;
begin
KD := 0;
for i := 1 to m do
for j := 1 to n do
if d[i,j]>0 then KD := KD + 1;
end;
Begin {начало основной программы}
writeln(‘Введите матрицу A’);
for i := 1 to 5 do
for j := 1 to 6 do read(a[i,j]);
writeln(‘Введите матрицу В’);
for i := 1 to 4 do
for j := 1 to 7 do read(b[i,j]);
CP(A, 5, 6, KA);
CP(B, 4, 7, KB);
C := KA - KB;
writeln(‘C=’, C:6:2);
End.
Вариант 2. Использование функции.
Program P2_F;
Type
Matr = array[1..5, 1..7) of real;
Var
A, B: Matr;
i, j, C: integer;
Function CP(D: Matr; m, n: integer): integer;
var
i, j, KD: integer;
begin
KD := 0;
for i := 1 to m do
for j := 1 to n do
if d[i,j]>0 then KD := KD + 1;
CP := KD;
end;
Begin {начало основной программы}
writeln(‘Введите матрицу A’);
for i := 1 to 5 do
for j := 1 to 6 do read(a[i,j]);
writeln(‘Введите матрицу В’);
for i := 1 to 4 do
for j := 1 to 7 do read(b[i,j]);
C := CP(A, 5, 6) - CP(B, 4, 7);
writeln(‘C=’, C);
End.
ГЛАВА 9. Текстовые данные
В Турбо Паскале текстовая информация может быть представлена двумя типами данных: символьный (CHAR) и строковый (STRING).
9.1. Символьный тип данных
Значением данных символьного типа является любой символ из множества набора всех символов компьютера. Каждому символу соответствует порядковый номер (код) в диапазоне 0..255. Для кодировки символов первой половины диапазона (0..127) используется код ASCII(американский стандартный код для обмена информацией). Вторая половина символов с кодами 128..255 может быть различной. Для компьютеров фирмы IBM наиболее распространен альтернативный вариант кодировки символов.
При написании программ символьные данные могут быть представлены либо константами, либо переменными.
Символьная константа представляет собой одиночный символ, заключенный в апострофы, например:
Символьная переменная объявляется в разделе описания переменных:
Var
cr: char;
Во внутренней памяти компьютера каждый символ занимает 1 байт.
Ввод-вывод символьных данных
Для ввода символьных данных используется оператор READLN. Необходимо помнить, что нажатие любой небуквенной клавиши (<пробел>, <Enter> и др.) будет значимым и восприниматься как символ.
Пример 1. Организовать ввод переменных:
a = ‘i’; b = ‘_’; c = ‘j’.
Var
a, b, c: char;
Begin
writeln(‘Введите исходные данные’);
readln(a,b,c);
………….
На клавиатуре символы набираются без апострофов:
i _ j <Enter>
Символ клавиши <Enter> выходит за пределы списка оператора READLN, поэтому он игнорируется.
Для вывода символьных данных используются операторы WRITE и WRITELN.
Пример 2. Организовать вывод указанных выше переменных на экран.
write(a,b,c);
writeln;
На экране будет отображено:
i _ j
Оператор WRITELN без списка используется для первода курсора к началу следующей строки.
Обработка символьных данных
Поскольку символы в Турбо Паскале упорядочены, к ним можно применять операции отношения (>, >=, <, <=, =, <>). Это дает возможность записывать логические выражения с символьными данными в условных операторах, например:
if ch =’!’ then ch := ‘.’;
Символьные данные могут использоваться и в операторе цикла FOR. Например, при выполнении операторов:
for ch := ‘a’ to ‘d’ write(ch);
writeln;
на экран выводится последовательность:
abcd
Курсор переводится к началу следующей строки.
Библиотека Турбо Паскаля содержит стандартные функции обработки символьных данных. Рассмотрим наиболее распространенные стандартные функции.
ORD(ch) – функция, возвращающая код символа ch.
Пример. Ord(‘a’) = 97.
CHR(N) – функция, преобразующая код N в соответствующий ему символ.
Пример. Chr(97) = ‘a’.
UPCASE(ch) – функция, преобразующая строчную латинскую букву в прописную.
Пример. UpCase(‘a’) = ‘A’.
-
Строковый тип данных
Значением данных строкового типа является любая последовательность символов из набора символов компьютера(строка).
Строковая константа – это строка, заключенная в апострофы, например:
‘Турбо Паскаль 7.0’