Ejemplo n.º 1
0
        private CodingTable codingTable; //Таблица


        public ShannonCompressor(CodingTable codingTable)//Конструктор, принимающий таблицу
        {
            this.codingTable = codingTable;
            codingTable.SortElements();  //Сортируем элементы таблицы по убыванию вероятностей
            codingTable.CreateCiphers(); //Создаем для каждого символа свой шифр
            codingTable.Modify();
        }
 private void PrintCiphers(CodingTable codingTable)//Вывод символов таблицы и их шифров в информационный бокс
 {
     for (int i = 0; i < codingTable.Count; i++)
     {
         int    cipherPadding    = 8 - codingTable.Elements[i].Symbol.Length;//Количество символов для отступа
         string symbolCipherPair = string.Format("{0, 3}", codingTable.Elements[i].Symbol) + " :" + string.Format("{0, " + cipherPadding + "}", codingTable.Elements[i].Cipher);
         infoTextBox.WriteLine(symbolCipherPair);
     }
 }
        private void CompressButton_Click(object sender, EventArgs e)             //Нажатие на кнопку "Архивировать"
        {
            string[]       symbols     = alphabet.Split(new char[] { ' ' });      //Преобразование в массив символов из алфавита
            string[]       symbolProbs = probabilities.Split(new char[] { ' ' }); //Преобразование в массив вероятностей
            List <Element> elements    = new List <Element>();

            for (int i = 0; i < symbols.Length && i < symbolProbs.Length; i++)
            {
                elements.Add(new Element(symbols[i], double.Parse(symbolProbs[i])));//Добавление стоблцов в таблицу
            }
            CodingTable codingTable = new CodingTable(elements);

            if (!codingTable.IsProbabilitySumCorrect)
            {
                MessageBox.Show("Сумма вероятнстей в файле больше единицы");
                return;
            }

            compressor = new ShannonCompressor(codingTable);                                 //Создание архиватора

            PrintCiphers(codingTable);                                                       //Вывод символов таблицы и их шифров в информационный бокс
            infoTextBox.WriteLine("Средняя длина код слова = " + codingTable.AverageLength); //Вывод информации о Средней длине код слова
            infoTextBox.WriteLine("Избыточность = " + codingTable.Redundancy);               //Вывод информации о Избыточности
            infoTextBox.WriteLine("Неравенство Крафта = " + codingTable.IsCraft);            //Вывод информации о Неравенстве Крафта
            try
            {
                string compressedText = compressor.Compress(compressedTextBox.Text); //Сжатый текст
                compressedTextBox.Text = compressedText;
                infoTextBox.WriteLine("Сжатый текст = " + compressedText);           //Вывод сжатого текста

                var saveFileDialog = new SaveFileDialog();                           //Создание диалогового окна для сохранения файла
                saveFileDialog.Filter = "Compressed files (.txt)|*.txt";             //Фильтр файла

                DialogResult result = saveFileDialog.ShowDialog();
                if (result == DialogResult.OK)
                {
                    string fileName = saveFileDialog.FileName;//Путь файла

                    // Удаляем файл, если такой уже существует
                    if (File.Exists(fileName))
                    {
                        File.Delete(fileName);
                    }

                    // Создаем и записываем файл
                    using (StreamWriter sw = File.CreateText(fileName))
                    {
                        sw.Write(compressedText);
                    }
                }
            }
            catch (Exception exception)//Вывод ошибки
            {
                MessageBox.Show(exception.Message);
            }
        }