5. 簡易霍夫曼編碼(Huffman encoding)資料壓縮系統

using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;

namespace Q5
{
    public partial class Form1 : Form
    {
        Label[] labels = new Label[4];
        TextBox[] textBoxes = new TextBox[4];

        public Form1()
        {
            InitializeComponent();

            for (int i = 0; i < 4; i++)
            {
                var lbl = new Label();
                labels[i] = lbl;
                lbl.AutoSize = false;
                lbl.Width = 40;
                lbl.BorderStyle = BorderStyle.FixedSingle;
                var tb = new TextBox();
                textBoxes[i] = tb;
                tb.Width = 40;
                tb.BorderStyle = BorderStyle.FixedSingle;

                flowLayoutPanel1.Controls.Add(lbl);
                flowLayoutPanel2.Controls.Add(tb);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button3_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label10.Text = "";
            label7.Text = "";
            label6.Text = "";

            var n = new Random();

            List<int> ns = [];
            List<char> ts = [];
            for (int i = 0; i < 4; i++)
            {
                var k = 0;
                do
                {
                    k = n.Next(1, 1000);
                } while (ns.Contains(k));
                char t = 'a';
                do
                {
                    t = (char)(n.Next(0, 26) + 'a'); // 注意0-25
                } while (ts.Contains(t));
                ts.Add(t);
                ns.Add(k);

                labels[i].Text = t.ToString();
                textBoxes[i].Text = k.ToString();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            var queue = new List<int>(textBoxes.Select(r => int.Parse(r.Text)).ToArray());
            var z = (queue.Sum() * 2);
            label6.Text = z.ToString();
            int k = 0;
            while (queue.Count > 1)
            {
                queue.Sort();
                var l = queue.First();
                var r = queue[1];

                queue.RemoveAt(0);
                queue.RemoveAt(0);

                queue.Add(l + r);

                k += l + r;
            }

            label7.Text = k.ToString();

            label10.Text = (Math.Round((double)z / k * 10000) / 10000).ToString("f4");
        }
    }
}

Last updated