Скачиваний:
12
Добавлен:
10.05.2015
Размер:
403.46 Кб
Скачать

III. О п и с а н и е п а к е т а.

1. Общие сведения

2. Функциональное назначение комплекса

3. Описание применения комплекса

4. Входные и выходные данные

5. Описание процедур комплекса

1. Procedure FBL

2. Procedure FPC

3. Procedure FTAB

4. Procedure FKOD

5. Procedure FBIN

6. Procedure VIEW

7. Procedure TVK

8. Procedure DCT

9. Procedure BTK

10. Procedure STAT

11. Procedure SEG

12. Procedure DCF

13. Procedure KAN

14. Procedure GKLF

15. Procedure SAG

16. Procedure RPT

17. Procedure KVN

18. Function MIN

19. Function MAX

1. Общие сведения.

В данном тексте приводится описание комплекса учебно-лабораторных подпрограмм "Цифровое моделирование системы эффективного кодирования, передачи и декодирования сообщений". Комплекс состоит из подпрограмм, написанных на Turbo Pascal 7.0, содержащих все необходимые для моделирования процедуры.

2. Функциональное назначение комплекса.

Комплекс подпрограмм предназначен для :

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

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

- автоматического построения эффективного (оптимального) кода;

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

- имитации статистического эксперимента с кодером - источником кодовых

слов с целью определения показателей эффективности кода.

В качестве сообщений может быть :

1 - информация, хранимая в текстовом файле;

2 - значения функции, сгенерированной процедурами модуля gnk.

3. Описание применения комплекса.

Для использования комплекса в Вашей программе необходимо самым первым оператором программы поставить USES gnk,gnk2,fkt.При этом необходимо наличие файлов gnk.tpu, gnk2.tpu, fkt.tpu в текущем каталоге или в каталоге, указанном в меню Options|Directories...|Unit directories. Подключение модуля gnk необходимо только в случае работы с функциями.

СПИСОК ПРОЦЕДУР,ИСПОЛЬЗУЕМЫХ ПРИ КОДИРОВАНИИ СИГНАЛОВ.

"Непрерывная" функция может имитироваться процедурами GKLF, GF и др. С помощью процедуры SAG осуществляется настройка "квантователя" с учетом точности отображения исходной (непрерывной) функции и интенсивности помех, воздействующих на квантованный по уровню сигнал. Расчет минимального и максимального значений функции осуществляется с помощью функций MIN и MAX соответственно. Процедура RPT рассчитывает порог квантования и уровень единицы для кодовых слов, передаваемых по каналу связи.

Процедура KVN осуществляет квантование сгенерированной ранее функции.

Процедура SEG сегментирует массив номеров уровней квантования на блоки или L-граммы.

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

Процедура FTAB создает специальную таблицу TREE, представляющую "дерево" в методе Хаффмена, по которой процедура FKOD строит эффективный код.

(Внимание! Поскольку содержимое массива РС, формируемого ранее процедурой FPC, изменяется при использовании его процедурой FTAB, то для восстановления содержимого этого массива, необходим повторный вызов процедуры FPC.)

Процедура FBIN кодирует сообщения, посылаемые источником, простым двоичным кодом.

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

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

Процедура STAT вычисляет статистические показатели эффективности кода:

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

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

СПИСОК ПРОЦЕДУР,ИСПОЛЬЗУЕМЫХ ПРИ КОДИРОВАНИИ ТЕКСТОВ.

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

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

Процедура FTAB создает специальную таблицу TREE, представляющую "дерево" в методе Хаффмена, по которой процедура FKOD строит эффективный код.

(Внимание! Поскольку содержимое массива РС, формируемого ранее процедурой

FPC, изменяется при использовании его процедурой FTAB, то для восстановления

содержимого этого массива, необходим повторный вызов процедуры FPC.)

Процедура FBIN кодирует тот же файл простым двоичным кодом.

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

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

Процедура DCT имитирует функции декодера и буфера для накопления принимаемых кодовых слов, и создает файл TEXT_OUT.PAS, в котором находится декодированный текст.

Процедура STAT вычисляет статистические показатели эффективности кода:

среднюю длину кодового слова и среднее число двоичных символов на одно

сообщение при кодировании блоками.

Процедура FBTK создает файл BIN_OUT.PAS,в котором исходный текст представ-

лен последовательностью кодовых комбинаций двоичного позиционного кода без

пробелов.

4. Входные и выходные данные.

4.1 Входные величины

N - количество символов ;

L - длина блока или L-граммы ;

KBL - длина исследуемой выборки сообщений ;

REG - ключ для процедур FBL,VIEW,KVT,DCF,SEG и STAT -

принимает 2 значения:

'B' - кодирование и декодирование блоков ;

'L' - кодирование и декодирование L-грамм ;

LEN - максимальное число разрядов эффективного кода ;

INF - число разрядов двоичного позиционного кода ;

TF - ключ для процедур FPC,VIEW -

принимает 2 значения:

'T' - обработка текстовой информации;

'F' - обработка уровней квантования;

T0 - значение уровня нуля сигналов в канале связи;

VP - ключ для процедуры KAN -

принимает 2 значения:

0 - обработка одного разряда кодового слова;

1 - обработка всего кодового слова;

Ax - вещественный одномерный массив длинной Na, содержащий координаты точек перегиба функции;

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

T - период функции, представляющей непрерывное сообщение;

Na - количество точек перегиба кусочно-линейной функции;

N - число всех отсчетов аргумента на интервале определения функции;

KU - количество уровней квантования;

M - математическое ожидание случайной величины;

S - среднее квадратичное отклонение случайной величины;

K3 - ключ,определяющий способ вычисления полушага квантования;

V - предполагаемая вероятность правильной передачи сообщения при "гауссовых" случайных помехах в канале связи;

K,E - ключи процедуры GRA, определяющие режимы вывода графиков функций.

4.2 Выходные величины

UK - одномерный массив длиной N, содержащий номера уровней квантования;

WT - двумерный массив размером (KBL,L),содержащий сообщения, блоки или L-граммы;

тип - string[1] при обработке текста;

тип - word при обработке функций;

DIF - количество различных сообщений, блоков или L-грамм в исследуемой выборке;

WP - одномерный массив длиной KBL, содержащий номера сообщений, блоков или L-грамм;

PC - двумерный массив размером (KBL,2),содержащий в 1-м столбце номера сообщений, блоков или L-грамм, а в 2-м столбце - их числа появления;

TREE - двумерный массив размером (KBL,3) ,представляющий "дерево" в методе Хаффмена, и содержащий :

в 1-м столбце номера сообщений, блоков или L-грамм,имеющих большее число появлений;

в 2-м столбце номера сообщений, блоков или L-грамм,имеющих меньшее число появлений;

в 3-м столбце номера вспомогательных "сообщений", получающихся в результате суммирования чисел появления;

KOD - двумерный массив размером (KBL,LEN), содержащий кодовые слова эффективного кода;

BIN - двумерный массив размером (KBL,INF), содержащий кодовые слова двоичного позиционного кода;

X - вещественный одномерный массив длиной N, содержащий все значения аргумента функции;

Y - вещественный одномерный массив длиной N, содержащий все значения сгенерированной "непрерывной" функции;

YK - вещественный одномерный массив длиной N, содержащий значения квантованной функции;

YKout - вещественный одномерный массив длиной N, содержащий значения искаженной квантованной функции;

Q - полушаг квантования;

Ymin - минимальное значение функции;

PK - порог квантования;

T1 - значение уровня единицы сигналов в канале связи.

6. Описание процедур комплекса.

1. Procedure FBL

Назначение

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

KOD_OUT.PAS и TEXT_OUT.PAS соответственно, и инициализация последних для записи.

Математическое описание:

При кодировании блоками строка массива WT образуется последовательной записью L символов.

При кодировании L-граммами каждая последующая строка массива WT (начиная со второй) образуется путем перезаписи в нее (L-1) элементов предыдущей строки, начиная со второго элемента. В L-тый элемент заносится новый символ.

Вход:

FF - файловая переменная для связи с текстовым файлом, определяемого пользователем;

REG - ключ для процедур FBL,VIEW,KVT,DCF,SEG и STAT,

принимает 2 значения:

'B'-кодирование и декодирование блоков;

'L'-кодирование и декодирование L-грамм;

L - длина блока или L-граммы ;

KBL - длина исследуемой выборки сообщений.

Выход:

WT - двумерный массив размером (KBL,L),содержащий все сообщения,блоки или

L-граммы;

Текст процедуры:

PROCEDURE FBL(var FF:text;REG:char;L,KBL:word;var WT);

LABEL 1;

VAR i,j:word;

BEGIN

ASSIGN(FK,'KOD_OUT.PAS');REWRITE(FK);

ASSIGN(FT,'TEXT_OUT.PAS');REWRITE(FT);

i:=1;

j:=1;

WHILE (NOT EOF(FF))and(i<=KBL ) DO

BEGIN

WHILE j<=L DO

BEGIN

IF EOLN(FF) THEN READLN(FF);

READ(FF,WT[i,j]);

j:=j+1

END;

i:=i+1;

CASE REG OF

'B','b':j:=1;

'L','l':BEGIN

j:=1;

WHILE j<L DO

BEGIN

WT[i,j]:=WT[i-1,j+1];

j:=j+1

END

END

ELSE HALT

END

END

END;

2. Procedure FPC

Назначение:

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

Математическое описание:

Выделение различных сообщений, блоков или L-грамм осуществляется путем последовательного перебора. Если очередное сообщение ранее не встречалось, то его номер заносится в первый столбец свободной строки массива РС, а во второй столбец заносится 1. В противном случае на 1 инкрементируется второй столбец той строки, первый столбец которой содержит номер этого сообщения.

Вход:

TF - ключ для процедур FPC,VIEW -

принимает 2 значения:

'T' - обработка текстовой информации;

'F' - обработка уровней квантования;

L - длина блока или L-граммы ;

KBL - длина исследуемой выборки сообщений;

WT - двумерный массив размером (KBL,L), содержащий сообщения, блоки или

L-граммы;

Выход:

DIF - количество различных сообщений, блоков или L-грамм в исследуемой

выборке;

WP - одномерный массив длиной KBL, содержащий номера сообщений, блоков или L-грамм ;

PC - двумерный массив размером (KBL,2),содержащий в 1-м столбце номера сообщений, блоков или L-грамм, а в 2-м столбце - их числа появления;

Текст процедуры:

PROCEDURE FPC(TF:char;KBL,L:word;var WT,WP,PC;var DIF:word);

{------Процедура PLUS служит для считывания текста из массива WT------}

PROCEDURE PLUS(var S:string;L,CH:word);

VAR m:word;

BEGIN

m:=1;

WHILE m<=L DO

BEGIN

S:=S+WT[CH,m];

m:=m+1

END

END;

{------Процедура UPR служит для упорядочивания массива РС------}

PROCEDURE UPR(DIF:word;var PC);

VAR i,PR:word;

P:boolean;

BEGIN

REPEAT

P:=FALSE;

i:=1;

WHILE (i<DIF-1) and (PC[i,2]>=PC[i-1,2]) DO i:=i+1;

IF PC[i,2]<PC[i-1,2] THEN

BEGIN

PR:=PC[i,2];

PC[i,2]:=PC[i-1,2];

PC[i-1,2]:=PR;

{---------}

PR:=PC[i,1];

PC[i,1]:=PC[i-1,1];

PC[i-1,1]:=PR;

P:=TRUE

END

UNTIL NOT P

END;

{---------}

VAR i,j,k,NZ:word;

ST,PST:string;

BEGIN

PC[1,1]:=1;

PC[1,2]:=1;

WP[1]:=1;

DIF:=1;

FOR k:=2 TO KBL DO

BEGIN

PR:=FALSE;

CASE TF OF

'T','t':BEGIN

ST:='';

PLUS(ST,L,k);

PST:='';

j:=0;

WHILE (j<k-1) and (ST<>PST) DO

BEGIN

j:=j+1;

PST:='';

PLUS(PST,L,j)

END;

IF ST=PST THEN PR:=TRUE

END;

{---------------------------------------------------}

'F','f':BEGIN

j:=1;

{-----------}

WHILE (j<k) and (not PR) DO

BEGIN

{-----------}

m:=1;

SF:=WT[k,m];

PSF:=WT[j,m];

WHILE (m<L) and (SF=PSF) DO

BEGIN

m:=m+1;

SF:=WT[k,m];

PSF:=WT[j,m]

END;

{-----------}

IF SF=PSF THEN PR:=TRUE ELSE j:=j+1

END;

END

END;

{-----------}

IF PR

THEN

BEGIN

m:=1;

WHILE PC[m,1]<>WP[j] DO m:=m+1;

{------------}

PC[m,2]:=PC[m,2]+1;

WP[k]:=WP[j]

END

ELSE

BEGIN

DIF:=DIF+1;

PC[DIF,1]:=DIF;

PC[DIF,2]:=1;

WP[k]:=DIF

END

END;

UPR(DIF,PC)

END;

3. Procedure FTAB

Назначение:

Создание специальной таблицы TREE, представляющей "дерево" в методе построения оптимального кода по Хаффмену.

Математическое описание:

ВНИМАНИЕ! В ДАННОМ ОПИСАНИИ ЭЛЕМЕНТОМ МАССИВА РС СЧИТАЕТСЯ ЕГО СТРОКА,СО-

ДЕРЖАЩАЯ НОМЕР (ИМЯ) СООБЩЕНИЯ И ЧИСЛО ЕГО ПОЯВЛЕНИЯ В ПОСЛЕДОВАТЕЛЬНОСТИ,

ФОРМИРУЕМОЙ ИСТОЧНИКОМ!

Над двумерным массивом РС, упорядоченном по убыванию чисел появления различных сообщений, процедурой UPR, в соответствии с методом построения кода по Хаффмену выполняются следующие

действия в каждом шаге цикла:

суммируются числа появления двух последних (с наименьшими ненулевыми значениями) в массиве РС элементов;

второй столбец предпоследнего элемента заменяется этой суммой, которая представляет псевдочисло появления вспомогательного "сообщения";

формируется номер вспомогательного "сообщения" путем увеличения на 1

числа отличных друг от друга сообщений;

первый столбец этого же элемента заменяется этим номером;

последний ненулевой элемент обнуляется;

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

Цикл выполняется до тех пор,пока в массиве не останется один ненулевой элемент с суммарным числом появления.

Вход:

DIF - количество различных сообщений, блоков или L-грамм в исследуемой выборке;

PC - двумерный массив размером (KBL,2), содержащий в 1-м столбце номера сообщений, блоков или L-грамм, а в 2-м столбце - их числа появления;

Выход:

TREE - двумерный массив размером (KBL,3), представляющий "дерево" в методе Хаффмена, и содержащий :

в 1-м столбце номера сообщений, блоков или L-грамм, имеющих большее число появлений;

в 2-м столбце номера сообщений, блоков или L-грамм, имеющих меньшее число появлений;

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

Текст процедуры:

PROCEDURE FTAB(DIF:word;var PC,TREE);

{------Процедура UPR служит для упорядочивания массива РС------}

PROCEDURE UPR(DIF:word;var PC);

VAR i,PR:word;

P:boolean;

BEGIN

REPEAT

P:=FALSE;

i:=1;

WHILE (i<DIF-1) and (PC[i,2]>=PC[i-1,2]) DO i:=i+1;

IF PC[i,2]<PC[i-1,2] THEN

BEGIN

PR:=PC[i,2];

PC[i,2]:=PC[i-1,2];

PC[i-1,2]:=PR;

{---------}

PR:=PC[i,1];

PC[i,1]:=PC[i-1,1];

PC[i-1,1]:=PR;

P:=TRUE

END

UNTIL NOT P

END;

{---------}

VAR i,j,PR2:word;

BEGIN

FOR i:=1 TO DIF-1 DO

BEGIN

PR2:=PC[DIF-i+1,2]+PC[DIF-i,2];

TREE[i,1]:=PC[DIF-i,1];

TREE[i,2]:=PC[DIF-i+1,1];

TREE[i,3]:=DIF+i;

PC[DIF-i,1]:=DIF+i;

PC[DIF-i,2]:=PR2;

PC[DIF-i+1,1]:=0;

PC[DIF-i+1,2]:=0;

UPR(DIF-i,PC)

END

END;

4. Procedure FKOD

Назначение:

Построение кодовых слов эффективного кода по методу Хаффмена.

Математическое описание:

Кодовые слова эффективного кода формируются с помощью "дерева", которое окончательно формируется с помощью специальной таблицы TREE. Каждое кодовое слово формируется в обратном порядке. Номер сообщения сравнивается с содержимым 1-го и 2-го столбцов массива TREE. При совпадении с содержимым 1-го столбца в кодовое слово заносится 1. При совпадении с содержимым 2-го столбца в кодовое слово заносится 0.

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

Цикл повторяется до тех пор, пока текущий номер<(2*DIF-1). Полученное кодовое слово заносится в массив KOD в обратном порядке.

Вход:

KBL - длина исследуемой выборки сообщений;

DIF - количество различных сообщений, блоков или L-грамм в исследуемой выборке;

LEN - максимальное число разрядов эффективного кода;

PC - двумерный массив размером (KBL,2),содержащий в 1-м столбце номера сообщений, блоков или L-грамм, а в 2-м столбце - их числа появления;

TREE - двумерный массив размером (KBL,3),представляющий "дерево" в методе Хаффмена, и содержащий :

в 1-м столбце номера сообщений, блоков или L-грамм,имеющих большее число появлений;

в 2-м столбце номера сообщений, блоков или L-грамм,имеющих меньшее число появлений;

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

Выход:

KOD - двумерный массив размером (KBL,LEN),содержащий кодовые слова эффективного кода.

Текст процедуры:

PROCEDURE FKOD(KBL,DIF,LEN:word;var PC,TREE,KOD);

VAR i,j,k,SN:word;

STR:string;

BEGIN

FOR k:=1 TO KBL DO FOR j:=1 TO LEN DO KOD[k,j]:=' ';

FOR i:=DIF DOWNTO 1 DO

BEGIN

SN:=PC[i,1];

STR:='';

REPEAT

j:=0;

REPEAT

j:=j+1

UNTIL (TREE[j,1]=SN) or (TREE[j,2]=SN);

{--------}

IF TREE[j,1]=SN THEN STR:=STR+'1' ELSE STR:=STR+'0';

SN:=TREE[j,3];

{--------}

UNTIL SN=2*DIF-1;

k:=1;

FOR j:=LENGTH(STR) DOWNTO 1 DO

BEGIN

KOD[i,k]:=STR[j];

k:=k+1

END

END

END;

5. Procedure FBIN

Назначение:

Кодирование номеров различных сообщений двоичным позиционным кодом.

Математическое описание:

Для кодирования очередного сообщения, блока или L-граммы используются массивы РС и BIN, в которых установлено следующее соответствие по строкам: кодовое слово в строке массива BIN соответствует номеру сообщения в той же строке массива РС.

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

Вход:

KBL - длина исследуемой выборки сообщений;

DIF - количество различных сообщений, блоков или L-грамм в исследуемой выборке;

INF - число разрядов двоичного позиционного кода ;

PC - двумерный массив размером (KBL,2),содержащий в 1-м столбце номера сообщений, блоков или L-грамм,а в 2-м столбце - их числа появления;

Выход:

BIN - многомерный массив (KBL,INF),содержащий двоичные позиционные коды;

Текст процедуры:

PROCEDURE FBIN(KBL,DIF,INF:word;var PC,BIN);

VAR DIG,i,j:word;

BEGIN

FOR i:=1 TO DIF DO

BEGIN

DIG:=PC[i,1];

j:=INF;

WHILE (DIG>1) and (j>1) DO

BEGIN

BIN[i,j]:=DIG mod 2;

DIG:=DIG div 2;

j:=j-1

END;

BIN[i,j]:=DIG

END

END;

6. Procedure VIEW

Назначение:

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

Математическое описание:

Кодирующие таблицы имитируются для их демонстрации на основе содержимого массивов WT,WP,PC,KOD и BIN и определенного соответствия между ними.

Вход:

TF - ключ для процедур FPC,VIEW -

принимает 2 значения:

'T' - обработка текстовой информации;

'F' - обработка уровней квантования;

REG - ключ для процедур FBL,VIEW,KVT,DCF,SEG и STAT;

принимает 2 значения:

'B'-кодирование и декодирование блоков ;

'L'-кодирование и декодирование L-грамм ;

KBL - длина исследуемой выборки сообщений;

DIF - количество различных сообщений, блоков или L-грамм в исследуемой выборке;

L - длина блока или L-граммы ;

LEN - максимальное число разрядов эффективного кода ;

INF - число разрядов двоичного позиционного кода ;

WT - двумерный массив размером (KBL,L),содержащий сообщения, блоки или L-граммы;

WP - одномерный массив длиной KBL, содержащий номера сообщений, блоков или L-грамм;

PC - двумерный массив размером (KBL,2),содержащий в 1-м столбце номера сообщений, блоков или L-грамм, а в 2-м столбце - их числа появления;

KOD - двумерный массив размером (KBL,LEN),содержащий кодовые слова эффективного кода;

BIN - двумерный массив размером (KBL,INF),содержащий кодовые слова двоичного позиционного кода.

Текст процедуры:

PROCEDURE VIEW(TF,REG:char;KBL,DIF,L,LEN,INF:word;var WT,WP,PC,KOD,BIN);

VAR NB,i,j,k,s,s1,s2:word;

KL:char;

REGIM:string;

BEGIN

CASE REG OF

'L','l' :REGIM:='L-грамма';

'B','b' :IF L=1 THEN

CASE TF OF

'T','t': REGIM:='Символ';

'F','f': REGIM:='Уровень';

END

ELSE REGIM:='Блок';

END;

{-----------}

CASE TF OF

'T','t': IF L<LENGTH(REGIM) THEN s2:=LENGTH(REGIM) ELSE s2:=L;

'F','f': IF L*3<LENGTH(REGIM) THEN s2:=LENGTH(REGIM) ELSE s2:=L*3;

END;

s:=(80-37-s2) div 2;

gotoXY(s,3);WRITE(REGIM);

gotoXY(s+s2+2,3); WRITE('вероятность');

gotoXY(s+s2+3,4); WRITE('появления');

gotoXY(s+s2+15,3);WRITE('эффективный');

gotoXY(s+s2+19,4);WRITE('код');

gotoXY(s+s2+28,3);WRITE('позиционный');

gotoXY(s+s2+32,4);WRITE('код');

s1:=5;

FOR i:=1 TO DIF DO

BEGIN

NB:=PC[i,1];

k:=1;

WHILE (NB<>WP[k]) and (k<KBL) DO k:=k+1;

gotoXY(s,s1);

FOR j:=1 TO L DO WRITE(WT[k,j]);

gotoXY(s+s2+5,s1);

WRITELN(PC[i,2]/KBL:5:3);

gotoXY(s+s2+16,s1);

FOR j:=1 TO LEN DO WRITE(KOD[i,j]);

gotoXY(s+s2+29,s1);

FOR j:=1 TO INF DO WRITE(BIN[i,j]);

WRITELN;

IF WHEREY=23 THEN

BEGIN

gotoXY(30,s1+2);

WRITELN('Нажмите любую клавишу !');

WHILE KEYPRESSED DO KL:=READKEY;KL:=READKEY;

FOR j:=5 TO 25 DO

BEGIN

gotoXY(1,j);

CLREOL

END;

s1:=5;

END

ELSE s1:=s1+1

END;

gotoXY(30,s1+1);

WRITELN('Нажмите любую клавишу !');

WHILE KEYPRESSED DO KL:=READKEY;KL:=READKEY;

IF (TF='T') or (TF='t') THEN

BEGIN

gotoXY(32,s1+3);

WRITELN('Идет запись! Ждите !')

END

END;

7. Procedure TVK

Назначение:

Кодирование очередного сообщения, блока или L-граммы эффективным кодом.

(Имитация функции оптимального двоичного кодера).

Математическое описание:

Для кодирования очередного сообщения, блока или L-граммы используются массивы РС и KOD, в которых установлено следующее соответствие по строкам :

кодовое слово в строке массива KOD соответствует номеру сообщения в той же строке массива РС.

Вход:

DIF - количество различных сообщений, блоков или L-грамм в исследуемой выборке;

L - длина блока или L-граммы;

LEN - максимальное число разрядов эффективного кода;

WPi - номер сообщения, блока или L-граммы;

PC - двумерный массив размером (KBL,2),содержащий в 1-м столбце номера сообщений, блоков или L-грамм, а в 2-м столбце - их числа появления;

KOD - двумерный массив размером (KBL,LEN),содержащий кодовые слова эффективного кода.

Выход:

LKOD - эффективное кодовое слово.

Текст процедуры:

PROCEDURE TVK(DIF,LEN:word;var PC,KOD;WPi:word;var LKOD:string);

VAR j,k:word;

BEGIN

LKOD:='';

j:=1;

WHILE (j<=DIF) and (PC[j,1]<>WPi) DO j:=j+1;

{-----------}

k:=1;

WHILE (k<=LEN) and (KOD[j,k]<>' ') DO

BEGIN

LKOD:=LKOD+KOD[j,k];

k:=k+1

END

END;

8. Procedure DCT

Назначение:

Декодирование очередного сообщения, блока или L-граммы.

Процедура имитирует функции декодера и буфера для накопления принимаемых кодовых слов, и создает файл TEXT_OUT.PAS, в котором находится декодированный текст.

Математическое описание:

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

сдвигается в сторону "старших" разрядов на длину опознанного кодового слова.

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

декодера приписывается очередное принимаемое кодовое слово.

Вход:

REG - ключ для процедур FBL,VIEW,DCT,DCF,SEG и STAT;

принимает 2 значения:

'B'-кодирование и декодирование блоков;

'L'-кодирование и декодирование L-грамм;

KBL - длина исследуемой выборки сообщений;

DIF - количество различных сообщений, блоков или L-грамм в исследуемой выборке;

LEN - максимальное число разрядов эффективного кода;

WT - двумерный массив размером (KBL,L), содержащий сообщения, блоки или L-граммы;

WP - одномерный массив длиной KBL, содержащий номера сообщений, блоков или L-грамм;

PC - двумерный массив размером (KBL,2), содержащий в 1-м столбце номера сообщений, блоков или L-грамм, а в 2-м столбце - их числа появления;

KOD - двумерный массив размером (KBL,LEN), содержащий кодовые слова эффективного кода;

NZ - счетчик цикла;

LKOD - эффективное кодовое слово.

Выход:

Файл TEXT_OUT.PAS , содержащий декодированный текст.

Текст процедуры:

PROCEDURE DCT(REG:char;DIF,L,LEN,KBL,NZ:word;var LKOD:string;

var WT,KOD,WP,PC);

LABEL 1,2,3;

VAR i,j,k,q,NI:word;

RKOD,LT:string;

BEGIN

IF NZ=1 THEN

BEGIN

SKOD:=LKOD;

Z1:=1;

Z2:=1;

END

ELSE

BEGIN

SKOD:=SKOD+LKOD;

APPEND(FK);

APPEND(FT)

END;

{-----------}

FOR i:=1 TO DIF DO

BEGIN

RKOD:='';

LT:='';

j:=1;

WHILE (j<=LEN) and (KOD[i,j]<>' ') DO

BEGIN

RKOD:=RKOD+KOD[i,j];

j:=j+1

END;

{-----------}

q:=1;

WHILE (q<=LENGTH(SKOD)) and (q<=LENGTH(RKOD)) DO

BEGIN

LT:=LT+SKOD[q];

q:=q+1

END;

{-----------}

IF RKOD=LT THEN

BEGIN

NI:=PC[i,1];

BREAK

END

END;

UNTIL (RKOD=LT) or (i>=DIF);

{-----------}

IF RKOD<>LT THEN

BEGIN

RKOD:='';

j:=1;

WHILE (j<=LEN) and (KOD[1,j]<>' ') DO

BEGIN{4}

RKOD:=RKOD+KOD[1,j];

j:=j+1

END;

NI:=PC[1,1]

END;

{-----------}

IF Z1+LENGTH(RKOD)<=80 THEN

BEGIN

1:FOR j:=1 TO LENGTH(RKOD) DO WRITE(FK,RKOD[j]);

Z1:=Z1+LENGTH(RKOD)

END

ELSE

BEGIN

WRITELN(FK);

Z1:=1;

GOTO 1

END;

{-----------}

i:=1;

WHILE (NI<>WP[i]) and (i<KBL) DO i:=i+1;

NI:=i;

{-----------}

CASE REG OF

'B','b':

BEGIN

IF Z2+L<=80 THEN

BEGIN

2:FOR q:=1 TO L DO WRITE(FT,WT[NI,q]);

Z2:=Z2+L

END

ELSE

BEGIN

WRITELN(FT);

Z2:=1;

GOTO 2

END

END;

'L','l':

BEGIN

IF NZ<>1 THEN

IF Z2+1<=80 THEN

BEGIN

3:WRITE(FT,WT[NI,L]);

Z2:=Z2+1

END

ELSE

BEGIN

WRITELN(FT);

Z2:=1;

GOTO 3

END

ELSE

BEGIN

FOR j:=1 TO L DO WRITE(FT,WT[NI,j]);

Z2:=Z2+L

END

END

END;

DELETE(SKOD,1,LENGTH(RKOD));

{-----------}

CLOSE(FK);CLOSE(FT)

END;

9. Procedure BTK

Назначение:

Кодирование сообщений, блоков или L-грамм двоичным позиционным кодом. (Имитация функции двоичного кодера). Создается файл BIN_OUT.PAS, содержащий текст, закодированный двоичным позиционным кодом без пробелов.

Математическое описание:

Для кодирования очередного сообщения, блока или L-граммы используются массивы РС и BIN, в которых установлено следующее соответствие по строкам : кодовое слово в строке массива BIN соответствует номеру сообщения в той же строке массива РС.

Вход:

KBL - длина исследуемой выборки сообщений;

DIF - количество различных сообщений, блоков или L-грамм в исследуемой выборке;

L - длина блока или L-граммы ;

INF - число разрядов двоичного позиционного кода ;

WP - одномерный массив длиной KBL, содержащий номера сообщений, блоков или L-грамм;

PC - двумерный массив размером (KBL,2),содержащий в 1-м столбце номера сообщений, блоков или L-грамм,а в 2-м столбце - их числа появления;

BIN - двумерный массив размером (KBL,INF),содержащий кодовые слова двоичного позиционного кода.

Выход:

Файл BIN_OUT.PAS ,содержащий текст, закодированный двоичным позиционным кодом без пробелов.

Текст процедуры:

PROCEDURE BTK(KBL,DIF,L,INF:word;var WP,PC,BIN);

LABEL 1;

VAR NB,i,j,k,z:word;

BEGIN

ASSIGN(FB,'BIN_OUT.PAS');REWRITE(FB);

z:=1;

FOR i:=1 TO KBL DO

BEGIN

NB:=WP[i];

j:=1;

WHILE (j<=DIF) and (PC[j,1]<>NB) DO j:=j+1;

1:IF z+INF<=78 THEN

BEGIN

FOR k:=1 TO INF DO WRITE(FB,BIN[j,k]);

z:=z+INF;

END

ELSE

BEGIN

WRITELN(FB);

z:=1;

GOTO 1;

END

END;

CLOSE(FB)

END;

10. Procedure STAT

Назначение:

Вычисление статистических показателей эффективности кода: средней длины кодового слова и среднего числа двоичных символов на одно сообщение при кодировании блоками.

Математическое описание:

Средняя длина кодового слова вычисляется путем деления суммарной длины кодовых слов, представляющих сообщения, блоки или L-граммы,на их число в данной выборке.

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

Вход:

KBL - длина исследуемой выборки сообщений;

L - длина блока или L-граммы ;

LEN - максимальное число разрядов эффективного кода ;

REG - ключ для процедур FBL,VIEW,KVT,DCF,SEG и STAT;

принимает 2 значения:

'B'-кодирование и декодирование блоков ;

'L'-кодирование и декодирование L-грамм ;

KOD - двумерный массив размером (KBL,LEN),содержащий кодовые слова эффективного кода;

PC - двумерный массив размером (KBL,2),содержащий в 1-м столбце номера сообщений, блоков или L-грамм,а в 2-м столбце - их числа появления

WP - одномерный массив длиной KBL, содержащий номера сообщений, блоков или L-грамм.

Текст процедуры:

PROCEDURE STAT(KBL,L,LEN:word;REG:char;var KOD,PC,WP);

VAR i,j,k,NI:word;

TS:real;

ST:string;

KL:char;

BEGIN

TS:=0;

FOR i:=1 TO DIF DO

BEGIN

NI:=WP[i];

k:=1;

WHILE (PC[k,1]<>NI) DO k:=k+1;

ST:='';

j:=1;

WHILE (KOD[k,j]<>' ') and (j<=LEN) DO

BEGIN

ST:=ST+KOD[k,j];

j:=j+1

END;

TS:=TS+LENGTH(ST)

END;

clrscr;

WRITELN('Средняя длина кодового слова :',TS/KBL:6:4);

IF REG='B' THEN

WRITELN('Количество двоичных символов на одно сообщение :',TS/KBL/L:6:4);

gotoXY(30,5);

WRITELN('Нажмите любую клавишу !');

WHILE KEYPRESSED DO KL:=READKEY;KL:=READKEY

END;

11. Procedure SEG

Назначение

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

Математическое описание:

При кодировании блоками строка массива WT (блок) образуется последовательной записью очередных из выборки L квантованных сообщений.

При кодировании L-граммами каждая последующая строка массива WT (начиная со второй) образуется путем перезаписи в нее (L-1) элементов предыдущей строки, начиная со второго элемента. В L-тый элемент заносится очередное сообщение выборки.

Вход:

REG - ключ для процедур FBL,VIEW,KVT,SEG,DCF и STAT,

принимает 2 значения:

'B'-кодирование и декодирование блоков;

'L'-кодирование и декодирование L-грамм;

L - длина блока или L-граммы ;

KBL - длина исследуемой выборки сообщений;

UK - одномерный массив длиной N, содержащий номера уровней квантования.

Выход:

WT - двумерный массив размером (KBL,L),содержащий сообщения, блоки или L-граммы.

Текст процедуры:

PROCEDURE SEG(REG:char;KBL,L:word;var UK,WT);

VAR i,j,k:word;

BEGIN

k:=1;

i:=1;

j:=1;

WHILE i<=KBL DO

BEGIN

WHILE j<=L DO

BEGIN

WT[i,j]:=UK[k];

k:=k+1;

j:=j+1

END;

i:=i+1;

CASE REG OF

'B','b':j:=1;

'L','l':

BEGIN

j:=1;

WHILE j<L DO

BEGIN

WT[i,j]:=WT[i-1,j+1];

j:=j+1

END

END

ELSE HALT

END

END

END;

12. Procedure DCF

Назначение

Декодирование очередного сообщения, блока или L-граммы.

Процедура имитирует функции декодера и буфера для накопления принимаемых кодовых слов.

Математическое описание:

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

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

декодера приписывается очередное принимаемое кодовое слово.

Вход:

REG - ключ для процедур FBL,VIEW,KVT,SEG,DCF и STAT,

принимает 2 значения:

'B'-кодирование и декодирование блоков;

'L'-кодирование и декодирование L-грамм;

DIF - количество различных сообщений, блоков или L-грамм в исследуемой выборке;

L - длина блока или L-граммы;

LEN - максимальное число разрядов эффективного кода;

KBL - длина исследуемой выборки сообщений;

NZ - счетчик цикла;

LKOD - эффективное кодовое слово;

Q - полушаг квантования;

Ymin - минимальное значение функции;

WT - двумерный массив размером (KBL,L),содержащий сообщения, блоки или L-граммы.

Выход:

WT - двумерный массив размером (KBL,L),содержащий сообщения, блоки или

L-граммы;

KOD - двумерный массив размером (KBL,LEN),содержащий кодовые слова эффективного кода;

WP - одномерный массив длиной KBL, содержащий номера сообщений, блоков или L-грамм;

PC - двумерный массив размером (KBL,2),содержащий в 1-м столбце номера сообщений, блоков или L-грамм,а в 2-м столбце - их числа появления;

YKout - вещественный одномерный массив длиной N, содержащий значения искаженной квантованной функции.

Текст процедуры:

PROCEDURE DCF(REG:char;DIF,L,LEN,KBL,NZ:word;var LKOD:string;

Q,Ymin:real;var WT,KOD,WP,PC,YKout);

LABEL 1;

VAR i,j,k,NI:word;

RKOD,LT:string;

BEGIN

IF NZ=1 THEN SKOD:=LKOD ELSE SKOD:=SKOD+LKOD;

{-----------}

FOR i:=1 TO DIF DO

BEGIN

RKOD:='';

LT:='';

j:=1;

WHILE (j<=LEN) and (KOD[i,j]<>' ') DO

BEGIN

RKOD:=RKOD+(KOD[i,j];

j:=j+1

END;

{-----------}

k:=1;

WHILE (k<=LENGTH(SKOD)) and (k<=LENGTH(RKOD)) DO

BEGIN

LT:=LT+SKOD[k];

k:=k+1

END;

{-----------}

IF RKOD=LT THEN

BEGIN

NI:=PC[i,1];

BREAK

END

END;

{-----------}

IF RKOD<>LT THEN

BEGIN

RKOD:='';

j:=1;

WHILE (j<=LEN) and (KOD[1,j]<>' ') DO

BEGIN

RKOD:=RKOD+KOD[1,j];

j:=j+1

END;

{-----------}

NI:=PC[1,1]

END;

{-----------}

i:=1;

WHILE (NI<>WP[i]) and (i<KBL) DO i:=i+1;

{-----------}

FOR k:=1 TO L DO VecW(WT)[L*(NZ-1)+k]:=VecW(WT)[L*(i-1)+k];

{-----------}

DELETE(SKOD,1,LENGTH(RKOD));

{-----------}

CASE REG OF

'B','b':

BEGIN

1:FOR k:=1 TO L DO YKout[NZ,k]:=Ymin+Q+2*Q*WT[NZ,k]

END;

'L','l':

BEGIN

IF NZ=1 THEN GOTO 1

ELSE YKout[L+NZ-1]:=Ymin+Q+2*Q*WT[NZ,L]

END

END

END;

13. Procedure KAN

Назначение

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

Математическое описание:

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

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

Примечание :

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

Вход:

VP - ключ для процедуры KAN -

принимает 2 значения:

0 - обработка одного разряда кодового слова;

1 - обработка всего кодового слова;

T0 - значение уровня нуля сигналов в канале связи;

T1 - значение уровня единицы сигналов в канале связи;

PK - порог квантования;

M - математическое ожидание случайной величины;

S - среднее квадратичное отклонение случайной величины;

LKOD - эффективное кодовое слово.

Выход:

LKOD - эффективное кодовое слово.

Текст процедуры:

PROCEDURE KAN(VP:byte;var LKOD:string;T0,T1,PK,S,M:real);

VAR j,N:byte;

R,US:real;

BEGIN

CASE VP OF

0:BEGIN

N:=random(length(LKOD)-1)+1;

R:=GAUSS(S,M);

IF LKOD[N]='1' THEN US:=T1 ELSE US:=T0;

US:=US+R;

{----------}

IF US>PK THEN

IF LKOD[N]='0' THEN LKOD[N]:='1';

{----------}

IF US<PK THEN

IF LKOD[N]='1' THEN LKOD[N]:='0';

END;

{--------}

1:BEGIN

FOR j:=1 TO LENGTH(LKOD) DO

BEGIN{3}

R:=GAUSS(S,M);

IF LKOD[j]='1' THEN US:=T1 ELSE US:=T0;

US:=US+R;

{----------}

IF US>PK THEN

IF LKOD[j]='0' THEN LKOD[j]:='1';

{----------}

IF US<PK THEN

IF LKOD[j]='1' THEN LKOD[j]:='0';

END

END

END

END;

14.Procedure GKLF

Назначение:

Генерация кусочно-линейной функции.

Математическое описание:

Процедура генерирует периодическую кусочно-линейную функцию Yo. Для этого по формуле y=k*x+b вычисляется значения линейных участков функции на интервале от Ax[1] до Ax[1]+T с шагом T/(N-1). Для определения коэффициентов k и b линейных участков используются координаты Na точек перегиба

(в массиве Ax) и значения функции в этих точках (в массиве Ay).

Вход:

T - период функции;

Ax - вещественный одномерный массив длинной Na, содержащий координаты точек перегиба;

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

Выход:

X - вещественный одномерный массив длиной N, содержащий значения аргумента функции;

Y - вещественный одномерный массив длиной N, содержащий значения сгенерированной кусочно-линейной функции.

Текст процедуры:

PROCEDURE GKLF(T:real;var Ax,Ay,X,Yo:array of real);

VAR

i,j:word;

k,b,dx:real;

BEGIN

dx:=T/High(X);

X[0]:=Ax[0];

Yo[0]:=Ay[0];

j:=0;

for i:=1 to High(X) do

begin

X[i]:=X[i-1]+dx;

if (j<High(Ax)) and (X[i]>=Ax[j+1]) then inc(j);

if j<High(Ax)

then k:=(Ay[j+1]-Ay[j])/(Ax[j+1]-Ax[j])

else k:=(Ay[0]-Ay[j])/(Ax[0]+T-Ax[j]);

b:=Ay[j]-k*Ax[j];

Yo[i]:=k*X[i]+b

end

END;

15.Procedure SAG

Назначение:

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

Математическое описание:

Процедура выполняет операции в зависимости от значения ключа K3:

K3=0 - полушаг квантования определяется с помощью подпрограммы AVER, количество уровней квантования определяется делением разности между максимальным и минимальным значениями функции на шаг квантования;

K3<>0 - полушаг квантования определяется делением разности между максимальным и минимальным значениями функции на количество уровней квантования.

Вход:

K3 - ключ,определяющий способ вычисления полушага квантования;

V - предполагаемая вероятность правильной передачи сообщения при "гауссовых" случайных помехах в канале связи;

M - предполагаемое математическое ожидание амплитуды "гауссовой" помехи;

S - предполагаемое среднее квадратичное отклонение амплитуды "гауссовой" помехи;

Ymin - минимальное значение функции;

Ymax - максимальное значение функции.

Выход:

KU - количество уровней квантования;

Q - полушаг квантования.

Текст процедуры:

PROCEDURE SAG(KS:word;V1,M,S,Ymin,Ymax:real;var KU:word;var Q:real);

BEGIN

if KS=0

then begin

Q:=AVER(V1,M,S);

KU:=round((Ymax-Ymin)/(2*Q))

end

else if KU=0 then Q:=0 else Q:=((Ymax-Ymin)/KU)/2

END;

16.Procedure RPT

Назначение:

Определение порога квантования и значения уровня единицы сигналов в канале связи c учетом интенсивности помех.

Математическое описание:

Порог квантования определяется с помощью подпрограммы AVER. Значение уровня единицы рассчитывается как сумма значений уровня нуля и удвоенного порога квантования.

Вход:

T0 - значение уровня нуля;

V - предполагаемая вероятность правильной передачи сообщения при "гауссовых" случайных помехах в канале связи;

M - предполагаемое математическое ожидание амплитуды "гауссовой" помехи;

S - предполагаемое среднее квадратичное отклонение амплитуды "гауссовой" помехи.

Выход:

PK - порог квантования;

T1 - значение уровня единицы.

Текст процедуры:

PROCEDURE RPT(T0,V,M,S:real;var PK,T1:real);

BEGIN

PK:=AVER(V,M,S);

T1:=PK*2+T0

END;

17.Procedure KVN

Назначение:

Квантование сообщений по уровню.

Математическое описание:

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

Вход:

KU - количество уровней квантования;

Q - полушаг квантования;

Ymin - минимальное значение функции;

Yi - квантуемое значение функции.

Выход:

NUK - номер уровня квантования;

YK - проквантованное значение функции.

Текст процедуры:

PROCEDURE KVN(KU:word;Q,Ymin,Yi:real;var NUK:word;var YK:real);

VAR

k:word;

BEGIN

k:=0;

repeat

YK:=Ymin+Q+2*Q*k;

k:=k+1

until (Yi<=YK+Q) or (k>=KU);

NUK:=k-1

END;

18. FUNCTION MIN

Назначение:

Определение минимального значения функции.

Математическое описание:

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

Вход:

Y - одномерный массив, содержащий значения функции.

Текст функции:

FUNCTION Min(var Mas:array of real):real;

VAR

i:word;

m:real;

BEGIN

m:=Mas[0];

for i:=1 to High(Mas) do if Mas[i]<m then m:=Mas[i];

Min:=m

END;

19. FUNCTION MAX

Назначение:

Определение максимального значения функции.

Математическое описание:

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

Вход:

Y - одномерный массив, содержащий значения функции.

Текст функции:

FUNCTION Max(var Mas:array of real):real;

VAR

i:word;

m:real;

BEGIN

m:=Mas[0];

for i:=1 to High(Mas) do if Mas[i]<m then m:=Mas[i];

Min:=m

END.

Соседние файлы в папке doc_1