Фрагмент для ознакомления
getState(n);MemoryStreamms = new MemoryStream();BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(ms, stm.getState(n)); ms.Position = 0;state = (hState)formatter.Deserialize(ms); }public bool BuildTree() {if (state == null) returnfalse; // Проверка на инициализациюwhile (state.Tree.Join()) stm.addState(state); // Building treestate.Tree.MakeCode();stm.addState(state);return true; }public bool Pack() // Упаковка{if (state == null) returnfalse; // Проверка на инициализациюstate.Reset();if (state.Tree.Root == null || state.Text=="") return false; // Словарьнеготовstring code;foreach (char c in state.Text) {code = state.Tree.getCode(c);if (code == "-") return false; // Неверныйсимволstate.Pack(code);stm.addState(state); }return true; }public bool Extract() // Распаковка{if (state == null) returnfalse; // Проверка на инициализациюstate.Reset();if (state.Tree.Root == null) return false; // Словарьнеготовstring s = state.Text;while (s.Length > 0) {char c = getchar(state.Tree.Root, ref s);if (c == hTreeNode.ZEROCHAR) return false; // Ошибкаstate.Extract(c,s);stm.addState(state); }return true; } }}ФайлhState.csusing System;usingSystem.Collections.Generic;namespaceHaff{ [Serializable]public class hState {privatehTree tree;private string text;private List packed;private string unpack;publichTree Tree { get => tree; }public string Text { get => text; }public List Packed { get => packed; }public string Unpack { get => unpack==""? "пусто" : unpack; }publichState(string _text, hTree _tree) {tree = _tree; text = _text; unpack = "";packed = new List(); }public void Reset() // Сброссостояния {packed.Clear(); unpack = ""; } public void Pack(string s) // Добавить к упаковщику {packed.Add(s); }public void Extract(char c,string s){unpack += c; text = s; // Для изменения входа пло шагам} }}ФайлhTree.csusing System;usingSystem.Collections.Generic;usingSystem.Text;namespaceHaff{ [Serializable]public class hTree {private List tree; // Деревоprivate bool built; // Деревопостроеноpublic List Nodes { get => tree; } // УзлыдереваpublichTree(List<(char,int)> a) // Инициализациядерева {tree = new List();foreach (var p in a)tree.Add(new hTreeNode(p.Item1,p.Item2));built = false; }publicboolJoin() // Связывание двух узлов{int n1 = -1, n2 = -1;for (inti=0;i tree[n2].Level ? tree[n1].Level : tree[n2].Level));else built = true;return !built; }private void mkCode(intt,string s) // Формированиекодов {tree[t].Code = s;if (tree[t].Left != -1) mkCode(tree[t].Left, s + "0");if (tree[t].Right != -1) mkCode(tree[t].Right, s + "1"); }public void MakeCode() // Формированиекодов {if (tree.Count==0) return; // НеизчегоделатьmkCode(tree.Count-1,""); }public string getCode(char c) // Получениекодасимвола {foreach (hTreeNode t in tree)if (t.Data == c) return t.Code;return "-"; } // Операции с деревомpublichTreeNode Root { get => built ? tree[tree.Count - 1] : null; } publichTreeNode Left(hTreeNode node) {returnnode.Left == -1 ? null : tree[node.Left]; }publichTreeNode Right(hTreeNode node) {returnnode.Right == -1 ? null : tree[node.Right]; } }}ФайлhTreeNode.csusing System;namespaceHaff{ [Serializable]public class hTreeNode {public static char ZEROCHAR = '#';private bool used;private char data;private string code;privateint weight;privateint left, right;privateintlvl;public bool Used { get => used; set => used = value; }public char Data { get => (left==-1 && right==-1)?data:ZEROCHAR; }public string Code { get => code; set => code = value; }publicint Weight { get => weight; }publicint Left { get => left; }publicint Right { get => right; }publicint Level { get => lvl; }publichTreeNode(char c, int w) {used = false; data = c; weight = w;left = -1; right = -1; code = ""; lvl = 0; }publichTreeNode(int w, int l, intr,int lev) {used = false; data = '#'; weight = w;left = l; right = r; code = ""; lvl = lev + 1; } }}ФайлManager.csnamespaceHaff{public class Manager {privatehRun runner; // Испольнительprivate Store store; // Хранилищеprivate View view; // Отображдательpublic Manager(View _view) {store = new Store();runner = new hRun(store);view = _view; }public void Init(hInit p) // Инициализация {store.Reset();store.addState(p.getState());runner.setState(0); }public bool Prepare() // Подготовкасловаря {returnrunner.BuildTree(); }public bool Pack() // Упаковка {returnrunner.Pack(); }public bool Extract() // Распаковка {returnrunner.Extract(); }public bool Save(string fn) // Сохранение {returnstore.Save(fn); }public bool Load(string fn) // Загрузка {store.Reset();if (!store.Load(fn)) return false;if (store.Count == 0) return false;runner.setState(store.Count-1);return true; }public void DisplayState() // Отображениесостояния {view.ShowTree(store.State);view.ShowCodes(store.State); }public void DisplayData() {view.ShowData(store.State); }public void ShowError(string msg) {view.ShowMessage(msg); }public bool First() {returnstore.First(); }public bool Next() {returnstore.Next(); } }}ФайлStore.csusingSystem.Collections.Generic;using System.IO;usingSystem.Runtime.Serialization.Formatters.Binary;namespaceHaff{class Store {private List states; // Списоксостоянийprivateintcstate; // Текущеесостояниеpublicint Count { get => states.Count; } publichStateLastState { get => states.Count == 0 ? null : states[states.Count - 1]; }publichState State { get => cstate==-1 ? null : states[cstate]; }public Store() {states = new List();cstate = -1;} // Создание клона состояния через сериализациюpublic static hState Clone(hState state) {MemoryStreamms = new MemoryStream();BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(ms, state); ms.Position = 0;return (hState)formatter.Deserialize(ms); }public bool Save(string fn) // Сохранение {if (states.Count == 0) return false;FileStreamsw;try {BinaryFormatter formatter = new BinaryFormatter();sw = new FileStream(fn, FileMode.OpenOrCreate);formatter.Serialize(sw, states); }catch { return false; }sw.Close();return true; }public bool Load(string fn) // Загрузка {FileStreamsr;try {BinaryFormatter formatter = new BinaryFormatter();sr = new FileStream(fn, FileMode.Open);states=(List)formatter.Deserialize(sr); }catch { return false; }sr.Close();return true; }public void Reset() // Сброссостояний {states.Clear();cstate = -1; }public void addState(hState state) // Добавлениесостояния {states.Add(Store.Clone(state));cstate = states.Count - 1; }publicboolFirst() // На первое состояние{if (states.Count==0) return false;cstate = 0;return true; }public bool Next() // Следующеесостояние {if (cstate == states.Count - 1) return false;cstate++;return true; }publichStategetState(int n) {if (n < 0 || n >= states.Count) return null;returnStore.Clone(states[n]); } }}ФайлView.csusingSystem.Collections.Generic;usingSystem.Text;usingSystem.Windows.Forms;namespaceHaff{public class View {privateTreeViewtreeBox;privateDataGridViewcodeBox;privateTextBoxdataBox;public View(TreeViewtb,DataGridViewcb,TextBoxdb) {treeBox = tb;codeBox = cb;dataBox = db; }private void showTree(hTreet,hTreeNoden,TreeNodetn) {if (n == null) return;tn.Text = $"{n.Data}: {n.Weight} | {n.Code}";if (n.Left != -1) {tn.Nodes.Add(new TreeNode());showTree(t, t.Left(n), tn.Nodes[0]); }if (n.Right != -1) {tn.Nodes.Add(new TreeNode());showTree(t, t.Right(n), tn.Nodes[1]); } }private void showCode(hTree t, hTreeNode n, List codes) {if (n == null) return;if (n.Left == -1 && n.Right == -1)codes.Add(n);showCode(t, t.Left(n), codes);showCode(t, t.Right(n), codes); }public void ShowTree(hState state) {treeBox.Nodes.Clear();if (state == null) return;hTreeNode root = state.Tree.Root;TreeNodetn = new TreeNode();if (state.Tree == null || state.Tree.Root==null) // Недерево {tn.Text = "Построение";string used;foreach (hTreeNode n in state.Tree.Nodes){used = n.Used ? "блок" : "свободен";tn.Nodes.Add(newTreeNode($"{n.Data} ({n.Level}): {n.Weight} : {used}"));} } else showTree(state.Tree, state.Tree.Root,tn); // ДеревоtreeBox.Nodes.Add(tn);treeBox.ExpandAll(); }public void ShowCodes(hState state) {if (state == null) return; List codes=new List();showCode(state.Tree, state.Tree.Root, codes);codeBox.AutoGenerateColumns = false;codeBox.DataSource = codes; }public void ShowData(hState state) {if (state == null) return;StringBuildersb = new StringBuilder();if (state.Packed.Count > 0) // Былаупаковка {foreach (string p in state.Packed)sb.Append(p); //sb.AppendLine(p); //+D+ } else {sb.AppendLine(state.Unpack);sb.AppendLine(state.Text); }dataBox.Text = sb.ToString(); }public void ShowMessage(string msg) {dataBox.Text = msg; } }}
1. Алгоритм Хаффмана. [Электронный ресурс] / Режим доступа: https://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A5%D0%B0%D1%84%D1%84%D0%BC%D0%B0%D0%BD%D0%B0
2. Метод Хаффмана и родственные методы. [Электронный ресурс] / Режим доступа: http://www.compression.ru/arctest/descript/huffmans.htm
3. Икон, А. И. Алгоритм Хаффмана для передачи большого объема информации на дальние расстояния / А. И. Икон, Л. В. Васильева. — Текст : непосредственный // Юный ученый. — 2018. — № 2 (16). — С. 92-94. [Электронный ресурс] / Режим доступа: https://moluch.ru/young/archive/16/1133/
4. Неравномерное кодирование. Средняя длина кодирования. [Электронный ресурс] / Режим доступа: https://intuit.ru/studies/courses/3481/723/lecture/14228?page=4
5. Префиксные коды и Алгоритм Хаффмана. [Электронный ресурс] / Режим доступа: https://prezi.com/_hf6ujcm-e8c/presentation/
6. Что такое Visual Studio? [Электронный ресурс] / Режим доступа: https://learn.microsoft.com/ru-ru/visualstudio/get-started/visual-studio-ide?view=vs-2022
7. Первое приложение в Visual Studio. [Электронный ресурс] / Режим доступа: https://metanit.com/sharp/windowsforms/1.1.php.
8. Что такое C#: плюсы и минусы язык. [Электронный ресурс] / Режим доступа: https://gb.ru/blog/chto-takoe-c/
9. Документация по C#. [Электронный ресурс] / Режим доступа: https://learn.microsoft.com/ru-ru/dotnet/csharp
10. Сериализация в .NET. [Электронный ресурс] / Режим доступа: https://learn.microsoft.com/ru-ru/dotnet/standard/serialization/
11. Руководство по классическим приложениям (Windows Forms .NET). [Электронный ресурс] / Режим доступа: https://learn.microsoft.com/ru-ru/dotnet/desktop/winforms/overview/?view=netdesktop-7.0
Windows Forms. [Электронный ресурс] / Режим доступа: https://learn.microsoft.com/ru-ru/dotnet/desktop/winforms/?view=netdesktop-8.0