Форум программистов, компьютерный форум CyberForum.ru

Алгоритм Шеннона-Фано - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Поиск файлов без разшерения http://www.cyberforum.ru/cpp-beginners/thread1010596.html
Доброго времени суток, такая проблема, делаю поиск файлов в папке, файлы находит но условие по совпадению имени не выполняются. В директории поиска есть такие файлы: Readme(файл без расширений) Readme-journal(файл без расширений) Readme.txt Вот код WIN32_FIND_DATA FindFileData; HANDLE hf;
C++ WinAPI Как изменить описание процесса в диспетчере задач всем привет. скажите, а как изменить то самое описание процесса, которое в колонке отображается справа? в диспетчере задач. код собирается в визуал студии. как это сделать? http://www.cyberforum.ru/cpp-beginners/thread1010589.html
доработать программу C++
что изменить в коде, чтобы значения вводились не с клавиатуры, а читались из файла или хотя бы вводились в самом коде? пробовал вводить в самом коде, но почему-то результат выдается не тот, что нужен #include<iostream.h> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<conio.h> #define word unsigned int int i, j, n, p, xn, xk; int flag;
C++ Подсчитать количество различных символов, которые не являются буквами или цифрами, и вывести их на экран
Задание: Дана строка. Подсчитать количество различных символов, которые не являются буквами или цифрами, и вывести их на экран. Как это сделать ? Вообще в этом не разбираюсь(
C++ Одноименные массивы С++ http://www.cyberforum.ru/cpp-beginners/thread1010572.html
Не могу исправить ошибки. Прошу помочь) Ошибки: error C2679: бинарный '>>': не найден оператор, принимающий правый операнд типа 'int ' (или приемлемое преобразование отсутствует) fatal error C1075: конец файла обнаружен ранее, чем левая фигурная скобка '{' в ".\лаб100.cpp(42)" #include <stdafx.h> #include <iostream> #include <locale> #include <cstdlib>
C++ Не работает setlocale(LC_ALL,"Russian") или Говорим по русски оператор setlocale(LC_ALL,"Russian"); при проверке одной консольной программы сpp в 3 оболочках C++Builder, CodeBlocks, MS VisualStudio 2008 давал русские буквы только в Visual Studio. В остальных-не работал. Почему? Мне удобно в разных местах не завязываться только с VisualStudio а нужен надежный способ вывода русского текста вне зависимости от оболочки. подробнее

Показать сообщение отдельно
dmmih
1 / 1 / 0
Регистрация: 21.12.2012
Сообщений: 15
18.11.2013, 02:16     Алгоритм Шеннона-Фано
Приветствую всех в этой теме.
Создаю архиватор по методу Шеннона-Фано.
И трудность возникла в программной реализации получения кодовых слов. В теории и на бумаге трудностей в этом нет, чего нельзя сказать про попытки реализовать метод в C++.
Предпринимались некоторые попытки, но они особо ни к чему не привели.
Как понял, данный метод можно сделать через массив структур или рекурсию. Предпочтительнее сделать массивом структур, так как рекурсию пока что в C++ не использовал вообще.
_
По данному заданию нужно было вычислить количество повторений байтов, вероятность повторений и среднее количество информации по Шеннону.
Затем добавляется сортировка по невозрастанию с учётом того, что у каждого байта при выводе информации на экран не должны меняться значения количества повторения и вероятности повторения.
Вот программный код с комментариями, который есть на данный момент:
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
 
int main(int argc, char *argv[])
{
    unsigned int c[256], mal2; // массив c[256] - количество повторений байта
    char filename[50]; // массив для имени файла
    FILE* f; 
    unsigned char b; 
    int i=0,j=0; 
    int n[256],mal1; // массив n[256] - массив под индексы байтов
    double p[256], mal; // массив p[256] - массив вероятностей
    double s=0; 
    double L=1/log(2); // необходимая переменная для подсчёта ср.кол-ва инф.
    double I=0; // обнуляем значение среднего количества информации
    printf("Input a filename:\n"); 
    scanf ("%s",&filename); // ввод имени файла
    
    for(i=0;i<256;i++) // обнуляем элементы массива количества повторений байтов по циклу
    {c[i]=0;}
    f = fopen(filename,"rb"); // открываем файл в бинарном режиме чтения
 
 /*Считаем количество повторений*/   
    do
{
    fread (&b,1,1, f); 
    c[b]++; 
}
    while (!feof(f));
    c[b]--;
    /*Считаем вероятности повторений байтов*/
    for(i=0; i<256;i++)
    {s=s+c[i];}
    for(i=0; i<256;i++)
    {p[i]=c[i]/s;}
   for(i=0; i<256;i++)
    {
    if (p[i]!=0) 
    {I = I+p[i]*log(1/(p[i]))*L;} // считаем среднее кол-во информации по формуле
    }  
    fclose(f); 
    
    /*Сортируем данные по невозрастанию пузырьковой сортировкой*/    
    for (i=0;i<256;i++) //Данный цикл нужен для того, чтобы у каждого значения байта оставались свои значения вероятности и повторений после сортировки
          { n[i]=i; }  // иначе значения повторения и вероятности у байтов поменяются при выводе результатов, так как индексы остались на своих местах
    for (i=255;i>=0;i--) // сама сортировка
    {
        for (j=i;j<255;j++)
        {
            if (p[j]<p[j+1])
            {
                            mal=p[j];
                            p[j]=p[j+1];
                            p[j+1]=mal;
                            mal1=n[j];
                            n[j]=n[j+1];
                            n[j+1]=mal1;
                            mal2=c[j];
                            c[j]=c[j+1];
                            c[j+1]=mal2;                         
                      }}}
 for (i=0; i<256; i++)   // вывод индексов байтов, кол-ва повторений и вероятности повторений по циклу
{ printf("indeks=%d, kolichestvo=%d, veroyatnost=%f\n", n[i],c[i],p[i]); }
printf("Kol-vo informacii= %lf\n",I); //вывод среднего количества информации    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Хочу заметить то, что искал в интернете исходники(в том числе и на англоязычных форумах), но они оказались довольно трудными для понимания.
Находил исходники с использованием стандартных шаблонов С++, но нужно обойтись без этого.
Прошу помочь с реализацией получения кодовых слов.
__
Как я понял, нужно сделать массив структур в виде таблицы и дальше работать с этим массивом, и обращаться к его элементам при разбиении вероятностей на части. Примерные идеи и некоторые совсем небольшие наработки есть, но дальше дело не идёт.
_
Также выкладываю результат работы программы, код которой изложен выше.
Мы вводим имя(на скриншоте - изображения), с байтами которого мы хотим работать(и в будущем который мы хотим сжимать/разжимать)
Миниатюры
Алгоритм Шеннона-Фано  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 12:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru