Основы алгоритмизации и программирования

Содержание

Слайд 2

Алгоритм решения задачи проектируется путем декомпозиции всей задачи в отдельные подзадачи.

Алгоритм решения задачи проектируется путем декомпозиции всей задачи в отдельные подзадачи.

Обычно подзадачи реализуются в виде подпрограмм.
Весьма поэтичное объяснение понятия подпрограмма дал В.Ф.Очков:
"Подпрограмма - это припев песни, который поют несколько раз, а в текстах песен печатают только один раз".
В самом деле, если есть необходимость многократно совершать одни и те же действия, то вполне логично описать их единожды, а потом лишь ставить на них ссылку.
Именно такой смысл имеет использование подпрограмм.

1. Понятие подпрограммы

Слайд 3

Подпрограмма - это в первую очередь программа. Со всеми полагающимися полноценной

Подпрограмма - это в первую очередь программа. Со всеми полагающимися полноценной

программе атрибутами:
именем,
разделами описания меток (label),
разделами описания констант (const),
разделами описания типов (type),
разделами описания переменных (var)
и даже со своими (вложенными) функциями и процедурами.
Слайд 4

Т.о., подпрограмма - это последовательность операторов, которые определены и записаны только

Т.о., подпрограмма - это последовательность операторов, которые определены и записаны только

в одном месте программы, однако их можно вызвать для выполнения из одной или нескольких точек программы.
Программа, содержащая подпрограммы, называется главной (головной).
Каждая подпрограмма определяется уникальным именем.

Определение подпрограммы

Слайд 5

В языке Pascal имеется два вида подпрограмм: процедуры и функции. Виды

В языке Pascal имеется два вида подпрограмм:
процедуры
и функции.

Виды

подпрограмм

Описывая их общие черты, мы будем употреблять обобщенный термин "подпрограмма".
Если же в тексте встретятся слова "процедура" или "функция", то это будет означать, что излагаемая информация свойственна только одному конкретному виду подпрограмм:
либо только процедурам,
либо только функциям.

Слайд 6

При использовании процедур или функций программа должна содержать текст процедуры или

При использовании процедур или функций программа должна содержать текст процедуры или

функции и обращение к процедуре или функции.
Работа с процедурами и функциями состоит из двух частей:
описания процедуры или функции в разделе описаний процедур и функций программы;
вызова ее на исполнение (передача управления компьютером) с одновременной передачей исходных данных, необходимых для работы процедуры или функции.
По окончании работы процедуры или функции управление возвращается за точку вызова (к следующему после вызова оператору головной программы).
Слайд 7

2. Объявление и описание подпрограммы

2. Объявление и описание подпрограммы

Слайд 8

Функция – это подпрограмма, определяющая одно – единственное скалярное или ссылочное

Функция – это подпрограмма, определяющая одно – единственное скалярное или ссылочное

значение, используемое при вычислении выражения.
Функции объявляются следующим образом:

Объявление функции и процедуры

function <имя_функции> (<список_параметров>): <тип_результата>;

Процедуры следует объявлять так:

procedure <имя_процедуры> (<список_параметров>);

Слайд 9

© С.В.Кухта, 2009 Описание подпрограммы должно идти после ее объявления. Оно

© С.В.Кухта, 2009

Описание подпрограммы должно идти после ее объявления. Оно осуществляется

по следующей схеме (единой для процедур и функций):

Описание подпрограммы

uses <имена_подключаемых_модулей>;
label <список_меток>;
const <имя_константы> = <значение_константы>;
type <имя_типа> = <определение_типа>;
var <имя_переменной> : <тип_переменной>;
procedure <имя_процедуры>
<описание_процедуры>
function <имя_функции>
<описание_функции>;
Вegin {начало тела подпрограммы}
<операторы>
End. (* конец тела подпрограммы *)

Слайд 10

Описания двух различных подпрограмм не могут пересекаться: каждый блок должен быть

Описания двух различных подпрограмм не могут пересекаться: каждый блок должен быть

логически законченным.
Однако внутри любой подпрограммы (она ведь тоже является программой) могут быть описаны другие процедуры или функции - вложенные. На них распространяются все те же правила объявления и описания подпрограмм.

Описание подпрограммы

Описание подпрограммы: пример

procedure err(c:byte; s:string);
var zz: byte;
begin
if c=0 then writeln(s)
else writeln('Ошибка!')
end;

Слайд 11

В заголовке подпрограммы (в ее объявлении) указывается список формальных параметров переменных,

В заголовке подпрограммы (в ее объявлении) указывается список формальных параметров переменных,

которые принимают значения, передаваемые в подпрограмму извне во время ее вызова.
Для краткости мы далее будем опускать слово "формальный".
Поскольку внутри подпрограммы параметры рассматриваются как переменные с начальным значением, то имена локальных переменных, описываемые в разделе var (внутреннем для подпрограммы), не могут совпадать с именами параметров этой же подпрограммы.
Подробнее о локальных и глобальных переменных будет рассказано далее.

Список параметров

Слайд 12

В этом случае подпрограмма не получает никаких переменных "извне". Однако отсутствие

В этом случае подпрограмма не получает никаких переменных "извне".
Однако отсутствие

параметров и, как следствие, передаваемых извне значений, вовсе не означает, что при каждом вызове подпрограмма будет выполнять абсолютно одинаковые действия.
Поскольку глобальные переменные видны изнутри любой подпрограммы, их значения могут неявно изменять внутреннее состояние подпрограмм. Это очень нежелательный эффект.

Список параметров

procedure proc1;
function func1: boolean;

Список параметров может и вовсе отсутствовать:

Слайд 13

О возможных способах подстановки значений в параметры ( , var, const)

О возможных способах подстановки значений в параметры (<пустой>, var, const) рассказано

в разделе "Способы подстановки аргументов".
Если способ подстановки и тип нескольких параметров совпадают, описание этих параметров можно объединить:

Список параметров

[<способ_подстановки>]<имя_параметра>:<тип>;

Если же параметры имеются, то каждый из них описывается по следующему шаблону:

[<способ_подстановки>]<имя1>,...,<имяN>: <тип>;

Пример описания всех трех способов подстановки:

function func2(a,b:byte;
var x,y,z:real; const c:char)real;

Слайд 14

вызовет ошибку уже на этапе компиляции. Для того чтобы обойти это

вызовет ошибку уже на этапе компиляции.
Для того чтобы обойти это

ограничение, составной тип данных нужно описать в разделе type, а при объявлении подпрограммы воспользоваться именем этого типа:

Список параметров

procedure proc2(a: array[1..100] of char);

В заголовке подпрограммы можно указывать только простые (не составные) типы данных. Следовательно, попытка записать

type arr = array[1..100] of char;
procedure proc2(a: arr);
function func2(var x: string): arr;

Слайд 15

Основное различие между функциями и процедурами состоит в количестве возвращаемых ими

Основное различие между функциями и процедурами состоит в количестве возвращаемых ими

значений.
Любая функция, завершив свою работу, должна вернуть основной программе (или другой вызвавшей ее подпрограмме) ровно одно значение, причем его тип нужно явным образом указать уже при объявлении функции.
Для возвращения результата применяется специальная "переменная", имеющая имя, совпадающее с именем самой функции. Оператор присваивания значения этой "переменной" обязательно должен встречаться в теле функции хотя бы один раз.

Возвращаемые значения

Слайд 16

© С.В.Кухта, 2009 Например: Возвращаемые значения function min(a, b: integer): integer;

© С.В.Кухта, 2009

Например:

Возвращаемые значения

function min(a, b: integer): integer;
begin

if a>b then min:= b
else min:= a
end;
Слайд 17

В отличие от функций, процедуры вообще не возвращают (явным образом) никаких

В отличие от функций, процедуры вообще не возвращают (явным образом) никаких

значений.
О том, как все-таки получить результаты работы процедуры, вы узнаете из пункта "Параметр-переменная".

Возвращаемые значения

Слайд 18

Любая подпрограмма может быть вызвана не только из основного тела программы,

Любая подпрограмма может быть вызвана не только из основного тела программы,

но и из любой другой подпрограммы, объявленной позже нее.
При вызове в подпрограмму передаются фактические параметры или аргументы (в круглых скобках после имени подпрограммы, разделенные запятыми):

Вызов подпрограмм

<имя_подпрограммы>(<список_аргументов>)

Аргументами могут быть переменные, константы и выражения, включающие в себя вызовы функций.

Слайд 19

Вызов подпрограмм

Вызов подпрограмм

Слайд 20

Вызов функции может стать равноправным участником арифметического выражения. Например: c:= min(a,

Вызов функции может стать равноправным участником арифметического выражения.
Например:

c:= min(a,

a*2);
if min(z, min(x, y))= 0 then ...;

Вызов подпрограмм

Слайд 21

Процедура же ничего не возвращает явным образом, поэтому ее вызов является

Процедура же ничего не возвращает явным образом, поэтому ее вызов является

отдельным оператором в программе.
Например:

err(res, 'Привет!');

Вызов подпрограмм

Слайд 22

3. Способы подстановки аргументов

3. Способы подстановки аргументов

Слайд 23

Как уже упоминалось выше, при вызове подпрограммы подстановка значений аргументов в

Как уже упоминалось выше, при вызове подпрограммы подстановка значений аргументов в

параметры производится в соответствии с правилами, указанными в атрибуте <способ_подстановки>.
Рассмотрим три различных значения этого атрибута:
<пустой>;
var;
const.
Слайд 24

В списке параметров подпрограммы перед параметром-значением служебное слово отсутствует. Например, функция

В списке параметров подпрограммы перед параметром-значением служебное слово отсутствует.
Например, функция func3

имеет три параметра-значения:
function func3(x:real; k:integer; flag:boolean):real;
При вызове подпрограммы параметру-значению может соответствовать аргумент, являющийся
выражением,
переменной
или константой.
Например:
dlina:= func3(shirina/2, min(a shl 1, ord('y')), true)+0.5;
Для типов данных здесь не обязательно строгое совпадение (эквивалентность), достаточно и совместимости по присваиванию (см. пункт 2).

Параметр-значение: описание

Слайд 25

В области памяти, выделяемой для работы вызываемой подпрограммы, создается переменная с

В области памяти, выделяемой для работы вызываемой подпрограммы, создается переменная с

именем
<имя_подпрограммы>.<имя_параметра>,
и в эту переменную записывается значение переданного в соответствующий параметр аргумента.
Дальнейшие действия, производимые подпрограммой, выполняются именно над этой новой переменной. Значение же входного аргумента не затрагивается.
Следовательно, после окончания работы подпрограммы, когда весь ее временный контекст будет уничтожен, значение аргумента останется точно таким же, каким оно было на момент вызова подпрограммы.

Параметр-значение: механизм передачи значения

Слайд 26

В качестве примера рассмотрим последовательность действий, выполняемых при передаче аргументов 1+а/2,

В качестве примера рассмотрим последовательность действий, выполняемых при передаче аргументов
1+а/2,

а и true
в описанную выше функцию func3.
Пусть а - переменная, имеющая тип byte, тогда значение выражения 1+a/2 будет иметь тип real, а true и вовсе является константой (неименованной).

Параметр-значение: механизм передачи значения

Слайд 27

Итак, при вызове func3(1+a/2,a,true) будут выполнены следующие действия: создать временные переменные

Итак, при вызове func3(1+a/2,a,true) будут выполнены следующие действия:
создать временные переменные func3.x,

func3.k, func3.flag;
вычислить значение выражения 1+а/2 и записать его в переменную func3.x;
записать в переменную func3.k значение переменной а;
записать в переменную func3.flag значение константы true;
произвести действия, описанные в теле функции;
уничтожить все временные переменные, в том числе func3.x, func3.k, func3.flag.
Уже видно, что значения аргументов не изменятся.

Параметр-значение: механизм передачи значения

function func3(x:real; k:integer; flag:boolean):real;

Слайд 28

В списке параметров подпрограммы перед параметром-переменной ставится служебное слово var. Например,

В списке параметров подпрограммы перед параметром-переменной ставится служебное слово var.
Например,

процедура proc3 имеет три параметра-переменные и один параметр-значение:
procedure proc3(var x,y:real; var k:integer; flag:boolean);
При вызове подпрограммы параметру-переменной может соответствовать только аргумент-переменная; константы и выражения запрещены.
Кроме того, тип аргумента и тип параметра-переменной должны быть эквивалентными (см. Тему 2).

Параметр-переменная: описание

Слайд 29

В отличие от параметра-значения, для параметра-переменной не создается копии при вызове

В отличие от параметра-значения, для параметра-переменной не создается копии при вызове

подпрограммы. Вместо этого в работе подпрограммы участвует та самая переменная, которая послужила аргументом.
Понятно, что если ее значение изменится в процессе работы подпрограммы, то это изменение сохранится и после того, как будет уничтожен контекст подпрограммы.

Параметр-переменная: механизм передачи значения

Слайд 30

Понятно опять же и ограничение на аргументы, которые должны соответствовать параметрам-переменным:

Понятно опять же и ограничение на аргументы, которые должны соответствовать параметрам-переменным:


ни константа, ни выражение не смогут сохранить изменения, внесенные в процессе работы подпрограммы.

Параметр-переменная: механизм передачи значения

Замечание: Для экономии памяти в параметр-переменную можно передавать и такую переменную, изменять значение которой не требуется. Если нужно передать в качестве аргумента массив, то лучше не создавать его копию, как это будет сделано при использовании параметра-значения, а использовать параметр-переменную.

Слайд 31

В списке параметров подпрограммы перед параметром-константой ставится служебное слово const. Например,

В списке параметров подпрограммы перед параметром-константой ставится служебное слово const.
Например, процедура

proc4 имеет один параметр-переменную и один параметр-константу:
procedure proc4(var k:integer;
const flag:boolean);
При вызове подпрограммы параметру-константе может соответствовать аргумент, являющийся
выражением,
переменной
или константой.

Параметр-константа: описание

Слайд 32

Во время выполнения подпрограммы соответствующая переменная считается обычной константой. Ограничением является

Во время выполнения подпрограммы соответствующая переменная считается обычной константой.
Ограничением является

то, что при вызове другой подпрограммы из тела текущей, параметр-константа не может быть подставлен в качестве аргумента в параметр-переменную.
Для типов данных здесь не обязательно строгое совпадение (эквивалентность), достаточно и совместимости по присваиванию (см. Тему 2).

Параметр-константа: описание

Слайд 33

В отличие от параметра-переменной, для параметра-константы создается копия при вызове подпрограммы. Параметр-константа: механизм передачи значения

В отличие от параметра-переменной, для параметра-константы создается копия при вызове подпрограммы.

Параметр-константа:

механизм передачи значения
Слайд 34

4. Области действия имен

4. Области действия имен

Слайд 35

Глобальные объекты - это типы данных, константы и переменные, объявленные в

Глобальные объекты - это типы данных, константы и переменные, объявленные в

начале программы до объявления любых подпрограмм.
Эти объекты будут видны во всей программе, в том числе и во всех ее подпрограммах.
Глобальные объекты существуют на протяжении всего времени работы программы.
Локальные объекты объявляются внутри какой-нибудь подпрограммы и "видны" только этой подпрограмме и тем подпрограммам, которые были объявлены как внутренние для нее.
Локальные объекты не существуют, пока не вызвана подпрограмма, в которой они объявлены, а также после завершения ее работы.

Разграничение контекстов

Слайд 36

Пример разграничения контекстов program prog; var a:byte; procedure pr1 (p:byte); var

Пример разграничения контекстов

program prog;
var a:byte;
procedure pr1 (p:byte);

var b:byte; {первый уровень вложенности}
function f (pp:byte);
var c:byte; {второй уровень вложенности}
begin
{здесь "видны" переменные a, b, c, p, pp}
end; {для f }
begin
{здесь "видны" переменные a, b, p}
end; {для pr1 }
var g:byte;
procedure pr2;
var d:byte; {первый уровень вложенности}
begin
{здесь видны переменные a, d, g}
end; {для pr2 }
begin
{тело программы; здесь "видны" переменные a, g}
end. {для prog }
Слайд 37

Поскольку глобальные переменные видны в контекстах всех блоков, то их значение

Поскольку глобальные переменные видны в контекстах всех блоков, то их значение

может быть изменено изнутри любой подпрограммы.
Этот эффект называется побочным, а его использование очень нежелательно, потому что может стать источником непонятных ошибок в программе.
Чтобы избежать побочного эффекта, необходимо строго следить за тем, чтобы подпрограммы изменяли только свои локальные переменные (в том числе и параметры-переменные).

Побочный эффект

Слайд 38

Вообще говоря, совпадения глобальных и локальных имен допустимы, поскольку к каждому

Вообще говоря, совпадения глобальных и локальных имен допустимы, поскольку к каждому

локальному имени неявно приписано имя той подпрограммы, в которой оно объявлено.
Таким образом, в приведенном выше примере фигурируют переменные
a, g, pr1.p, pr1.b, pr1.f.pp, pr1.f.c, pr2.d.

Совпадение имен

Слайд 39

Если имеются глобальная и локальная переменные с одинаковым именем, то изнутри

Если имеются глобальная и локальная переменные с одинаковым именем, то изнутри

подпрограммы к глобальной переменной можно обратиться, приписав к ней спереди имя программы:

Совпадение имен

<имя_программы>.<имя_глобальной_переменной>

Например, (локальной переменной здесь присваивается значение глобальной):

a:= prog.a;