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.