Advertisement
ResistanceJke

lab3 cyclic code (7, 4)

Dec 21st, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.00 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <conio.h>
  5. #include <Windows.h>
  6. #define N 7 // длина слова на выходе
  7. #define M 4 // длина полинома и длина слова на входе
  8.  
  9. using namespace std;
  10.  
  11. int p74[4] = { 1, 0, 1, 1 };
  12. int deshifmass[N];
  13. int mas[N];
  14. int masmain[M];
  15. int massive_for_division[N];
  16.  
  17. void Coding()
  18. {
  19.     int i = 0;
  20.     int flag = 0;
  21.     while (i < N)
  22.     {
  23.         while (mas[i] == 0)
  24.         {
  25.             if (N - i < M) //проверяем условие, что делимое не короче делителя
  26.             {
  27.                 flag = 1;
  28.                 break;
  29.             }
  30.             i++;
  31.             if (N - i < M)//тоже самое
  32.             {
  33.                 flag = 1;
  34.                 break;
  35.             }
  36.         }
  37.         if (flag == 1)
  38.             break;
  39.         int j;
  40.         j = 0;
  41.         for (i; j < M; i++)
  42.         {
  43.             mas[i] = (mas[i] + p74[j]) % 2; //деление - это сложение по mod 2(остаток от деления на 2)(взаимоисключающее или)
  44.             j++;
  45.         }
  46.         i = 0;
  47.     }
  48.     cout << endl << "Остаток: ";
  49.     for (int j = 0; j < N; ++j)
  50.     {
  51.         cout << mas[j];
  52.     }
  53.     for (int i = 0; i < M; i++)
  54.     {
  55.         mas[i] = masmain[i];
  56.     }
  57. }
  58.  
  59. void Delenie()
  60. {
  61.     int i, j;
  62.  
  63.     for (int k = 0; k < N; k++) {
  64.  
  65.         //ищем старший разряд единицы
  66.         for (i = 0; i < N; i++) {
  67.             if (massive_for_division[i] == 1) {
  68.                 break;
  69.             }
  70.         }
  71.  
  72.         if ((N - i - 1) < (M - 1))
  73.             break;// делить нельзя, степень остатка N-i-1 меньше степени полинома M-1
  74.  
  75.         cout << endl;
  76.         for (j = 0; j < M; j++) {
  77.             massive_for_division[i + j] = (massive_for_division[i + j] + p74[j]) % 2;
  78.         }
  79.     }
  80.  
  81.     cout << "\nMassive_for_division: ";
  82.     for (int j = 0; j < N; j++) {
  83.         cout << massive_for_division[j];
  84.     }
  85. }
  86.  
  87. void RightShift() //сдвиг вправо
  88. {
  89.     int temp;
  90.     temp = deshifmass[N - 1];
  91.     for (int i = N - 1; i > 0; i--)
  92.     {
  93.         deshifmass[i] = deshifmass[i - 1];
  94.     }
  95.     deshifmass[0] = temp;
  96.     cout << endl << "Правый сдвиг: ";
  97.     for (int i = 0; i < N; i++)
  98.     {
  99.         cout << deshifmass[i];
  100.     }
  101. }
  102.  
  103. void LeftShift()//сдвиг влево
  104. {
  105.     int temp;
  106.     temp = deshifmass[0];
  107.     for (int i = 0; i < N - 1; i++) {
  108.         deshifmass[i] = deshifmass[i + 1];
  109.     }
  110.     deshifmass[N - 1] = temp;
  111.     cout << endl << "Левый сдвиг: ";
  112.     for (int i = 0; i < N; i++) {
  113.         cout << deshifmass[i];
  114.     }
  115. }
  116.  
  117. void out()
  118. {
  119.     cout << endl << "Шифрованное слово: ";
  120.     for (int i = 0; i < N; i++)
  121.     {
  122.         cout << mas[i];
  123.     }
  124. }
  125.  
  126. int main()
  127. {
  128.     SetConsoleCP(1251);
  129.     SetConsoleOutputCP(1251);
  130.  
  131.     cout << "Кодирование информации" << endl;
  132.     cout << "Введи слово (4 бита): ";
  133.     for (int i = 0; i < M; i++)
  134.     {
  135.  
  136.         cin >> mas[i];
  137.     }
  138.     for (int i = 0; i < M; i++)
  139.     {
  140.         masmain[i] = mas[i];
  141.     }
  142.     int j = 4;
  143.     while (j < N) //добавляем контрольные биты (3 штуки)
  144.     {
  145.         mas[j] = 0;
  146.         j++;
  147.     }
  148.     cout << "Массив после добавления контрольных битов: ";
  149.     for (int i = 0; i < N; i++)
  150.         cout << mas[i];
  151.     Coding();
  152.     out();
  153.     int number_of_shift = 0;
  154.     cout << endl << endl << "Декодирование информации" << endl;
  155.     cout << "Введите слово: ";
  156.  
  157.     for (int i = 0; i < N; i++)
  158.     {
  159.         cin >> deshifmass[i];
  160.     }
  161.     int number_of_sdvig = 0;
  162.     for (int k = 0; k < N; k++) {
  163.  
  164.         for (int p = 0; p < N; p++)
  165.         {
  166.             massive_for_division[p] = deshifmass[p];
  167.         }
  168.  
  169.         Delenie();
  170.  
  171.         int ost = 0;
  172.         for (int j = 0; j < N; j++)
  173.         {
  174.             ost += massive_for_division[j];
  175.         }
  176.         cout << " Остаток: " << ost;
  177.  
  178.         if (ost > 1) {
  179.             LeftShift();
  180.             number_of_sdvig++;
  181.             continue;
  182.         }
  183.  
  184.         if (ost == 1) {
  185.             deshifmass[N - 1] = (deshifmass[N - 1] + 1) % 2;
  186.             for (int j = 0; j <= number_of_sdvig - 1; j++)
  187.                 RightShift(); //если вес остатка равен 1, то мы суммируем по mod 2 сдвинутое число и остаток
  188.             break;
  189.         }
  190.         if (ost == 0)
  191.             cout << "\nОшибок нет!";
  192.     }
  193.  
  194.     return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement