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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2013, 13:50   #1
803
Пользователь
 
Регистрация: 13.02.2012
Сообщений: 89
По умолчанию Правильность работы алгоритма (код C#)

Здравствуйте. Есть реализация lzw, но я не могу понять правильно он работает или нет и вообще по какому принципу работает код. Пример: я ввожу строку "abacabadabacabae" для кодировке, на выходе я получаю "abacĀadĄăāe" правильно ли это я не знаю. Прошу вашей помощи, заранее спасибо.
Код:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace LZW
{
    class LzwStringTable
    {
        public LzwStringTable(int numBytesPerCode)
        {
            maxCode = (1 << (8 * numBytesPerCode)) - 1;
        }

        public void AddCode(string s)
        {
            if (nextAvailableCode <= maxCode)
            {
                if (s.Length != 1 && !table.ContainsKey(s))
                    table[s] = nextAvailableCode++;
            }
            else
            {
                throw new Exception("LZW string table overflow");
            }
        }

        public int GetCode(string s)
        {
            if (s.Length == 1)
                return (int)s[0];
            else
                return table[s];
        }

        public bool Contains(string s)
        {
            return s.Length == 1 || table.ContainsKey(s);
        }

        private Dictionary<string, int> table = new Dictionary<string, int>();
        private int nextAvailableCode = 256;
        private int maxCode;
    }

    class Program
    {
        private const int NumBytesPerCode = 2;

        static int ReadCode(BinaryReader reader)
        {
            int code = 0;
            int shift = 0;

            for (int i = 0; i < NumBytesPerCode; i++)
            {
                byte nextByte = reader.ReadByte();
                code += nextByte << shift;
                shift += 8;
            }

            return code;
        }

        static void WriteCode(BinaryWriter writer, int code)
        {
            int shift = 0;
            int mask = 0xFF;

            for (int i = 0; i < NumBytesPerCode; i++)
            {
                byte nextByte = (byte)((code >> shift) & mask);
                writer.Write(nextByte);
                shift += 8;
            }
        }

        static void Compress(StreamReader input, BinaryWriter output)
        {
            LzwStringTable table = new LzwStringTable(NumBytesPerCode);

            char firstChar = (char)input.Read();
            string match = firstChar.ToString();

            while (input.Peek() != -1)
            {
                char nextChar = (char)input.Read();
                string nextMatch = match + nextChar;

                if (table.Contains(nextMatch))
                {
                    match = nextMatch;
                }
                else
                {
                    WriteCode(output, table.GetCode(match));
                    table.AddCode(nextMatch);
                    match = nextChar.ToString();
                }
            }

            WriteCode(output, table.GetCode(match));
        }

        static void TestCompress()
        {
            FileStream inputStream = new FileStream("Input.txt", FileMode.Open);
            StreamReader inputReader = new StreamReader(inputStream);

            FileStream outputStream = new FileStream("Compressed.txt", FileMode.Create);
            BinaryWriter outputWriter = new BinaryWriter(outputStream);

            Compress(inputReader, outputWriter);

            outputWriter.Close();
            outputStream.Close();

            inputReader.Close();
            inputStream.Close();
        }

        static void Main(string[] args)
        {
            TestCompress();
        }
    }
}
803 вне форума Ответить с цитированием
Старый 21.03.2013, 13:58   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вы всерьез считаете, что можно узнать, правильно ли работает алгоритм, если не знаешь, что он должен делать?
s-andriano вне форума Ответить с цитированием
Старый 21.03.2013, 14:01   #3
803
Пользователь
 
Регистрация: 13.02.2012
Сообщений: 89
По умолчанию

Он должен сжимать текст методом lzw.
803 вне форума Ответить с цитированием
Старый 21.03.2013, 14:07   #4
803
Пользователь
 
Регистрация: 13.02.2012
Сообщений: 89
По умолчанию

Если у кого есть пример получше, я буду признателен если вы им поделитесь.
803 вне форума Ответить с цитированием
Старый 21.03.2013, 14:12   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Напишите метод Decompress, примените его к результату и посмотрите, получилась исходная строка или нет.
Abstraction вне форума Ответить с цитированием
Старый 21.03.2013, 14:16   #6
803
Пользователь
 
Регистрация: 13.02.2012
Сообщений: 89
По умолчанию

Строка то получается. Я не могу понять почему в compress выводит "abacĀadĄăāe", а не цифры?
803 вне форума Ответить с цитированием
Старый 21.03.2013, 14:33   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Строка то получается. Я не могу понять почему в compress выводит "abacĀadĄăāe", а не цифры?
Эм-м-м... он выводит двоичные данные. Скажем (для примера) 01101010 00101111 01010010 10010101 00001010 10010110 10011010. Дальше Вы открываете получившийся файл текстовым редактором. Поскольку любой файл есть последовательность бит, которую программы интерпретируют и представляют Вам в некотором удобочитаемом формате, то и в этом случае текстовый редактор пытается проинтерпретировать эти данные как буквы. Откройте тот же файл программой вроде XVI32 - увидите шестнадцатеричные коды.
Abstraction вне форума Ответить с цитированием
Старый 21.03.2013, 14:45   #8
803
Пользователь
 
Регистрация: 13.02.2012
Сообщений: 89
По умолчанию

То есть сама программа работает правильно и выводит то что нужно?
Можете пожалуйста буквально в 2 словах мне описать эти функции если не сложно конечно.
Код:
public LzwStringTable(int numBytesPerCode)
        {
            maxCode = (1 << (8 * numBytesPerCode)) - 1;
        }

        public void AddCode(string s)
        {
            if (nextAvailableCode <= maxCode)
            {
                if (s.Length != 1 && !table.ContainsKey(s))
                    table[s] = nextAvailableCode++;
            }
            else
            {
                throw new Exception("LZW string table overflow");
            }
        }

        public int GetCode(string s)
        {
            if (s.Length == 1)
                return (int)s[0];
            else
                return table[s];
        }

        public bool Contains(string s)
        {
            return s.Length == 1 || table.ContainsKey(s);
        }

        private Dictionary<string, int> table = new Dictionary<string, int>();
        private int nextAvailableCode = 256;
        private int maxCode;
    }

    class Program
    {
        private const int NumBytesPerCode = 2;

        static int ReadCode(BinaryReader reader)
        {
            int code = 0;
            int shift = 0;

            for (int i = 0; i < NumBytesPerCode; i++)
            {
                byte nextByte = reader.ReadByte();
                code += nextByte << shift;
                shift += 8;
            }

            return code;
        }

        static void WriteCode(BinaryWriter writer, int code)
        {
            int shift = 0;
            int mask = 0xFF;

            for (int i = 0; i < NumBytesPerCode; i++)
            {
                byte nextByte = (byte)((code >> shift) & mask);
                writer.Write(nextByte);
                shift += 8;
            }
        }
Заранее спасибо.
803 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно проверить правильность работы функции (Си) Nekit9401 Помощь студентам 3 07.02.2013 20:29
Не работает внешний стиль css, хотя код много раз проверялся на правильность Edelveiss HTML и CSS 2 02.06.2012 13:07
Код алгоритма игры VBA Nkeyka Помощь студентам 0 28.05.2012 14:55
засеч время работы алгоритма V_F Помощь студентам 7 15.11.2010 23:05
Время работы алгоритма, мс. WinForms/С++ Lazio Windows Forms 1 22.09.2010 13:54