Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Egorova1

.pdf
Скачиваний:
36
Добавлен:
14.02.2015
Размер:
1.67 Mб
Скачать

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

Переменная b - глобальная, так как объявлена в основной программе. Значит, все входящие в основную программу подпрограммы могут ссылаться к этой переменной b, но только в том случае, если в них нет другого объявления для идентификатора b.

То есть, если один и тот же идентификатор описан в блоке С и второй раз описан во вложенном в С блоке D, то эти два идентификатора соответствуют разным ячейкам памяти. Например, для основной программы a - целая переменная, но в процедуре есть своя переменная a типа char. Процедуре nest1 недоступна переменная a из основной программы.

Итак, все изменения, происходящие с переменной а в процедуре ("а:='!'), становятся несущественными при выходе из этой процедуры. Все изменения, происходящие с переменной b в процедуре, сохраняются и после выхода из нее. Поэтому оператор writeln в основной программе напечатает "0 101".

Пример 3. Если локальная и глобальная переменные принадлежат к одному и тому же сложному типу, то этот тип надо описать в разделе type основной программы, а сами переменные описать через этот общий тип.

program t1;

type ab=array [1..3] of real; var a:ab;

procedure Q; var b:ab;

M

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

program t2;

var a:array [1..3] of real; procedure Q;

var b:array[1..3] of real;

M

Вэтом случае программа "не считает", что переменные a и b принадлежат одному типу.

7.7.2Правила действия идентификаторов внутри программных блоков:

a)идентификатор определен только в пределах блока, в котором он описан;

b)один и тот же идентификатор может быть по разному определен в каждом отдельном блоке, в этом случае совпадающим идентификатором соответствуют разные области памяти; следует избегать подобного дублирования имен, так как. оно затрудняет чтение программы;

c)если в некотором операторе используется идентификатор, который описан в ряде вложенных блоков, то этому идентификатору соответствует описание самого внутреннего из вложенных блоков, содержащих данный оператор;

d)на уровне блока идентификатор может описываться лишь один раз.

7.8ПОБОЧНЫЕ ЭФФЕКТЫ

7.8.1 Побочные эффекты глобальных переменных

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

141

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

Пример. Рассмотрим следующую функцию F function F(x:real):real;

begin v:=v*x; F:=sqrt(v)+x

end;

Функция F изменяет глобальную величину v. Поэтому выражения "F(x)+v" и "v+F(x)", которые вычисляются в программе, содержащей эту функцию, дадут разный результат, так как в первом случае к F(x) прибавится уже измененное значение v.

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

7.8.2 Побочные эффекты функций

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

Пример. Найти 5-ый член последовательности: a n+1 =3a n -2; если a 1 =1.

Рассмотрим функцию FV, которая находит n-ый член последовательности. Предположим, что параметры функции FV: a - значение первого члена a 1 , n - номер искомого члена

последовательности, - описана как параметры-переменные. function FV(var a,n:integer):integer;

var i:integer; begin

for i:=1 to n do a:=3*a-2; FV:=a

end;

Использование параметров-переменных в данном случае приведет к ошибке. Так, после обращения к функции в виде b:=FV(1,5); будет "испорчена" константа 1, так как в ячейку памяти, содержащую 1 (первый фактический параметр), функция FV поместит результат - текущий член последовательности.

Вывод: функцию следует использовать для выполнения только одного действия: по значению аргументов вычислить результат. Как одно из следствий этого вывода: в функциях не следует использовать параметры-переменные.

7.8.3 Побочные эффекты параметра-переменной

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

Замечание. Но с целью экономии ресурсов ЭВМ, если исходными данными для ПП является массив или запись, то соответствующий параметр можно оформить как параметр-переменную (и следить, чтобы в ПП этот параметр не менялся). В этом случае

142

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

7.9 СОКРАЩЕНИЕ СПИСКА ПАРАМЕТРОВ

Для сокращения размеров списка параметров пользуются структурными данными: массивами, записями, файлами, множествами.

Пример. Рассмотрим модуль сложения двух комплексных чисел cadd (смотри п.7.2, пример 2).

procedure cadd(r1,i1, r2,i2 : real; var r3,i3 : real);

144444444424444444443

упроцедуры- 6 параметров

Количество параметров можно сократить, если комплексное число рассмотреть как

запись. Получим следующую программу.

 

Program cd;

 

 

type comp=record

(* Объявление типа comp *)

 

r:real; (* Вещественная часть *)

 

im:real; (* Коэффициент мнимой части *)

 

end;

 

 

var x,y,z:comp;

 

 

procedure cadd1 (a,b:comp; var c:comp); (* c=a+b

*)

begin

 

 

c.r:=a.r+b.r;

(* сумма вещественных частей

*)

c.im:=a.im+b.im; (* сумма коэф-тов мнимых частей*)

end;

 

 

begin (* Начало основной программы *)

 

...

 

 

cadd1(y,z,x);

(* Определение x=y+z *)

 

...

 

 

end.

 

 

7.10РЕКУРСИЯ. ДИРЕКТИВА FORWARD

Вязыке Паскаль процедуры и функции могут вызывать сами себя. Подпрограммы, которые вызывают сами себя, называются рекурсивными.

Пример 1. Необходимо выдать на печать в обратном порядке цифры целого положительного числа n. Рассмотрим следующую рекурсивную процедуру reverse.

procedure reverse (n:integer); begin

write (n mod 10); if (n div 10)<>0

then reverse (n div 10)

end;

Рассмотрим работу этой процедуры для числа n=153. Оператор write(n mod 10) напечатает остаток от деления 153 на 10, то есть цифру "3". Оператор if проверяет целую часть частного 153/10=15 на ноль. Если не ноль, то с этим значением (15) идет вновь обращение к процедуре reverse. Оператор write (n mod 10) дописывает на экран остаток от деления 15 на 10, то есть "5". Затем со значением 15/10=1 идет третье обращение к reverse. Оператор write выведет "1". Затем оператор if проверит выражение "1 div10" на ноль и передаст управление на конец процедуры.

Таким образом, однократное обращение извне к процедуре reverse вызвало трехкратное

еесрабатывание. Условие полного окончания работы процедуры должно находиться в

143

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

а) в некоторых простых случаях должно существовать нерекурсивное решение; б) рекурсивный процесс должен шаг за шагом так упрощать задачу, чтобы в конце

концов для нее появилось нерекурсивное решение.

Рекурсивные модули имеют одну из двух форм: 1) прямая рекурсия; 2) косвенная рекурсия.

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

Во втором случае один модуль вызывает какой-либо второй модуль, который либо сам, либо посредством других модулей вызывает исходный модуль. Для предотвращения бесконечной последовательности вызовов один или оба модуля должны проверять условие завершения.

Пример 2. Если A, B - имена модулей, то схема вызова при косвенной рекурсии может быть такой: A B A.

Вслучае косвенной рекурсии возникает проблема: как и где описать вызываемый модуль. По правилам Паскаля каждый вызываемый модуль должен быть описан до его вызова. Но если модуль А вызывает В, а В вызывает А, то получается замкнутый круг. Для подобных ситуаций в Паскале существует предварительное описание модулей. Предварительное описание состоит из заголовка модуля, за которым следует директива "forward". После такого описания соответствующий модуль можно использовать. В последующем описании модуля список формальных параметров и тип результата функции опускаются.

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

function B(x:integer):real; forward; function A(y:integer):real;

begin

M

A:=B(i)+3.5

end;

function B; (* Список формальных параметров и тип функции B не указываются *) begin

M

B:=A(d)-1.8 end;

Пример 4. Рассмотрим рекурсивную программу вычисления факториала. В рекурсивной форме определение факториала выглядит следующим образом:

для x>0 x!=x*(x-1)! , для x=0 x!=1 .

program findfac(i,o);

var n:integer; (* Вводимое число *)

function fac (v:integer):integer; (* Функция рекурсивного вычисления факториала *) begin

if v=0 then fac:=1

else fac:=v*fac(v-1);

end;

begin (* Начало ОП *)

write('Для какого числа вычислить факториал? ');readln(n);

if n<0 then writeln ('Отрицательные числа не имеют факториала') else writeln ('Факториал ',n,' равен ',fac(n));

end.

144

7.11 ИНСТРУКЦИЯ К МОДУЛЮ

При записи обращения к ПП необходимо правильно сформировать список аргументов. Для этого используется инструкция к модулю, которую составляет программист при создании модуля.

Основные разделы инструкции к модулю:

1)имя модуля и назначение;

2)вид обращения и описание всех аргументов;

3)указание, какие модули используются в данном модуле и являются по отношению к нему внешними;

4)описание алгоритма, реализованного в модуле, или указание литературы, в которой этот алгоритм описан.

Пример. Рассмотрим инструкцию к модулю VVOM (см. пример 3, п.7.2; пример 3,

п.7.4.2).

Имя : VVOM.

Заглавие : procedure VVOM (var a:OM);

Назначение : модуль предназначен для ввода элементов одномерного массива, номера которых изменяются в диапазоне от 1 до N.

Обращение : VVOM(a);

где а - одномерный массив, имеющий тип OM; тип OM объявлен следующим образом: type OM=array [1..100] of real.

Используемые процедуры и функции: нет.

Особенности работы. При работе модуль VVOM затребует от пользователя ввода с клавиатуры элементов вещественного массива. Номер элемента массива, подлежащего вводу, подается на экран. Пользователь после ввода очередного значения должен нажать клавишу <ВК>.

7.12 ИСПОЛЬЗОВАНИЕ БИБЛИОТЕЧНЫХ МОДУЛЕЙ

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

Для реализации некоторого класса задач может быть создана библиотека модулей. Все модули записываются в библиотеку (каталог) с расширение PAS. Тогда для присоединения модулей из библиотеки на этапе компиляции можно использовать директиву компилятора I (include - включить). Директива I может быть записана в любом месте раздела объявлений вызывающего модуля и имеет вид:

1){$I <имя>.PAS}

2){$I <имя> } - система сама присваивает разделитель PAS.

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

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

a

0

+ a x + a

2

x2

+K+ a

n

xn , 0 n 15,

 

1

 

 

 

по схеме Горнера для заданного x.

В описании библиотеки для каждого модуля указано его заглавие и дана инструкция. Для модуля POL имеет следующее заглавие:

function POL (n:integer; a:KP; x:real):real;

145

Любой библиотечный модуль всегда надо проверить, то есть выполнить в тех ситуациях, в которых его дальше будут использовать. Напишем программу для проверки

модуля POL. Возьмем полином P (x)=1+2x+3x 2

, n=2. При х=3 имеем: P(3)=34.

program PROV(i,0);

 

type KP=array [0..15] of real;

 

var K:integer;

 

 

b:KP;

(* Массив коэффициентов *)

 

{$I POL.PAS}

(* Присоединение модуля POL из библиотеки *)

begin

 

 

for K:=0 to 2 do

 

b[K]:=K+1;

 

 

writeln ('Степень полинома : 2');

 

writeln ('Коэффициенты полинома : 1,2,3');

 

writeln ('Значение полинома должно быть равно 34');

writeln ('Значение полинома получили : ',pol(2,b,3));

end.

 

 

Пример 2. Пусть имеем два отдельных файла

L1.PAS и L2.PAS в библиотеке ТР55 (в

текущем каталоге).

 

Файл L1.PAS содержит основную программу l1, в которой есть вызов процедуры l2. program l1(i,0);

var a,b:integer; {$i l2.pas}

begin a:=1; l2(a,b);

writeln(a,b)

end.

Файл L2.PAS содержит процедуру l2. procedure l2(a:integer; var b:integer);

begin b:=a+1;

end;

Порядок работы может быть следующим:

1)оттранслировать процедуру l2 в файле L2.PAS;

2)оттранслировать и выполнить программу l1 в файле L1.PAS.

В итоге получим выполнение программы l1 и печать двух чисел: 1 и 2.

Замечание. Если, например, файл L2.PAS записан не в текущем каталоге, а в подкаталоге user корневого каталога, то в директиве компилятора должно быть указание полного построения пути к соответствующему файлу в виде:

{$i \user\L2.PAS}

7.13 БЕЗУСЛОВНАЯ ПЕРЕДАЧА УПРАВЛЕНИЯ

Безусловная передача управления внутри блока осуществляется оператором goto, для аналогичной передачи управления, но из блока, используются обычно стандартные процедуры exit или halt.

Описание процедуры: exit;

Выполнение. Когда exit выполняется в теле ПП, то происходит возврат управления из подпрограммы в вызывающий блок. Когда exit выполняется в основной программе, то прекращается работа этой программы.

Замечания.

146

1.Если exit выполняется в пределах рекурсивного ПП, то управление возвращается на предыдущий уровень рекурсии.

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

Процедура halt останавливает выполнение программы и возвращает управление в операционную систему.

7.14 ЛАБОРАТОРНАЯ РАБОТА #7 "ПОДПРОГРАММЫ В ПАСКАЛЕ"

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

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

7.14.1 Пример выполнения лабораторной работы по теме "Подпрограммы в Паскале"

Задание

Дан порядок двух квадратных матриц T и C - число n. Матрица T задается своим внешним видом, матрица C вводится с клавиатуры. Необходимо получить матрицы T и C и обработать их в соответствии с определенным заданием.

Полученная программа должна иметь модульную структуру и содержать следующие подпрограммы, среди которых должна быть хотя бы одна процедура и хотя бы одна функция:

1)для формирования матрицы T;

2)для ввода матрицы C;

3)для печати матрицы;

4)подпрограммы для выполнения конкретного задания по обработке матриц T и C.

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

Программа program pppas;

const rm=10; (* Максимальный порядок матриц *) type mat=array[1..rm,1..rm] of integer;

var k:integer; (* Фактический порядок матриц *) c,t:mat; (* Основные матрицы *)

. . .

(* Процедура формирования матрицы T: t1 - формируемая матрица, s - ее порядок *) procedure formt(var t1:mat;s:integer);

. . .

end;

(* Процедура ввода с клавиатуры матрицы C: c1 - вводимая матрица, s - ее порядок *) procedure formc(var c1:mat;s:integer);

var i,j:integer; begin

writeln('Введите матрицу размером (',s,'*',s,') построчно: '); for i:=1 to s do

for j:=1 to s do read(c1[i,j]) end;

(* Процедура печати квадратной матрицы u порядка s *) procedure prt(var u:mat;s:integer);

var i,j:integer; begin

147

for i:=1 to s do begin

for j:=1 to s do write(u[i,j],' '); writeln

end end;

. . . (* Другие процедуры и функции *) begin (* Начало основной программы *) repeat

write('Введите порядок матриц k, 0<k<=10: '); readln(k);

until (k>0)and(k<=10); form(t,k);

writeln('Матрица T:'); prt(t,k); form(c,k);

writeln('Матрица C:'); prt(c,k);

. . .

end.

7.14.2 Задание к лабораторной работе по теме "Подпрограммы в Паскале"

Выполнить задание, описанное в п.7.14.1. Вариант внешнего вида матрицы T выбрать из списка заданий в п.7.14.2.1. Пример формирования матрицы по ее внешнему виду см. в модуле 4, п.4,3.4, пример 4. Следует иметь в виду, что для некоторых заданий порядок матрицы должен быть нечетным, что явно следует из внешнего вида матрицы. Вариант конкретного задания по обработке матриц T и C выбрать из списка заданий в п.7.14.2.2.

7.14.2.1 Формирование матрицы

ЗАДАНИЕ. Оформить процедуру формирования матрицы T по ее внешнему виду для любого заданного порядка n (для некоторых заданий порядок должен быть нечетным).

 

 

 

 

 

 

N1.

 

 

 

 

 

 

N2.

 

 

 

 

 

 

13

 

14

15

16

17

 

 

1

1

0

1

1

 

 

 

12 3 4 5 18

 

 

 

1

0

0

0

1

 

 

 

 

 

 

 

 

T

=

 

11 2 1 6 19

 

T

=

0

0

0

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

0

0

 

 

 

 

10 9 8 7 20

 

 

1

 

 

 

25

 

24 23

22

 

 

 

 

1

1

0

1

1

 

 

 

 

 

21

 

 

 

 

 

 

 

 

 

N3.

 

 

 

 

 

 

 

 

N4.

 

 

 

 

 

 

 

1

2

4

8

16

 

 

 

0

0

3

 

0

0

 

 

 

 

0

1

2

4

0

 

 

 

 

0

0

2

 

0

0

 

 

 

 

 

 

 

 

 

 

 

 

T =

0

0

1

0

0

 

 

T

=

3

2

1

2

3

 

 

 

 

 

0

1

2

4

 

 

 

 

 

0

0

2

 

0

 

 

 

 

 

 

0

 

 

 

 

0

 

 

 

 

1

2

4

8

 

 

 

 

 

0

0

3

 

0

0

 

 

 

 

 

16

 

 

 

 

 

 

 

 

 

 

 

N5.

 

 

 

 

 

 

 

 

N6.

 

 

 

148

 

 

3

 

2

0

2

3

 

 

 

 

 

 

2

 

0

0

0

2

 

 

 

 

 

 

 

 

 

 

 

 

 

T =

0

 

0

0

0

0

 

 

 

 

 

 

 

 

 

0

0

0

 

 

 

 

 

 

 

2

 

2

 

 

 

 

 

 

3

 

2

0

2

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N7.

 

 

 

 

 

 

 

 

 

 

1

2

3

 

4

5

 

 

 

 

 

 

 

2

1

2

 

3

4

 

 

 

 

 

 

 

 

 

 

 

 

 

T

=

 

3

2

1

 

2

3

 

 

 

 

 

 

 

 

 

3

2

 

1

 

 

 

 

 

 

 

 

4

 

2

 

 

 

 

 

 

 

5

4

3

 

2

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N9.

 

 

 

 

 

 

 

 

 

 

1

3

5

 

7

9

 

 

 

 

 

 

 

3

1

3

 

5

7

 

 

 

 

 

 

 

 

 

 

 

 

 

T

=

5

3

1

 

3

5

 

 

 

 

 

 

 

 

 

. .

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

. .

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N11.

 

 

 

 

 

 

 

 

 

 

1

2

3

 

2

1

 

 

 

 

 

 

 

0

1

2

 

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

T

=

 

0

0

1

 

0

0

 

 

 

 

 

 

 

 

 

1

2

 

1

 

 

 

 

 

 

 

 

0

 

0

 

 

 

 

 

 

 

1

2

3

 

2

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N13.

 

 

 

 

 

 

 

1

 

 

3

5

7

 

9

 

11

 

 

2

 

 

4

6

8

 

10

12

 

 

 

 

 

 

 

T

=

3

 

 

5

7

9

 

11

13

 

 

 

 

 

 

6

8

10

12

 

 

 

 

4

 

 

14

 

 

 

 

 

 

. .

 

.

 

.

 

 

 

. .

 

 

 

 

 

 

 

 

 

 

N15.

 

 

 

 

 

 

 

 

1

 

2

3

 

4

 

5

 

 

 

6

 

7

8

 

9

10

 

 

 

 

 

 

 

T =

11

 

12

13

 

14

15

 

 

 

 

 

 

 

.

.

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

.

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N17.

 

 

 

 

 

 

 

 

1

 

 

 

3

 

6

 

10

15

 

 

 

 

2

 

 

 

5

 

9

 

14

19

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

=

 

4

 

 

 

8

 

13

 

18

 

22

 

 

 

 

 

 

 

 

12

17

 

21

 

 

 

 

 

 

 

 

7

 

 

 

 

24

 

 

 

 

 

 

 

16

20

23

 

25

 

 

 

 

11

 

 

 

 

 

 

 

 

 

 

 

 

N8.

 

 

 

 

 

 

 

 

 

 

 

 

3

2

1

2

 

3

 

 

 

 

 

 

 

 

2

1

0

1

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T =

 

1

0

0

0

 

1

 

 

 

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

 

 

 

2

 

2

 

 

 

 

 

 

 

 

3

2

1

2

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N10.

 

 

 

 

 

 

 

 

 

 

5

 

 

4

 

3

2

 

 

1

 

 

 

 

6

 

 

7

8

9

 

10

 

 

 

 

 

 

 

 

 

 

T =

15

14

13

12

11

 

 

 

 

 

 

 

 

.

 

.

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

.

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N12

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1

1

1

1

 

 

 

 

 

 

 

 

 

 

2

2

2

 

 

 

 

 

 

 

 

 

 

 

1

1

 

 

 

 

 

T =

1

2

3

2

1

 

 

 

 

 

 

 

 

 

 

2

2

2

 

 

 

 

 

 

 

 

 

 

 

1

1

 

 

 

 

 

 

 

 

 

 

1

1

1

 

 

 

 

 

 

 

 

 

 

 

1

1

 

 

 

 

 

 

 

 

 

 

 

N14.

 

 

 

 

 

 

 

 

 

 

 

5

 

4

3

 

2

1

 

 

 

 

 

 

 

 

 

4

 

5

4

 

3

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T =

 

3

 

4

5

 

4

3

 

 

 

 

 

 

 

 

 

 

 

 

 

3

4

 

5

 

 

 

 

 

 

 

 

 

 

2

 

 

4

 

 

 

 

 

 

 

 

 

1

 

2

3

 

4

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N16.

 

 

 

 

 

 

 

 

 

 

 

1

10

11

 

 

 

 

 

 

 

 

 

 

2

9

 

12 .

 

.

 

 

 

 

 

 

 

 

 

 

 

 

T =

 

3

8

 

13 .

 

.

 

 

 

 

 

 

 

 

 

7

 

14 .

 

 

 

 

 

 

 

 

 

4

 

 

.

 

 

 

 

 

 

5

6

 

15

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N18.

 

 

 

 

 

 

 

149

 

 

 

 

1

0

0

0

1

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

1

1

 

 

 

 

T = 1

1

1

1

1

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

1

1

 

 

 

 

 

 

 

0

0

0

 

 

 

 

 

 

 

1

1

 

 

 

 

 

 

 

 

N19.

 

 

 

 

 

1

1 1

1 1

1 . .

 

2 2

 

 

2 2 2

2

 

 

 

 

. .

T =

3 3

 

 

3

3 3

3

 

. .

 

 

 

 

 

.

 

.

.

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

.

.

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N21.

 

 

 

 

 

 

 

 

 

1

2

3

4

5

 

 

 

 

 

 

 

2

2

3

4

5

 

 

 

 

 

 

 

 

 

 

 

 

 

T =

 

3

3

3

4

5

 

 

 

 

 

 

 

 

 

4

4

4

 

 

 

 

 

 

 

 

4

5

 

 

 

 

 

 

 

5

5

5

5

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N23.

 

 

 

 

 

 

 

1

 

2

3

4

 

5

 

 

 

 

 

 

9

8

7

 

6

 

 

 

10

 

 

 

 

T

=

11

 

12

13

14

 

15

 

 

 

 

 

 

 

.

.

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

.

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N25.

 

 

 

 

 

 

 

 

 

1

2

3

2

1

 

 

 

 

 

 

 

1

2

1

 

 

 

 

 

 

 

1

1

 

 

 

 

T = 1

1

1

1

1

 

 

 

 

 

 

 

1

2

1

 

 

 

 

 

 

 

1

1

 

 

 

 

 

 

 

2

3

2

 

 

 

 

 

 

 

1

1

 

 

 

 

 

 

 

 

N27.

 

 

 

 

 

 

 

 

0

 

0

0

0

1

 

 

 

 

 

0

 

0

0

2

9

 

 

 

 

 

 

 

 

 

 

T

=

 

0

 

0

3

8

10

 

 

 

 

 

 

 

 

4

7

11

 

 

 

 

 

 

 

0

 

14

 

 

 

 

 

5

 

6

12

13

15

 

 

 

 

 

 

 

 

 

N29.

 

 

1

0

 

2

0

3

0

 

.

.

 

 

 

0

1

 

 

0

2

0

3

 

.

 

 

 

 

 

 

 

.

T

=

 

2 0 1 0 2 0 . .

 

 

 

 

 

 

 

. .

. .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

. .

. .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N20.

 

 

 

 

 

 

 

 

 

 

5

 

 

4

3

2

 

 

1

 

 

 

 

 

 

 

9

8

7

 

 

6

 

 

 

 

 

10

 

 

 

 

 

T =

15

 

14

13

12

 

11

 

 

 

 

 

 

 

.

.

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

.

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N22.

 

 

 

 

 

 

 

 

 

 

1

0

0

0

 

1

 

 

 

 

 

 

0

2

0

2

 

0

 

 

 

 

 

 

 

 

 

 

 

 

T =

0

0

3

0

 

0

 

 

 

 

 

 

 

 

 

2

0

2

 

 

 

 

 

 

 

 

0

 

0

 

 

 

 

 

 

1

0

0

0

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N24.

 

 

 

 

 

 

 

 

 

 

1

1

1

1

 

1

 

 

 

 

 

 

0

1

1

1

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

T

=

0

0

1

0

 

0

 

 

 

 

 

 

 

 

1

1

1

 

 

 

 

 

 

 

 

0

 

0

 

 

 

 

 

 

1

1

1

1

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N26.

 

 

 

 

 

 

 

 

 

 

1

2

4

6

 

...

 

 

 

 

 

 

3

1

2

4

 

 

 

 

 

 

 

 

 

 

...

 

 

 

T

=

5

3

1

2

 

...

 

 

 

 

 

 

 

 

5

3

1

 

 

 

 

 

 

 

 

7

 

...

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

. . .

 

...

 

 

 

 

 

 

 

 

N28.

 

 

 

 

 

 

 

 

 

 

1

3

5

7

 

9

 

 

 

 

 

 

 

4

1

3

5

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

T

=

5

4

1

3

 

5

 

 

 

 

 

 

 

 

 

5

4

1

 

 

 

 

 

 

 

 

 

9

 

3

 

 

 

 

 

 

 

 

9

5

4

 

1

 

 

 

 

 

 

14

 

 

 

N30.

150

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]