Метод Шеннона - Фано: Перевести с 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();
}
//---------------------------------------------------------------------------

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы