Будь умным!


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

16770

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

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 24.11.2024

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. Тема- Дружеская и любовная лирика Пушкина
3. Лабораторная работа- Изучение приспособленности организма осьминога к среде обитания
4. МЕТОДИЧНІ ОСНОВИ ПРОФЕСІОГРАФІЇ Мета- оволодіння навичками побудови професіограми на основі опитува
5. ЛАБОРАТОРНАЯ РАБОТА ТЕМА- СОЗДАНИЕ СПИСКОВ В ТЕКСТОВЫХ ДОКУМЕНТАХ ЦЕЛЬ ЗАНЯТИЯ- Изучение информаци
6. Навчальний посібник з розвитку навичок читання та говоріння для студентів І курсу за спеціальністю ldquo;Обл
7. На основании обобщения результатов проведенной работы с журналистами по этому направлению а также данных о
8.  Проблема возрастной периодизации детского развития По теоретическим основам предложенные в науке
9. Любимое дело приносит достаток
10. Внутрішня енергія
11. Значении категории рода
12. якому етапі розвитку держави- вони існують у кожній сучасній державі й пов'язані з вирішенням цілого комплек
13. тема об~єктивних закономірностей
14. Сервис ~ Параметры
15. Методы определения абсолютного возраста горных пород
16. О ФОНДЕ СОДЕЙСТВИЯ РЕФОРМИРОВАНИЮ ЖИЛИЩНОКОММУНАЛЬНОГО ХОЗЯЙСТВА.html
17. я Категория авторизации научнопопулярного текста проявляется в метатексте
18.  Коэффициент распространености заболеваний общая заболеваемость prevlence rte PR одномоментные п
19. следственной диаграммы в выявлении основных причин появления проблем во взаимодействии двух видов транспор1
20. блоки знаний убеждений мыслей чувств настроений стремлений надежд соединяясь в мировоззрении образу