Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
8 / 6 / 3
Регистрация: 24.05.2013
Сообщений: 43

Написать программу для кодирования методом Шеннона - Фано

25.01.2019, 23:41. Показов 10828. Ответов 0
Метки нет (Все метки)

Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Студворк — интернет-сервис помощи студентам
Собственно по заданию нужно написать программу, которая будет кодировать символы методом Шеннона - Фано, на входе символы и число сколько раз они встречаются в тексте, на выходе соответствующие этим символам коды. Написал кусок программы, но он не особо работает, ошибку понять не могу, может кто поможет или с нуля напишет, может вдруг случайно у кого в загашниках есть готовая программа.

Pascal
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
program code;
type
  mas=array[0..100]of integer;
  mass=array[0..100,0..100]of char;
var start,stop,l,g_level,i,j:integer;
    a:mas; b:mass;
 
procedure shannon(var start_pos,end_pos:integer; aa:mas; bb:mass; level:integer);
var i,j,k:integer; isum,jsum:array[0..10000]of integer;
begin
  if level > g_level then g_level:=level;
  while i<(j-1) do begin
    while((isum[i]>jsum[j]) and (i<(j-1))) do begin
      j:=j-1;
      jsum[j]:=jsum[j]+aa[j];
    end;
    while ((isum[i]<jsum[j]) and (i<(j-1))) do begin
      inc(i);
      isum[i]:=isum[i]+aa[i];
    end;
   end;
   if i=start then bb[start,level]:=('0')
              else if ((i-start)>=1) then begin
                                          for k:=start to i do
                                                              bb[k,level]:=('0');
                                          shannon(start,i,a,bb,level+1);  
                                          end;
end;
 
 
 
 
 
 
 
 
 
 
 
begin
start:=0;
stop:=8;
l:=1;
a[1]:=4; a[2]:=6; a[3]:=6; a[4]:=3; a[5]:=1; a[6]:=2; a[7]:=2; a[8]:=1;
for i:=0 to 7 do
  for j:=0 to 7 do b[i,j]:=('x');
 
shannon(start,stop,a,b,l);
 
for i:=0 to 7 do begin
 for j:=0 to 7 do write(b[i,j],' ');
 writeln;
 end;
 
end.
Добавлено через 8 часов 10 минут
Сделал сам, выкладываю, если вдруг кому нужно будет
Pascal
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
program Shennon;
type
  mas=array[1..100]of real;
  var tex:text;
      s,qq:array[1..10000]of char;
      sum,tmp,p1:real;
      i,j,jj,k,n:byte;
      a,l:array[1..100]of integer;
      p,q:array[1..100]of real;
      c:array[1..100] of string;
      kol,d,h:integer;
      bol,t:boolean;
      tmp1:char;
begin
   jj:=1;
   k:=1;
   n:=0;
   kol:=0;
   assign(tex,'d:\2.txt');
   reset(tex);
   while not Eoln(tex)do
     begin
      inc(kol);
      read(tex,s[kol]);
     end;
  writeln('Кол-во символов:',kol);
   while not Eoln(tex) do
     for i:=1 to kol do read(tex,s[i]); //Чтение символов из файла
   for i:=1 to kol do //Подсчёт частоты встречи символов
   begin
     for j:=i to kol do
       begin
        t:=true;
        for h:=1 to i-1 do
          if (s[i]=s[i-h]) then
                                begin
                                 t:=false;
                                 break;
                                end
                             else t:=true;
    if (s[i]=s[j])and(t=true) then  a[k]:=a[k]+1;
   end;
   inc(k);
  end;
  close(tex);
  for i:=1 to kol do  write(s[i]:2); //Вывод символов в файле
  writeln;
  for k:=1 to kol do begin
                      write(a[k]:2); //Вывод колличества каждого символа в файле
                      if a[k]>0 then begin
                                      qq[jj]:=s[k];
                                      inc(jj);
                                     end;
                     end;
  for k:=1 to kol do
     if a[k]<>0 then n:=n+1;
  i:=1;
  for k:=1 to kol do //Подсчёт уникальных символов
    if a[k]<>0 then
     begin
      a[i]:=a[k];
      inc(i);
     end;
  writeln;
 
  sum:=0;  //Подсчёт вероятности
  for i:=1 to n do
    begin
     p[i]:=a[i]/kol;
     sum:=sum+p[i];
    end;
  repeat
     bol:=false;
     for i:=1 to n-1 do
          if p[i]<p[i+1] then
                         begin
                         bol:=true;
                         tmp:=p[i];
                         tmp1:=qq[i];
                         p[i]:=p[i+1];
                         qq[i]:=qq[i+1];
                         p[i+1]:=tmp;
                         qq[i+1]:=tmp1;
                         end;
until bol=false;
   writeln;
//вычисления
 for i:=2 to n do
  begin
   q[i] := q[i-1]+p[i-1]; //Подсчёт вероятности обратного события
  end;
 for i:=1 to n do
  begin //Подсчёт длины кодового слова
   repeat
    if exp(ln(2)*d)>p[i]
     then d := d-1;
   until (exp(ln(2)*d)<=p[i]);
   l[i] := abs(d);
   d := 0;
  end;
 for i:=1 to n do
  begin //Составление кодового слова
   for j:=1 to l[i] do
    begin
     if j=1
      then p1 := q[i]*2
      else p1 := p1*2;
     if (trunc(p1) > 1)
      then p1 := p1 - 2;
     if (trunc(p1) = 1)
      then c[i] := c[i] + '1'
      else c[i] := c[i] + '0';
    end;
  end;
for i:=1 to n do
q[i]:=1-p[i];  
for i:=1 to n do writeln('p[',qq[i]:2,']=',p[i]:4:3,'  q[',qq[i]:2,']=',q[i]:1:3,'  l[',qq[i]:2,']=',l[i],'  c[',qq[i]:2,']=',c[i]:5);
end.
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.01.2019, 23:41
Ответы с готовыми решениями:

Кодирование методом Шеннона-Фано и Хаффмана
Добрый день уважаемые форумчане, не могу выполнить задание по дискретной математике, нужно написать программу которая будет кодировать...

Реализация алгоритма кодирования Шеннона-Фано
задание: реализовать алгоритм кодирования Шеннона-Фано, ввести строку символов, на выходе получить таблицу&quot;символ, вероятность, код...

Шифрование методом Шеннона-Фано
Помогите пожалуйста создать на Java код который будет шифровать методом Шеннона фано плз).

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2019, 23:41
Помогаю со студенческими работами здесь

Кодирование методом Шеннона-Фано
Добрый день! Нужно доработать программу: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { string...

Алгоритм сжатия методом Шеннона-Фано
Народ, нужна помощь в поиске кода реализующего алгоритм кодирования и декодирования сообщения методом Шеннона-Фано на Си. Заранее...

Сжатие методом Шеннона-Фано (Pascal -> C++)
Есть код на pascal может кто-нибудь помочь перевести на с++ ? uses crt; var c:char; s,s1,s2:string; i,n,j,j1:byte; ...

Закодировать алфавит методом Шеннона-Фано и Хаффмана
Нужно закодировать алфавит K = {k1, k2, k3, k4, k5} двоичным кодом, если вероятности букв следующие: p(k1) = 0.05 p(k2) = 0.5 p(k3) =...

Кодирование фразы Методом Шеннона-фано и Хаффмена
Привет всем)))) помогите мне написать программу,пожалуйста)))) мне необходимо написать программу на языке Visual Basic for...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru