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