Egorova1
.pdfПеременная х - локальная для процедуры 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