
Циклы на языке Паскаль
Существует три типа циклов:
1) repeat-until – цикл с постусловием (repeat – повторять, until – до тех пор пока). Между словами repeat и until находится тело цикла, состоящие из произвольного количества операций. После until записывается УВИЦ, цикл выполняется, пока условие ложно.
Пример: Найти сумму N чисел
i:=0;
repeat
readln(x);
s:=s+x:
i:=i+1;
until i >= N
2)While – do – цикл с предусловием. Имеет формат: While <условие> do. Цикл выполняется, пока условие истинно. После do может идти только один оператор. Если их несколько, используются операторные скобки (begin … end).
Пример: Найти сумму N чисел
i:=0;
while i<N do
begin
readln(x);
s:=s+x:
i:=i+0.1;
end.
3) for – do – реализует цикл с предусловием при заранее известном количестве итераций. Является аналогом блоков циклов в блок схемах, но имеет более жесткие ограничения:
не поддерживает шаг кроме +1, -1.
Начальное и конечное значение счетчика могут быть только целые.
Счетчик может быть только целой переменной.
for – do имеет формат:
for <Имя счетчика> := <начальное значение счетчика> to <конечное значение счетчика> do <оператор>;
Пример:
for i:=1 to N do
s:=s+x[i];
Правило работы с циклом см. в главе блоки циклов.
Пример: Найти сумму N чисел
For i:=1 to N do
begin
read (x);
s:=s+x;
end;
Для создания цикла с шагом -1 вместо to пишется downto
For i:=N downto 1 do
Массивы.
Массив – сложная структура данных, состоящая из фиксированного количества элементов, имеющих одинаковый тип и упорядоченных по номерам.
Элементами массива могут быть данные любого типа, в том числе и массивы.
Массив определяется именем и количеством размерностей.
В качестве индексов могут использоваться константы, переменные и выражения целых типов.
Одномерные массивы.
Массивы бывают двух видов:
Статические – размер устанавливается при его описании и не может изменяться в ходе программы.
Динамические – размер устанавливается в ходе программы и может свободно изменяться.
Начальный индекс в статических массивах может быть производным.
У динамических он всегда равен 0.
Работа со статическими массивами
Описание: type <имя_типа> = Array [<начальн. инд.>..<кон. инд.>]
of <тип элементов>;
var <имена массивов> : <имя_типа>;
Пример: type Mas = [1..100] of real;
var M1, M2: Mas;
Существует сокращенная форма объявления:
var <имена массивов> : Array [<начальн. инд.>..<кон. инд.>]
of <тип элементов>;
Использовать сокращённое объявление мас сива не рекомендуется. Это связано с тем, что Pascal два массива, описанные таким образом:
var M1: array [1..100] of real;
var M2: array [1..100] of real;
Считаются разнотипными.
Это делает невозможным использование массивов в качестве параметров процедур и функций.
Использование массивов
Однотипные массивы могут присваиваться друг другу целиком:
var M1, M2: Mas;
begin …
M1:=M2;
В выражениях массивы целиком участвовать не могут, кроме операций сравнения, =, >, <.
Массивы считаются равными, если равны все их элементы.
Элементы массива могут использоваться как обычные переменные данного типа, т. е. к ним могут применяться все операции допустимые для переменных этого типа.
Динамические массивы
При работе с динамическими массивами, выделяют два этапа их описания:
объявление – выполняется перед началом работы программы.
установка размеров – после начала программы.
1. Type <имя_типа>=array of <тип_элем.>;
Var <имена_массивов>:<имя типа>;
2. Выполняется при помощи процедуры SetLength(<имя_массива>,<размер_массива>)
<размер_массива> - количество элементов в нём, индекс начального элемента 0.
Установка размеров может выполняться произвольное количество раз в ходе программы.
Динамические массивы и их элементы используются так же, как и статические.
Пример: ввести в массив N чисел и вывести их сумму:
….
Type AA=array of real;
Var A:AA;
N,i:integer;
S:real;
Begin
Write(‘Введите N:’);
Readln(N);
SetLength(A,N); S:=0;
For i:=0 to N-1 do
Begin write(‘Введите число:’);
Readln(A[i]);
S:=S+A([i]);
S:=S+A[i];
End;
Write(‘Сумма=’,S);
End.
Двумерные массивы
Статические массивы:
Объявление: type<имя_типа>=array[<нач.инд.строки>..<кон.инд.строки>,<нач.инд.столбца>..<кон.инд.столбца>] of <тип_элемента>
Var <имена_массивов>:<имя_типа>;
Пример: type Mas2D=array[1..5,1..3] of real;
Var M2D:Mas2D;
Если есть необходимость совместного использования одномерных и двумерных массивов, двумерные массивы лучше объявлять так:
Type<имя_1D типа>=array[<нач.индекс>..<кон.индекс>] of <тип_элементов>;
<имя_2D типа>=array[<нач.индекс>..<кон.индекс>] of <имя_1D типа>;
Var<имена массивов>:<имя_2D типа>;
Пример: type Mas1D=Array[1..3] of real;
Mas2D=Array[1..5] of Mas1D;
Использование двумерных массивов
Использование массивов и их элементов аналогично одномерным. Кроме того для одномерных массивов и родственных им двумерных допустимо использовать операции =,< >, а также присваивание:
Var M1D:Mas1D; M2D:Mas2D;
. . . .
M2D[i]:=M1D;
If M1D=M2D[4] then. . .
Динамические массивы:
Описание:
Type<имя_2Dтипа>=array of array of <тип_элементов>;
Var <имена_массивов>:<имя_2Dтипа>;
Установка размера:
SetLength(<имя_массива>,<кол-во_строк>, <кол-во_столбцов>);
Пример: Type M2D=array of array of integer;
Var M:M2D;
. . . .
SetLength(M,5,3);
Подпрограммы
Подпрограмма- это группа операторов, которые выполняют логически завершенное действие, имеют имя и может быть вызвано из различных мест основной программы и других подпрограмм.
Основные цели создания подпрограмм:
Декомпозиция программ – дробление её на замкнутые части, это позволяет упростить восприятие программы.
Сокращение программного кода за счёт замены повторяющихся частей программами.
Создание библиотек подпрограмм, реализующих часто используемые операции.
В Паскале существует два вида подпрограмм:
процедуры,
функции.
Процедура
Процедура – подпрограмма, ориентированная на вычисление нескольких величин или выполнение действий не связанных с расчётами (write(…), SetLength).
Процедура вызывается как отдельный оператор и не может участвовать в выражениях.
Использование собственных процедур включает в себя два этапа:
описание;
её вызов.
Структура описания процедуры:
Procedure<Имя_процедуры>(<список_формальных_параметров>);
<описание переменных, констант, типов и т.д.>
begin
<список операторов>
end;
Структура вызова процедуры:
<имя_процедуры>(<список_фактических_параметров>)
Параметры – это переменные, служащие для обмена данными между основной и подпрограммой.
Параметры, которые используются внутри описания называются формальными, а те которые перечисляются при вызове – фактическими.
При вызове процедур формальные параметры принимают значение фактических. Основная цель использования параметров – универсализация, при которой процедуры могут работать с разными данными.
Пример: подпрограмма, которая получает два числа и выводит сообщение какое больше:
Uses …
Procedure Who_More(A,B:real);
Begin
If A>B then
Write(‘1-е больше!’)
Else
Write(‘2-е больше!’);
End;
…
Begin
Read(x1,x2);
Who_More(x1,x2);
End;
Параметры делятся на параметры–значения и параметры–переменные.
Параметры–значения (входные) — используются, чтобы передать в процедуру начальные данные.
Параметры–переменные (выходные) — используются, чтобы передать в основную программу результаты вычислений, сделанных в подпрограмме. Перед такими параметрами, в заголовке процедуры, ставится ключевое слово var.
Пример: Подпрограмма получает два числа и вычисляет их сумму, и какое больше.
Uses …
Procedure Who_More(A,B:real; var S:real);
Begin
If A>B then
Write(‘1-е больше!’)
Else
Write(‘2-е больше!’);
S:=A+B;
End;
…
Begin
Read(x1,x2);
Who_More(x1,x2,sum);
Write(sum);
End;
Списки формальных и фактических параметров должны содержать одинаковое количество параметров.
Соответствующие параметры должны иметь одинаковый тип.
Названия формальных и фактических параметров обычно не совпадают.
В процедурах могут описываться собственные переменные и константы, они называются локальными и существуют только внутри подпрограмм.
Переменные и константы, описанные в основной программе называются глобальными и действуют во всей программе.
Имена локальных и глобальных переменных могут совпадать, в таком случае во всей программе действует глобальная переменная, но внутри процедуры, где принята локальная переменная действует она.
Рекомендуется счетчики циклов в подпрограммах объявлять локальными.