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

Справочная информация по алгоритмам + код

.doc
Скачиваний:
25
Добавлен:
20.06.2014
Размер:
87.04 Кб
Скачать

Справочная информация

1.Алгоритмы сортировок.

[ 1.1 ] Метод выбора;

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

Дано: исходный неупорядоченный массив a[i], i=1..N ; C – промежуточная переменная;

1. for i:=1 to N-1 do

1.1. Min:=a[i];

1.2. for k:=i+1 to N do

1.2T. if Min>a[k] then

1.2T.1. C:=a[k];

1.2T.2. a[k]:=Min;

1.2T.3. Min:=C;

1.3. a[i]:=Min;

Итог: массив a[i] упорядочен так, что значения элементов возрастают от 1-го к N-му элементу;

[ 1.2 ] Метод обмена

Упорядоченная последовательность создается на том же участке

памяти, что и исходная последовательность записей. Сортировка

проводится путем сравнения соседних элементов, причем такие сравнения проводят N-раз;

Дано: исходный неупорядоченный массив a[i], i=1..N ;

C - промежуточная переменная;

1. for k:=1 to N do

1.1 for i:=1 to N-1 do

1.1T. if a[i]>a[i+1] then

1.1T.1 C:=a[i];

1.1T.2 a[i]:=a[i+1];

1.1T.3 a[i+1]:=C;

Итог: массив a[i] упорядочен так , что значения элементов

возрастают от 1-го к N-му элементу;

[ 1.3 ] Метод вставок.

Упорядоченная последовательность создается на новом участке

памяти. Первый элемент исходной и новой последовательности совпадают. Далее, по одному, элементы исходной последовательности сравниваются с элементами новой, если они по значению больше, то дописываются в конец новой последовательности иначе все элементы новой последовательности, которые по значению больше сдвигают вправо (т.е. b[i] -> b[i+1]), а в позицию, с которой они сдвинуты, вставляют элемент исходной последовательности.

Дано: исходный неупорядоченный массив a[i], i=1..N ;

C - промежуточная переменная;

1. b[1]:=a[1];

2. for i:=2 to N do

2.1T. if a[i]<b[i-1] then

2.1T.1 j:=i;

2.1T.2 repeat () until (a[i]>=b[j-1])or(j=1)

2.1T.2.1 dec(j)

2.1T.3 for k:=i downto j+1 do

b[k]:=b[k-1];

b[j]:=a[i];

2.1E. else

2.1E.1 b[i]:=a[i];

Итог: массив b[i] является упорядоченным массивом a[i] так,

что значения элементов возрастают от 1-го к N-му элементу;

[ 1.4 ] Метод подсчета.

Упорядоченная последовательность создается на новом участке

памяти. Для каждого элемента счетчик подсчитывает сколько существует элементов меньше данного , если таких элементов (k) , то этот элемент займет в новой последовательности [k+1] позицию. Сортировка возможна только если нет одинаковых элементов.

Дано: исходный неупорядоченный массив a[i], i=1..N ,

C - промежуточная переменная;

1. for i:=1 to N do

1.1. k:=0;

1.2. for j:=1 to N do

1.2T if a[i]<a[j] then

1.2T.1 inc(k);

1.2T.2. b[k+1]:=a[i];

Итог: массив b[i] является упорядоченным массивом a[i] так,

что значения элементов возрастают от 1-го к N-му элементу;

[1.5] Метод Шелла.

Аналогичен (1.2), с той разницей, что сравниваются элементы отдаленные друг от друга на некоторое число позиций – h (шаг).

Дано: исходный неупорядоченный массив a[i], i=1..N ,

h - шаг сравнения равный N/2,N/4,N/8...N/2^(k),

( если N- нечетное число то h=(N+1)/2,..,(N+1)/2^(k) ),

1. k:=0;

2. while (N/2^(k))>1 do

2.1 inc(k);

2.2 h:=N/2^(k);

2.3 for i:=1 to N-h do

2.3T if a[i]>a[i+h] then

2.3T.1 c:=a[i+h];

2.3T.2 a[i+h]:=a[i];

2.3T.3 a[i]:=c;

Итог: массив a[i] упорядочен так, что значения элементов

возрастают от 1-го к N-му элементу;

[ 1.6 ] Метод сортировки по бинарному дереву;

Сортировка состоит из двух фаз:

1) строится дерево так что первый узел=первый элемент в последовательности, далее, если элемент меньше значения узла то он попадает в левую ветвь, иначе в правую.

2) смешанный обход дерева, начиная с самой левой ветви через узел в правую ветвь и далее к корневому узлу. Прочитанная таким образом последовательность будет отсортированной.

2. Алгоритмы оптимизации.

-------------------------

[ 2.1 ] Метод Фибоначчи.

Для поиска корня функции f(x) на интервале [a,b]

используется специальная последовательность чисел:

F(n)=F(n-1)+F(n-2), F(0)=F(1)=1;

Кол-во шагов приближения (s), вычисляют по формуле :

N=(b-a)/delta;

так что F(s-1) < N <= F(s) ;

При непосредственном поиске корня используют

минимальный шаг h_min=(b-a)/F(s);

Вычисления заканчиваются, когда в расчетах использованы

все числа F(s).

1. h_min:=(N*gamma)/fib[j];

2. x1:=a;

3. x2:=b;

4. for i:=S-2 downto 1 do

4.1. y1:=f(x1);

4.2. y2:=f(x2);

4.3T if (abs(y1)>abs(y2)) then

4.3T.1. x1:=x1+h_min*fib[j];

4.4T if (abs(y1)<abs(y2)) then

4.4T.1. x2:=x2-h_min*fib[j];

4.5T. if (abs(y1)=abs(y2)) then

4.5T.1. x1:=x1+(h_min/2)*fib[j];

4.5T.2. x2:=x2-(h_min/2)*fib[j];

5. KOR:=(x1+x2)/2; { найденный корень функции}

[ 2.2 ] Метод "золотого сечения".

Поиск корня в данном методе аналогичен 2.1. c той разницей,

что шаг вычисляется как некоторая часть текущего отрезка [a,b], на котором локализован корень:

x(i)=x(i-1)[+/-](b-a)*0.62 ;

Вычисления заканчиваются когда (b-a)< delta, где

delta - точность поиска корня.

1.h_min:=(b-a)*0.62;

2. x1:=a;

3. x2:=b;

4. repeat () until (b-a)<delta;

4.1. h_min:=(b-a)*0.62;

4.2. y1:=f(x1);

4.3. y2:=f(x2);

4.4T. if (abs(y1)>abs(y2)) then

4.4T.1 x1:=x1+h_min;

4.5T. if (abs(y1)<abs(y2)) then

4.5T.1 x2:=x2-h_min;

4.6T. if (abs(y1)=abs(y2)) then

4.6T.1. x1:=x1+(h_min/2);

4.6T.2. x2:=x2-(h_min/2);

4.7. a:=x1;

4.8. b:=x2;

5. KOR:=(a+b)/2;{ найденный корень функции}

[ 2.3 ] Метод половинного деления.

Для поиска корня функции f(x) на отрезке [a,b] этот

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

(например: корень локализован на данном отрезке, если значения функций на его концах различны по знаку;)

Вычисления заканчиваются когда (b-a)< delta, где

delta - точность поиска корня.

1.repeat () until (b-a)<delta;

1.1. x1:=a;

1.2. x2:=b;

1.3. x3:=a+(b-a)/2;

1.4. y1:=f(x1);

1.5. y2:=f(x2);

1.6. y3:=f(x3);

1.7T. if ((y1>0)and(y3<0))or((y1<0)and(y3>0)) then

1.7T.1 a:=x1;

1.7T.2 b:=x3;

1.8T. if ((y2>0)and(y3<0))or((y2<0)and(y2>0)) then

1.8T.1 a:=x1;

1.8T.2 b:=x2;

2. KOR:=(a+b)/2;{ найденный корень функции}

[ 2.4 ] Метод Свена.

Поиск корня функции проводят, начиная с произвольной точки

на оси OX - x0 . Далее по формуле:

x(k):=x(k-1)+2^k*delta, k=1,2,..N

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

1. k:=0;

2. repeat () until ((y1<0)and(y2>0))or((y1>0)and(y2<0))

2.1. inc(k);

2.2. x[k]:=x[k-1]+2^(k)*delta;

2.3. y1:=f(x[k-1]);

2.4 y2:=f(x[k])

3. a:=x[k-1];

4. b:=x[k];

{ корень локализован на отрезке [a,b] }

[ 2.5 ] Метод Ньютона.

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

1. repeat () until f(k+1)<delta;

1.1. x[k+1]:=x[k]-f(x[k])/f'(x[k]);

{ f'(x)- производная }

{ delta - точность -> 0 }

3.Алгоритмы генерации псевдослучайных чисел.

---------------------------------------------

[ 3.1 ] Метод середины квадратов.

a) Произвольное целое 2-k значное число (xx) возводим в квадрат

i:=0; i_max- необходимое количество псевдослучайных чисел

1. repeat () until i=i_max;

1.1. inc(i);

1.2. xXXx:=(xx)^2;

1.3. xx:=XX; { XX- пс-число - как средние 2-k из 4-k}

b) Аналогично (a) можно использовать два 2-k числа, перемножая их

1. i:=0;

2. repeat () until i=i_max;

2.1 inc(i);

2.2 zZZz:=(xx)*(yy);

2.3 xx:=ZZ;

2.4 yy:=zz; { zz и ZZ - пс-числа }

[ 3.2 ] Мультипликативный метод.

Заданы целые числа M,C и x[0] , c их помощью вычисляется пс-последовательность чисел x[i] , i=1,2,..,N по

формуле:

i:=0; i_max- необходимое количество пс-чисел

1. repeat () until i=i_max;

1.1. x[i+1]=C*x[i] mod M;

1.2. inc(i);

[ 3.3 ] Аддитивный метод.

Заданы целые числа M,x[1] и x[0] , c их помощью вычисляется пс-последовательность чисел x[i] , i=1,2,..,N по

формуле:

i:=1; i_max- необходимое кол-во пс-чисел

1. repeat () until i=i_max;

1.1 x[i+1]=(x[i]+x[i-1]) mod M;

1.2 inc(i);

[ 3.4 ] Линейный метод.

Задан набор целых чисел a[g] , g=0,1,..N и число M.

Генерация пс-последовательности x[i] происходит

по формуле:

i:=1; i_max- необходимое кол-во пс-чисел

1. repeat () until i=i_max;

1.1. x[i+1]:=0;

1.2. for g:=1 to N do

1.2.1 x[i+1]=(a[g]*x[i-1] mod M)+x[i+1];

1.3. inc(i);

[ 3.5 ] Комбинированный метод.

Заданы целые числа С и 2-k значное число x[0];

Генерируется пс-последовательность x[i] по следующим правилам:

i:=0; i_max- необходимое количество пс-чисел

1. repeat () until i=i_max;

1.1. x'[i]:=XX;

{последние 2-k разряда от квадрата x[i]^2 = xxXX}

1.2. x"[i]:=xx;

{первые 2-k разряда от x[i]*C = xxXX}

1.3. x"'[i]:=zz;

{первые 2-k разряда от x"[i]^2 = zzZZ}

1.4. x""[i]:=ZZ;

{последние 2-k разряда от квадрата x"'[i]^2 = zzZZ}

1.5. x[i+1]:=x"[i]+x""[i];

1.6. inc(i);

4.Алгоритмы кодирования.

------------------------

[ 4.1 ] Шифр простой подстановки.

Комбинация символов заменяется другой комбинацией,

====================================================

например:

текст=" ...в лесу родилась елочка .."

символ | a в д е и к л c р ь ч у о <space>

--------|--------------------------------

код | ц я х н м р г ъ т щ о з д ю

кодированный текст=".. яюгнъзютдхгцъщюнгдорц .." ;

=======================================================

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

[ 4.2 ] Шифр Вижинера.

Этот способ кодировки позволяет нарушить в кодируемом тексте

статистическое появление букв алфавита т.к. каждый символ кодируется с добавлением ключа,

=============================================================

например:

текст=" ...в лесу родилась елочка .." ,

+

код =" п аска льпаскал ьпаска " т.е. ключ ="паскаль",

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

номер по алфавиту символа из ключа и символа текста и по

этому номеру определить в алфавите символ кода ;если

сумма превысит кол-во букв в алфавите то из нее следует вычесть это max число букв.

так буква "в"+cимвол-кода_"п" = 3 + 17 = 20 => "т"

"л"+cимвол-кода_"а" = 13 + 1 = 14 => "м"

================================================================

[ 4.3 ] Шифрование гаммированием.

Данный способ кодировки аналогичен (4.2) c той разницей, что

что ключом кодировки служит генератор псевдослучайных чисел,

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

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

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

чем больше длина неповторяющейся последовательности, тем выше степень защиты.

5.Алгоритмы компрессии.

-----------------------

[ 5.1 ] Код Шеннона-Фано.

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

удельное число повторений ,т.е. разделить на общее число символов в тексте. Затем эти удельные коэффициенты необходимо

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

=======================================================

например:

текст="AAAAADDDDCCCCCBBAABBBB" , - всего 22 символа

символ_'A'- кол-во повтор.=7, уд.кол-во повтор.=7/22=0.32;

символ_'B'- кол-во повтор.=6, уд.кол-во повтор.=6/22=0.27;

символ_'C'- кол-во повтор.=5, уд.кол-во повтор.=5/22=0.23;

символ_'D'- кол-во повтор.=4, уд.кол-во повтор.=4/22=0.18;

0.32 0.27 0.23 0.18

--------------------

/ \

0.32('A')+0.18('D') 0.27('B')+0.23('C')

| |

0 1

0.32('A') 0.18('D') 0.27('B') 0.23('C')

| | | |

0 1 0 1

итог: код символа 'A'=00

код символа 'B'=10

код символа 'C'=11

код символа 'D'=01

==========================================================

[ 5.2.] Код Хаффмана.

Аналогично (5.1) проводится сортировка символов по количеству

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

Если проследить перемещения коэффициентов для каждого символа,

то можно построить двоичное дерево. А если по пути от "корня"

до каждого "листа" правым ветвям присваивать '1',а "левым"

'0',то каждому символу будет соответствовать такой двоичный

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

===========================================================

например:

текст="AAAAADDDDCCCCCBBAABBBB" , - всего 22 символа

символ_'A'- кол-во повтор.=7, уд.кол-во повтор.=7/22=0.32;

символ_'B'- кол-во повтор.=6, уд.кол-во повтор.=6/22=0.27;

символ_'C'- кол-во повтор.=5, уд.кол-во повтор.=5/22=0.23;

символ_'D'- кол-во повтор.=4, уд.кол-во повтор.=4/22=0.18;

0.32 0.27 0.23 0.18

'0' \ / '1'

<--------- 0.41

/

0.41 0.32 0.27

'0' \ / '1'

<--------0.59

/

0.59 0.41

'0' \ / '1'

1

итог: код символа 'A'=00

код символа 'B'=01

код символа 'C'=10

код символа 'D'=11

==============================================================

6.Алгоритмы 2-D графики.

[ 6.1 ] Алгоритм Бразенхейма.

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

Пусть заданы точки T1(x1,y1) и T2(x2,y2) между которыми следует провести прямую линию. Вычисляется угловой коэффициент k=dy/dx, с помощью которого простыми итерациями строятся точки. Но при построении учитывается близость текущего значения коэффициента к реальному значению точки (а или b - ?) , что позволяет провести оптимальное построение прямой.

T2

-|-|-|-|-|-|-|X|-- dx=x2-x1,

-|-|-|-|-|-|*|-|-- dy=y2-y1,

-|-|-|-|-|*|-|-|-- y=(dx/dy)*x,

-|-|-|a|?|?|b|-|--

-|-|-|-|*|-|-|-|--

-|-|-|*|-|-|-|-|--

-|-|*|-|-|-|-|-|--

-|X|-|-|-|-|-|-|--

T1

1. repeat () until (x[i]=x2)or(y[i]=y2)

1.1. a=(y[i]+1)-(dy/dx)*x[i];

1.2. b=(dy/dx)*x[i]-y[i];

1.3. x[i]:=x[i-1]+1;

1.4T. if d[i-1]>=0 then

1.4T.1 y[i]:=y[i-1]+1;

1.4T.2 d[i]:=2*(dy-dx)+d[i-1];

1.4E else

1.4E.1 y[i]:=y[i-1];

1.4E.2 d[i]:=2*dy+d[i-1];

Лабораторная работа № 1

Тема: «Программирование алгоритмов сортировки»

Задание: разработать программу, осуществляющую ввод, вывод а также внутреннюю и внешнюю сортировку однородной и неоднородной информации символьного и числового типа методами: выбора, обмена, вставок, подсчета, Шелла, на базе древовидной структуры хранения, сбалансированным n–ленточным слиянием в соответствии с вариантом

Контрольные вопросы

      1. Основные понятия и принципы сортировки (цикл обработки, ключи, составные ключи, ранг ключа, инвертированные массивы, внутренняя сортировка, внешняя сортировка)

      2. Основные методы сортировки линейных структур данных (метод выбора, метод обмена, метод вставок, метод подсчета, метод Шелла). Методы сортировки, использующие древовидное представление данных (понятие графа, дерева, построение дерева, обход дерева). Внешняя сортировка (сбалансированное n–ленточное слияние)

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

Лабораторная работа № 2

Тема: «Программирование алгоритмов ускоренного поиска информации»

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

Контрольные вопросы

      1. Основные принципы информационного поиска (критерий выдачи, аргумент поиска, одноаспектный поиск, многоаспектный поиск, поиск по совпадению, поиск по интервалу, поиск по выражению, логика поиска, стратегия поиска, программный поиск, аппаратный поиск)

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

Лабораторная работа № 3

Тема: «Программирование элементарных численных методов»

Задание: разработать программу, осуществляющую ввод, вывод, а также оптимизацию функции одного аргумента методами исключения интервалов – дихотомии, Фибоначчи, «Золотого сечения», методами интерполяции – квадратичной, первого приемлемого приближения, кубической, методом случайного поиска; решение нелинейных уравнений одной переменной – методом секущих, методом касательных в соответствии с вариантом

Контрольные вопросы

      1. Методы оптимизации для функции одного аргумента (метод выбора начальной точки: метод Свена; методы исключения интервалов: деления отрезка пополам, Фибоначчи, «золотого сечения»).

      2. Некоторые методы численного решения непрерывных задач (вычисление значения производной; вычисление предельной точности на данной вычислительной машине для задаваемого типа данных и определенного языка программирования)

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

Лабораторная работа № 4

Тема: «Программирование алгоритмов генерации псевдослучайных чисел»

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

Контрольные вопросы

  1. Случайная величина

  2. Функция закона распределения

  3. Функция плотности распределения

  4. Гистограмма

  5. Последовательность псевдослучайных чисел

  6. Методы генерации псевдослучайных чисел: середин квадратов, мультипликативный метод, аддитивный метод, линейный метод, комбинированный метод

Лабораторная работа № 5

Тема: «Программирование алгоритмов кодирования информации»

Задание: разработать программу, осуществляющую ввод, вывод, а также шифрование и дешифрование информации методами: простой подстановки, Вижинера, гаммированием и эффективного кодирования коррелированной и некоррелированной информации (кодом Шеннона – Фано, кодом Хаффмана) в соответствии с вариантом

Контрольные вопросы

  1. Цифровое представление информации

  2. Криптографическое закрытие информации: шифр простой подстановки, шифр Вижинера, шифрование гаммированием

  3. Эффективное кодирование (префиксность эффективных кодов, код Шеннона–Фано, код Хаффмана)

Лабораторная работа № 6

Тема: «Построение графических примитивов»

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

Контрольные вопросы

  1. Растровая графика

  2. Базовые алгоритмы построения графических примитивов

  3. Целочисленные алгоритмы: построения отрезка прямой, построения эллипса, заполнение области

Литература

  1. Болски М. И. Язык программирования Си. Справочник: Пер. с англ. – М.: Радио и связь, 1988. – 96 с.

  2. Бочков С. О., Субботин Д. М. Язык программирования Си для персонального компьютера. – М.: Радио и связь, 1990. – 384 с.

  3. Трофимова И. П. Системы обработки и хранения информации: Учебник для вузов по специальности АСОИУ. – М.: Высшая школа, 1989. – 191 с.

  4. Толковый словарь по вычислительным системам/ Под ред. В. Иллингуорта и др.: Пер. с англ. – М. Машиностроение, 1990. – 560 с.

  5. Коутс Р., Влеймик И. Интерфейс «человек – компьютер»: Пер. с англ. – М.: Мир, 1990. – 501 с.

  6. Кнут Д. Искусство программирования для ЭВМ. Т. 3.: Пер. с англ. – М.: Мир, 1978.

  7. Роджерс Д. Алгоритмические основы машинной графики: Пер. с англ. – М.: Мир, 1989. – 512 с.

  8. Арсак Ж. Программирование игр и головоломок: Пер. с франц. –М.: Наука. Г. р. Ф.–м. Л., 1990. – 212 с.

  9. В. К. Зейденберг и др. Англо–русский словарь по вычислительной технике: Ок. 42000 терминов / Под ред. Е. К. Масловского. – М.: Рус. яз., 1990. – 800 с.

  10. Першиков В. И., Савинков В. М. Толковый словарь по информатике. – М.: Финансы и статистика, 1991. – 543 с.

7