|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
15.12.2011, 11:36 | #1 |
Регистрация: 27.03.2011
Сообщений: 7
|
Перевести в С# из С++ (Метод Шеннон Фано)
Помогите, пожалуйта!!!!
Нужно перевести код, который ниже, в С# Заранее спасибо!!! Это метод Шеннона - Фано. Работа выполненна в С++ |
15.12.2011, 11:38 | #2 |
Регистрация: 27.03.2011
Сообщений: 7
|
2
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 //--------------------------------------------------------------------------- #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) { 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]; } } //--------------------------------------------------------------------------- |
15.12.2011, 11:39 | #3 |
Регистрация: 27.03.2011
Сообщений: 7
|
#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]; } } //--------------------------------------------------------------------------- |
16.12.2011, 08:54 | #4 |
Форумчанин
Регистрация: 13.10.2011
Сообщений: 143
|
Поместите код в тег [CODE] (значок решетки в редакторе сообщения). Это сделает его гораздо более читабельным.
Все имена, фамилии, ники, даты и события упоминаемые в моих постах, являются вымышленными. Все совпадения с реально существующими - случайны.
Последний раз редактировалось Lasur; 16.12.2011 в 23:04. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
метод Шеннона-Фано | Вечно грустная... | Помощь студентам | 3 | 11.11.2011 11:41 |
Эффективное кодирование информации методами Шеннона-Фано и Хаффмана в Delphi | LoveCookies | Помощь студентам | 0 | 06.11.2011 01:19 |
Теория информации. Метод сжатия Шеннона-Фано, Хаффмена и арифметический | Fantazerishka | Помощь студентам | 0 | 15.02.2011 16:25 |
Алгоритм Фано(Pascal) | makc101 | Помощь студентам | 0 | 11.12.2010 12:19 |
Архивация методом Шеннона-Фано | Ketu | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 13.10.2008 19:42 |