Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 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
Lasur
Форумчанин
 
Аватар для Lasur
 
Регистрация: 13.10.2011
Сообщений: 143
По умолчанию

Поместите код в тег [CODE] (значок решетки в редакторе сообщения). Это сделает его гораздо более читабельным.
Все имена, фамилии, ники, даты и события упоминаемые в моих постах, являются вымышленными. Все совпадения с реально существующими - случайны.

Последний раз редактировалось Lasur; 16.12.2011 в 23:04.
Lasur вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
метод Шеннона-Фано Вечно грустная... Помощь студентам 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