Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

16770

Работа добавлена на сайт samzan.net:


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace lab3

{

   class Program

   {

       static void Main(string[] args)

       {

           string s = "";

           string s_unic = "";

           string s_polin_0 = "";

           string s_polin = "";

           string s_polin_err = "";

           string s_polin_cor = "";

           string s_unic_fix = "";

           string s_fix = "";

           string s_b_unic = "";

           string s_b_polin_0 = "";

           string s_b_polin = "";

           string s_b_polin_err = "";

           string s_b_polin_cor = "";

           string s_b_unic_fix = "";

           string s_b_fix = "";

           Console.WriteLine("Передача данных с помощью полиномиального кодирования (32, 6)");

           Console.WriteLine("Исходная строка:");

           //s = "Лабораторная работа №3.";

           s = "Лаба3 ";

           // Если длина строки нечетная - добавляем в конце "пробел"

           if (s.Length % 2 == 1)

           {

               s = s + " ";

           }

           // Преобразуем строку в массив символов

           char[] b = s.ToCharArray();

           Console.WriteLine(s);

           // Обрабатываем строку по 2 символа

           for (int i = 0; i < b.Length; i += 2)

           {

               // Преобразуем Юникод каждого символа в двоичный код, а затем преобразуем в строку, длиной 16 символов (общая длина строки станет 32)

               s_b_unic = Program.ToBinary(Convert.ToInt64(b[i])) + Program.ToBinary(Convert.ToInt64(b[i + 1]));

               // Вставляем контрольные биты в виде 0, на места с индексом 2^n-1 (0, 1, 3, 7, 15, ...)

               s_b_polin_0 = Program.Pol_cod_0(s_b_unic);

               // Делаем вычисление значения контрольных бит (если кол-во 1 в разрядах, подчиненных контрольному биту нечетное, то ставим 1, иначе 0)

               s_b_polin = Program.Pol_cod_zap(s_b_polin_0);

               // Делаем 1 ошибку в каждом слове в случайно выбранном бите

               s_b_polin_err = Program.Pol_cod_err(s_b_polin);

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

               s_b_polin_cor = Program.Pol_cod_cor(s_b_polin_err);

               // Производим удаление избыточной информации (контрольных бит)

               s_b_unic_fix = Program.Unic_fix(s_b_polin_cor);

               // Делаем обратное преобразование из двоичного кода в символ, а затем преобразуем в строку

               s_b_fix = Program.Char_fix(s_b_unic_fix);

               s_unic = s_unic + s_b_unic + " ";

               s_polin_0 = s_polin_0 + s_b_polin_0 + " ";

               s_polin = s_polin + s_b_polin + " ";

               s_polin_err = s_polin_err + s_b_polin_err + " ";

               s_polin_cor = s_polin_cor + s_b_polin_cor + " ";

               s_unic_fix = s_unic_fix + s_b_unic_fix + " ";

               s_fix = s_fix + s_b_fix;

           }

           Console.WriteLine("");

           Console.WriteLine("Сообщение без контрольных бит");

           Console.WriteLine(s_unic);

           //Console.WriteLine();

           //Console.WriteLine(s_polin_0);

           Console.WriteLine("");

           Console.WriteLine("Сообщение с контрольными битами");

           Console.WriteLine(s_polin);

           Console.WriteLine("");

           Console.WriteLine("Сообщение с контрольными битами с ошибкой в 1 бите");

           Console.WriteLine(s_polin_err);

           Console.WriteLine("");

           Console.WriteLine("Восстановленное сообщение с контрольными битами");

           Console.WriteLine(s_polin_cor);

           Console.WriteLine("");

           Console.WriteLine("Восстановленное сообщение без контрольных бит");

           Console.WriteLine(s_unic_fix);

           Console.WriteLine("");

           Console.WriteLine("Восстановленное сообщение");

           Console.WriteLine(s_fix);

           Console.ReadLine();

       }

       static string ToBinary(Int64 Decimal)

       {

           Int64 BinaryHolder;

           char[] BinaryArray;

           string BinaryResult = "";

           while (Decimal > 0)

           {

               BinaryHolder = Decimal % 2;

               BinaryResult += BinaryHolder;

               Decimal = Decimal / 2;

           }

           BinaryArray = BinaryResult.ToCharArray();

           Array.Reverse(BinaryArray);

           BinaryResult = new string(BinaryArray);

           //Если длина слова меньше 16, то добавляем нули вперед

           for (int i = BinaryResult.Length; i < 16; i++)

           {

               BinaryResult = "0" + BinaryResult;

           }

           return BinaryResult;

       }

       static string Pol_cod_0(string s)

       {

           string pol_cod = "";

           string pol_cod_beg = "";

           string pol_cod_end = "";

           int st = 0;

           pol_cod = s;

           for (int i = 0; i < s.Length; i++)

           {

               if (i == (System.Math.Pow(2, st) - 1)) // Если индекс равен (2 в степени st - 1), то разбиваем строку pol_cod на 2 подстроки и вставляем между ними '0'

               {

                   st++;

                   if (i > 0)

                   {

                       pol_cod_beg = pol_cod.Substring(0, i);

                   }

                   pol_cod_end = pol_cod.Substring(i, pol_cod.Length - i);

                   pol_cod = pol_cod_beg + "0" + pol_cod_end;

               }

           }

           return pol_cod;

       }

       static string Pol_cod_zap(string s)

       {

           string pol_cod = "";

           char[] BinaryArray;

           int st = 0;

           int k_1 = 0;

           int ind_kb = 0;

           int ind_kb_end = 0;

           int len_kb = 0;

           BinaryArray = s.ToCharArray(); // Преобразуем строку в массив символов

           for (int i = 0; i < s.Length; i++)

           {

               if (i == (System.Math.Pow(2, st) - 1))

               {

                   k_1 = 0;

                   ind_kb = i; // Индекс контрольного бита блока

                   len_kb = i + 1; // кол-во подчиненных контрольному биту бит в блоке

                   ind_kb_end = ind_kb + len_kb - 1; // Индекс конца блока

                   if (ind_kb_end > s.Length - 1) // Если индекс конца блока выходит за пределы длины строки, то присваиваем ему индекс последнего бита в строке

                   {

                       ind_kb_end = s.Length - 1;

                   }

                   for (int j = i; j < s.Length; j++) // Цикл от начала контрольного бита до конца строки

                   {

                       if ((j >= ind_kb) && (j <= ind_kb_end) && (BinaryArray[j] == '1')) // Если текущий индекс входит в блок и значение равно '1', то добавляем 1 в счетчик

                       {

                           k_1++;

                       }

                       if (j == ind_kb_end + 1) // Если текущий бит - следующий за концом очередного блока, то вычисляем индексы начала и конца следующего блока

                       {

                           ind_kb = ind_kb + 2 * len_kb;

                           ind_kb_end = ind_kb_end + 2 * len_kb;

                       }

                   }

                   if (k_1 % 2 == 1) // Если кол-во '1' нечетное, то в контрольный бит записываем '1'

                   {

                       BinaryArray[i] = '1';

                   }

                   st++; // Добавляем 1 к значению степени

               }

           }

           pol_cod = new string(BinaryArray); // Преобразуем массив символов в строку

           return pol_cod;

       }

       static string Pol_cod_err(string s)

       {

           System.Threading.Thread.Sleep(10);

           Random rd = new Random();

           int err_i = rd.Next(0, s.Length - 1); //числа от 0 до 31

           char[] BinaryArray = s.ToCharArray();

           if (BinaryArray[err_i] == '0') // Инвертируем значение бита, в котором будет "ошибка"

           {

               BinaryArray[err_i] = '1';

           }

           else

           {

               BinaryArray[err_i] = '0';

           }

           string pol_cod = new string(BinaryArray);

           return pol_cod;

       }

       static string Pol_cod_cor(string s)

       {

           string pol_cod = "";

           char[] BinaryArray;

           char[] BinaryArray_2;

           int st = 0;

           int k_1 = 0;

           int ind_kb = 0;

           int ind_kb_end = 0;

           int len_kb = 0;

           int ssum = 0;

           BinaryArray = s.ToCharArray();

           // Обнуление контрольных бит вспомогательного массива

           BinaryArray_2 = s.ToCharArray();

           for (int i = 0; i < s.Length; i++)

           {

               if (i == (System.Math.Pow(2, st) - 1))

               {

                   BinaryArray_2[i] = '0';

                   st++;

               }

           }

           st = 0;

           for (int i = 0; i < s.Length; i++)

           {

               if (i == (System.Math.Pow(2, st) - 1))

               {

                   k_1 = 0;

                   ind_kb = i; // Индекс контрольного бита блока

                   len_kb = i + 1; // кол-во подчиненных контрольному биту бит в блоке

                   ind_kb_end = ind_kb + len_kb - 1; // Индекс конца блока

                   if (ind_kb_end > s.Length - 1) // Если индекс конца блока выходит за пределы длины строки, то присваиваем ему индекс последнего бита в строке

                   {

                       ind_kb_end = s.Length - 1;

                   }

                   for (int j = i; j < s.Length; j++) // Цикл от начала контрольного бита до конца строки

                   {

                       if ((j >= ind_kb) && (j <= ind_kb_end) && (BinaryArray_2[j] == '1')) // Если текущий индекс входит в блок и значение равно '1', то добавляем 1 в счетчик

                       {

                           k_1++;

                       }

                       if (j == ind_kb_end + 1) // Если текущий бит - следующий за концом очередного блока, то вычисляем индексы начала и конца следующего блока

                       {

                           ind_kb = ind_kb + 2 * len_kb;

                           ind_kb_end = ind_kb_end + 2 * len_kb;

                       }

                   }

                   if (k_1 % 2 == 1) // Если кол-во '1' нечетное, то в контрольный бит записываем '1'

                   {

                       BinaryArray_2[i] = '1';

                   }

                   else

                   {

                       BinaryArray_2[i] = '0';

                   }

                   if (BinaryArray[i] != BinaryArray_2[i]) // Если контрольные биты не совпадают, то добавляем к сумме индекс этого бита (причем не реальный индекс, который начинается с 0, а номер позиции, который будет на 1 больше индекса)

                   {

                       ssum = ssum + i + 1;

                   }

                   st++; // Добавляем 1 к значению степени

               }

           }

           ssum--; // Получаем значение индекса бита с ошибкой, вычтя из суммы номеров позиций несовпавших контрольных бит 1

           if (BinaryArray[ssum] == '1') // Инвертируем значение бита с ошибкой

           {

               BinaryArray[ssum] = '0';

           }

           else

           {

               BinaryArray[ssum] = '1';

           }

           pol_cod = new string(BinaryArray); // Преобразуем массив символов в строку

           return pol_cod;

       }

       static string Unic_fix(string s)

       {

           string pol_cod = "";

           char[] BinaryArray;

           int st = 0;

           BinaryArray = s.ToCharArray();

           for (int i = 0; i < s.Length; i++)

           {

               if (i == (System.Math.Pow(2, st) - 1))

               {

                   st++; // Если индекс текущего бита равен (2 в степени st - 1), то увеличиваем st на 1

               }

               else

               {

                   pol_cod = pol_cod + BinaryArray[i]; // Если индекс текущего бита не равен (2 в степени st - 1), т.е. не является контрольным, то добавляем его в строку

               }

           }

           return pol_cod;

       }

       static string Char_fix(string s)

       {

           string pol_cod = "";

           string s1 = "";

           string s2 = "";

           s1 = s.Substring(0, s.Length / 2); // Разделяем исходную строку на две равные подстроки

           s2 = s.Substring(s.Length / 2, s.Length / 2);

           int i1 = Convert.ToInt32(s1, 2); // Получаем значение кода символа в Юникоде

           int i2 = Convert.ToInt32(s2, 2);

           pol_cod = pol_cod + (char)(i1); // Добавляем символ в выходную строку

           pol_cod = pol_cod + (char)(i2);

           return pol_cod;

       }

   }

}




1. Бизнес план Строительство магазина с последующей реализацией в нём трикотажных изделий и одежды так же сд
2. Тематичні блокиКількість завдань Від найдавніших часів ~ перша половина ХVI ст
3. Федерация КУДО России А
4. Введение. 3 Коммуникативная функция и онтогенез речи
5. реферат дисертації на здобуття наукового ступеня кандидата технічних наук Київ 2001
6. Современный танец ~ это плавильный котел в котором собраны все пластические приемы которые накопило челов
7. Етнічна культура
8. тема взглядов че ловека на окружающий мир явления природы общество и самого себя а также вытекающие из о
9. НА ТЕМУ- ИНФЛЯЦИЯ
10. Ярославская государственная сельскохозяйственная академия УТВ
11. Компьютерные технологии в преподавании математики
12. тема контроля версий А
13. Тема- Подарок Деду Морозу для детей подготовительной к школе группы
14.  Діяльність людини має складну ієрархічну будову
15. Вариант 1 Выполнил-Ануфриева В
16. Пусть функция непрерывна на отрезке в концах отрезка достаточно односторонней непрерывности и при1
17. Благие знамения Терри Пратчетт Нил ГейманБлагие знамения Scn Conv Изольда; OCR RedCheck SK.
18. Православие в Японии
19. Реферат- Разработка технологии по изготовлению книжного издания по искусству
20. практикуму Для студентов 4го курса кафедры ИУ5 Cisco Pcket Trcer