Метод Шеннона - Фано: Перевести с C++ на C#
Формулировка задачи:
Помогите, пожалуйта!!!!
Нужно перевести код, который ниже в С#
Заранее спасибо!!!
//--------------------------------------------------------------------------- #include <vcl.h> #include <string.h> #include <math.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { StringGrid1->Cells[0][0]="Символ"; StringGrid1->Cells[1][0]="Частота"; StringGrid2->Cells[0][0]="Символ"; StringGrid2->Cells[1][0]="Код"; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { String str; //Исходная строка char sb; //Символ в строке int k; // int sp; //Начальная точка отсчета int ep; //Конечная точка Boolean flag; //Допольнительная переменная логическая Byte count; //Дополнительная переменная для измерения колличества (короткий целый) Byte len; //Дополнительная переменная для измерения длины (короткий целый) StringGrid1->RowCount=1; //--------------------------------------------------------------------------- str=Edit1->Text; //Переводим строку из поля для ввода в переменную len=str.Length(); //Узнаем длину сообщения for(int i=1;i<=len;i++) { flag=false; count=StringGrid1->RowCount-1; sb=str[i]; //Берем i-символ из исходной строки for (int j=1;j<count+1;j++) if (sb==StringGrid1->Cells[0][j][1]) //Проверяем наличие символа в таблице { StringGrid1->Cells[1][j]=StrToInt(StringGrid1->Cells[1][j])+1; //Если символ найден, уевличиваем колличество символов на 1 flag=true; } if (!flag) //Если символ не найден, то добалям новую строку в таблицу, записываем туда символ и присваивам колличество 1 { StringGrid1->RowCount++; StringGrid1->Cells[0][count+1]=sb; StringGrid1->Cells[1][count+1]=1; } } StringGrid2->RowCount=StringGrid1->RowCount; for(int i=1;i<StringGrid1->RowCount;i++) StringGrid2->Cells[0][i]=StringGrid1->Cells[0][i]; //Переносим все символы из 1й таблицы во вторую //Создаем таблицу кодов для каждого символа len=16; k=len; /*Далее следует цикл, который делит исходную таблицу на 2, затем присваивает одной половине все 0, другой все 1 затем снова таблицы делятся на 2 и по тому же принципу первой половине прсиваивается 0, второй 1 цикл выполняется до тех пор пока деление станет невозможным, тоесть станутся только одиночные символы. Таким образом выполняется алогорит Шеннона Фано*/ while (k>1) { k/=2; //Делим текущую длину на 2, получае сколько символов в данный момент в группе, напрмер // всего символов было 16, значит после деления получиться что в группе 8 символов sp=1; //Устанавливаем начала прохода группы ep=k; //Устанавливаем конец прохода группы //Тоесть для нашего примера получитьсч что, мы будем обрабатывать символы с 1 по 8 for (int i=1;i<=len/k;i++) //Этот цикл выполниться столько раз сколько у нас получилось групп, при //При первом проходе получиться 2 прохода, потом 4,8.. и т.д. { for (int j=sp;j<=ep;j++) { if (fmod(i,2)==1) //Эта проверка определяет какая группа у нас идет, если гурппа четная, //то по условию ей добавиться 0, иначе добавиться 1 StringGrid2->Cells[1][j]=StringGrid2->Cells[1][j]+"0"; else StringGrid2->Cells[1][j]=StringGrid2->Cells[1][j]+"1"; } sp+=k; //Сдвигаем грацы, тоесть если мы обрабатывали символы с 1-8, то теперь будтем с 9-16 ep+=k; } } //Выводим закодированное сообщение------------------------------------------- len=str.Length(); Label1->Caption=""; for (int i=1;i<=len;i++) { sb=str[i]; for(int j=1;j<=StringGrid2->RowCount-1;j++) //Ищем совпадения код для текущего символа в таблице if (sb==StringGrid2->Cells[0][j][1]) //При нахождении добавлем его на Label Label1->Caption=Label1->Caption+StringGrid2->Cells[1][j]; } } //---------------------------------------------------------------------------
Это метод Шеннона - Фано. Работа выполненна в С++
Решение задачи: «Метод Шеннона - Фано: Перевести с C++ на C#»
textual
Листинг программы
#include <vcl.h> #include <string.h> #include <math.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { StringGrid1->Cells[0][0]="Символ"; StringGrid1->Cells[1][0]="Частота"; //StringGrid1->Cells[2][0]="Код"; Вместо этого просто статик текст } //--------------------------------------------------------------------------- int Med(TStringGrid *StringGrid1,int begin, int end){ int group1=StrToInt(StringGrid1->Cells[1][begin]); int group2=StrToInt(StringGrid1->Cells[1][end]); while (end-begin>1){ if (group1<=group2){ begin++; group1+=StrToInt(StringGrid1->Cells[1][begin]); } else { end--; group2+=StrToInt(StringGrid1->Cells[1][end]); } } return begin; } void Fano(TStringGrid *StringGrid1, TStringGrid *StringGrid3, int begin, int end, int pos){ int m; if (end>begin){ pos=pos+1; StringGrid3->ColCount++; m=Med(StringGrid1,begin,end); for (int i=begin; i<=end; i++){ if (i<=m) StringGrid3->Cells[pos][i]=0; else StringGrid3->Cells[pos][i]=1; } Fano(StringGrid1, StringGrid3, begin,m,pos); Fano(StringGrid1, StringGrid3, m+1,end,pos); } } void __fastcall TForm1::Button1Click(TObject *Sender) { String str; //Исходная строка char sb; //Символ в строке int k; // int sp; //Начальная точка отсчета int ep; //Конечная точка Boolean flag; //Допольнительная переменная логическая Byte count; //Дополнительная переменная для измерения колличества (короткий целый) Byte len; //Дополнительная переменная для измерения длины (короткий целый) StringGrid1->RowCount=1; //--------------------------------------------------------------------------- str=Edit1->Text; //Переводим строку из поля для ввода в переменную len=str.Length(); //Узнаем длину сообщения for(int i=1;i<=len;i++) { flag=false; count=StringGrid1->RowCount-1; sb=str[i]; //Берем i-символ из исходной строки for (int j=1;j<count+1;j++) if (sb==StringGrid1->Cells[0][j][1]) //Проверяем наличие символа в таблице { StringGrid1->Cells[1][j]=StrToInt(StringGrid1->Cells[1][j])+1; //Если символ найден, уевличиваем колличество символов на 1 flag=true; } if (!flag) //Если символ не найден, то добалям новую строку в таблицу, записываем туда символ и присваивам колличество 1 { StringGrid1->RowCount++; StringGrid1->Cells[0][count+1]=sb; StringGrid1->Cells[1][count+1]=1; } } //Сортируем массив for (int i=1; i<StringGrid1->RowCount; i++){ for (int j=i+1; j<StringGrid1->RowCount; j++){ if (StringGrid1->Cells[1][j]>StringGrid1->Cells[1][i]){ String c0=StringGrid1->Cells[0][j]; String c1=StringGrid1->Cells[1][j]; StringGrid1->Cells[0][j]=StringGrid1->Cells[0][i]; StringGrid1->Cells[1][j]=StringGrid1->Cells[1][i]; StringGrid1->Cells[0][i]=c0; StringGrid1->Cells[1][i]=c1; } } } //Фано, настало твоё время StringGrid3->RowCount=StringGrid1->RowCount; Fano(StringGrid1, StringGrid3, 1, StringGrid1->RowCount-1,0); //Выводим закодированное сообщение------------------------------------------- Label1->Caption=""; for (int i=1;i<=str.Length();i++) { sb=str[i]; for(int j=1;j<StringGrid1->RowCount;j++){ //Ищем совпадения код для текущего символа в таблице if (sb==StringGrid1->Cells[0][j][1]){ for (int k=1; k<StringGrid3->ColCount; k++){ if (StringGrid3->Cells[k][j]!=""){ Label1->Caption=Label1->Caption+StringGrid3->Cells[k][j]; } else break; } } //При нахождении добавлем его на Label } } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Close(); } //---------------------------------------------------------------------------
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д