Страница 1 из 1

С# аппаратная реализация циклического кода

Добавлено: 02 дек 2013, 20:38
meason
Разработать программу аппаратной реализации циклического кода (15, 11) с порождающим многочленом x4 + x3 + +x2 +1.

Комментарий преподавателя: Неверно определяет номер искаженного разряда
Помогите исправить пжлста )

Код программы:

Код: Выделить всё

 using System;
 using System.Collections.Generic;
 //using System.Linq;
 using System.Text;

 namespace SystemNippel
 {
 publicclassSystemNippel
 {
 //основной модуль программы
 //содержит функции для обработки двоичных комбинаций и
 //кодирования/декодирования по алгоритмам циклического кода

 publicstaticstring Polynom = "11111";//порждающиймногочлен
 publicstaticintinf = 11;//количество инф. символов
 publicstaticintcount = 15;//общее колическтов символов
 publicstaticint t = 1;//колическтво исправляемых ошибок

 publicstaticintCountMoves=0;//количество левых сдвигов в текущем сеансе декодирования
 //перед началом декодирования должен быть установлен в ноль

 publicstaticchar plus(char c1, char c2)
 {
 //сложение разрядов по модудю 2
 if (c1 == '0'&& c2 == '0') return'0';
 if (c1 == '0'&& c2 == '1') return'1';
 if (c1 == '1'&& c2 == '0') return'1';
 if (c1 == '1'&& c2 == '1') return'0';

 thrownewException("Ошибка: недопутимый символ");
 return'0';

 }

 publicstaticstring str_plus(string s1, string s2)
 {
 //сложение двоичных комбинаций по модулю 2
 string s3 = "";
 if (s1.Length != s2.Length) thrownewException("Внутренняяошибка : строкиразнойдлины");
 for (int i = 0; i < s1.Length; i++)
 {
 s3 += plus(s1[i], s2[i]);
 }
 return s3;
 }

 publicstaticstring GetRemainder(string x, string d)
 {
 //получение остатка от деления х на d
 string r = "";
 int n; //длина делимого 
 int m; //длина делителя
 int z; //указатель текущего положения разряда делимого
 int i; //счетчикцикла
 char[] arr;

 z = 0;
 n = x.Length;
 m = d.Length;
 for (i = 0; i < n; i++)//инициализация
 {
 if (x[i] != '0'&& x[i] != '1') thrownewException("Ошибка: недопутимыйсимвол");
 r += x[i];
 }
 arr = r.ToCharArray();

 while (true)
 {

 for (i = 0; i < m ; i++)
 //прибавляем делитель в текущей позиции указателия
 {
 arr[z + i] =plus(arr[z + i], d[i]);
 }
 while (arr[z] == '0') { 
 z++;//сдвиг указателя влево, до первой единицы
 if (z >= arr.Length) break;
 }
 if (z > n - m) break;//конец деления

 }
 r = newstring(arr);

 return r;
 }

 publicstaticstring Coder(string s)
 {
 //кодирование двоичной комбинации
 stringstr = "";
 string output = "";
 int r;

 str = s;
 r=count-inf;
 for(int i=0;i<r;i++){
 //увеличиваем длину строки до общего количества символов
 str += '0';
 }
 output = str;
 str = GetRemainder(str, Polynom);//остаток от деления на порождающий многочлен
 output = str_plus(output, str);//сложениесостатком
 return output;

 }

 publicstaticstring Transfer(string s, int bit)
 {
 //передача символа
 //моделирует искажение выбранного бита (номер бита начинается с нуля)
 char[] arr = s.ToCharArray();
 if (arr[bit] == '0') { arr[bit] = '1'; }
 elseif (arr[bit] == '1') { arr[bit] = '0'; }
 returnnewstring(arr);

 }

 publicstaticint GetWeight(string s)
 {
 //вычисляет количество единиц в двоичной комбинации
 int i;
 int c=0;
 for (i = 0; i < s.Length; i++)
 {
 if (s[i] == '1') c++;
 }
 return c;
 }
 publicstaticstring MoveLeft(string s)
 {
 //левый цикл.сдвиг двоичной комбинации на один разряд
 stringres;
 res = s.Substring(1, s.Length - 1);
 res += s[0];
 returnres;
 }

 publicstaticstring MoveRight(string s)
 {
 //правый цикл.сдвиг двоичной комбинации на один разряд
 stringres="";
 res += s[s.Length - 1];
 res += s.Substring(0, s.Length - 1); 
 return res;
 }

 publicstaticbool CheckString(string str)
 {
 //проверка корректности введенной двоичной строки
 //для правильной строки возвращает ИСТИНА
 int i;
 if (str.Length == 0) returnfalse;
 for ( i = 0; i < str.Length; i++)
 {
 if (str[i] != '0'&& str[i] != '1') returnfalse;
 }
 returntrue;

 }

 //генерация случайной двоичной комбинации
 //длина комбинации соответствует длине инф. части
 publicstaticstring NewRandomNippel()
 {
 Random rnd = newRandom();
 String str = "";
 int i;
 for (i = 0; i < inf; i++)
 {
 str += rnd.Next(2).ToString();
 }
 return str;

 }
 }
 }

Re: С# аппаратная реализация циклического кода

Добавлено: 02 дек 2013, 20:42
Romeo
Очень много кода, который сложно так просто взять и разобрать. Может есть возможность локализировать проблему с помощью дебагера и указать более точное место в коде, над которым можно подумать, дабы облегчить жизнь потенциальным помощникам?