Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/49: Рейтинг темы: голосов - 49, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 27.03.2011
Сообщений: 6

Метод Шеннона - Фано: Перевести с C++ на C#

05.12.2011, 16:50. Показов 9249. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, пожалуйта!!!!
Нужно перевести код, который ниже в С#
Заранее спасибо!!!
код на С++
C++
1
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
//---------------------------------------------------------------------------
 
#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];
        }
 
}
//---------------------------------------------------------------------------


Добавлено через 1 минуту
Это метод Шеннона - Фано. Работа выполненна в С++
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.12.2011, 16:50
Ответы с готовыми решениями:

Метод Шеннона-Фано
using System; using System.Collections.Generic; using System.Linq; using System.Text; class A {

Метод Шеннона-Фано
метод Шеннона-Фано, рассортировал вероятности по убыванию, а после не могу ничего сделать(( помогите плиз, там надо пополам делить и 0 или...

Метод Шеннона-Фано
Очень нужен метод Шеннона-Фано на C# для форм. Форма имеет вид текст бокс для ввода текста, кнопка кодирования, текст бокс для вывода кода,...

4
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
05.12.2011, 19:48
Замени "->" на "." И все. Принципиальных отличий в коде нет.
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
15.04.2013, 04:36
Это не метод Шеннона-Фано. Такой код в топку. Метод Шеннона-Фано подразумевает не деления пополам с получением равномерного кода, а деление на группы в зависимости от суммы вероятности так что не факт что группа разделится в отношение один к двум.
0
0 / 0 / 1
Регистрация: 25.01.2012
Сообщений: 49
22.05.2013, 11:14
Почему здесь циклы начинаются с 1, а не с 0
0
0 / 0 / 1
Регистрация: 25.01.2012
Сообщений: 49
25.05.2013, 07:48
Цитата Сообщение от Alendorff Посмотреть сообщение
Почему здесь циклы начинаются с 1, а не с 0
Нулевые под названия заняты же...

Добавлено через 21 час 35 минут
Закопипастил предыдущий код и переделал под фано.
Правда проскакивает баг, с которым так и не разобрался. Как правило, появляется, если строка довольно длинная, то массив может взять и не отсортироваться =\
Кликните здесь для просмотра всего текста
C++
1
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
112
113
114
115
116
117
118
119
120
121
122
123
124
#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();
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2013, 07:48
Помогаю со студенческими работами здесь

Метод Шеннона фано
Помогите пожалуста реализовать самый простой способ этого алгоритма сжатия на С/С++ Добавлено через 14 минут с задаными ...

Метод архивации Шеннона-Фано
Не подскажите,может есть у кого исходник кода архивации(сжатия и восстановления) методом Шеннона-Фано на С++?

Метод Шеннона-Фано и контейнер Map
Пишем лабораторную работу по кодированию - выпал метод Шеннона-Фано, и вторую неделю не получается исправить ошибку с...

Алгоритм Шеннона-Фано
Приветствую всех в этой теме. Создаю архиватор по методу Шеннона-Фано. И трудность возникла в программной реализации получения кодовых...

Кодирование Фано-Шеннона
Добрый день. Есть недочет в коде, цель закодировать и декодировать строку алгоритмом Фано-Шеннона. Проблема в том, что если кодировать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru