Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
финальный Диплом222.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1 Mб
Скачать

Заключение

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

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

Для разработки программы была выбрана среда разработки Microsoft Visual Studio 2016 и язык программирования C#, на котором достаточно просто и легко создавать подобного рода приложения с использованием встроенных компонентов.

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

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

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

Существует возможность дальнейшее доработки и модификации программы:

  • внедрение нескольких алгоритмов шифрования;

  • внедрение алгоритма хеширования;

  • добавление проигрывателя;

  • модернизация интерфейса.

Цель достигнута - разработана программа пространственно - временного сокрытия информации в звуковых файлах методом LSB:

  1. Исследована предметная область метода сокрытия информации (16 источников литературы)

  2. Проведен сравнительный анализ программного средства с наиболее популярными программами сокрытия информации (SecureEngine Professional, S - Tools)

  3. Разработано программное средство пространственно - временного сокрытия информации методом LSB

Список используемых источников

  1. Анин, Б.Ю. Защита компьютерной информации. /Б.Ю. Анин - Учебник. - М.: BHV Санкт - Петербург, 2010. - 284 с.

  2. Артёхиц, Б.В. Стеганография II Журнал «Защита информации. Конфидент» /Б.В. Артёхиц. - М.: 2010. - 47 - 50 c.

  3. Барсуков B.C. Стеганографические технологии защиты документов, авторских прав и информации /В.С. Барсуков - Обзор специальной техники. - М.: 2010. №2. 31 - 40 с.

  4. Барсуков, B.C., Романцов А.П. Компьютерная стеганография: вчера, сегодня, завтра. Технологии информагщонной безопасности XXI века. /В.С. Барсуков - материалы Internet - ресурса «Специальная техника» - М.: (http://st.ess.rii/).

  5. Быков, С.Ф. Алгоритм сжатия JPEG с позиции компьютерной стеганографии /С.Ф. Быков - "Защита информации. Конфидент", №3. - М.: 2009, 26 с.

  6. Грибунин, В.Г., Оков И.Н., Туринцев И.В. Цифровая стеганография./В.Г. Грибунин. - М.: Солон - Пресс, 2009. — 272 с.

  7. Генне, О.В. Основные положения стеганографии /О.В. Генне - Журнал "Защита информации. Конфидент". - М.: №З, 2009.

  8. Зинченко, В. Основы эргономики. /В. Зинченко. -М.: МГУ. 2009. 179 с.

  9. Информационный ресурс исследовательской группы "CNews Analytics" (http://www.cnews.ru/).

  10. Кустов, В.Н., Федчук А.А. Методы встраивания скрытых сообщений /В.Н. Кустов - Журнал "Защита информации. Конфидент", №3. – М.: 2009, 34 с.

  11. Конахович, Г.Ф., Пузыренко А.Ю., Компьютерная стеганография. Теория и практика. - М.: МК - Пресс, 2009 - 286с.

  12. Лабор, В.В. Си Шарп: Создание приложений для Windows. /В.В. Лабор. - М.: Мн.Харвест, 2009. - 384 с.

  13. Прозис Дж. Программирование для Microsoft .NET. /Дж. Прозис. - М.: Издательско - торговый дом Русская Редакция, 2009 - 704 стр.: ил.

  14. Петцольд Ч. Программирование для Microsoft Windows на C#. /Ч.Петцольд. - М.: Издательско - торговый дом Русская Редакция, 2009 - 576 с.

  15. Соколов А.В., Шаньгин В.Ф. Защита информации в распределённых корпоративных сетях и системах. /А.В. Соколов. - М.: ДМК Пресс, 2012. — 656 с.

  16. Хорошко В.О., Азаров О.Д., Шелест О.А. Основы компьютерной стеганографии. Начальное пособие для студентов и аспирантов. /В.О. Хорошко. - М.: Венеция: ВДТУ, 2010. - 143 с.

ПРИЛОЖЕНИЕ А

Исходный код программы

Код процедуры открытия файла - контейнера:

public bool OpenWavFile(string wNameFile,int nF)

{

int i, sizechunk;

bool ff = false;

byte[] karet;

if (nF == - 1)

{

Riff.Add(new wRiff());

NameFiles.Add(wNameFile);

nF = Riff.Count - 1;

}

else

{

NameFiles.RemoveAt(nF);

NameFiles.Insert(nF, wNameFile);

ff = true;

}

//считываем первые четыре байта идентификатора Riff;

karet = new byte[4];

FileStream wFile = new FileStream(wNameFile, FileMode.Open, FileAccess.Read);

wFile.Read(karet,0,4);

if ((karet[0] == 'R') & (karet[1] == 'I') & (karet[2] == 'F') & (karet[3] == 'F'))

{

Riff[nF].headerRIFF = new char[4];

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

Riff[nF].headerRIFF[i] = (char)karet[i];

}

else

{

MessageBox.Show("Открываемый файл, не формата *.wav", "Информация", MessageBoxButtons.OK);

Riff.RemoveAt(nF);

wFile.Close();

wFile.Dispose();

wFile = null;

return(false);

}

//считываем следующие 4 байта, длина чанка Riff;

wFile.Read(karet, 0, 4);

Riff[nF].sizeRIFF = BitConverter.ToInt32(karet, 0);

//считываем следующие четыре байта идентификатора WAVE;

wFile.Read(karet, 0, 4);

if ((karet[0] == 'W') & (karet[1] == 'A') & (karet[2] == 'V') & (karet[3] == 'E'))

{

Riff[nF].headerWAVE = new char[4];

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

Riff[nF].headerWAVE[i] = (char)karet[i];

}

else

{

Riff.RemoveAt(nF);

MessageBox.Show("Не верный файл!", "Информация", MessageBoxButtons.OK);

return (false);

}

while (!(wFile.Length == wFile.Position))

{

//считываем следующие четыре байта идентификатора fmt;

wFile.Read(karet, 0, 4);

if ((karet[0] == 'f') & (karet[1] == 'm') & (karet[2] == 't') & (karet[3] == ' '))

{

Riff[nF].headerFMT = new char[4];

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

Riff[nF].headerFMT[i] = (char)karet[i];

//считываем следующие 4 байта, длина чанка fmt;

wFile.Read(karet, 0, 4);

Riff[nF].sizeFMT = BitConverter.ToInt32(karet, 0);

karet = new byte[2];

//считывание категории формата

wFile.Read(karet, 0, 2);

Riff[nF].FormatTag = BitConverter.ToInt16(karet, 0);

//считывание количества каналов

wFile.Read(karet, 0, 2);

Riff[nF].Channels = BitConverter.ToInt16(karet, 0);

karet = new byte[4];

//считывание количества сэмплов в секунду

wFile.Read(karet, 0, 4);

Riff[nF].SamplesPerSec = BitConverter.ToInt32(karet, 0);

//считывание среднее число байт в сек

wFile.Read(karet, 0, 4);

Riff[nF].AvgBytesPerSec = BitConverter.ToInt32(karet, 0);

karet = new byte[2];

//считывание выравнивание данных в дата - чанке

wFile.Read(karet, 0, 2);

Riff[nF].BlockAlign = BitConverter.ToInt16(karet, 0);

//считывание бит в сэмпле

wFile.Read(karet, 0, 2);

Riff[nF].BitPerSample = BitConverter.ToInt16(karet, 0);

wFile.Seek(Riff[nF].sizeFMT - 16, SeekOrigin.Current);

karet = new byte[4];

}

else

if ((karet[0] == 'd') & (karet[1] == 'a') & (karet[2] == 't') & (karet[3] == 'a'))

{

wFile.Read(karet, 0, 4);

Riff[nF].sizeDATA = BitConverter.ToInt32(karet, 0);

//если бит в семпле 16

if (Riff[nF].BitPerSample == 16)

{

Riff[nF].DataChunk16 = new UInt16[Riff[nF].sizeDATA / 2];

karet = new byte[2];

for (i = 0; i < Riff[nF].sizeDATA / 2; i++)

{

wFile.Read(karet, 0, 2);

Riff[nF].DataChunk16[i] = BitConverter.ToUInt16(karet, 0);

}

}

//если бит в семпле 8

if (Riff[nF].BitPerSample == 8)

{

Riff[nF].DataChunk8 = new byte[Riff[nF].sizeDATA];

karet = new byte[1];

for (i = 0; i < Riff[nF].sizeDATA; i++)

{

wFile.Read(karet, 0, 1);

Riff[nF].DataChunk8[i] = karet[0];

}

}

break;

}

else

{

//если встречается необязательная чанка, то размер чанки рифф уменьшается на размер необязательной чанки

wFile.Read(karet, 0, 4);

//Riff.sizeRIFF = Riff.sizeRIFF - 4;

sizechunk = BitConverter.ToInt32(karet, 0);

//Riff.sizeRIFF = Riff.sizeRIFF - sizechunk;

wFile.Seek(sizechunk, SeekOrigin.Current);

}

}

if (Riff[nF].BitPerSample >16)

{

if (ff==false)

Riff.RemoveAt(nF);

MessageBox.Show("Программа работает только с wav - файлами, число бит семпле которых равно либо 8, либо 16!", "Информация", MessageBoxButtons.OK);

wFile.Close();

wFile.Dispose();

wFile = null;

return (false);

}

wFile.Close();

wFile.Dispose();

wFile = null;

return (true);

}

Код процедуры сокрытия файла:

public void OpenAnyFile(string aNameFile, LoadingDelegate deleg, int bt, int saveitem, int uShif, byte[] key, byte[] IV)

{

long i, k,j,check;

int l;

byte[] karet;

chbit = bt;

if (uShif == 1)

{

FileStream sFile = new FileStream(aNameFile, FileMode.Open, FileAccess.ReadWrite);

byte[] charkar = new byte[1];

sizeFile = sFile.Length;

l = 0;

check = 0;

for (l = 0; l <= Riff.Count - 1; l++)

{

if (Riff[l].BitPerSample == 16)

check = check + Riff[l].sizeDATA / 16;

if (Riff[l].BitPerSample == 8)

check = check + Riff[l].sizeDATA / 8;

}

if (check < sizeFile * 8)

{

MessageBox.Show("Размер открываемого файла больше чем размер файлов контейнеров!", "Информация", MessageBoxButtons.OK);

sFile.Close();

sFile = null;

return;

}

byte[] sByteFile = new byte[sizeFile];

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

{

sFile.Read(charkar, 0, 1);

sByteFile[i] = charkar[0];

}

sFile.Close();

sFile = null;

bufmem = new MemoryStream();

Rijndael RijndaelAlg = Rijndael.Create();

CryptoStream cStream = new CryptoStream(bufmem, RijndaelAlg.CreateEncryptor(key, IV), CryptoStreamMode.Write);

try

{

cStream.Write(sByteFile, 0, sByteFile.Length);

cStream.FlushFinalBlock();

}

catch (Exception er)

{

Console.WriteLine("An error occurred: {0}", er.Message);

return;

}

finally

{

FileStream aaa = File.Open("../Shifer", FileMode.OpenOrCreate);

bufmem.WriteTo(aaa);

bufmem.Flush();

cStream.Close();

cStream = null;

bufmem.Close();

bufmem = null;

aaa.Close();

aaa = null;

aFile = new FileStream("../Shifer", FileMode.Open, FileAccess.ReadWrite);

}

}

else if (uShif== 0)

{

aFile = new FileStream(aNameFile, FileMode.Open, FileAccess.Read);

}

sizeFile = aFile.Length+56;

check = 0;

razriad = 1;

//проверка на вместимость фала в контейнер

for (l = 0; l <= Riff.Count - 1; l++)

{

if (Riff[l].BitPerSample == 16)

check = check + Riff[l].sizeDATA / 16;

if (Riff[l].BitPerSample == 8)

check = check + Riff[l].sizeDATA / 8;

}

if (check < sizeFile*8)

{

MessageBox.Show("Размер открываемого файла больше чем размер файлов контейнеров!", "Информация", MessageBoxButtons.OK);

aFile.Close();

aFile = null;

File.Delete("../Shifer");

return;

}

k = 0;

i = 0;

deleg(1, sizeFile*8);

numlet = 0;

ind = 0;

while (i <= sizeFile*8)

{

for (l = 0; l<= Riff.Count - 1; l++)

{

if (k < Riff[l].sizeDATA)

{

//если размер бит в семпле 16

if (Riff[l].BitPerSample == 16)

{

checkbits(Riff[l].BitPerSample);

if (i <= 47)

{

karet = BitConverter.GetBytes(loadKaretkaSlovo());

Stego16(karet[0], k, l);

if (i == 47)

{

numlet = 0;

ind = 0;

razriad = 1;

}

}

if ((i > 47) && (i <= 111))

{

karet = BitConverter.GetBytes(loadKaretKey());

Stego16(karet[0], k, l);

}

else

if (i > 111)

{

karet = BitConverter.GetBytes(loadKaretFile());

Stego16(karet[0], k, l);

}

}

//если размер бит в семпле 8

if (Riff[l].BitPerSample == 8)

{

checkbits(Riff[l].BitPerSample);

if (i <= 47)

{

karet = BitConverter.GetBytes(loadKaretkaSlovo());

Stego8(karet[0], k, l);

if (i == 47)

{

numlet = 0;

ind = 0;

razriad = 1;

}

}

if ((i > 47) && (i <= 111))

{

karet = BitConverter.GetBytes(loadKaretKey());

Stego8(karet[0], k, l);

}

else

if (i > 111)

{

karet = BitConverter.GetBytes(loadKaretFile());

Stego8(karet[0], k, l);

}

}

i = i + 1;

deleg(2, i);

}

}

k = k + 1;

}

for (l = 0; l <= Riff.Count - 1; l++)

{

if (Riff[l].BitPerSample == 8)

{

if (saveitem == 1)

{

SaveFileDialog Dialog = new SaveFileDialog();

if (Dialog.ShowDialog() == DialogResult.OK)

{

Dialog.Filter = "wav file|*.wav";

FileStream newFile = new FileStream(Dialog.FileName, FileMode.Create);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerRIFF), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].sizeRIFF), 0, 4);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerWAVE), 0, 4);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerFMT), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].sizeFMT), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].FormatTag), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].Channels), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].SamplesPerSec), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].AvgBytesPerSec), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].BlockAlign), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].BitPerSample), 0, 2);

newFile.Write(Encoding.ASCII.GetBytes("data"), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].sizeDATA), 0, 4);

for (j = 0; j < Riff[l].sizeDATA; j++)

{

newFile.Write(BitConverter.GetBytes(Riff[l].DataChunk8[j]), 0, 1);

}

newFile.Close();

}

else

{

aFile.Close();

aFile = null;

File.Delete("../Shifer");

return;

}

}

if (saveitem == 0)

{

FileStream newFile = new FileStream(NameFiles[l], FileMode.Open);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerRIFF), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].sizeRIFF), 0, 4);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerWAVE), 0, 4);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerFMT), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].sizeFMT), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].FormatTag), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].Channels), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].SamplesPerSec), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].AvgBytesPerSec), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].BlockAlign), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].BitPerSample), 0, 2);

newFile.Write(Encoding.ASCII.GetBytes("data"), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].sizeDATA), 0, 4);

for (j = 0; j < Riff[l].sizeDATA; j++)

{

newFile.Write(BitConverter.GetBytes(Riff[l].DataChunk8[j]), 0, 1);

}

newFile.Close();

}

}

if (Riff[l].BitPerSample == 16)

{

if (saveitem == 1)

{

SaveFileDialog Dialog = new SaveFileDialog();

if (Dialog.ShowDialog() == DialogResult.OK)

{

Dialog.Filter = "wav file|*.wav";

FileStream newFile = new FileStream(Dialog.FileName, FileMode.Create);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerRIFF), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].sizeRIFF), 0, 4);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerWAVE), 0, 4);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerFMT), 0, 4);

newFile.Write(BitConverter.GetBytes((Int32)16), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].FormatTag), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].Channels), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].SamplesPerSec), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].AvgBytesPerSec), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].BlockAlign), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].BitPerSample), 0, 2);

newFile.Write(Encoding.ASCII.GetBytes("data"), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].sizeDATA), 0, 4);

for (j = 0; j < Riff[l].sizeDATA / 2; j++)

{

newFile.Write(BitConverter.GetBytes(Riff[l].DataChunk16[j]), 0, 2);

}

newFile.Close();

}

else

{

aFile.Close();

aFile = null;

File.Delete("../Shifer");

return;

}

}

if (saveitem == 0)

{

FileStream newFile = new FileStream(NameFiles[l], FileMode.Open);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerRIFF), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].sizeRIFF), 0, 4);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerWAVE), 0, 4);

newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerFMT), 0, 4);

newFile.Write(BitConverter.GetBytes((Int32)16), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].FormatTag), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].Channels), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].SamplesPerSec), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].AvgBytesPerSec), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].BlockAlign), 0, 2);

newFile.Write(BitConverter.GetBytes(Riff[l].BitPerSample), 0, 2);

newFile.Write(Encoding.ASCII.GetBytes("data"), 0, 4);

newFile.Write(BitConverter.GetBytes(Riff[l].sizeDATA), 0, 4);

for (j = 0; j < Riff[l].sizeDATA / 2; j++)

{

newFile.Write(BitConverter.GetBytes(Riff[l].DataChunk16[j]), 0, 2);

}

newFile.Close();

newFile.Dispose();

newFile = null;

}

}

}

aFile.Close();

aFile = null;

File.Delete("../Shifer");

}

Код процедуры извлечения фала:

public bool OpenStegoFile(int bt)

{

long i,k;

bool flag, tiptop;

sizeFile = 0;

chbit = bt;

int l;

l = 0;

numlet = 0;

ind = 0;

flag = false;

razriad = 1;

i = 0;

k = 0;

candrew = "";

tiptop = true;

//"манчестерский код"

while (i <= 47)

{

l = 0;

while (l <= Riff.Count - 1)

{

if (k < Riff[l].sizeDATA)

{

checkbits(Riff[l].BitPerSample);

if (Riff[l].BitPerSample == 16)

{

if (decodeslovo16(Riff[l].DataChunk16[k]) == true)

{

flag = true;

}

}

if (Riff[l].BitPerSample == 8)

{

if (decodeslovo8(Riff[l].DataChunk8[k]) == true)

{

flag = true;

}

}

i = i + 1;

}

l = l + 1;

if (i == 48)

{

break;

}

}

if (l == Riff.Count)

{

k = k + 1;

}

}

if (flag == false)

{

MessageBox.Show("Не верные файлы, либо неверно заданы настройки!", "Информация", MessageBoxButtons.OK);

tiptop = false;

return(tiptop);

}

//извлечение ключа

while (i <= 111)

{

if (l == Riff.Count)

l = 0;

while (l<=Riff.Count - 1)

{

checkbits(Riff[l].BitPerSample);

if (k < Riff[l].sizeDATA)

{

if (Riff[l].BitPerSample == 16)

{

decodekey16(Riff[l].DataChunk16[k]);

}

if (Riff[l].BitPerSample == 8)

{

decodekey8(Riff[l].DataChunk8[k]);

}

i = i + 1;

}

l = l + 1;

if (i == 112)

{

break;

}

}

if (l == Riff.Count)

{

k = k + 1;

}

}

razriad = 1;

ind = 0;

numlet = 0;

i = 0;

byteFile = new byte[sizeFile];

while (i<sizeFile*8)

{

if (l == Riff.Count)

l = 0;

while (l <= Riff.Count - 1)

{

if (k < Riff[l].sizeDATA)

{

checkbits(Riff[l].BitPerSample);

if (Riff[l].BitPerSample == 16)

{

decode16(Riff[l].DataChunk16[k]);

}

if (Riff[l].BitPerSample == 8)

{

decode8(Riff[l].DataChunk8[k]);

}

i = i + 1;

}

l = l + 1;

if (i == sizeFile*8)

{

break;

}

}

if (l == Riff.Count)

{

k = k + 1;

}

}

return (tiptop);

}

ПРИЛОЖЕНИЕ Б

Исходный код программы расчета освещения

unit Unit4;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, Buttons;

type

TForm4 = class(TForm)

Label27: TLabel;

Label28: TLabel;

Label29: TLabel;

Label33: TLabel;

Label30: TLabel;

Label32: TLabel;

Label31: TLabel;

Label22: TLabel;

Label23: TLabel;

Label24: TLabel;

Label25: TLabel;

Label26: TLabel;

Label34: TLabel;

Label35: TLabel;

Label37: TLabel;

Label38: TLabel;

SpeedButton1: TSpeedButton;

Label2: TLabel;

Label3: TLabel;

Edit21: TEdit;

Edit22: TEdit;

Edit23: TEdit;

ComboBox5: TComboBox;

ComboBox4: TComboBox;

Edit24: TEdit;

Edit25: TEdit;

Edit26: TEdit;

Edit17: TEdit;

Edit18: TEdit;

Edit19: TEdit;

Edit20: TEdit;

StaticText4: TStaticText;

StaticText3: TStaticText;

Button2: TButton;

Label1: TLabel;

Label4: TLabel;

procedure Button2Click(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form4: TForm4;

mf: array[1..15] of integer = (2600, 3000, 3570, 3820, 4550, 4070, 4440, 5220, 8000, 100, 100, 2250, 2080, 4160, 3460);

mw: array[1..15] of integer = (40, 40, 65, 65, 65, 80, 80, 80, 150, 4, 4, 40, 40, 80, 80);

implementation

{$R *.dfm}

procedure TForm4.Button2Click(Sender: TObject);

var

s: double;

i: double;

h: double;

C: double;

n: double;

f: double;

w: double;

k: integer;

begin

s := StrToFloat(Edit17.Text) * StrToFloat(Edit18.Text);

h := StrToFloat(Edit19.Text) - StrToFloat(Edit20.Text);

i := s / (StrToFloat(Edit17.Text) + StrToFloat(Edit18.Text)) / h;

C := 0;

if(ComboBox5.ItemIndex = 0) then

while(1=1) do

begin

if(i <= 0.5) then begin C := 0.17; break; end;

if(i <= 0.7) then begin C := 0.25; break; end;

if(i <= 0.9) then begin C := 0.29; break; end;

if(i <= 1.1) then begin C := 0.31; break; end;

if(i <= 1.25) then begin C := 0.33; break; end;

if(i <= 1.5) then begin C := 0.34; break; end;

if(i <= 1.75) then begin C := 0.36; break; end;

if(i <= 2.0) then begin C := 0.37; break; end;

if(i <= 2.25) then begin C := 0.39; break; end;

if(i <= 2.5) then begin C := 0.39; break; end;

if(i <= 3.0) then begin C := 0.41; break; end;

if(i <= 4.0) then begin C := 0.42; break; end;

if(i <= 5.0) then begin C := 0.43; break; end;

end;

if(ComboBox5.ItemIndex = 1) then

while(1=1) do

begin

if(i <= 0.5) then begin C := 0.15; break; end;

if(i <= 0.7) then begin C := 0.21; break; end;

if(i <= 0.9) then begin C := 0.24; break; end;

if(i <= 1.1) then begin C := 0.27; break; end;

if(i <= 1.25) then begin C := 0.28; break; end;

if(i <= 1.5) then begin C := 0.30; break; end;

if(i <= 1.75) then begin C := 0.32; break; end;

if(i <= 2.5) then begin C := 0.36; break; end;

if(i <= 3.0) then begin C := 0.37; break; end;

if(i <= 4.0) then begin C := 0.39; break; end;

if(i <= 5.0) then begin C := 0.41; break; end;

end;

if(ComboBox5.ItemIndex = 2) then

while(1=1) do

begin

if(i <= 0.5) then begin C := 0.23; break; end;

if(i <= 0.7) then begin C := 0.30; break; end;

if(i <= 0.9) then begin C := 0.33; break; end;

if(i <= 1.1) then begin C := 0.36; break; end;

if(i <= 1.25) then begin C := 0.38; break; end;

if(i <= 1.5) then begin C := 0.40; break; end;

if(i <= 1.75) then begin C := 0.41; break; end;

if(i <= 2.0) then begin C := 0.43; break; end;

if(i <= 3.0) then begin C := 0.47; break; end;

if(i <= 4.0) then begin C := 0.50; break; end;

if(i <= 5.0) then begin C := 0.52; break; end;

end;

if(ComboBox4.ItemIndex = 0) then

begin

f:=StrToFloat(Edit25.Text);

w:=StrToFloat(Edit24.Text);

end;

if(ComboBox4.ItemIndex <> 0) then

begin

f:=mf[ComboBox4.ItemIndex];

w:=mw[ComboBox4.ItemIndex];

end;

n := (s * StrToFloat(Edit21.Text) * StrToFloat(Edit22.Text) * StrToFloat(Edit23.Text))/(C*f);

k := round(n);

if(k < n) then inc(k);

StaticText3.Caption := IntToStr(k);

if(StrToFloat(Edit26.Text) < 0) then Edit26.Text :='1';

Label38.Caption := FloatToStr(k / StrToFloat(Edit26.Text));

StaticText4.Caption := FloatToStr(k * w);

end;

procedure TForm4.SpeedButton1Click(Sender: TObject);

begin

close;

end;

end.