Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

В блоке БПВИ осуществляется преобразование принятой последовательности в требуемый формат.

Структурная схема принимающего устройства представлена на рисунке 3.3

Рисунок 3.3 – Структурная схема принимающего устройства

3.4 Алгоритм функционирования приёмного устройства

При включении питания принимающего устройства УУ подаст сигнал на БАСИ о наличии питания. Сигнал поступает на БНУ, который устанавливает все остальные блоки в начальное состояние. После этого схема перейдет в режим ожидания стартовой посылки из канала связи. При длительном отсутствии стартовой посылки УУ формирует сигнал для БАСИ об отсутствии данных в канале.

Из канала связи через УПС данные поступают на приемную часть СПД. Информация разделяется на служебную и информационную. Служебная записывается в РгСК, после чего поступает на ДшСК, от куда информация поступает на БФЦ. БФЦ выявляет стартовую стартовую комбинацию и отправляет сигнал на УУ, после чего следующая за стартовой комбинацией информация (информационная) записывается в М. Получение информации от УПС осуществляется до выявления УВССС стоповой комбинации.

При повторном получении сообщения, информация, записанная с М, сравнивается с полученной, в результате по нечетному количеству принятых комбинаций формируется результирующая комбинация. При достижении заданного числа принятых блоков, ДшСК отправляет на УУ сигнал о завершении приема. По завершению приема блока информации, информация записывается в БН, от куда поступает на ДК для декодирования информации. После декодирования УУ через ФСО1 запрашивает готовность приемника к получению данных и, в случае получения разрешающего сигнала, направляет данные в БПВИ. В блоке БПВИ осуществляется преобразование принятой последовательности в требуемый формат и согласование по уровню с уровнем приемника.

НЕ нашли? Не то? Что вы ищете?

При возникновении ошибки на любом из этапов: не обнаружена стартовая или стоповая комбинации, недопустимое значение номера блока или номера источника, невозможность исправления ошибки ДК и т. д. УУ подает на БАСИ сигнал об аварии.

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

Алгоритм работы приемника изображен на рисунке 3.4.

Рисунок 3.4 – Блок схема алгоритма работы приемника

3.5 Синтез схем кодирующего и декодирующего устройств

Задан образующий полином:

Р(х)=7478==х8+х7 +х6 +х5 +х2+x1+1.

С помощью данного полинома можно закодировать n-r бит информации, где n — общая длина кодовой комбинации, которая для данного полинома равна 28-1 = 255; r – число проверочных элементов, равное степени образующего полинома. Рассчитав, получим, что с помощью данного полинома можно закодировать 247 информационных бит.

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

Основные правила синтеза:

1) Число ячеек регистра равно старшей степени образующего полинома (для заданного полинома получаем 8 ячеек). Ячейка для старшей степени многочлена отсутствует, а для х0 всегда присутствует.

2) Число сумматоров на единицу меньше числа ненулевых членов многочлена (в данном случае 6).

3) В структурной схеме кодирующего устройства отсутствует сумматор для старшего члена многочлена. В структурной схеме декодирующего устройства – для младшего.

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

5) В кодирующем устройстве полином должен подаваться только на первый сумматор, в декодирующем — одновременно на вход и все сумматоры.

6) Полином подается на входы схем старшим разрядом вперед.

На основе данных правил, синтезируем структурные схемы кодирующего (рисунок 3.5) и декодирующего (рисунок 3.6) устройств.

Нас схеме кодирующего устройства k1,k2 – ключи. На схеме декодирующего устройства Я1..Я247 – ячейки буферного информационного регистра.

Рисунок 3.5. - Структурная схема кодирующего устройства

Рисунок 3.6. - Структурная схема декодирующего устройства

3.6 Выводы к главе 3

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

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

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

Р(х)=7478==х8+х7 +х6 +х5 +х2+x1+1

4. Разработка кодирующего и декодирующего устройства

4.1 Описание программы

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

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

Программирование выполнено в среде С++Builder 6.0 для операционной системы Windows XP. Программная реализация устройства оформлена в виде класса и выделена в отдельный программный модуль. Разработанный программный модуль включен в состав демонстрационной программы. Компиляция программы выполнена без использования динамических библиотек и runtime пакетов.

Функциональное значение

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

Программа должна поддерживать кроме заданного образующего по­линома любой произвольный образующий полином до 31 степени включительно. Размер входной последовательности – до 32768 бит.

Программа должна обеспечивать:

· ввод и преобразование входной последовательности из двоичного файла и вручную;

· сохранение входной последовательности в двоичный файл;

· ввод образующего полинома из файла и вручную;

· сохранение образующего полинома в двоичный файл;

· вывод результата кодирования/декодирования на экранную форму и в файл;

· наложение вектора помех (вручную и из файла с возможностью записи введенного вектора помех в файл);

· сравнение данных до преобразования и после восстановления.

Входные данные

Входными данными являются: образующий полинома, исходная информация и вектор ошибок. Ввод данных осуществляется пользователем с клавиатуры либо из бинарного файла (*.pol, *.inf, *.err).

Таблица 4.1 Входные данные

Имя переменной

Тип переменной

Пояснение

R

int

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

N

int

Общая длина последовательности (информационные+проверочные биты)

Pol

bool*

Указатель на массив образующего полинома

Inf

bool*

Указатель на массив информационной последовательности

Err

bool*

Указатель на массив вектора помех

Выходные данные

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

Таблица 4.2 Выходные данные

Имя переменной

Тип переменной

Пояснение

Cod

bool*

Указатель на массив кодирующей комбинации

Ost

bool*

Указатель на массив остатка от деления

Dec

bool*

Указатель на массив декодированной информационной последовательности

Математическая постановка задачи

Циклические коды находят наибольшее распространение в системах передачи данных с решающей обратной связью, что обусловлено их высокими корректирующими свойствами, срав­нительно простой реализацией, невысокой избыточностью. Осо­бенно они эффективны при обнаружении пакетов ошибок. Цик­лические коды относятся к блочным систематическим кодам, в которых каждая комбинация кодируется самостоятельно в ви­де блока таким образом, что информационные k и проверочные r элементы всегда находятся на определенных местах. Для упро­щения процедуры кодирования и декодирования проверочные биты размещают в конце блока. Кодирование передаваемого сообщения осуществляется умножением двоичной последова­тельности G(x) на одночлен хr, имеющий ту же степень, что и образующий полином Р(х), с добавлением к этому произведе­нию остатка R(x), полученного после деления произведения G(x)*xr на образующий полином, т. е. передаваемое в канал связи сообщение F(x) имеет вид:

F(x) = G(x)*xr+R(x). (4.1)

При декодировании принимаемая последовательность F(x) снова делится на образующий полином Р(х). Полученный ну­левой остаток R(x)=0 свидетельствует об отсутствии ошибок в принятом блоке, а отличие от нуля - о наличии ошибок.

Описание логической структуры

1) Функции и переменные созданного класса

class coder

{

protected:

private:

int R; //степень образующего полинома=кол-во проверочных бит

int N; //N=информационные+проверочные биты

bool *Pol; //указатель на массив образующего полинома

bool *Inf; //указатель на массив инф. последовательности

bool *Cod; //указатель на массив кодирующ. комбинации

bool *Err; //указатель на массив вектора помех

bool *Ost; //указатель на массив остатка от деления

bool *Dec; //указатель на массив декодированной информации

public:

void Init(); //начальная инициализация

int getR(); //возврат степени образующего полинома

int getN(); //возврат общей длины комбинации

bool* getPol(); //возврат указателя на массив полинома

bool* getInf(); //возврат указателя на массив инф. послед-ти

bool* getCod(); //возврат указателя на массив кодир. комб-ии

bool* getErr(); //возврат указателя на массив вектора помех

bool* getOst(); //возврат указателя на массив остатка

bool* getDec(); //возврат указателя на массив декодиров. инф-ии

void setR(int); //запись значения степени полинома в переменную

void setN(int); //запись значения длины комб в переменную

void setPol(bool* ); //запись ук-ля на полином в переменную

void setInf(bool* ); //запись ук-ля на инф. послед-ть в переменную

void setCod(bool* ); //запись ук-ля на кодир. комб в перемен

void setErr(bool* ); //запись ук-ля на вектор помех в переменную

void setOst(bool* ); //запись ук-ля на остаток в переменную

void setDec(bool* ); //запись ук-ля на декодир. инф в переменную

void Coder(); //кодирование

void Decod(); //декодирование

};

2) Алгоритм кодирования

Перед началом кодирования, программа проверяет, существует ли информационная комбинация и образующий полином. Если да, то создается новый массив под кодирующую комбинацию (если ещё не был создан). Затем к информационной комбинации дописываются нули (их количество соответствует степени образующего многочлена). После чего начинается деление информационной последовательности на образующий полином. Программно это реализуется следующим образом. Первые R бит информационной последовательности записываются в кодирующую комбинацию (где R-степень полинома и число проверочных бит). Затем выполняется проверка: равен ли первый бит кодирующей комбинации нулю. Если нет, то выполняется «деление» - сложению по модулю два кодирующей комбинации и образующего полинома, если да, то комбинация сдвигается в сторону старшего разряда, а в младший разряд сносится следующий бит информационной комбинации. Процесс деления повторяется. Деление завершится, когда в информационной комбинации не останется неиспользованных (не переписанных в кодирующую комбинацию) элементов. После завершения деления проверочные биты, сформированные в массиве кодирующей комбинации, дописываются к информационной последовательности.

Так как процедура деления нам понадобится и при декодировании, вынесем ее в отдельную функцию bool* d (int n, int m, bool* a, bool* b), где n – длина делителя, m – длина делимого, a – делитель, b – делимое. Функция возвращает остаток от деления. Реализация деления представлена на рисунке 4.1.

Данный алгоритм представлен на рисунке 4.2.

Рисунок 4.1 – Блок–схема алгоритма деления.

Рисунок 4.2 – Блок–схема алгоритма функции Coder().

3) Алгоритм декодирования:

Перед началом декодирования вводится переменную error под количество единиц в векторе помех, также проверяется существование информационной последовательности, полинома и вектора ошибок. Если они существуют, то создаются новые массивы под остаток от деления и декодированную информацию. Выполняется подсчет количества единиц в векторе помех. Вводятся дополнительные переменные: KolEd –количество единиц в остатке; Sdvig – сколько раз был выполнен сдвиг; a – булева переменная для использования в качестве буфера при перезаписи массивов; k – счетчик проходов; W – счетчик проходов для цикла (изначально равен единице). В массив декодированной информации переписываются элементы из массива исходной информации, сложенные по модулю два с элементами вектора помех. Затем выполняется первичное деление полученной информации на образующий полином. Затем подсчитывается количество единиц в остатке от деления. Информация считается переданной без ошибок, если оно равно 0. Иначе если оно меньше или равно количеству ошибок, то декодированная информация складывается по модулю два с остатком (со стороны младших разрядов). В результате получаем исправленную информацию. Если количество единиц в остатке больше числа ошибок, то выполняется циклический сдвиг информационной комбинации на единицу в сторону старших разрядов и деление повторяется. Действия будут повторяться, пока количество единиц в остатке не будет меньше либо равно количеству ошибок, либо, во избежание зацикливания программы, не более 6 раз. После чего декодированная информация аналогично складывается по модулю два с остатком, и выполняется обратный циклический сдвиг (в сторону младших разрядов). В результате получаем исправленную информацию.

Данный алгоритм представлен на рисунке 4.2.

Рисунок 4.3 – Блок–схема алгоритма функции Decod().

Вызов и загрузка

Вызов программы производится щелчком на ярлыке Program. exe. В начале работы пользователю доступны только некоторые из функций (рисунок 4.4) – необходимо сначала ввести степень полинома и затем ввести его вручную, нажав кнопку «Вручную», загрузить из файла, нажав «Загрузить». Далее пользователь может ввести информационную последовательность. Ввод информационной последовательности осуществляется таким же способом, что и ввод полинома. После ввода информационной последовательности будет доступна функция кодирования информации, для этого нужно нажать кнопку «Кодировать». После кодирования информации становится доступной функция декодирования, кнопка «Декодировать». Если необходимо, перед началом декодирования можно заполнить вектор ошибок вручную или загрузить его из файла. Значения в ячейке меняется двойным кликом по нужной ячейке. К концу работы форма принимает вид, указанный на рисунке 4.5.

В любой момент можно сбросить введенную информацию, нажав «Сброс». Так же осуществляется сохранение входных/выходных данных в бинарный файл, для этого нужно нажать кнопку «Сохранить» рядом с соответствующим полем данных. Возможно случайное заполнение образующего полинома и информационной последовательности. Это производится нажатием кнопки «Рандом», после чего нужно указать степень полинома и длину информационной последовательности и нажать «ОК». Результат заполнения случайной информацией представлен на рисунке 4.6.

Рисунок 4.4 Форма в начале работы

Рисунок 4.5 – Форма по окончанию работы

Рисунок 4.6 – Результат заполнения случайной информацией

Выше перечисленные функции так же доступны с помощью главного меню программы: загрузка/сохранение данных (рисунок 4.7), действия (рисунок 4.8)

Рисунок 4.7 – Главное меню программы (загрузка/сохранение)

Рисунок 4.8 – Главное меню программы (действия)

Правила пользования программой и её возможности пользователь может прочитать в справке, которая вызывается из пункта меню «О программе» (Рисунок 4.9).

Рисунок 4.9 – Справка программы

Выход из программы реализуется нажатием пункта главного меню «Выход».

4.2 Тестирование программной реализации

Тест №1:

Задан образующий полином: Р(х)= =х8+х7 +х6 +х5 +х2+x1+1

Задана информационная последовательность:

1)  Кодирующая комбинация:

/=

2)  Кодированное сообщение:

3)  Вектор ошибок:

4)  Декодированная комбинация: /=

Складываем полученную последовательность и остаток по модулю 2, получаем .

5)  Декодированное сообщение соответствует переданному в канал связи, так как декодирующая комбинация =0. Декодированное сообщение:

Результат: информация передана без ошибок (Рисунок 4.10).

Рисунок 4.10 – Тест №1

Тест №2:

Исходные данные те же. Введем вектор ошибок:

1)  Декодированная комбинация:

/=

Информация передана с ошибками. Количество единиц в остатке равно числу ошибок, завершаем деление.

2)  +=

Декодированное сообщение:

Результат: информация передана с ошибками, ошибки исправлены (Рисунок 4.11)

Рисунок 4.11 – Тест №2

Тест №3:

Исходные данные те же. Введем вектор ошибок:

1)  Декодированная комбинация:

/=

Информация передана с ошибками. Количество единиц в остатке больше числа ошибок, сдвинем комбинацию циклически в сторону старших бит и продолжим деление.

/=

/=

/=

/=

/=

Выполнено уже 5 сдвигов, а количество единиц в остатке так и не стало меньше или равно единице. Завершаем деление.

2)  +=

Полученную комбинацию сдвигаем циклически на 5 в сторону младших разрядов:

Декодированное сообщение:

Результат: информация передана с ошибками, ошибки не были исправлены (Рисунок 4.12)

Рисунок 4.12 – Тест №3

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

4.3 Выводы к главе 4

В этой главе разработана программная реализация устройства кодирования и декодирования циклического кода. Программа поддерживает кроме заданного образующего по­линома любой произвольный образующий полином до 31 степени включительно. Размер входной последовательности – до 32768 бит.

Программа обеспечивает:

·  ввод и преобразование входной последовательности из двоичного файла и вручную;

·  сохранение входной последовательности в двоичный файл;

·  ввод образующего полинома из файла и вручную;

·  сохранение образующего полинома в двоичный файл;

·  вывод результата кодирования/декодирования на экранную форму и в файл;

·  наложение вектора помех (вручную и из файла с возможностью записи введенного вектора помех в файл);

·  сравнение данных до преобразования и после восстановления.

Заключение

В данном курсовом проекте была разработана СПД с заданными параметрами.

В первой главе был проведен анализ СПД, исследованы теоретические сведения о способах передачи информации.

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

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

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

Приложение A

(Обязательное)

Список сокращений

УПС — устройство преобразования сигнала

ФСО1, ФСО2 — формирователи сигналов обмена

ФТИ — формирователь тактовых импульсов

РгСК – регистр служебной комбинации

ДшСК – дешифратор служебной комбинации

БФЦ — блок фазирования по циклу

М – мажоритарное устройство

ДК — декодер (декодирующее устройство)

БН — буферный накопитель

БПВИ — блок преобразования и выдачи информации

БНУ — блок начальной установки

БАСИ — блок аварийной сигнализации и индикации

УУ – устройства управления

БСИ – блока сбора информации от источников

УЗО - устройства защиты от ошибок.

К — коннектор для связи с несколькими источниками информации

БППИ — блок приема и преобразования информации

ДНУ — датчик номера устройства

ДНБ — датчик номера блока

ФССС — формирователь сигнала «старт/стоп»

КУ — кодирующее устройство

СПП — счетчик повторной передачи

КС – канал связи

Приложение Б
(Обязательное)

Листинг программы

Файл coder. h

#ifndef codH

#define codH

//------

class coder

{

protected:

private:

int R; //степень образующего полинома=кол-во проверочных бит

int N; //N=информационные+проверочные биты

bool *Pol; //указатель на массив образующего полинома

bool *Inf; //указатель на массив инф. последовательности

bool *Cod; //указатель на массив кодирующ. комбинации

bool *Err; //указатель на массив вектора помех

bool *Ost; //указатель на массив остатка от деления

bool *Dec; //указатель на массив декодированной информации

public:

void Init(); //начальная инициализация

int getR(); //возврат степени образующего полинома

int getN(); //возврат общей длины комбинации

bool* getPol(); //возврат указателя на массив полинома

bool* getInf(); //возврат указателя на массив инф. послед-ти

bool* getCod(); //возврат указателя на массив кодир. комб-ии

bool* getErr(); //возврат указателя на массив вектора помех

bool* getOst(); //возврат указателя на массив остатка

bool* getDec(); //возврат указателя на массив декодиров. инф-ии

void setR(int); //запись значения степени полинома в переменную

void setN(int); //запись значения длины комб в переменную

void setB(int);

void setM(int);

void setPol(bool* ); //запись ук-ля на полином в переменную

void setInf(bool* ); //запись ук-ля на инф. послед-ть в переменную

void setCod(bool* ); //запись ук-ля на кодир. комб в перемен

void setErr(bool* ); //запись ук-ля на вектор помех в переменную

void setOst(bool* ); //запись ук-ля на остаток в переменную

void setDec(bool* ); //запись ук-ля на декодир. инф в переменную

void Coder(); //кодирование

void Decod(); //декодирование

};

//

extern PACKAGE coder *Kod;

//

#endif

Файл coder. cpp

#include <vcl. h>

#pragma hdrstop

#include "cod. h"

//

#pragma package(smart_init)

//

void coder::Init()

{

R=0;

N=0;

Pol=0;

Inf=0;

Cod=0;

Err=0;

Ost=0;

Dec=0;

}

//-

int coder::getR() {return R;}

int coder::getN() {return N;}

bool* coder::getPol() {return Pol;}

bool* coder::getInf() {return Inf;}

bool* coder::getCod() {return Cod;}

bool* coder::getErr() {return Err;}

bool* coder::getOst() {return Ost;}

bool* coder::getDec() {return Dec;}

void coder::setR(int B) {R=B;}

void coder::setN(int B) {N=B;}

void coder::setPol(bool* A) {Pol=A;}

void coder::setInf(bool* A) {Inf=A;}

void coder::setCod(bool* A) {Cod=A;}

void coder::setErr(bool* A) {Err=A;}

void coder::setOst(bool* A) {Ost=A;}

void coder::setDec(bool* A) {Dec=A;}

//-

bool* d (int n, int m, bool* a, bool* b)

{

int i, j;

bool* ost=new bool[n+1];

for(i=0; i<=n; i++)

{

ost[i]=b[i];

}

for(i=0; i<m-1-n; i++)

{

if(ost[0]==0)

{

for(j=0; j<n; j++)

ost[j]=ost[j+1];

ost[n]=b[n+i+1];

}

else

{

for(j=0; j<=n; j++)

ost[j]=ost[j]^a[j];

i--;

}

}

if(ost[0]==1)

for(j=0; j<=n; j++)

ost[j]=ost[j]^a[j];

return ost;

}

//-

void coder::Coder()

{

int i, j, k;

if(Inf!=0&&Pol!=0)

{

if (Cod==0)

Cod=new bool[R+1];

for(i=0; i<R; i++)

{

Inf[N-R+i]=0;

}

Cod=d(R, N, Pol, Inf);

for(i=0;i<R;i++)

Inf[N-R+i]=Cod[i+1];

}

}

//-

void coder::Decod()

{

int s=0;

int error=0;

int i, j;

if(Inf!=0&&Pol!=0&&Err!=0)

{

Ost=new bool[R+1];

Dec=new bool[N];

for(j=0;j<N;j++)

{

if(Err[j])

error++;

} //подсчёт кол-ва ошибок

int Kol=0;

int Sdv=0;

bool a=0;

int k=0, q;

s=0;

int W=1;

for (i=0;i<N;i++) Dec[i]=Inf[i]^Err[i];

q=0;

while (q<W)

{

if (k>0)

{

a=Dec[0];

for (i=0;i<N;i++) Dec[i]=Dec[i+1];

Dec[N-1]=a;

Sdv++;

}

Ost=d(R, N, Pol, Dec);

k++;

Kol=0;

for (i=1;i<=R;i++) {if (Ost[i]!=0) Kol++;}

if (Kol>error&&k<6) W++;

q++;

}

for (i=0;i<R+1;i++) Dec[N-1-i]=Dec[N-1-i]^Ost[R-i];

for (j=Sdv;j>0;j--)

{

a=Dec[N-1];

for (i=0;i<N-1;i++) Dec[N-1-i]=Dec[N-2-i];

Dec[0]=a;

}

}

}

//-

Файл Unit1.h

//

#ifndef Unit1H

#define Unit1H

//

#include <Classes. hpp>

#include <Controls. hpp>

#include <StdCtrls. hpp>

#include <Forms. hpp>

#include <Menus. hpp>

#include <Grids. hpp>

#include <Dialogs. hpp>

#include "CSPIN. h"

#include <ExtCtrls. hpp>

//

class TForm1 : public TForm

{

__published: // IDE-managed Components

TMainMenu *MainMenu1;

TMenuItem *N1;

TMenuItem *N2;

TMenuItem *N3;

TMenuItem *N4;

TMenuItem *N5;

TMenuItem *N6;

TMenuItem *N7;

TMenuItem *N8;

TMenuItem *N9;

TMenuItem *N10;

TMenuItem *N11;

TMenuItem *N14;

TMenuItem *N15;

TMenuItem *N16;

TMenuItem *N17;

TMenuItem *N18;

TMenuItem *N19;

TMenuItem *N20;

TMenuItem *N21;

TStringGrid *StringGrid1;

TLabel *Label1;

TLabel *Label2;

TLabel *Label3;

TLabel *Label4;

TLabel *Label5;

TLabel *Label6;

TLabel *Label7;

TLabel *Label8;

TLabel *Label9;

TStringGrid *StringGrid2;

TStringGrid *StringGrid3;

TStringGrid *StringGrid4;

TStringGrid *StringGrid5;

TStringGrid *StringGrid6;

TStringGrid *StringGrid7;

TOpenDialog *OpenDialog1;

TSaveDialog *SaveDialog1;

TButton *Button1;

TButton *Button2;

TButton *Button4;

TButton *Button5;

TButton *Button7;

TButton *Button11;

TButton *Button12;

TCSpinEdit *CSpinEdit1;

TCSpinEdit *CSpinEdit2;

TLabel *Label10;

TButton *Button14;

TLabel *Label11;

TMemo *Memo1;

TButton *Button3;

TButton *Button8;

TButton *Button10;

TButton *Button13;

TButton *Button15;

TButton *Button6;

TMenuItem *N12;

void __fastcall Button1Click(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

void __fastcall StringGrid1DblClick(TObject *Sender);

void __fastcall StringGrid1SelectCell(TObject *Sender, int ACol,

int ARow, bool &CanSelect);

void __fastcall StringGrid2DblClick(TObject *Sender);

void __fastcall StringGrid2SelectCell(TObject *Sender, int ACol,

int ARow, bool &CanSelect);

void __fastcall Button11Click(TObject *Sender);

void __fastcall StringGrid5DblClick(TObject *Sender);

void __fastcall StringGrid5SelectCell(TObject *Sender, int ACol,

int ARow, bool &CanSelect);

void __fastcall Button12Click(TObject *Sender);

void __fastcall Button4Click(TObject *Sender);

void __fastcall Button5Click(TObject *Sender);

void __fastcall Button7Click(TObject *Sender);

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4