- •Программирование на языке Паскаль в среде Turbo Pascal версии 6 и 7
- •Глава 7. Составные типы данных 29
- •Глава 8. Подпрограммы и функции 46
- •Глава 9. Файлы 50
- •Глава 10. Динамические переменные (списки) 58
- •Тип и функциональные возможности языка
- •Структура программы на Паскале
- •Алфавит языка
- •Правила написания имен
- •Структура блока описаний
- •Глава 2. Простые типы данных в языке Паскаль Понятие и классификация типов данных
- •Целочисленные типы
- •Вещественные типы
- •Логический тип
- •Символьный тип
- •Интервальный тип пользователя
- •Перечисляемый тип пользователя
- •Глава 3. Встроенные функции Понятие и классификация типов функций
- •Математические функции
- •Функции преобразования типов
- •Глава 4. Выражения Понятие и классификация типов выражений
- •Арифметические операции
- •Логические операции
- •Отношения
- •Битовые операции
- •Глава 5. Выполняемые операторы языка (для программ линейной структуры) Понятие и классификация
- •Классификация инструкций Паскаля
- •Оператор присваивания
- •Простейшие операторы ввода с клавиатуры
- •Простейшие операторы вывода на экран дисплея
- •Глава 6. Выполняемые управляющие операторы языка Простые управляющие операторы
- •Оператор безусловного перехода.
- •Оператор продолжения цикла.
- •Операторы ветвлений
- •Оператор условного перехода.
- •Неполный условный оператор.
- •Полный условный оператор.
- •Операторы циклов
- •Оператор арифметического цикла
- •Операторы итеративных циклов
- •Организация цикла с помощью условного перехода
- •Оператор итеративного цикла с предусловием
- •Оператор итеративного цикла с постусловием
- •Глава 7. Составные типы данных Классификация составных типов
- •Массивы Основные определения
- •Вывод массива
- •Примеры программ работы с массивами
- •Сортировки массива
- •Алгоритмы основных методов сортировок
- •Строки Строковые переменные
- •Стандартные (встроенные) процедуры работы со строками
- •Стандартные (встроенные) функции работы со строками
- •Структуры
- •Глава 8. Подпрограммы и функции Понятие подпрограмм в языке Паскаль.
- •Процедуры.
- •Описание и вызов функций
- •Параметры процедур и функций
- •Глава 9. Файлы Классификация внешних данных
- •Стандартные процедуры работы с файлами
- •Процедуры
- •Функции
- •Особенности работы с текстовыми файлами
- •Пример работы с текстовыми файлами.
- •Двоичные файлы (в машинных кодах) Типизированные файлы
- •Процедуры при работе с типизированными файлами
- •Функции при работе с типизированными файлами
- •Пример работы с типизированными файлами.
- •Файлы без типов
- •Процедуры, используемые при работе с нетипизированными файлами
- •Функции, используемые при работе с нетипизированными файлами.
- •Глава 10. Динамические переменные (списки) Понятие динамических переменных
- •Списочные данные
- •Односвязные списки
- •Двусвязные списки
- •Нульсвязные списки
- •Глава 11.Стандартный модуль работы с текстовым экраном Crt
- •2) Координаты экрана
- •3) Управление графическим режимом
- •4) Управление экраном и окном
- •5) Управление цветом
- •6) Вывод точек
- •7) Вывод линий
- •8) Вывод и закраска контуров
- •9) Окружности, эллипсы, дуги
- •10) Вывод текста
- •11) Последовательность работ при использовании графического режима
- •11) Пример программы приложения
Описание и вызов функций
Функция состоит из заголовка, раздела описаний и выполняемого блока. Описания должны находиться после других операторов описаний основной (вызывающей) программы, перед ее выполняемым блоком. В отличие от основной программы, заголовок функции обязателен, и имеет вид:
FUNCTION <имя функции>(<список аргументов>):<тип результата>;
Список аргументов это, по существу, список входных параметров.
Раздел описаний функции строится как раздел описаний основной программы, с учетом того, что все описанные переменные существуют только во время выполнения функции в виде локальных переменных и никак не связаны с переменными вызывающей программы.
Следует иметь в виду, что если во внешней программе переменная описана, а в функции – нет, ее использование в теле функции означает работу с переменной внешней программы (так называемые глобальные переменные).
Выполняемый блок (который должен быть заключен в скобки Begin .. End) заканчивается символом ";", а не точкой.
В функции, в отличие от процедуры, в выполняемом блоке имени функции обязательно должно быть присвоено значение, которое и будет являться ее значением. Такое присваивание может встречаться несколько раз, конечным значением будет результат последнего присваивания. Внутри выражений тела функции, ее имя встречаться не должно, если это не специальная рекурсивная функция.
Обращение к функции выполняется только внутри выражения, входящего в состав оператора, аналогично обращению к стандартным (встроенным) функциям Турбо-Паскаля.
Параметры процедур и функций
Все основные сложности процедур связаны с механизмом параметров. Рассмотрим правила составления списка параметров.
В список параметров включаются исходные данные для работы процедуры (входные параметры) и, если надо, указания, куда поместить результаты работы процедуры (выходные параметры). Параметры в операторе заголовка процедуры называются формальными, так как на самом деле работа будет производиться над фактическими параметрами, которые будут подставлены на место формальных при обращении к процедуре. Отсюда следует первое правило, что количество, порядок следования и типы формальных параметров должны соответствовать фактическим параметрам.
Существует два способа передачи данных через список параметров из вызывающей программы в процедуру. Первый способ заключается в том, что процедуре передается некоторое данное в виде его значения, например, если данное числового типа, передается само число. Второй способ заключается в том, что передается не значение данного, а адрес ячейки, где это данное находится (говорят, что передается имя переменной). Таким образом, параметры могут передаваться по значению и по имени. В каких случаях, какой способ следует использовать? Обычно входные параметры передаются в процедуру по значению, и каждому простому формальному параметру в этом случае может соответствовать в списке фактических параметров выражение того же типа, что и формальный параметр. Частным случаем выражения может быть константа или переменная. Если в качестве фактического параметра передается переменная, что бы с ней не делалось в процедуре, по окончании значение переменной в основной программе не изменится.
Если в процедуру требуется передать выходные параметры, т.е. имена тех переменных, которые должны измениться в программе в результате работы процедуры, такие параметры, очевидно, должны передаваться по имени. Фактические параметры, передаваемые по имени, не могут быть константами или выражениями, а только именами переменных простого или составного типа, файлов, или подпрограмм.
Есть некоторые особенности при передаче массивов в качестве фактических параметров. Даже если массив представляет собой входные данные и не меняется в процессе выполнения процедуры, его обычно передают по имени, так как это требует передачи только адреса начала массива, а не копии всего массива, как это потребовалось бы при передаче массива по значению. Кроме того, массив основной программы (фактический параметр) и массив в списке формальных параметров должны иметь один и тот же тип - т.е. должен использоваться один и тот же явный описатель.
Остановимся на правилах записи списка формальных и фактических параметров. Элементы списка фактических параметров отделяются друг от друга запятыми, формальные параметры записываются сложнее. Перед параметрами, передаваемыми по имени должно ставиться ключевое слово VAR, за параметром после двоеточия указывается тип, после каждого имени типа ставится символ ";". Если несколько подряд расположенных параметров имеют одинаковый тип (и способ передачи), их можно записать через запятую перед типом.
Примеры написания списков параметров:
...(A,B,C: real; VAR X1,X2:real; VAR N:integer); формальные параметры
...(0.762, Alfa, C[3]-1.2, X, Y, Num); соответствующие фактические параметры
Для передачи массива в процедуру:
TYPE
Vect = array[1..10] of real;
Mas5x8 = array[1..5,1..8] of integer;
. . .
VAR
C1,C2: Vect;
A: Mas5x8;
Metod: Integer;
. . .
{ описание процедуры }
PROCEDURE GetMatr(M:integer; Var X,Y:Vect; Var Z:Mas5x8;...);
VAR
A1,C1:integer;
. . .
Begin
{ Операторы тела процедуры }
. . .
End;
BEGIN
{Операторы основной программы }
. . .
GetMatr(0, C2, C1, A,...); { обращение к процедуре }
. . .
END.
Примеры описания процедур.
1. Описание процедуры, вычисляющей корни уравнения 2-го порядка
(вида Ax2 + Bx + C=0)
Procedure XX( A1,A2,A3:real; var X1,X2:real; var K:integer);
{
процедура вычисляющая корни уравнения aX + bX + C=0, и возвращающая
количество найденных вещественных корней и их значения
VGI, MIT
}
Var D:real;
Begin
if A1 = 0 then
if A2 = 0 then
K:=0
else
begin
X1:=-A3/A2;
K:=1;
end
else
begin
D:= sqr(A2)-4.0*A1*A3;
if D < 0 then
K:=0
else
begin
X1:=(-A2-sqrt(D))/2.0/A1;
X2:=(-A2+sqrt(D))/2.0/A1;
K:=2;
end;
end;
End;
2. Описание процедуры, вычисляющей среднеарифметические значения положительных и отрицательных элементов вещественного массива длиной N чисел.
Так как для формального параметра – имени массива необходимо указать тип, его следует описать до описания массива.
Type mas = array[1..1000] of real;
. . .
Procedure Sr_po(var A:mas; N:integer; var Srp,Sro:real);
{
процедуры, вычисляющей среднеарифметические значения положительных и
отрицательных элементов вещественного массива длиной N чисел.
VGI, MIT
}
Var
i,kp,ko: integer;
Sp,So : real;
Begin
So:=0;
Sp:=0;
kp:=0;
ko:=0;
for i:=1 to N do
if A[i]<0 then
begin
So:=So+A[i];
inc(ko);
end
else
begin
Sp:=Sp+A[i];
inc(kp);
end;
if ko>0 then
Sro:=So/ko
else
Sro:= +1; { признак отсутствия отрицательных чисел в массиве }
if kp>0 then
Srp:=Sp/kp
else
Sro:= -1; { признак отсутствия положительных чисел в массиве }
End.