- •Конспект лекций
- •1.4 Общая структура программы
- •1.5 Стандартные процедуры и функции
- •1.6 Процедуры ввода/вывода
- •2. Простые типы данных
- •2.1 Целые типы
- •2.2 Вещественные типы
- •2.3 Cимвольный тип данных
- •2.4 Логический тип данных.
- •2.5 Ограниченные типы
- •2.6 Перечислимые типы
- •2.7 Описание типов
- •2.8 Преобразование типов
- •2.9 Порядок вычисления выражений
- •3. Операторы языка Паскаль
- •3.1 Оператор присваивания
- •3.2 Составной оператор
- •3.3 Условный оператор
- •3.4 Оператор выбора case
- •3.5 Оператор цикла с параметром (цикл for)
- •3.6 Оператор цикла с предусловием (цикл while)
- •1 Вариант:
- •2 Вариант:
- •3 Вариант:
- •3.7 Оператор цикла с постусловием (цикл repeat)
- •3.8 Вложенные циклы
- •3.9 Оператор перехода goto
- •4. Массивы
- •4.2 Сортировка элементов массива
- •4.3 Многомерные массивы
- •5. Подпрограммы (процедуры и функции)
- •5.1 Процедуры
- •5.2 Функции
- •5.3 Области действия имен
- •5.4 Параметры процедур и функций
- •5.5 Побочные эффекты при использовании подпрограмм
- •5.6 Передача массивов в подпрограммы
- •5.7 Параметры-костанты
- •5.8 Массивы открытого типа
- •5.9 Рекурсия в подпрограммах
- •6. Строковый тип данных
- •6.1 Описание строк
- •6.2 Операции со строками
- •6.3 Процедуры и функции для работы со строками
- •7. Стандартные модули Турбо-Паскаля
- •7.1 Модули турбо3 и graph3
- •7.2 Модуль overlay
- •7.3 Модуль dos
- •7.4 Модуль system
- •7.5 Модуль printer
- •7.6 Модуль crt
- •7.7 Модуль graph
- •8. Записи
- •8.1 Определение записи
- •8.2 Оператор над записями
- •8.3 Вложенные записи
- •8.4 Массив записей
- •8.5 Записи с вариантами
- •9. Файлы
- •9.1 Определение файла
- •9.2 Процедуры и функции для работы с файлами
- •9.3 Нетипизированные файлы
- •10. Интегрированная среда Турбо Паскаля
- •10.1 Как начать работу с Турбо Паскалем
- •10.2 Ваша первая программа
5.5 Побочные эффекты при использовании подпрограмм
Побочные эффекты возникают, когда изменение переменных в подпрограмме приводит к их нежелательным изменениям в основной программе
Пример: программа с побочным эффектом
var s,p: integer;
procedure Sum(n: integer, var f: integer);
var i: integer;
begin
s
~
for i:=1 to n do s:=s+i;
f:=s;
end;
begin
s:=2;
sum(3,p);
writeln(s,p); 6 6
end.
Процедура изменяет значение глобальной переменной S (!). Надо добавить в нее описание локальной S:
procedure Sum(n: integer, var f: integer);
var i: integer;
s: integer;
begin
…
5.6 Передача массивов в подпрограммы
Типом формального параметра подпрограммы может быть стандартный или заранее определенный тип, заданный в виде идентификатора (!). Поэтому описание процедуры следующего вида является недопустимым:
procedure S(a: array [1..10] of real);
В связи с этим, если в качестве параметра необходимо использовать массив, то делается предварительное описание типа массива:
type mas=array [1..10] of real;
…
procedure s(a: mas);
begin
…
end;
var b: mas;
c: array [1..10] of real;
begin
S(b);
S(c); - нельзя!
…
Массив может передаваться как параметр-значение, и как параметр-переменная. Если параметр массив описан со словом var, то изменение массива в подпрограмме приводит к изменению соответствующего массива в основной программе.
Пример:
type mas=array [1..10] of integer;
var c,d: mas;
i: integer;
procedure S(a: mas, var b: mas);
var i: integer;
begin
for i:=1 to 10 do
begin
a[i]:=a[i]*5;
b[i]:=b[i]*5;
end;
end;
begin
for i:=1 to 10 do
begin
c[i]:=1;
d[i]:=1;
end;
s(c,d);
for i:=1 to 10 do write (c[i]:3); 1 1 1 1 1 1 …
writeln;
for i:=1 to 10 do write (d[i]:3); 5 5 5 5 5 5 …
end.
Следующие три пункта 5.7, 5.8 и 5.9 являются необязательными для изучения, хотя рассмотренный в них материал достаточно широко используется в программировании.
5.7 Параметры-костанты
В Турбо-Паскаль 7.0 существует еще один вид параметров – параметры-константы.
(const имя: тип)
В этом случае в подпрограмму передается адрес фактического параметра, но он защищен от изменений.
Чаще всего используется для передачи в подпрограмму массивов, которые не должны изменяться. В этом случае нельзя использовать параметр-переменную, а использование параметра-значения не эффективно, т.к. на копию массива требуется много памяти и может быть переполнение стека.
type mas=array [1..10] of real;
var a: mas;
function Summa (const x:mas): integer;
var s,i: integer;
begin
s:=0;
for i:=1 to 10 do s:=s+x[i];
summa:=s;
end;
begin
randomize;
for i:=1 to 10 do a[i]:=random(20);
writeln(‘сумма элементов массива: ’,summa(a));
end.
5.8 Массивы открытого типа
В Турбо-Паскаль 7.0 в качестве параметров-переменных можно использовать массивы открытого типа, у которых не задаются размеры. В этом случае подпрограмма может обрабатывать массив любого размера. Фактический размер массива может быть определен с помощью функции High. При описании не указывается тип индекса массива. Индексация элементов открытого массива всегда от 0 до значения функции High ( 0..high(x) , где x – имя массива).
function Summa (var x: array of real): real;
var i: integer;
s: real;
begin
s:=0;
for i:=1 to high(x) do s:=s+x[i];
summa:=s;
end;