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); } }