Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
ТЕМА: Процедуры и функции
Паскаль позволяет структурировать программу, отделив ее функционально независимые части. Отдельные, функционально независимые части программы называют подпрограммами (процедурами и функциями).
Название «подпрограмма» означает, что она подобна и подчинена программе.
Подпрограммы решают очень важные задачи, значительно облегчая программирование:
1) избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты;
2) улучшают структуру программы, облегчая ее понимание при разборе;
3) повышают устойчивость к ошибкам программирования и непредвиденным последствиям при модификациях.
Подпрограммы могут быть:
1) стандартными, т. е. определенными системой Паскаль;
2) пользовательскими, т. е. разработанными собственно пользователем.
Существует два способа объединения подпрограмм и программ:
1) текст подпрограмм может быть приведен в разделе описаний использующей их программы до слова begin, с которого начинается тело самой программы (это важно!);
2) подпрограммы группируются в отдельных файлах, имеющих специальную структуру – модулях. Для того чтобы основная программа могла использовать модуль, он должен быть подключен к основной программе.
Первый способ используется, когда программа в целом не слишком велика, а ее подпрограммы, по-видимому, не будут использованы в других программах.
Второй способ желателен для тех программ, которые составляют Ваш технологический задел по программированию и могут использоваться в других программах. Кроме того, оформление отдельных модулей желательно для больших программ, когда текст становится неудобным для восприятия.
С одной стороны, вопрос о том, какие частные алгоритмы должны быть вынесены в подпрограммы, во многом определяется привычками программиста. С другой стороны, огромное количество разработанных программ позволяет указать на типичные ситуации и сформулировать общие принципы выделения подпрограмм:
· Когда Вы несколько раз перепишете в программе одни и те же последовательности команд, необходимость введения подпрограммы приобретет характер острой внутренней потребности.
· Иногда слишком много мелочей закрывает главное. Полезно убрать в подпрограмму подробности, заслоняющие смысл основной программы.
· Полезно разбить длинную программу на составные части – просто как книгу разбивают на главы. При этом основная программа становится похожа на оглавление.
· Бывают сложные частные алгоритмы. Полезно отладить их отдельно в небольших тестирующих программах. Включение программ с отлаженными алгоритмами в основную программу будет легким, если они оформлены как подпрограммы.
· Все, что Вы сделали хорошо в одной программе, Вам захочется перенести в новые. Для повторного использования частей программы лучше сразу выделять полезные алгоритмы в подпрограммы.
Структура текста подпрограммы соответствует структуре текста основной программы:
<заголовок подпрограммы>;
<раздел описаний>;
begin
<тело подпрограммы>
end;
Следует обратить внимание на два отличия в описании основной программы и подпрограммы:
1) подпрограмма начинается с заголовка, содержащего имя подпрограммы, передаваемые в нее и возвращаемые от нее параметры. Заголовок подпрограммы отличается от заголовка основной программы;
2) подпрограмма заканчивается точкой с запятой, а не точкой.
Чем отличаются процедуры и функции?
И процедура, и функция – подпрограмма, которая создается для выделения в отдельный завершенный логический блок некоторого вспомогательного алгоритма. Обычно функция используется в том случае, когда результатом подпрограммы должна быть единственная скалярная (простая) величина. Отличие между процедурой и функцией проявляется также при вызове их из основной программы.
Заголовки процедуры и функции имеют вид:
Procedure <имя_процедуры> (<список формальных параметров>);
Function <имя_функции> (<список формальных параметров>): <тип результата>;
Список формальных параметров – это имена переменных с указанием их типов, над которыми подпрограмма осуществляет действия.
Пример заголовков процедуры и функции:
Procedure primer1 (x, y: real; z: integer);
Function primer2 (n, m: byte): integer;
Вызов подпрограммы происходит при каждом употреблении ее имени в основной программе. При вызове подпрограммы начинают выполняться ее операторы до завершающего слова end или специального выхода из подпрограммы – exit. После выхода из подпрограммы управление передается команде, следующей за обращением к подпрограмме.
Отличия процедуры от функции связаны со способом вызова.
Для вызова процедуры приводится ее имя и в скобках приводится список передаваемых и получаемых параметров. Вызов процедуры – оператор (это важно!).
Вызов функции производится по ее имени и списку параметров, но, в отличие от процедуры, результат функции имеет определенное значение, поэтому функции используются не как операторы, а как выражения или операнды в выражениях (это важно!). Для того чтобы функция получила численное значение, в теле функции необходимо присвоить ей это значение.
Пример обращения к процедуре и функции:
Primer1 (sin(2), k, 3); {обращение к процедуре, используется как
оператор}
F:= primer2 (i, 2*j); {обращение к функции, используется как
операнд выражения}
При вызове подпрограммы (процедуры или функции) после ее имени в скобках указываются фактические параметры. Фактическими параметрами могут быть как конкретные значения, так и переменные или даже результат выражения. Последовательность фактических параметров, их количество и их тип должны точно совпадать с формальными параметрами подпрограммы. Значения фактических параметров на момент обращения к подпрограмме должны быть определены.
Передача параметров по ссылке и по значению
При передаче параметров по значению в подпрограмме создаются переменные, в соответствии с объявлениями в заголовке. Эти переменные существуют только на время работы подпрограммы.
При вызове процедуры фактические параметры, передаваемые по значению, могут быть записаны как константы, переменные или выражения.
В начале выполнения подпрограммы копии значений этих констант, переменных и выражений присваиваются временным переменным подпрограммы. Когда подпрограмма завершается, используемые в ней переменные не сохраняются. Это значит, что передача параметров по значению имеет смысл для передачи данных в подпрограмму, но не для передачи полученных результатов из нее.
Пример описания формальных параметров, передаваемых по значению:
Procedure primer (x, y: integer; z: real);
При передаче параметров по ссылке основная программа передает в подпрограмму не значение переменной, а ссылку на нее, следовательно, память под передаваемую по ссылке переменную не отводится. Подпрограмма, производя некоторые действия с переменной, принявшей ссылку на место памяти основной программы, где расположена переменная, в действительности производит действия с переменной основной программы. Поэтому после завершения процедуры изменения, совершенные с переменной основной программы, сохраняются. Этот механизм используется для получения результатов от подпрограммы.
При вызове процедуры параметры, передаваемые по ссылке, не могут быть заданы ни константой, ни выражением, т. к. они не имеют адреса для передачи. Параметры, передаваемые по ссылке, при вызове процедуры задаются переменной.
В заголовке процедуры список параметров, принимающих значения по ссылке, начинается служебным словом var.
Пример описания формальных параметров, передаваемых по ссылке:
Procedure primer1 (var k, l: byte; var d: integer);
Решение задачи с использованием подпрограмм
Задача: треугольник задан координатами своих вершин. Составить программу вычисления его площади.
Решение этой задачи удобно представить в виде следующих этапов:
1. Ввод последовательно координат трех вершин: x1, y1, x2, y2, x3, y3.
2. Вычисление длины первой стороны
3. Вычисление длины второй стороны
4. Вычисление длины третьей стороны
5. Вычисление площади по формуле Герона
6. Вывод на экран полученного значения площади.
Из приведенного выше плана решения задачи видно, что в пунктах 2-4 будут выполняться одни и те же действия только с разными координатами вершин. Удобно оформить эти вычисления в виде подпрограммы. Так как длина стороны – это вещественное число, то ее можно вычислять с помощью подпрограммы-функции. При этом для начала можно продумать лишь название функции, ее параметры и тип результата, а детали реализации записать чуть позже. Иначе говоря, следует пока написать «пустую» функцию, чтобы понять для начала ход решения основной задачи.
Итак, пусть наша функция называется storona. Для вычисления стороны треугольника нужно передать в подпрограмму координаты двух вершин. Пусть формальные параметры называются a1, b1, a2, b2 и имеют вещественный тип (real). Тип результата функции также будет вещественным.
Тогда начальный вариант программы будет выглядеть следующим образом:
Program treugolnik;
Var
S, a, b, c, p: real; {описываем переменные для вычисления площади
(S), сторон (a, b, c), периметра (p)}
X1, y1, x2, y2, x3, y3: real; {описываем переменные – координаты
вершин}
Function storona (a1, b1, a2, b2: real): real; {заголовок функции, в
которой будет вычисляться длина стороны треугольника}
Begin
End; {конец функции. Пока тело функции пусто, детали вычислений
запишем чуть позже. Зато к этой функции уже можно
обращаться из основной программы}
Begin {начало основной программы}
Writeln (‘Введите координаты первой вершины’);
Readln (x1, y1);
Writeln (‘Введите координаты второй вершины’);
Readln (x2, y2);
Writeln (‘Введите координаты третьей вершины’);
Readln (x3, y3);
A:= storona (x1, y1, x2, y2); {вычисляем длину первой стороны}
B:= storona (x2, y2, x3, y3); {вычисляем длину второй стороны}
C:= storona (x3, y3, x1, y1); {вычисляем длину третьей стороны}
P:= a+ b+ c; {вычисляем периметр}
S:= sqrt(p/2*(p/2-a)*(p/2-b)*(p/2-c));
Writeln (‘площадь треугольника равна:’, s);
End.
После того, как в основной программе выделены подзадачи, продуман план решения, решен основной вопрос, какие данные передаются в подпрограмму и что должно быть получено в результате ее работы, можно детально продумать алгоритм работы подпрограммы.
Для вычисления длины стороны в функции можно описать локальную (определенную только внутри функции) переменную вещественного типа, пусть она называется d.
Function storona (a1, b1, a2, b2: real): real;
Var d: real; {описание переменной, которая будет использоваться
исключительно внутри функции}
Begin
D:= sqrt(sqr(a1- a2) +sqr(b1-b2));
Storona:= d; {обязательный в теле функции оператор присваивания,
когда с именем функции связывается вычисленное значение}
End;
Вот теперь наша задача полностью решена.
Эту же задачу можно решить с использованием подпрограммы-процедуры. Начинать решение задачи рекомендуется так же, как и в предыдущем случае. Сначала определить название процедуры, передаваемые в нее параметры, способ получения результата из процедуры. Тело процедуры пока можно сделать пустым. Затем написать основную программу, в которой определить точки обращения к процедуре и значения фактических параметров.
Пусть наша процедура называется dlina. Для вычисления длины стороны треугольника в процедуру необходимо передать значения координат двух вершин, поэтому в списке формальных параметров в заголовке процедуры нужно описать 4 параметра-значения вещественного типа: a1, b1, a2, b2. Для передачи полученного значения в основную программу нужно описать в заголовке параметр-переменную, принимающий ссылку, назовем этот параметр d (необходимо помнить, что в заголовке процедуры перед этим параметром ставится служебное слово var).
Тогда начальный вариант программы будет выглядеть следующим образом:
Program treugolnik;
Var
S, a, b, c, p: real; {описываем переменные для вычисления площади
(S), сторон (a, b, c), периметра (p)}
X1, y1, x2, y2, x3, y3: real; {описываем переменные – координаты
вершин}
Procedure dlina (a1, b1, a2, b2: real; var d: real); {заголовок процедуры,
в которой будет вычисляться длина стороны треугольника}
Begin
End; {конец процедуры. Пока тело процедуры пусто, детали
вычислений запишем чуть позже. Зато к этой процедуре уже
можно обращаться из основной программы}
Begin {начало основной программы}
Writeln (‘Введите координаты первой вершины’);
Readln (x1, y1);
Writeln (‘Введите координаты второй вершины’);
Readln (x2, y2);
Writeln (‘Введите координаты третьей вершины’);
Readln (x3, y3);
dlina (x1, y1, x2, y2, a); {вычисляем длину первой стороны, при этом
x1, y1, x2, y2 будут передавать копии своих
значений в процедуру, а переменная a будет
принимать полученный результат}
dlina (x2, y2, x3, y3, b); {вычисляем длину второй стороны, при этом
x2, y2, x3, y3 будут передавать копии своих
значений в процедуру, а переменная b будет
принимать полученный результат }
dlina (x3, y3, x1, y1, c); {вычисляем длину третьей стороны, при этом
x3, y3, x1, y1 будут передавать копии своих
значений в процедуру, а переменная c будет
принимать полученный результат}
P:= a+ b+ c; {вычисляем периметр}
S:= sqrt(p/2*(p/2-a)*(p/2-b)*(p/2-c));
Writeln (‘площадь треугольника равна:’, s);
End.
Обратите еще раз внимание на различие в вызове подпрограммы-функции и подпрограммы-процедуры. Обращение к функции использовалось в операторе присваивания как выражение, а обращение к процедуре – это оператор.
Теперь можно наполнить содержанием саму процедуру:
Procedure dlina (a1, b1, a2, b2: real; var d: real);
Begin
D:= sqrt(sqr(a1- a2) +sqr(b1-b2));
End;
Область действия переменных, взаимодействие блоков
В программе может быть описано сколько угодно блоков (подпрограмм). Внутри этих блоков могут быть описания других блоков. Важно знать, откуда и какие блоки могут быть вызваны.
«Блок – это дом с зеркальными стенами. Изнутри видно все, что делается снаружи. Внутрь заглянуть нельзя».
Рассмотрим программу с процедурами различного уровня вложенности. Мы получим иерархию описаний:
Program osnovn;
Procedure A;
Procedure A1;
……….
Begin…… end; {A1}
Procedure A2;
………..
begin ……end; {A2}
begin
………
end; {A}
procedure B;
procedure B1;
………
begin ……. end; {B1}
procedure B2;
procedure B21;
………..
begin ..end; {B21}
begin …….. end; {B2}
begin …………end; {B}
begin {начало основной программы}
………end. {конец основной программы}
Подпрограмма любого уровня имеет обычно описание множества констант, переменных, типов и вложенных подпрограмм низшего уровня.
Считается, что все имена, описанные внутри подпрограммы, локализуются в ней, т. е. они как бы «невидимы» снаружи подпрограммы. Таким образом, со стороны операторов, использующих обращение к подпрограмме, она (подпрограмма) трактуется как «черный ящик», в котором реализуется тот или иной алгоритм. Все детали этой реализации скрыты от глаз пользователя и поэтому недоступны ему.
В рассмотренном выше примере из основной программы можно обратиться к подпрограммам А и В, но нельзя вызвать ни одну из вложенных в них процедур А1, А2, В1, В2 и В21.
При входе в подпрограмму низшего уровня становятся доступными не только описанные в ней имена, но и сохраняется доступ ко всем именам верхнего уровня. Так, например, из подпрограммы В21 мы можем вызвать подпрограмму А, использовать имена, объявленные в основной программе, в подпрограмме В, и обратиться к ним.
При взаимодействии подпрограмм одного уровня вступает в действие основное правило Паскаля: любая подпрограмма перед использованием должна быть описана. Поэтому из процедуры В можно вызвать процедуру А. Из процедуры А вызвать В невозможно (точнее такая возможность появляется только с использованием опережающего описания).
Продолжая образное сравнение, подпрограмму можно уподобить ящику с непрозрачными стенками и дном, но с полупрозрачной крышей: из подпрограммы можно «смотреть» только вверх и нельзя вниз; т. е. подпрограмме доступны только те объекты верхнего уровня, которые описаны до описания данной подпрограммы. Эти объекты называются глобальными по отношению к подпрограмме.
Имена локальных переменных могут совпадать с именами глобальных переменных. Если в подпрограмме описана (локализована) переменная с тем же именем, что и глобальная, то в этом случае на время действия подпрограммы локальная переменная «закрывает» глобальную и делает ее недоступной, т. е. значение глобальной переменной на время действия подпрограммы «замораживается».
Память для локальных, т. е. описанных в подпрограмме, переменных выделяется на время действия подпрограммы в специальной области, называемой стеком. При завершении подпрограммы память освобождается, поэтому все внутренние результаты работы подпрограммы не сохраняются от одного обращения к другому.
Рекурсия
Подпрограммы в Паскале могут обращаться сами к себе. Такое обращение называется рекурсией.
Для того чтобы такое обращение не было бесконечным, в тексте подпрограммы должно быть условие, по достижению которого дальнейшее обращение к подпрограмме не происходит.
Пример.
Рассмотрим математическую головоломку из книги Ж. Арсака «Программирование игр и головоломок».
Построим последовательность чисел следующим образом: возьмем целое число i>1. Следующий член последовательности равен i/2, если i четное, и 3i+1, если i нечетное. Если i=1, то последовательность останавливается.
Математически конечность последовательности независимо от начального i не доказана, но на практике последовательность останавливается всегда.
Применение рекурсии позволило решить задачу без использования циклов, как в основной программе, так и в процедуре.
Program Arsac;
Var first: word;
Procedure posledov (i: word);
Begin
Writeln (i);
If i=1 then exit;
If odd(i) then posledov (3*i+1) else posledov (i div 2);
End;
Begin
Write (‘введите первое значение’); readln (first);
Posledov (first);
Readln;
End.
Программист разрабатывает программу, сводя исходную задачу к более простым. Среди этих задач может оказаться и первоначальная, но в упрощенной форме. Например, для вычисления F(N) может понадобиться вычислить F(N-1). Иными словами, частью алгоритма вычисления функции будет вычисление этой же функции.
Алгоритм, который является своей собственной частью, называется рекурсивным. Часто в основе такого алгоритма лежит рекурсивное определение.
Пример.
N! = (N-1)!*N, если N=0, то N!= 1
Любое рекурсивное определение состоит из двух частей. Одна часть определяет понятие через него же, другая часть – через иные понятия.
Пример.
2n= 2n-1*2, если n=0, то 2n= 1
Процедура является рекурсивной, если она обращается сама к себе прямо или косвенно (через другие процедуры).
![]() |
Заметим, что при косвенном обращении все процедуры в цепочке – рекурсивные.
Все сказанное о процедурах целиком относится и к функциям.
Пример рекурсивной функции вычисления факториала:
Function factorial(N: integer) : longint;
Begin
If N= 0 then
Factorial := 1
Else Factorial := factorial(N-1) * N
End;
Рекурсия изнутри
Это может показаться удивительным, но самовызов процедуры ничем не отличается от вызова другой процедуры. Что происходит, если одна процедура вызывает другую? В общих чертах следующее:
1) в памяти размещаются параметры, передаваемые процедуре (но не параметры-переменные!);
2) в другом месте памяти сохраняются значения внутренних переменных вызывающей процедуры;
3) запоминается адрес возврата в вызывающую процедуру;
4) управление передается вызванной процедуре.
Если процедуру вызвать повторно из другой процедуры или из нее самой, будет выполняться тот же код, но работать он будет с другими значениями параметров и внутренних переменных. Это и дает возможность рекурсии.
Пусть рекурсивная процедура Power(X, N,Y) возводит число X в степень N и возвращает результат Y.
Procedure Power (X: real; N: integer; var Y: real);
Begin
If N=0 then
Y := 1
Else Begin Power(X, N-1,Y);
Y:= Y*X;
End;
End;
Проследим за состоянием памяти в процессе выполнения вызова данной процедуры Power(5,3,Y). Стрелка «®» означает вход в процедуру, стрелка «» означает выход из нее.
Число копий переменных, одновременно находящихся в памяти, называется глубиной рекурсии. Как видно из примера, сначала она растет, а затем сокращается.
Лабораторная работа №4
Тема: Процедуры и функции
Приступая к решению задач, следует вспомнить, что:
· Для передачи данных в подпрограмму следует использовать параметры. Глобальные переменные применять не рекомендуется;
· При написании подпрограммы-функции среди ее инструкций должен быть хотя бы один оператор присваивания вида <имя_функции>:= выражение;
· Тип каждого фактического параметра (константы, выражения или переменной) при вызове подпрограммы должен совпадать с типом формального параметра, указанного в заголовке подпрограммы;
· Если в заголовке подпрограммы перед именем формального параметра не стоит слово var, то при вызове подпрограммы в качестве фактического параметра можно использовать константу, переменную или выражение соответствующего типа;
· Если параметр подпрограммы используется для возврата результата в основную программу, то в заголовке перед ним ставится слово var;
· Если в заголовке подпрограммы перед именем формального параметра стоит слово var, то при вызове подпрограммы в качестве фактического параметра можно использовать только переменную соответствующего типа;
Задание 1
Указание к выполнению: задание выполняется в тетради и предназначено для отработки навыков правильного описания процедур и функций и алгоритмов, реализованных в них. Вы можете для выполнения задания №1 написать программу на компьютере и проверить правильность работы Вашей процедуры/функции, в этом случае в основной программе должны быть реализованы ввод исходных данных и вызов процедуры/функции.
Вариант 1. Написать подпрограмму, которая вычисляет объем цилиндра. Параметрами функции должны быть радиус и высота цилиндра.
Вариант 2. Написать подпрограмму, которая возвращает максимальную из двух обыкновенных дробей вида
и
.
Вариант 3. Написать подпрограмму, которая сравнивает два числа и возвращает результат сравнения в виде одного из знаков: < , > или =.
Вариант 4. Написать подпрограмму, вычисляющую натуральную степень числа.
Вариант 5. Написать подпрограмму, вычисляющую целую отрицательную степень числа.
Вариант 6. Написать подпрограмму, вычисляющую наибольший общий делитель двух натуральных чисел.
Вариант 7. Написать подпрограмму, вычисляющую проценты от числа.
Вариант 8. Написать подпрограмму, выводящую на экран строку, состоящую из звездочек. Количество звездочек является параметром подпрограммы.
Вариант 9. Написать подпрограмму, вычисляющую наименьшее общее кратное двух натуральных чисел.
Вариант 10. Написать подпрограмму, выводящую на экран строку из одинаковых символов. Количество символов в строке и выводимый символ – параметры подпрограммы.
Вариант 11. Написать подпрограмму, вычисляющую значение выражения
, где x, p, q – параметры подпрограммы.
Вариант 12. Написать подпрограмму, вычисляющую минимальную из двух обыкновенных дробей вида
и
.
Вариант 13. Написать подпрограмму, вычисляющую сумму делителей данного натурального числа.
Вариант 14. Написать подпрограмму, вычисляющую площадь кольца. Радиус внешней и внутренней окружностей – параметры подпрограммы.
Вариант 15. Написать подпрограмму, вычисляющую функцию sign(x): 
Задание 2
Указание к выполнению: составить программу решения задачи с использованием подпрограмм.
Вариант 1. Определить, в каком из данных двух целых чисел больше цифр.
Вариант 2. Два натуральных числа называются «дружественными», если каждое из них равно сумме всех делителей (кроме самого числа) другого (например, числа 220 и 284). Найти все пары дружественных чисел, которые не больше заданного числа N.
Вариант 3. Два простых числа называются «близнецами», если они отличаются друг от друга на 2 (например, 41 и 43). Напечатать все пары «близнецов» из отрезка [n, 2n], где n – заданное натуральное число большее 2.
Вариант 4. Написать программу вычисления суммы
для заданного n. Дробь
должна быть несократимой (p, q – натуральные).
Вариант 5. Натуральное число, в записи которого n цифр, называется числом Армстронга. Если сумма его цифр, возведенная в степень n, равна самому числу. Найти все такие числа от 1 до k.
Вариант 6. Найти все натуральные числа, не превосходящие заданного n, которые делятся на каждую из своих цифр.
Вариант 7. Составить программу для нахождения числа из интервала [M, N], имеющего наибольшее количество делителей.
Вариант 8. Для последовательности
,
составить программу, вычисляющую k-й член последовательности в виде обыкновенной несократимой дроби. Например,
,
.
Вариант 9. Написать программу, которая находит и выводит на печать все четырехзначные числа вида
, для которых выполняется условие
.
Вариант 10. На части катушки с автобусными билетами номера шестизначные. Составить программу, определяющую количество счастливых билетов на катушке, если меньший номер билета – N, больший – M (билет является счастливым, если сумма первых трех его цифр равна сумме последних трех цифр).
Вариант 11. Написать программу, определяющую сумму n-значных чисел, содержащих только нечетные цифры.
Вариант 12. Составить программу разложения числа на простые множители. Например, 200=23× 52.
Вариант 13. Из заданного числа вычли сумму его цифр. Из результата вновь вычли сумму его цифр и т. д. Через сколько таких действий получится ноль?
Вариант 14. Дано четное число n>2. Проверить для него гипотезу Гольдбаха: каждое четное n представляется в виде суммы двух простых чисел.
Вариант 15. Написать программу вычисления суммы
для заданного n. Дробь
должна быть несократимой (p, q – натуральные).
Задание 3
Указания к выполнению: составить программу решения задачи с использованием функций нахождения факториала и числа сочетаний из n по m
.
Вариант 1. Вычислить выражение для заданных n, x: 
Вариант 2. Вычислить выражение для заданных n, m, p, k:
.
Вариант 3. Вычислить выражение для заданных n, k: 
Вариант 4. Вычислить выражение для заданного k: 
Вариант 5. Вычислить выражение для заданных n, x, y: ![]()
Вариант 6. Вычислить выражение для заданного n: ![]()
Вариант 7. Вычислить выражение для заданных n, x: 
Вариант 8. Вычислить выражение для заданного k: ![]()
Вариант 9. Вычислить выражение для заданных n, x, a: ![]()
Вариант 10. Вычислить выражение для заданных n, x: 
Вариант 11. Вычислить выражение для заданного n: 
Вариант 12. Вычислить выражение для заданных x, n: 
Вариант 13. Вычислить выражение для заданного n: 
Вариант 14. Вычислить выражение для заданных n, x: 
Вариант 15. Вычислить выражение для заданных n, x, a: ![]()
Контрольные вопросы по данной теме
1. Преимущества процедурного программирования
2. Подпрограммы и пошаговая детализация
3. Структура подпрограмм на Паскале. Подпрограммы-процедуры и подпрограммы-функции
4. Формальные и фактические параметры. Передача параметров по значению и по ссылке
5. Область действия переменных, локальные и глобальные переменные. Взаимодействие блоков
6. Рекурсивные подпрограммы
7. *Внешние подпрограммы
8. *Размещение параметров в стеке. Активная точка программы
Тема: Массивы
Понятие структуры
До сих пор мы работали с простыми типами данных – логический (boolean), целый (integer, word, byte, longint), вещественный (real), символьный (char). Любой алгоритм можно запрограммировать с помощью этих четырех базовых типов. Но для обработки информации о многообразном реальном мире требуются данные, имеющие более сложное строение. Такие сложные конструкции, основанные на простейших скалярных типах, называются структурами. Структура – некоторый составной тип данных, составленный из базовых скалярных. Если структура не изменяет своего строения на протяжении всего выполнения программы, в которой она описана, то такую структуру называют статической.
Массив – однородная совокупность элементов
Самой распространенной структурой, реализованной практически во всех языках программирования, является массив.
Массивы состоят из ограниченного числа компонент, причем все компоненты массива имеют один и тот же тип, называемый базовым. Структура массива всегда однородна. Массив может состоять из элементов типа integer, real или char, либо других однотипных элементов. Из этого, правда, не следует делать вывод, что компоненты массива могут иметь только скалярный тип.
Другая особенность массива состоит в том, что к любой его компоненте можно обращаться произвольным образом. Что это значит? Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу).
Индекс массива
Номер элемента массива называется индексом. Индекс – это значение порядкового типа, определенного, как тип индекса данного массива. Очень часто это целочисленный тип (integer, word или byte), но может быть и логический и символьный.
Описание массива в Паскале. В языке Паскаль тип массива задается с использованием специального слова array (англ. – массив), и его объявление в программе выглядит следующим образом:
Type <имя_типа>= array [ I ] of T;
где I – тип индекса массива, T – тип его элементов.
Можно описывать сразу переменные типа массив, т. е. в разделе описания переменных:
Var a, b: array [ I ] of T;
Обычно тип индекса характеризуется некоторым диапазоном значений любого порядкового типа : I1 ..In. Например, индексы могут изменяться в диапазоне 1..20 или ‘a’..’n’.
При этом длину массива характеризует выражение:
ord(In)-ord(I1)+1.
Вот, например, объявление двух типов: vector в виде массива из 10 целых чисел и stroka в виде массива из 256 символов:
Type
Vector=array [1..10] of integer;
Stroka=array [0..255] of char;
С помощью индекса массива можно обращаться к отдельным элементам любого массива, как к обычной переменной: можно получать значение этого элемента, отдельно присваивать ему значение, использовать его в выражениях.
Опишем переменные типа vector и stroka:
Var a: vector;
c: stroka;
далее в программе мы можем обращаться к отдельным элементам массива a или c. Например, a[5]:=23; c[1]:=’w’; a[7]:=a[5]*2; writeln(c[1], c[3]).
Вычисление индекса массива
Индекс массива не обязательно задавать в явном виде. В качестве индекса массива можно использовать переменную или выражение, соответствующее индексному типу. Иначе говоря, индексы можно вычислять.
Этот механизм – весьма мощное средство программирования. Но он порождает распространенную ошибку: результат вычислений может оказаться за пределами интервала допустимых значений индекса, то есть будет произведена попытка обратиться к элементу, которого не существует. Эта типичная ошибка называется «выход за пределы массива».
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 |



