End.
Упражнение 14.
Что получим в результате выполнения цикла, и сколько раз он выполнится?
l. S:=0;
1:=1;
While K10 Do
Begin
S:=S+I;
I:=I+2;
End;
WriteLn(S);
,ZP:=1;
1:=1;
While I> 10 Do
Begin
P:=P*I;
I:=I+3;
End;
WriteLn(P);
3.A:=1;
B:=2;
While 2*A+B< 17 Do
Begin
A:=A-1;
B:=B+1;
End;
WriteLn( A ,". В ););
§14. Цикл с постусловием
Цикл с постусловием относится к циклам ПОКА. Называется он так потому, что условие выполнения стоит после тела цикла. Цикл с постусловием записывается следующим образом:
Repeat
<операторы тела цикла>
Until <условие>;
Заметим, что если операторов больше, чем один, то операторных скобок Begin End ставить не нужно, так как Repeat Until сами являются таковыми. Работу данного цикла можно представить на следующем фрагменте блок-схемы.

Выполнение цикла с постусловием:
1. выполняется тело цикла;
2. проверяется условие;
если условие ложно, выполняется тело цикла и снова проверка условия, иначе выход из цикла.
Внимание!
1. Тело цикла выполнится хотя бы один раз. v 2. Цикл не закончится, если условие всегда останется ложным.
3. Заранее количество повторений цикла неизвестно, так как выход происходит по выполнению условия.
Цикл с постусловием применяется в тех случаях, когда необходимо, чтобы тело цикла выполнилось хотя бы один раз.
Примеры решения задач.
Задача 1
Два человека одновременно делают вклад на одинаковую сумму. Первый под 10% годовых, а второй под 7%. Определить, когда у первого денег на счете будет в 2 раза больше, чем у второго.
Итак, нам необходимы две переменных для хранения суммы сбережений.
S 1 - сумма вклада 1 - го человека,
S2 - сумма вклада 2-го человека.
Пока количество прошедших лет равно 0 ( L:=0;), суммы вкладов одинаковые, допустим по 1000 рублей.
Но через год (L:=L+1;) у одного сумма вырастет на 10% 1.S1-S1+SP0.1 {10/100},
а у второго только на 7%
2. S2:=S2+S2*0.07 {7/100}
3.L-L+1;
и через некоторое время у 1-го сумма вклада становится в 2 раза больше, чем у 2-го ( S1->S2*2;). (Подумайте, почему нельзя записать S1^2*S2 ?!).
Итак, действия 1,2,3 являются операторами, требующими многократного выполнения:
до тех пор ПОКА S1>=2*S2;
Программа выглядит следующим образом:
Const
N=1000; { интересно, важна сумма вклада или нет? } Var
Sl, S2:Real;
L:Word;
Begin S1:=N;
S2:=N;
L:=0;
Repeat
Sl-Sl+SPO. l;
S2:=S2+S2*0.07;
L-L+l;
Until S1>=2*S2;
WriteLn(' Пройдет ',L,' лет');
ReadLn;
End.
Задача 2
Вкладчик банка положил на свой банковский счет сумму 1000 рублей, через сколько лет его сумма возрастет в 100 раз, если известен годовой процент? Сумма через год = Сумма + Сумма * год. процент /100;
пока Сумма не станет больше 100.000;
Var
S, P:Real;
L: Integer;
Begin
WriteLn(' Введите годовой процент');
ReadLn(P);
S:=1000;
L:=0;
Repeat S-S+S^P/lOO;
L:=L+1;
Until S> 100000;
WriteLn(' Сумма возрастет в 100 раз через ' ,L,' лет');
ReadLn;
End.
Задачей
(Для решения задачи нужны дополнительные знания: символьный тип данных). Реализовать движение курсора по экрану с помощью клавиш управления курсором {LEFT} и {RIGHT}.
Для решения этой задачи необходимо знать коды пяти клавиш.
#27 {ESC}
#72 {UP}
#80 {DOWN}
#75 {LEFT}
#77 {RIGHT}
Мы управляем курсором, пока не нажата клавиша {ESC}.
Repeat
Until С=#27;
Движение курсора влево Write(#8);
Движение курсора вправо Write('');
Функция считывания кода клавиши ReadKey;{ Модуль Crt}
Uses Crt;
Const
Left = #75;
Right = #77;
Esc = #27;
Var. C:Char;
Begin
Repeat
C^ReadKey;
IfC=RightThenWrite(");
IfC= Left Then Write(#8);
Until С = Esc;
End.
Задача 4
Подсчитать сумму цифр заданного числа. Выделение из числа каждого разряда происходит по следующему принципу:
d:=a mod 10; { выделяем последний разряд }
а:=а div 10; { убираем разряд из числа }
Это мы будем делать ПОКА ао0. Выход а=0;
Окончательный вариант программы:
Var
A:LongInt;
S:Byte;
D:Byte;
Begin
WriteLn(' Введите число');
ReadLn(A);
S:=0;
Repeat
D:=Amod 10;
A:=Adiv 10;
S := S + D;
Until a=0;
WriteLn(' Сумма цифр числа', A,' равна ',S);
ReadLn;
End.
Упражнение 15.
1. Что получим в результате выполнения цикла, сколько раз он выполнится? S:=0;
Repeat
S:=S+I;
I:=l+2;
UntiH>10;
WriteLn(S);
P:=l;
I:=l;
Repeat
P:=P*1;
I:=l+3;
Until K10;
WriteLn(P);
A-.=l;
B-2;
Repeat
Begin
A:=A-1;
B:=B+1;
Until A + 2*B < 0;
WriteLn(A; ',B);____________________________________________
§15. Массивы как способ организации данных
15.1. Структура данных массив. Понятие массива
До сих пор мы работали с простыми переменными. Простая переменная характеризуется тем, что под ее именем в памяти хранится только одна величина. Однако есть задачи, в которых необходимо под одним именем задавать сразу несколько величин одного типа.
Пример.
С клавиатуры вводятся целые числа. Требуется распечатать их в обратном порядке. Если таких чисел три, то задача может быть решена следующим образом:
program primi;
var al, a2,a3: integer;
begin read(al, a2,a3);
write(a3,a2,al) end.
Но для большого количества чисел программа будет громоздкой из-за количества используемых переменных. В данном случае можно использовать такой способ задания данных, как массив, позволяющий одним именем задать сразу несколько величин.
Массивом называется упорядоченная последовательность конечного числа однотипных данных, обозначаемая одним именем
Упорядочение заключается в том, что элементы массива располагаются в последовательных ячейках памяти (т. е. память под массив выделяется одним непрерывным куском). Массив можно представить себе как несколько одинаковых ящиков, скрепленных вместе. На всю конструкцию повешен один ярлык, имя массива. Все ящики пронумерованы, начиная с 1. Номер ящика - это значение индекса элемента массива.

. Чтобы получить доступ к нужному ящику, нужно указать имя массива и его индекс. Индекс записывается в квадратных скобках. Имя массива записывается по тем же правилам, что и имя простой переменной. Например: а[3] - обращение к 3-му элементу массива. Массив относится к структурированным типам данных.
15.2.0писание массива
Если при решении задачи используется массив, то в программе он должен быть описан либо в разделе переменных, либо в разделе типов. Описание массива в разделе переменных.
VAR <имя массива> : ARRAY [Tl ] OF T2 ;
Здесь ARRAY (массив); OF (из) - служебные слова; Tl - тин индекса, в качестве которого может быть любой простой тип, кроме стандартных типов INTEGER и REAL; T2 - тип элементов массива, допустимый в языке Паскаль (любой, кроме файлового). Примеры:
VAR A: ARRAY [1 ..5] OF REAL;
здесь А - имя массива, элементы которого имеют базовый тип REA1; тип индекса - ограниченный.(т. е. указывается нижняя граница и через двоеточие верхняя граница индекса).
Так как тип индекса не может быть стандартным целым или действительным типом, то нельзя делать следующее описание массива:
VAR A: ARRAY [5] OF REAL;
или VAR A: ARRAY [INTEGER] OF REAL;
Если несколько массивов имеют одинаковый тип индекса и одинаковый базовый тип, то допускается следующее описание:
VAR A, B,C: ARRAY [1..5] OF REAL;
здесь объявлено 3 массива А, В,С действительных чисел.
Внимание!
дй Нельзя путать понятия 'индекс' и 'тип индекса'. Тип индекса используется в разделе описания массива, а индекс указывается в разделе операторов для обозначения конкретных элементов массива. В качестве индекса может быть выражение, частным случаем которого является константа или переменная.
Описание массива в разделе типов.
Описание массива в разделе типов является хорошим стилем программирования, упрощает отладку программы и позволяет достичь логической ясности программы. Форма описания состоит из 2 - х этапов:
1. В разделе описания типов TYPE указывается тип массива;
2. В разделе переменных VAR перечисляются массивы, относящиеся к указанному типу.
Форма объявления массива имеет вид:
TYPE <имя типа> - ARRAY [Tl] OF T2;
VAR <имя массива> : <имя типа>;
здесь Tl - тип индекса;
T2 - базовый тип элементов массива.
Примеры:
1. Список фамилий учеников класса.
TYPE mas = ARRAY [1 ..20] OF STRING[20];
VAR fam:mas;
2. Список оценок учеников класса.
TYPE masi - ARRAY [1..20] OF BYTE;
VARocen:masl;
С элементами массива можно работать как с простой переменной. В операторе присваивания элементы массива могут стоять справа и слева. В[5]:=В[3]+1;
Элементы массива могут использоваться в выражении. SUM:=SUM-C[Kj;
PI :=А[2*1+1]; индекс - выражение.
15.3. Способы задания значений элементов массива
1. Оператором присваивания.
A[lj:-3;
А[21-4;
или В[ 11: 'Иванов';
П[21:-'Петров';
Такой способ чадания значений используется, если массив небольшой.
2. Оператором ввода с клавиатуры.
FORI:=1T010DO BEGIN WRITELN('BBeAHTe', I, '-ый элемент массива');
READLN (A[I]);
{ в качестве индекса используется переменная • параметр цикла} END;
Этот способ задания значений также используется для небольших массивов. 3. Заполнение массива с использованием генератора случайных чисел.
RANDOMIZE;
FORI:=1 TO 10 DO A[I]:=RANDOM(X);
{массив заполнится целыми числами в диапазоне от 0 до X} Вывод массива.
FOR I-1 ТО 10 DO WRITELN (A[I]);
Вывод конкретного, например, пятого, элемента массива: WRITE (A[5j);
Упражнение 16.
1. Дан массив из 7 элементов названий книг. Заполнить его с клавиатуры. Распечатать в столбик.
2. Дан массив из 7 элементов целых чисел. Заполнить его случайным образом. Распечатать в строчку.
3. Дан массив из 7 элементов целых чисел. Заполнить массив по формуле: значение элемеп - . та равно индексу, под которым элемент находится в массиве.
4. Дано: массив А из 6 элементов и произвольное число "X". Заполнить массив следующим образом:
AfI1:=X*X*X+I, где I - параметр цикла. ____Распечатать массив на экране в строчку.
§16. Алгоритмы работы с массивами
Алгоритмы работы с массивами можно рассмотреть на примере следующих задач:
1. Суммирование элементов массива.
2. Поиск заданного элемента в массиве.
3. Определение числа элементов в массиве, удовлетворяющих заданному условию. Примеры:
1). Сумма элементов массива.
{ объявление типа массива} type mas = array [1..10] of integer;
var a:mas ; {объявление переменной типа массив}
{ начальное значение для простой переменной sum, в которой
будет накапливаться сумма значений элементов массива } sum:=0;
fori:=l to 10 do begin
readln(a[i]);
sum:= sum + a[i] end;
writeln( "cyMMa=",sum);
2).Сумма положительных чисел.
sum:=0 ;
fori:=ltol0do
begin
readin (a[ij);
ifa[i]>0 then sum:= sum + a[i]
end;
writein ("сумма положительных 4Hcen",sum);
3).Сумма и количество положительных чисел.
sum:-=0;k:-0;
{ начальное значение для простой переменной, в которой будет подсчитываться количество положительных чисел } fori:=l to 10 do ifa[i]>0then
begin
k:-=k+ 1;
sum:=sum +a[ij;
end;
writein ("сумма положительных чисел~",8ит, "их количество ",k);
4).Поиск заданного 'момента в массиве.
(если таких элементов несколько, то отыскать последний) Дано:
а - исходный массив;
n - число элементов в массиве;
t - искомое число;
р - признак ( р=0 означает, что нет числа t в массиве а);
k - параметр цикла (номер очередного элемента массива);
k:=0;p:=0;
while k<=n do
begin
ifa[k]=tthenp:=k;
k:=k+l
end;
В цикле просматриваются все элементы массива. Каждый раз, когда встречается элемент t, признак р приобретает значение номера этого элемента.
5). Поиск наибольшего (наименьшего) элемента среди элементов массива.
Алгоритм.
В качестве наибольшего берется 1-й элемент, который сравнивается с каждым следующим элементом массива. Каждый раз, когда встречается элемент, значение которого больше ранее взятого, он выступает в роли наибольшего до тех пор, пока не найдется еще больший элемент.
max:=a[l];k:=2;
while k<=m do begin ifa[k]>max then max:=a[k];
k-k+1;
end;
writein ('наибольший элемент ',max);
Примеры решения задач.
1. Информация о количестве выпавших в течение месяца осадков задана в виде массива. Определить :
• общее количество осадков ча месяц;.
• сколько раз в течение месяца температура опускалась ниже 0 градусов?
• температура скольких дней за месяц была ниже среднемесячной?
Решение:
Дано: массив средних суточных температур (например, ча декабрь);
Результат: количество дней, в которые температура опускалась ниже среднемесячной.
program pr4;
type
{ объявление ТИПА массива средней суточной}
{ температуры воздуха за месяц декабрь, в декабре 31 день } mas^arrayt I.. 31 ] of real;
var a:mas; {Объявление переменной а типа массив } i:integer; {I- индекс массива, параметр цикла} k:integer; {k- количество дней, в которые температура}
{опускалась ниже 0 градусов} s:real; {s-среднемесячная температура воздуха} begin
for i:=l to 31 do { заполнение массива с клавиатуры} begin
ут1е1п('введите среднюю суточную температуру за ',i, ' день месяца');
readln(a[i]);
end;
{определение суммарной температуры за декабрь - s } s:=0; {начальное значение для суммарной температуры }
{определение суммарной температуры за декабрь } for i:=l to 31 do s^s+a^j;
{определение среднемесячной температуры за декабрь} s:=s/31;
\угЬе1п('среднемесячная температура за декабрь = *,s:3:1, ' градусов Цельсия');
{определяем, температура скольких дней } {была ниже среднемесячной} k:=0;
for i:=l to 31 do
ifa[i]<sthenk:=k+l;
writeln('TeMnepaTypa ',k,' дней декабря была ниже ",s:3:l, ' градусов Цельсия');
end.
2. В магазине продаются детские игрушки. Сколько стоит самая дорогая игрушка? (Пусть в магазине 10 наименований игрушек)
Решение:
program pr5;
type mas=array fl..l0] of real;
mas 1 ^ array |1..10] of string) 20];
var a:mas; {массив цен}
b:masl; {массив названий игрушек}
k:integer; {счетчик количества игрушек и массиве}
n:integer; {индекс самой дорогой игрушки}
i:inlcger; {параметр цикла}
х:геа1; {переменная, для запоминания цены игрушки } begin
{заполнение массива названий игрушек} fori:-l to 10 do begin \уп1е1п('введите название ',i,' игрушки');
readln(b[i]);
end;
{заполнение массива цен} fori:=ltol0do begin ут1е1п('введите цену для игрушки ',b[i],' в рублях');
readln(a[ij);
end;
{определение самой дорогой игрушки} x:=a[l];k:=2;n:=l;
while k<= 10 do begin ifa[k]>x then begin x:=a[kj; n:=k end;
k:=k+l;
end;
writeln('caMan дорогая игрушка ',b[n],'. Она стоит ',х:4:1, ' рублей.');
end.
Какие изменения требуется произвести в описании алгоритма поиска наибольшего элемента в массиве, чтобы осуществить поиск наименьшего? Как определить индекс наименьшего элемента?
Упражнение 17.
Создать массив целых случайных чисел. Размер массива - 10.
1. Определить количество отрицательных элементов массива.
2. Уменьшить каждый элемент массива на 5.
3. Определить сумму положительных чисел.
4. Заменить отрицательные элементы их модулями.
5. Все результаты вывести на экран дисплея.
§17. Упорядочение массива
Упорядочение (сортировка) - это расположение значений элементов. массива в порядке возрастания или убывания их значении
Упорядочение массива методом "пузырька ".
Рассмотрим алгоритм упорядочения массива по возрастанию методом "пучырь-ка", в соответствии с которым элементы массива просматриваются слева направо. Каждый предыдущий элемент сравнивается с последующим. Если предыдущий элемент больше последующего, то предыдущий и последующий элементы меняются местами.

С - простая переменная.
С := предыдущий элемент;
предыдущий элемент:= последующий элемент ;
последующий элемент:=С;
Просмотр проводится от 1-го элемента до N-1 (N - количество элементов в массиве).
Если при просмотре произошла хотя бы одна перестановка чисел, то просмотр повторяется. Указанный процесс заканчивается, когда при просмотре элементов массива никакие 2 элемента не менялись местами.
При сортировке по возрастанию самый большой элемент продвигается в правый конец массива, затем следующий за ним по величине элемент и т. д. Сказанное можно проиллюстрировать на конкретном примере:
массив А из 4-х элементов целых чисел упорядочить по возрастанию.

Рассмотрим программу упорядочения массива по возрастанию.
Пример 1. Массив А1,А2,...Ап. Алгоритм:
1. Ввод элементов массива.
2. Сортировка.
3. Вывод отсортированного массива.
Шаг 2 алгоритма.
metka: k:=0; {признак того, что массив упорядочен} FOR I-l TON - 1 DO ifa|i]>ali+ljthen begin c:-a[i];
a[i]:=a[i+l];
a[i+l]:=c;
k:=l;
end;
ifk==l then goto metka
else writeln('ynopMA04eH');
С использованием вложенных циклов шаг 2 может быть записан так:
fori:=l ton-1 do forj:=l to n-i do ifa|j]>a[j+l]then begin c:=a[j1;
a[J]:=a[J+l];
a[j+l]:=c;
end;
где a - исходный массив чисел;
n - число элементов в массиве;
i - параметр внешнего цикла;
j - параметр внутреннего цикла;
с - вспомогательная переменная, используемая для обмена.
Пример 2
Исходный массив А: 50,40,30,20,10 упорядочен по убыванию. Применим алгоритм упорядочения по возрастанию с использованием вложенных никлов-

§18. Двумерный массив
До сих пор рассматривали массивы, каждый элемент которых содержал только один индекс. Такие массивы называются одномерными. В математике часто используются многомерные массивы (двумерные, трехмерные и т. д.). Мы рассмотрим двумерные массивы, иначе называемые матрицами. Например:
5436
2817
4395
Данная матрица имеет размер 3 на 4, т. е. она состоит из трех строк и четырех столбцов. Если всю матрицу обозначить одним именем, например А, то каждый элемент матрицы будет иметь два индекса - A[ij].
Здесь первый индекс i обозначает номер строки (i=l,2,3), второй индекс j-номер столбца (j=l,2,3,4). Такую матрицу можно описать следующим образом (с использованием имени типа Т):
1-ый способ'(чаще используется) Type Т = array [1..3,1..4] of integer;
Var A: T;
2-ой способ Type Т = array [1..3] of array [1..4] of integer;
Var A: T;
Ввод элементов двумерного массива (матрицы) For i:=l to n do Forj:=l torn do Readln(A[ij]);
Печать
For i:=l to n do
begin
Forj:=l to m do
Write (A[i, j],''); {Вывод элементов одной строки матрицы }
writein; {переход на следующую строку экрана} end;
где
А - имя массива;
i-индекс строки;
j-индекс столбца;
N-количество элементов в строке;
М-количество элементов в столбце.
Примеры решения задач
1. Дан массив действительных чисел, состоящий из 3 строк и 5 столбцов. Вычислить произведение всех элементов массива.
program рг1;
{вычисление произведения элементов двумерного массива,}
{в котором 3 строки и 5 столбцов}
CONST
N=3;
М-5;
TYPE
MAS=ARRAY [1..N.1..M] OF REAL;
VAR
B:MAS;
1:1. .N; {индекс строк}
J: 1. .M; {индекс столбцов}
p:REAL; {произведение} BEGIN
{ ввод значений массива }
WRITELN('BBEAHTE ЗНАЧЕНИЕ ЭЛЕМЕНТА МАССИВА:');
FORI:=1 TON DO
FOR J:=l TO M DO READ(B[I, J]);
{ вывод значений массива }
FOR I :=1 TON DO
BEGIN
FOR J:-! TOM DO WR1TE(B[I, J]:7:2);
WR1TELN;
END;
{ вычисление произведения элементов массива }
P:-l;
FORI-lTON DO
FORJ:-! TOM DO
P:-P*B[I, J];
\УР1ТКЩ'ПРОИЗВЕДЕНИЕ ',P:7:2);
END.
2. Дана кнадратная матрица размером NxN, содержащая вещественные числа. Пай in сумму •)лемеитов первого столбца. program pr2;
{квадратная матрица размером NxN - двумерный массив,} {в котором число строк равно числу столбцов} CONST N=3;
TYPE
MAS=ARRAY [l..N, l..N] OF REAL;
VAR A:MAS;
1:1..3;{индекс строки} J: 1 ..3; {индекс столбца} s:real; {сумма} BEGIN WRITELN('BBEnHTE ЗНАЧЕНИЕ МАТРИЦЫ:');
FOR I:=l TO N DO
FORJ:=1TONDO
READ(A[I, J]);
{вывод матрицы} FORI:=1TONDO
BEGIN
FOR J:=l TO N DO
WRITE(A[I, J]:5:1);
WRITELN;
END;-
{ОПРЕДЕЛЕНИЕ СУММЫ ЭЛЕМЕНТОВ ПЕРВОГО СТОЛБЦА}
S-0;
J:=l;
FOR I-1 TON DO
S:=S+A[I, J];
WRITELNCCYMMA ЭЛЕМЕНТОВ 1-ГО СТОЛБЦА=',8:5:1) END.
3. Дан двумерный массив A(N, M).
Сформировать массив B(N, M), где
SQR(A[I, J]), если I - НЕЧЕТНОЕ;
B[I, J]=
SQRT(A[I, J]), если I - ЧЕТНОЕ.
program ргЗ;
CONST
N=3;
М=5;
•1-YPE
MAS-ARRAY [l..N, l..M] OF REAL;
VAR
A, B:MAS;
1:1. .N; {индекс строк}
J: 1 ..M; {индекс столбцов} BEGIN
{ ввод значений массива }
^УР1ТЕЬМ('ВВЕДИТЕ ЗНАЧЕНИЕ ЭЛЕМЕНТА МАССИВА:');
FOR I-l TON DO
FORJ:=1TOMDO
READ(A[I, J]);
WRITELN('PE3ynbTAT);
FORI:=1TONDO BEGIN FOR J:=l TO M DO WRITE(A[I, J]:7:2);
WRITELN END;
{ формирование массива В } FORI:=1TONDO IF 1/2 - INTO/I) THEN { четное }
FOR J:=l TO M DO BtU]:- SQRT(A[I, J]) ELSE FOR J:=l TO M DO B[I, J]:= SQR(A[I, J]);
{ВЫВОД МАССИВА В - СФОРМИРОВАННОГО} FOR I:=l TO N DO 'BEGIN FOR J:=l TO M DO WRITE(B[I, J]:7:2);
WRITELN END END.
§19. Программирование вспомогательных алгоритмов
19.1. Понятие подпрограммы
В практике программирования часто встречаются задачи, в которых по ходу выполнения программы приходится производить одни и те же действия или вычисления, но при различных исходных данных. Чтобы исключить повторение одинаковых операторов и сделать тем самым программу проще и понятнее, можно выделить эти повторяющиеся действия в самостоятельную часть программы, которая может быть исполь-' зована многократно по мере необходимости.
Автономная часть программы, реализующая определенный алгоритм и допускающая обращение к ней из различных частей общей программы, называется подпрограммой.
Подпрограммы оформляются в виде замкнутых участков программы, имеющих четко обозначенные вход и выход.
Обращение к подпрограмме осуществляется из основной программы через заголовок подпрограммы. При вызове подпрограммы работа основной программы приостанавливается, и начинает выполняться вызванная подпрограмма. Она обрабатывает данные, переданные ей из основной программы, или просто выполняет заданную последовательность действий. По завершении выполнения подпрограммы основная программа продолжает выполняться с того места, где прервалось ее действие.
Передача данных из основной программы в подпрограмму (входные данные ) и возврат результата выполнения подпрограммы осуществляется с помощью параметров.
Параметры - это данные, которые передаются вызываемой подпрограмме и используются последней в качестве входной и (или) выходной
информации.
Использование подпрограмм позволяет реализовать один из самых прогрессивных методов программирования - структурное программирование.
19.2. Процедура в Паскале и ее формат.
В языке PASCAL выделяют два вида подпрограмм: процедура(ргосв<1иге) и
функция (function). Имея один и тот же смысл и аналогичную структуру, процедуры и
функции различаются назначением и способом их использования.
Мы уже встречались со стандартными процедурами и функциями. Любая программа может содержать несколько процедур и функции. Процедуры
и функции объявляются в разделе описания вслед за разделом описания переменных.
Процедура - это независимая часть программы, которую можно вызывать по имени для выполнения определенных действий.
Процедуры служат для задания совокупности действий, направленных на изменение внешней по отношению к ним программной обстановки; например, вычисления каких-либо выражений с разными значениями параметров или рисования геометрических фигур с различными значениями сторон или радиусов. Структура процедуры имеет следующий вид:
procedure имя [(список формальных параметров)];
раздел описаний begin
раздел операторов end;
Первая строка описания называется заголовком процедуры, а раздел операторов называется телом процедуры.
В заголовке указывается служебное слово PROCEDURE, за которым следуют имя процедуры и список формальных параметров, заключенные в круглые скобки (если такие имеются). В списке перечисляются имена формальных параметров и их тип. Имя параметра отделяется от типа двоеточием, а параметры друг от друга - точкой с запятой. Если несколько формальных параметров имеют одинаковый тип, тогда их можно перечислить через запятую, а затем указать тип. Имя процедуры задается по правилам задания имен переменных.
Тело процедуры заключается в операторные скобки BEGIN и END, причем после END, в отличие от основной программы, вместо точки ставится точка с запятой.
Раздел описаний процедуры подобен программе и состоит из разделов меток, констант, типов, переменных и, в свою очередь, процедур и функций. Процедура вызывается по ее имени:
имя [(список фактических параметров)];
Формальные параметры - параметры, определенные в заголовке процедуре.
Фактические параметры - выражения, задающие конкретные значения при обращении к процедуре.
При обращении к процедуре ее формальные параметры замещаются фактическими, переданными из основной программы.
С помощью формальных и фактических параметров данные передаются из программы в процедуру и, наоборот, из процедуры в программу. Между формальными и фактическими параметрами должно быть соответствие по количеству параметров, по их типу и порядку следования. Среди параметров процедуры выделяют параметры-значения и параметры-переменные.
Параметры-значения выполняют роль входных параметров процедуры. Они могут получать значения фактических параметров, но не могут передавать свои значения фактическим параметрам.
Параметры-переменные выполняют роль как входных, так и выходных параметров процедуры. Они могут получать значения фактических параметров, изменять их в процедуре и возвращать новые значения в основную программу. Для передачи результатов выполнения подпрограммы в основную программу следует использовать параметры-переменные. В списке формальных параметров они перечисляются после зарезервированного слова VAR с обязательным указанием типа. 19.3. Механизм передачи параметров
Если параметр определен как параметр-значение, то перед вызовом процедуры это значение вычисляется, полученный результат помещается во временную память и передается процедуре. Процедура использует в качестве значения соответствующего параметра значение из этой памяти. При выходе из процедуры эта временная память недоступна основной программе. Таким образом, значения фактических параметров не изменяются подпрограммой, а остаются теми же, что были при обращении к подпрограмме.
Если же формальный параметр определен как параметр-переменная, то при вызове подпрограммы ей передается сама переменная, поэтому изменение в подпрограмме значения параметра - переменной приводит к изменению фактического параметра в основной программе.
Следовательно, исходные данные из программы в подпрограмму могут быть переданы как через параметры - значения, так и через параметры - переменные, а результат работы процедуры возвращается в основную программу только через параметры - переменные.
Любая процедура может содержать несколько входных параметров и несколько результатов ее выполнения.
Пример процедуры:
PROCEDURE EXPRES(A, B,C:REAL;VAR X, Y:REAL);
VAR Z:REAL;
BEGIN
Z-A+B+C;
X:=SQR(Z); (*КВАДРАТг *) Y:=SQRT(Z) (*KOPEHbH3Z *) END;
Эту процедуру можно вызвать таким образом:
EXPRESS(25.4,44.6,30,X1,Y1);
Формальные входные параметры А, В, С принимают значения соответствующих фактических параметров, А=25.4, B=344.6, С=30. При этих значениях выполняется процедура. Результатом выполнения процедуры являются X, Y, которые передают свои значения соответствующим фактическим параметрам XI, Y1. Таким образом, в основной программе будем иметь Xl=10000, Yl=10.
Допускается одинаковое обозначение соответствующих формальных и фактических параметров. Например, вызов процедуры может иметь вид:
EXPRESS(25.4,44.6,30,X, Y);
В качестве фактических параметров, которые соответствуют параметрам-значениям, могут быть константы, переменные, выражения. Их тип должен соответствовать типу формального параметра. Например, вызов процедуры может быть таким:
А:=25;С-.=30;
EXPRESS(A,44.6,C, X1,Y1);
или
D:=44.6;R:=10;
EXPRESS(25.4,D, R+20,Z, T);
В любом случае формальные параметры получат значения А=25.4, В=44.6, 030.
В качестве фактических параметров, которым соответствуют параметры-персменные, используются только имена переменных (константы и выражения недопустимы).
Допускается использование процедур без параметров. В этом случае формальные и фактические параметры отсутствуют. Назначение такой процедуры - изменение значений некоторых переменных или выполнение каких - либо действий, внешних по отношению к процедуре (очистка экрана, например). В процедуре, как и в основной программе, может отсутствовать раздел описаний.
Область действия имен
Имена, объявленные в разделе описания основной программы, действуют в разделе операторов основной программы и в любой подпрограмме (процедуре и функции). Эти имена называются глобальными. Имена, объявленные в подпрограмме, действуют только в этой подпрограмме и в любой объявленной в ней процедуре и функции. Такие имена называются локальными. Они не доступны для операторов основной программы.
Рекомендации по использованию процедур
Нужно ли использовать при программировании процедуры, сколько должно быть у нее параметров, какие из них должны быть параметры-значения, а какие параметры - переменные, что нужно передавать через глобальные переменные? Здесь не может быть категоричных утверждений, в этом заключается искусство программирования.
Желательно, чтобы процедура реализовывала один вспомогательный алгоритм, а не несколько сразу. Например, процедура нахождения максимального из двух чисел только находила это максимальное, а вывод результата на экран выполнялся бы в основной программе или другой процедуре.
Примеры решения задач.
Задача 1.
Написать процедуру, находящую максимальное из двух вещественных чисел и с ее помощью определить максимальное из 4-х вводимых с клавиатуры вещественных чисел.
Начните решение задачи с ответов на вопросы:
1. Какие данные являются входными для процедуры, что будет являться результатом работы процедуры? ( Входными данными являются два вещественных числа, а результатом будет являться максимальное из них).
2. Сколько параметров у этой процедуры?( Всего три параметра: два параметра-значения вещественного типа, их имена будут а и Ь, и один параметр-переменная
(результат) вещественного типа, его имя будет с). Имя процедуры make, имена переменных, вводимых с клавиатуры а1,а2,а3,а4. Имена вспомогательных переменных - zl, z2,z3.
Примерное решение:
program zadani;
var al, a2,a3,a4,zl, z2,z3:real;
Procedure makc(a, b:real;var c:real);
begin
ifa>b then c:=a else c:=b
end; {конец процедуры}
begin
\\т11е('Введите 4 вещественных числа'); readl(al, a2,a3,a4);
makc(al, a2,zl);
makc(a3,a4,z2);
makc(zl, z2,z3);
ут1е1п('максимальное=',г3);
end.
Задача 2.
Написать процедуру с 2-мя параметрами целочисленного типа, меняющую их • значения местами.
Пусть имена переменных, значения которых необходимо переставить местами, будут I и J, их значения можно занести в эти переменные оператором присваивания. Имя процедуры - PER, имена параметров процедуры х и у.
Program perest;
Varij:integer;
Procedure PER(x, y:integer);
Var z-.integer;
begin z:=x; x:=y; y:=z;
end; { конец процедуры}
begin r^l;]:^;
writeln( 'до перестановки' ,'i=',i:3,'j='.j:3);
PER(iJ);
write/n('no<yie перестановки ','i='.i:-5,'J^'j'-S);
end.
Упражнение 18.
1. Написать процедуру, вычисляющую по заданному натуральному числу N сумму натуральных чисел от 1 до N включительно. Используя ее, найти сумму натуральных чисел от 51 до 99. Указание: искомая сумма равна разности суммы чисел от 1 до 99 и суммы от 1 до 50.
2. Написать процедуру, которая вычисляет площадь треугольника по его известным сторонам( используя формулу Герона). Используя эту процедуру, вычислить площадь четырехугольника с известными сторонами и одной из диагоналей.___________________ __
19.5. Понятие функции
Функция необходима для определения алгоритма вычисления нового значения некоторого простого типа.
В этом отношении функция подобна выражению, которое вычисляет значение. Вызов функции является одним из допустимых операндов выражения, обозначая в нем то значение, которое вычисляет функция. Имя функции можно употреблять при записи выражений, аналогично тому, как мы употребляли имя стандартной тригонометрической функции SIN(x) при вычислении значений тригонометрических выражений. (Привести примеры стандартных функций.)
Функция пользователя оформляется аналогично процедуре. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров), результат обозначается именем функции и передается в основную программу.
Функция оформляется в следующем виде:
FUNCTION имя[( список формальных параметров)] :тип;
—————————:——1
раздел описании
be ————————————'
раздел операторов END; '—————————————'
Строка, начинающаяся с ключевого слова FUNCTION, называется заголовком функции, а все остальное - телом функции.
Вызывается функция по ее имени с указанием списка фактических параметров ( если они есть ). При вызове функции тип не указывается. ? Может ли имя функции встречаться в теле функции справа от знака := ? Ответ: да.
Примеры решения задач.
Задача I
Написать функцию, находящую максимальное из двух вещественных чисел, и с ее помощью определить максимальное из 4 вводимых с клавиатуры вещественных чисел.
После описания параметров необходимо описать тип результата, возвращаемого функцией. Функция будет вызываться по имени в операторе присваивания.
Решение:
program zadani;
var al, a2,a3,a4,zl, z2,z3:real;
Function makc(a, b:real):real;
var c:real;
begin
ifa>b then c:=a else c:=b;
makc'.^c end; • begin
\\тЬе('Введите 4 вещественных числа'); readl(al, a2,a3,a4);
z\•.~•:makc(a\,a2);
z2:=makc(a3,a4);
z3:=makc(zl, z2);
у/гНе^Смаксимальное^гЗ);
end.
Задача 2
Написать функцию, вычисляющее число Фибоначчи по номеру. С ее помощью вычислить сумму 10-го и 12-го (по порядковому номеру) чисел Фибоначчи.
Все входные данные должны быть заложены в программе.
Результатом программы является число, равное сумме двух чисел, его нужно вывести на экран.
Числа Фибоначчи образуют такую последовательность
1,1,2,3,5,8, 13...
Каждое следующее число равно сумме двух предыдущих, а два первых равны 1.
program funcfib;
var z:integer;
function fib(n:integer):integer;
var c, d,k, i:integer;
begin
c:=l;d:=l;i:=2;
repeat
k:=c+d; c:=d; d:=k; i:=i+l;
until i>n-l;
fib:= k;
end;
begin z-fibOt^+fn^U^writelnCz-'.z);
end.
Упражнение 19.
Написать функцию вычисления N! (N факториал ), Указание: N!=l *2* ... (N-1)*N - произведение чисел от 1до N.
Необходимо проверять правильность любых программ и подпрограмм - это называется тестированием. Программа проверяется при различных значениях исходных данных, для которых известен результат. Например, 6!=720. Необходимо тестировать при критических значениях входных параметров, например, что выдаст программа при введенном 0 ( 0!=1) или при отрицательном значении (должно быть сообщение об ошибке в данных).
Используя написанную подпрограмму, определить, сколькими способами можно из 10 предметов выбрать два.
Это число = 10!/(2!*8!)
Можно ли с помощью этой функции вычислить 10! ? Нет, это большое число, превышающее 32767 . Необходимо объявить переменные как longint;
2.Написать функцию, которая вычисляет площадь треугольника по его известным сторонам (используя формулу Герона)
Используя эту функцию, вычислить площадь четырехугольника с известными сторонами и одной из диагоналей.____ _______ _____________
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


